diff --git a/asyncapi-parser-2.0.0-next-major.8.tgz b/asyncapi-parser-2.0.0-next-major.8.tgz deleted file mode 100644 index 53346f295..000000000 Binary files a/asyncapi-parser-2.0.0-next-major.8.tgz and /dev/null differ diff --git a/src/models/channel.ts b/src/models/channel.ts index 2f25a6829..e4aa36a96 100644 --- a/src/models/channel.ts +++ b/src/models/channel.ts @@ -1,11 +1,11 @@ import type { BaseModel } from './base'; import type { ChannelParametersInterface } from './channel-parameters'; import type { MessagesInterface } from './messages'; -import type { BindingsMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface, ExternalDocumentationMixinInterface, TagsMixinInterface } from './mixins'; +import type { CoreMixinInterface } from './mixins'; import type { OperationsInterface } from './operations'; import type { ServersInterface } from './servers'; -export interface ChannelInterface extends BaseModel, BindingsMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface, ExternalDocumentationMixinInterface, TagsMixinInterface { +export interface ChannelInterface extends BaseModel, CoreMixinInterface { id(): string; address(): string | null | undefined; servers(): ServersInterface; diff --git a/src/models/message-trait.ts b/src/models/message-trait.ts index b140fdfe6..346bf480d 100644 --- a/src/models/message-trait.ts +++ b/src/models/message-trait.ts @@ -1,10 +1,10 @@ import type { BaseModel } from './base'; import type { CorrelationIdInterface } from './correlation-id'; import type { MessageExamplesInterface } from './message-examples'; -import type { BindingsMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface, ExternalDocumentationMixinInterface, TagsMixinInterface } from './mixins'; +import type { CoreMixinInterface } from './mixins'; import type { SchemaInterface } from './schema'; -export interface MessageTraitInterface extends BaseModel, BindingsMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface, ExternalDocumentationMixinInterface, TagsMixinInterface { +export interface MessageTraitInterface extends BaseModel, CoreMixinInterface { id(): string; schemaFormat(): string; hasMessageId(): boolean; @@ -17,9 +17,5 @@ export interface MessageTraitInterface extends BaseModel, BindingsMixinInterface headers(): SchemaInterface | undefined; hasName(): boolean; name(): string | undefined; - hasTitle(): boolean; - title(): string | undefined; - hasSummary(): boolean; - summary(): string | undefined; examples(): MessageExamplesInterface; } diff --git a/src/models/mixins.ts b/src/models/mixins.ts index 42d8cff71..11c71a8c7 100644 --- a/src/models/mixins.ts +++ b/src/models/mixins.ts @@ -7,6 +7,8 @@ export interface BindingsMixinInterface { bindings(): BindingsInterface; } +export interface CoreMixinInterface extends BindingsMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface, ExternalDocumentationMixinInterface, SummaryMixinInterface, TagsMixinInterface, TitleMixinInterface {} + export interface DescriptionMixinInterface { hasDescription(): boolean; description(): string | undefined; @@ -21,6 +23,16 @@ export interface ExternalDocumentationMixinInterface { externalDocs(): ExternalDocumentationInterface | undefined; } +export interface SummaryMixinInterface { + hasSummary(): boolean; + summary(): string | undefined; +} + export interface TagsMixinInterface { tags(): TagsInterface; +} + +export interface TitleMixinInterface { + hasTitle(): boolean; + title(): string | undefined; } \ No newline at end of file diff --git a/src/models/operation-trait.ts b/src/models/operation-trait.ts index b92c6d82a..42acda245 100644 --- a/src/models/operation-trait.ts +++ b/src/models/operation-trait.ts @@ -1,11 +1,9 @@ import type { BaseModel } from './base'; import type { SecurityRequirements } from './security-requirements'; -import type { BindingsMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface, ExternalDocumentationMixinInterface, TagsMixinInterface } from './mixins'; +import type { CoreMixinInterface } from './mixins'; -export interface OperationTraitInterface extends BaseModel, BindingsMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface, ExternalDocumentationMixinInterface, TagsMixinInterface { +export interface OperationTraitInterface extends BaseModel, CoreMixinInterface { hasId(): boolean; id(): string | undefined; - hasSummary(): boolean; - summary(): string | undefined; security(): SecurityRequirements[]; } diff --git a/src/models/server.ts b/src/models/server.ts index 9509d0f45..3406a1d38 100644 --- a/src/models/server.ts +++ b/src/models/server.ts @@ -1,12 +1,12 @@ import type { BaseModel } from './base'; import type { ChannelsInterface } from './channels'; import type { MessagesInterface } from './messages'; -import type { BindingsMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface, TagsMixinInterface } from './mixins'; +import type { CoreMixinInterface } from './mixins'; import type { OperationsInterface } from './operations'; import type { ServerVariablesInterface } from './server-variables'; import type { SecurityRequirementsInterface } from './security-requirements'; -export interface ServerInterface extends BaseModel, DescriptionMixinInterface, BindingsMixinInterface, ExtensionsMixinInterface, TagsMixinInterface { +export interface ServerInterface extends BaseModel, CoreMixinInterface { id(): string url(): string; protocol(): string; diff --git a/src/models/v2/channel.ts b/src/models/v2/channel.ts index 8265c2024..b7523619d 100644 --- a/src/models/v2/channel.ts +++ b/src/models/v2/channel.ts @@ -1,4 +1,3 @@ -import { BaseModel } from '../base'; import { ChannelParameters } from '../channel-parameters'; import { ChannelParameter } from './channel-parameter'; import { Messages } from '../messages'; @@ -6,26 +5,21 @@ import { Operations } from '../operations'; import { Operation } from './operation'; import { Servers } from '../servers'; import { Server } from './server'; -import { Tags } from '../tags'; -import { bindings, hasDescription, description, extensions } from './mixins'; +import { CoreModel } from './mixins'; -import type { BindingsInterface } from '../bindings'; import type { ChannelInterface } from '../channel'; import type { ChannelParametersInterface } from '../channel-parameters'; -import type { ExtensionsInterface } from '../extensions'; -import type { ExternalDocumentationInterface } from '../external-documentation'; import type { MessagesInterface } from '../messages'; import type { MessageInterface } from '../message'; import type { OperationsInterface } from '../operations'; import type { OperationAction, OperationInterface } from '../operation'; import type { ServersInterface } from '../servers'; import type { ServerInterface } from '../server'; -import type { TagsInterface } from '../tags'; import type { v2 } from '../../spec-types'; -export class Channel extends BaseModel implements ChannelInterface { +export class Channel extends CoreModel implements ChannelInterface { id(): string { return this._meta.id; } @@ -34,22 +28,6 @@ export class Channel extends BaseModel extends BaseModel implements MessageTraitInterface { +export class MessageTrait extends CoreModel implements MessageTraitInterface { id(): string { return this.messageId() || this._meta.id || this.extensions().get(xParserMessageName)?.value() as string; } @@ -70,38 +65,6 @@ export class MessageTrait { @@ -109,16 +72,4 @@ export class MessageTrait }>): BindingsInterface { +type BindingsObject = + | v2.ServerBindingsObject + | v2.ChannelBindingsObject + | v2.OperationBindingsObject + | v2.MessageBindingsObject + | v2.ReferenceObject; + +export interface CoreObject extends v2.SpecificationExtensions { + title?: string; + summary?: string; + description?: string; + externalDocs?: v2.ExternalDocumentationObject; + tags?: v2.TagsObject; + bindings?: BindingsObject; +} + +export abstract class CoreModel = {}> extends BaseModel { + hasTitle(): boolean { + return !!this._json.title; + } + + title(): string | undefined { + return this._json.title; + } + + hasSummary(): boolean { + return !!this._json.summary; + } + + summary(): string | undefined { + return this._json.summary; + } + + hasDescription(): boolean { + return hasDescription(this); + } + + description(): string | undefined { + return description(this); + } + + hasExternalDocs(): boolean { + return hasExternalDocs(this); + } + + externalDocs(): ExternalDocumentationInterface | undefined { + return externalDocs(this); + } + + tags(): TagsInterface { + return tags(this); + } + + bindings(): BindingsInterface { + return bindings(this); + } + + extensions(): ExtensionsInterface { + return extensions(this); + } +} + +export function bindings(model: BaseModel<{ bindings?: BindingsObject }>): BindingsInterface { const bindings = model.json('bindings') || {}; return new Bindings( Object.entries(bindings || {}).map(([protocol, binding]) => createModel(Binding, binding, { protocol, pointer: model.jsonPath(`bindings/${protocol}`) }, model) ), - { originalData: bindings, asyncapi: model.meta('asyncapi'), pointer: model.jsonPath('bindings') } + { originalData: bindings as Record, asyncapi: model.meta('asyncapi'), pointer: model.jsonPath('bindings') } ); } diff --git a/src/models/v2/operation-trait.ts b/src/models/v2/operation-trait.ts index ffa124f43..2f09034d1 100644 --- a/src/models/v2/operation-trait.ts +++ b/src/models/v2/operation-trait.ts @@ -1,20 +1,15 @@ -import { BaseModel } from '../base'; import { SecurityScheme } from './security-scheme'; import { SecurityRequirements } from '../security-requirements'; import { SecurityRequirement } from './security-requirement'; -import { bindings, hasDescription, description, extensions, hasExternalDocs, externalDocs, tags } from './mixins'; +import { CoreModel } from './mixins'; -import type { BindingsInterface } from '../bindings'; -import type { ExtensionsInterface } from '../extensions'; -import type { ExternalDocumentationInterface } from '../external-documentation'; import type { OperationAction } from '../operation'; import type { OperationTraitInterface } from '../operation-trait'; -import type { TagsInterface } from '../tags'; import type { v2 } from '../../spec-types'; -export class OperationTrait extends BaseModel implements OperationTraitInterface { +export class OperationTrait extends CoreModel implements OperationTraitInterface { id(): string | undefined { return this._json.operationId; } @@ -23,30 +18,6 @@ export class OperationTrait; return (this._json.security || []).map((requirement, index) => { @@ -60,16 +31,4 @@ export class OperationTrait implements ServerInterface { +export class Server extends CoreModel implements ServerInterface { id(): string { return this._meta.id; } @@ -47,14 +43,6 @@ export class Server extends BaseModel implement return this._json.protocolVersion; } - hasDescription(): boolean { - return hasDescription(this); - } - - description(): string | undefined { - return description(this); - } - channels(): ChannelsInterface { const channels: ChannelInterface[] = []; Object.entries(this._meta.asyncapi?.parsed.channels || {}).forEach(([channelAddress, channel]: [string, any]) => { @@ -104,16 +92,4 @@ export class Server extends BaseModel implement return new SecurityRequirements(requirements); }); } - - tags(): TagsInterface { - return tags(this); - } - - bindings(): BindingsInterface { - return bindings(this); - } - - extensions(): ExtensionsInterface { - return extensions(this); - } } diff --git a/src/models/v3/channel.ts b/src/models/v3/channel.ts index 16e2211d8..355a900ab 100644 --- a/src/models/v3/channel.ts +++ b/src/models/v3/channel.ts @@ -1,4 +1,3 @@ -import { BaseModel } from '../base'; import { ChannelParameters } from '../channel-parameters'; import { ChannelParameter } from './channel-parameter'; import { Messages } from '../messages'; @@ -8,23 +7,19 @@ import { Operation } from './operation'; import { Servers } from '../servers'; import { Server } from './server'; -import { bindings, hasDescription, description, extensions, hasExternalDocs, externalDocs, tags } from './mixins'; +import { CoreModel } from './mixins'; -import type { BindingsInterface } from '../bindings'; import type { ChannelInterface } from '../channel'; import type { ChannelParametersInterface } from '../channel-parameters'; -import type { ExtensionsInterface } from '../extensions'; -import type { ExternalDocumentationInterface } from '../external-documentation'; import type { MessagesInterface } from '../messages'; import type { OperationsInterface } from '../operations'; import type { OperationInterface } from '../operation'; import type { ServersInterface } from '../servers'; import type { ServerInterface } from '../server'; -import type { TagsInterface } from '../tags'; import type { v3 } from '../../spec-types'; -export class Channel extends BaseModel implements ChannelInterface { +export class Channel extends CoreModel implements ChannelInterface { id(): string { return this._meta.id; } @@ -33,22 +28,6 @@ export class Channel extends BaseModel impleme return this._json.address; } - hasDescription(): boolean { - return hasDescription(this); - } - - description(): string | undefined { - return description(this); - } - - hasExternalDocs(): boolean { - return hasExternalDocs(this); - } - - externalDocs(): ExternalDocumentationInterface | undefined { - return externalDocs(this); - } - servers(): ServersInterface { const servers: ServerInterface[] = []; const allowedServers = this._json.servers || []; @@ -95,16 +74,4 @@ export class Channel extends BaseModel impleme }) ); } - - tags(): TagsInterface { - return tags(this); - } - - bindings(): BindingsInterface { - return bindings(this); - } - - extensions(): ExtensionsInterface { - return extensions(this); - } } diff --git a/src/models/v3/message-trait.ts b/src/models/v3/message-trait.ts index 180c90fe7..e50e76d70 100644 --- a/src/models/v3/message-trait.ts +++ b/src/models/v3/message-trait.ts @@ -1,4 +1,3 @@ -import { BaseModel } from '../base'; import { CorrelationId } from './correlation-id'; import { MessageExamples } from '../message-examples'; import { MessageExample } from './message-example'; @@ -6,20 +5,16 @@ import { Schema } from './schema'; import { xParserMessageName } from '../../constants'; import { getDefaultSchemaFormat } from '../../schema-parser'; -import { bindings, hasDescription, description, extensions, hasExternalDocs, externalDocs, tags } from './mixins'; +import { CoreModel } from './mixins'; -import type { BindingsInterface } from '../bindings'; import type { CorrelationIdInterface } from '../correlation-id'; -import type { ExtensionsInterface } from '../extensions'; -import type { ExternalDocumentationInterface } from '../external-documentation'; import type { MessageExamplesInterface } from '../message-examples'; import type { MessageTraitInterface } from '../message-trait'; import type { SchemaInterface } from '../schema'; -import type { TagsInterface } from '../tags'; import type { v3 } from '../../spec-types'; -export class MessageTrait extends BaseModel implements MessageTraitInterface { +export class MessageTrait extends CoreModel implements MessageTraitInterface { id(): string { return this.messageId() || this._meta.id || this.extensions().get(xParserMessageName)?.value() as string; } @@ -70,38 +65,6 @@ export class MessageTrait { @@ -109,16 +72,4 @@ export class MessageTrait }>): BindingsInterface { +type BindingsObject = + | v3.ServerBindingsObject + | v3.ChannelBindingsObject + | v3.OperationBindingsObject + | v3.MessageBindingsObject + | v3.ReferenceObject; + +export interface CoreObject extends v3.SpecificationExtensions { + title?: string; + summary?: string; + description?: string; + externalDocs?: v3.ExternalDocumentationObject; + tags?: v3.TagsObject; + bindings?: BindingsObject; +} + +export abstract class CoreModel = {}> extends BaseModel { + hasTitle(): boolean { + return !!this._json.title; + } + + title(): string | undefined { + return this._json.title; + } + + hasSummary(): boolean { + return !!this._json.summary; + } + + summary(): string | undefined { + return this._json.summary; + } + + hasDescription(): boolean { + return hasDescription(this); + } + + description(): string | undefined { + return description(this); + } + + hasExternalDocs(): boolean { + return hasExternalDocs(this); + } + + externalDocs(): ExternalDocumentationInterface | undefined { + return externalDocs(this); + } + + tags(): TagsInterface { + return tags(this); + } + + bindings(): BindingsInterface { + return bindings(this); + } + + extensions(): ExtensionsInterface { + return extensions(this); + } +} + +export function bindings(model: BaseModel<{ bindings?: BindingsObject }>): BindingsInterface { const bindings = model.json('bindings') || {}; return new Bindings( Object.entries(bindings || {}).map(([protocol, binding]) => createModel(Binding, binding, { protocol, pointer: model.jsonPath(`bindings/${protocol}`) }, model) ), - { originalData: bindings, asyncapi: model.meta('asyncapi'), pointer: model.jsonPath('bindings') } + { originalData: bindings as Record, asyncapi: model.meta('asyncapi'), pointer: model.jsonPath('bindings') } ); } diff --git a/src/models/v3/operation-trait.ts b/src/models/v3/operation-trait.ts index 44a898ef8..b94c72188 100644 --- a/src/models/v3/operation-trait.ts +++ b/src/models/v3/operation-trait.ts @@ -1,19 +1,14 @@ -import { BaseModel } from '../base'; import { SecurityScheme } from './security-scheme'; import { SecurityRequirements } from '../security-requirements'; import { SecurityRequirement } from './security-requirement'; -import { bindings, hasDescription, description, extensions, hasExternalDocs, externalDocs, tags } from './mixins'; +import { CoreModel } from './mixins'; -import type { BindingsInterface } from '../bindings'; -import type { ExtensionsInterface } from '../extensions'; -import type { ExternalDocumentationInterface } from '../external-documentation'; import type { OperationTraitInterface } from '../operation-trait'; -import type { TagsInterface } from '../tags'; import type { v3 } from '../../spec-types'; -export class OperationTrait extends BaseModel implements OperationTraitInterface { +export class OperationTrait extends CoreModel implements OperationTraitInterface { id(): string | undefined { return this._meta.id; } @@ -22,30 +17,6 @@ export class OperationTrait; return (this._json.security || []).map((requirement, index) => { @@ -59,16 +30,4 @@ export class OperationTrait implements ServerInterface { +export class Server extends CoreModel implements ServerInterface { id(): string { return this._meta.id; } @@ -47,14 +43,6 @@ export class Server extends BaseModel implement return this._json.protocolVersion; } - hasDescription(): boolean { - return hasDescription(this); - } - - description(): string | undefined { - return description(this); - } - channels(): ChannelsInterface { const channels: ChannelInterface[] = []; Object.entries((this._meta.asyncapi?.parsed as v3.AsyncAPIObject)?.channels || {}).forEach(([channelName, channel]) => { @@ -127,16 +115,4 @@ export class Server extends BaseModel implement return new SecurityRequirements(requirements); }); } - - tags(): TagsInterface { - return tags(this); - } - - bindings(): BindingsInterface { - return bindings(this); - } - - extensions(): ExtensionsInterface { - return extensions(this); - } } diff --git a/test/models/v2/channel.spec.ts b/test/models/v2/channel.spec.ts index 2d3ea0258..b22bc611c 100644 --- a/test/models/v2/channel.spec.ts +++ b/test/models/v2/channel.spec.ts @@ -8,7 +8,7 @@ import { Message } from '../../../src/models/v2/message'; import { Servers } from '../../../src/models/servers'; import { Server } from '../../../src/models/v2/server'; -import { serializeInput, assertBindings, assertDescription, assertExtensions } from './utils'; +import { serializeInput, assertCoreModel } from './utils'; import type { v2 } from '../../../src/spec-types'; @@ -136,8 +136,6 @@ describe('Channel model', function() { }); describe('mixins', function() { - assertBindings(Channel); - assertDescription(Channel); - assertExtensions(Channel); + assertCoreModel(Channel); }); }); diff --git a/test/models/v2/message-trait.spec.ts b/test/models/v2/message-trait.spec.ts index e397b133c..2bb83fa97 100644 --- a/test/models/v2/message-trait.spec.ts +++ b/test/models/v2/message-trait.spec.ts @@ -4,7 +4,7 @@ import { MessageExample } from '../../../src/models/v2/message-example'; import { MessageTrait } from '../../../src/models/v2/message-trait'; import { Schema } from '../../../src/models/v2/schema'; -import { assertBindings, assertDescription, assertExtensions, assertExternalDocumentation, assertTags } from './utils'; +import { assertCoreModel } from './utils'; describe('MessageTrait model', function() { describe('.id()', function() { @@ -181,62 +181,6 @@ describe('MessageTrait model', function() { }); }); - describe('.hasTitle()', function() { - it('should return true when there is a value', function() { - const doc = { title: '...' }; - const d = new MessageTrait(doc); - expect(d.hasTitle()).toEqual(true); - }); - - it('should return false when there is no value', function() { - const doc = {}; - const d = new MessageTrait(doc); - expect(d.hasTitle()).toEqual(false); - }); - }); - - describe('.title()', function() { - it('should return the value', function() { - const doc = { title: '...' }; - const d = new MessageTrait(doc); - expect(d.title()).toEqual(doc.title); - }); - - it('should return undefined when there is no value', function() { - const doc = {}; - const d = new MessageTrait(doc); - expect(d.title()).toBeUndefined(); - }); - }); - - describe('.hasSummary()', function() { - it('should return true when there is a value', function() { - const doc = { summary: '...' }; - const d = new MessageTrait(doc); - expect(d.hasSummary()).toEqual(true); - }); - - it('should return false when there is no value', function() { - const doc = {}; - const d = new MessageTrait(doc); - expect(d.hasSummary()).toEqual(false); - }); - }); - - describe('.summary()', function() { - it('should return the value', function() { - const doc = { summary: '...' }; - const d = new MessageTrait(doc); - expect(d.summary()).toEqual(doc.summary); - }); - - it('should return undefined when there is no value', function() { - const doc = {}; - const d = new MessageTrait(doc); - expect(d.summary()).toBeUndefined(); - }); - }); - describe('.examples()', function() { it('should return collection of examples', function() { const doc = { examples: [{ name: '...' }] }; @@ -255,10 +199,6 @@ describe('MessageTrait model', function() { }); describe('mixins', function() { - assertBindings(MessageTrait); - assertDescription(MessageTrait); - assertExtensions(MessageTrait); - assertExternalDocumentation(MessageTrait); - assertTags(MessageTrait); + assertCoreModel(MessageTrait); }); }); diff --git a/test/models/v2/message.spec.ts b/test/models/v2/message.spec.ts index c1ca1885c..fb68ea821 100644 --- a/test/models/v2/message.spec.ts +++ b/test/models/v2/message.spec.ts @@ -9,7 +9,7 @@ import { Schema } from '../../../src/models/v2/schema'; import { Servers } from '../../../src/models/servers'; import { Server } from '../../../src/models/v2/server'; -import { assertBindings, assertDescription, assertExtensions, assertExternalDocumentation, assertTags } from './utils'; +import { assertCoreModel } from './utils'; describe('Message model', function() { describe('.id()', function() { @@ -181,10 +181,6 @@ describe('Message model', function() { }); describe('mixins', function() { - assertBindings(Message); - assertDescription(Message); - assertExtensions(Message); - assertExternalDocumentation(Message); - assertTags(Message); + assertCoreModel(Message); }); }); diff --git a/test/models/v2/operation-trait.spec.ts b/test/models/v2/operation-trait.spec.ts index 149d93f25..0522be384 100644 --- a/test/models/v2/operation-trait.spec.ts +++ b/test/models/v2/operation-trait.spec.ts @@ -3,7 +3,7 @@ import { SecurityRequirement } from '../../../src/models/v2/security-requirement import { SecurityRequirements } from '../../../src/models/security-requirements'; import { SecurityScheme } from '../../../src/models/v2/security-scheme'; -import { assertBindings, assertDescription, assertExtensions, assertExternalDocumentation, assertTags } from './utils'; +import { assertCoreModel } from './utils'; describe('OperationTrait model', function() { describe('.id()', function() { @@ -34,34 +34,6 @@ describe('OperationTrait model', function() { }); }); - describe('.hasSummary()', function() { - it('should return true when there is a value', function() { - const doc = { summary: '...' }; - const d = new OperationTrait(doc); - expect(d.hasSummary()).toEqual(true); - }); - - it('should return false when there is no value', function() { - const doc = {}; - const d = new OperationTrait(doc); - expect(d.hasSummary()).toEqual(false); - }); - }); - - describe('.summary()', function() { - it('should return the value', function() { - const doc = { summary: '...' }; - const d = new OperationTrait(doc); - expect(d.summary()).toEqual(doc.summary); - }); - - it('should return undefined when there is no value', function() { - const doc = {}; - const d = new OperationTrait(doc); - expect(d.summary()).toBeUndefined(); - }); - }); - describe('.security()', function() { it('should return collection of security requirements', function() { const doc = { security: [{ requirement: [] }] }; @@ -88,10 +60,6 @@ describe('OperationTrait model', function() { }); describe('mixins', function() { - assertBindings(OperationTrait); - assertDescription(OperationTrait); - assertExtensions(OperationTrait); - assertExternalDocumentation(OperationTrait); - assertTags(OperationTrait); + assertCoreModel(OperationTrait); }); }); diff --git a/test/models/v2/operation.spec.ts b/test/models/v2/operation.spec.ts index 1a0c627d9..42689d14a 100644 --- a/test/models/v2/operation.spec.ts +++ b/test/models/v2/operation.spec.ts @@ -8,7 +8,7 @@ import { Message } from '../../../src/models/v2/message'; import { Servers } from '../../../src/models/servers'; import { Server } from '../../../src/models/v2/server'; -import { assertBindings, assertDescription, assertExtensions, assertExternalDocumentation, assertTags } from './utils'; +import { assertCoreModel } from './utils'; describe('Operation model', function() { describe('.id()', function() { @@ -163,10 +163,6 @@ describe('Operation model', function() { }); describe('mixins', function() { - assertBindings(Operation); - assertDescription(Operation); - assertExtensions(Operation); - assertExternalDocumentation(Operation); - assertTags(Operation); + assertCoreModel(Operation); }); }); diff --git a/test/models/v2/server.spec.ts b/test/models/v2/server.spec.ts index 0da5db926..28ec854ef 100644 --- a/test/models/v2/server.spec.ts +++ b/test/models/v2/server.spec.ts @@ -10,7 +10,7 @@ import { SecurityScheme } from '../../../src/models/v2/security-scheme'; import { SecurityRequirements } from '../../../src/models/security-requirements'; import { SecurityRequirement } from '../../../src/models/v2/security-requirement'; -import { serializeInput, assertBindings, assertDescription, assertExtensions } from './utils'; +import { serializeInput, assertCoreModel } from './utils'; import type { v2 } from '../../../src/spec-types'; @@ -206,9 +206,7 @@ describe('Server Model', function () { }); }); - describe('mixins inheritance', function () { - assertBindings(Server); - assertDescription(Server); - assertExtensions(Server); + describe('mixins', function () { + assertCoreModel(Server); }); }); diff --git a/test/models/v2/utils.ts b/test/models/v2/utils.ts index 38db79245..af4a8d9b5 100644 --- a/test/models/v2/utils.ts +++ b/test/models/v2/utils.ts @@ -1,7 +1,7 @@ import { BindingsV2, ExtensionsV2, ExternalDocumentationV2, TagsV2 } from '../../../src/models/v2'; import type { Constructor } from '../../../src/models/utils'; -import type { BindingsMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface, ExternalDocumentationMixinInterface, TagsMixinInterface } from '../../../src/models/mixins'; +import type { BindingsMixinInterface, CoreMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface, ExternalDocumentationMixinInterface, SummaryMixinInterface, TagsMixinInterface, TitleMixinInterface } from '../../../src/models/mixins'; type DeepPartial = T extends object ? { [P in keyof T]?: DeepPartial } : T; @@ -126,6 +126,41 @@ export function assertExternalDocumentation(model: Constructor) { + describe('.hasSummary()', () => { + const doc1 = { summary: 'Testing' }; + const doc2 = { summary: '' }; + const doc3 = {}; + const d1 = new model(doc1); + const d2 = new model(doc2); + const d3 = new model(doc3); + + it('should return a boolean indicating if the object has summary', () => { + expect(d1.hasSummary()).toEqual(true); + expect(d2.hasSummary()).toEqual(false); + expect(d3.hasSummary()).toEqual(false); + }); + }); + + describe('.summary()', () => { + const doc1 = { summary: 'Testing' }; + const doc2 = { summary: '' }; + const doc3 = {}; + const d1 = new model(doc1); + const d2 = new model(doc2); + const d3 = new model(doc3); + + it('should return a value', () => { + expect(d1.summary()).toEqual(doc1.summary); + expect(d2.summary()).toEqual(''); + }); + + it('should return an undefined', () => { + expect(d3.summary()).toEqual(undefined); + }); + }); +} + export function assertTags(model: Constructor) { describe('tags', () => { const doc1 = { tags: [{ name: 'test1' }, { name: 'test2' }] }; @@ -147,4 +182,49 @@ export function assertTags(model: Constructor) { expect(d3.tags().length).toEqual(0); }); }); -} \ No newline at end of file +} + +export function assertTitle(model: Constructor) { + describe('.hasTitle()', () => { + const doc1 = { title: 'Testing' }; + const doc2 = { title: '' }; + const doc3 = {}; + const d1 = new model(doc1); + const d2 = new model(doc2); + const d3 = new model(doc3); + + it('should return a boolean indicating if the object has title', () => { + expect(d1.hasTitle()).toEqual(true); + expect(d2.hasTitle()).toEqual(false); + expect(d3.hasTitle()).toEqual(false); + }); + }); + + describe('.title()', () => { + const doc1 = { title: 'Testing' }; + const doc2 = { title: '' }; + const doc3 = {}; + const d1 = new model(doc1); + const d2 = new model(doc2); + const d3 = new model(doc3); + + it('should return a value', () => { + expect(d1.title()).toEqual(doc1.title); + expect(d2.title()).toEqual(''); + }); + + it('should return an undefined', () => { + expect(d3.title()).toEqual(undefined); + }); + }); +} + +export function assertCoreModel(model: Constructor) { + assertBindings(model); + assertDescription(model); + assertExtensions(model); + assertExternalDocumentation(model); + assertSummary(model); + assertTags(model); + assertTitle(model); +} diff --git a/test/models/v3/channel.spec.ts b/test/models/v3/channel.spec.ts index 71e0a5904..ef424f515 100644 --- a/test/models/v3/channel.spec.ts +++ b/test/models/v3/channel.spec.ts @@ -8,7 +8,7 @@ import { Message } from '../../../src/models/v3/message'; import { Servers } from '../../../src/models/servers'; import { Server } from '../../../src/models/v3/server'; -import { serializeInput, assertBindings, assertDescription, assertExtensions } from './utils'; +import { serializeInput, assertCoreModel } from './utils'; import type { v3 } from '../../../src/spec-types'; @@ -132,8 +132,6 @@ describe('Channel model', function() { }); describe('mixins', function() { - assertBindings(Channel); - assertDescription(Channel); - assertExtensions(Channel); + assertCoreModel(Channel); }); }); diff --git a/test/models/v3/message-trait.spec.ts b/test/models/v3/message-trait.spec.ts index 3c83731e6..1e0c22119 100644 --- a/test/models/v3/message-trait.spec.ts +++ b/test/models/v3/message-trait.spec.ts @@ -4,7 +4,7 @@ import { MessageExample } from '../../../src/models/v3/message-example'; import { MessageTrait } from '../../../src/models/v3/message-trait'; import { Schema } from '../../../src/models/v3/schema'; -import { assertBindings, assertDescription, assertExtensions, assertExternalDocumentation, assertTags } from './utils'; +import { assertCoreModel } from './utils'; describe('MessageTrait model', function() { describe('.id()', function() { @@ -181,62 +181,6 @@ describe('MessageTrait model', function() { }); }); - describe('.hasTitle()', function() { - it('should return true when there is a value', function() { - const doc = { title: '...' }; - const d = new MessageTrait(doc); - expect(d.hasTitle()).toEqual(true); - }); - - it('should return false when there is no value', function() { - const doc = {}; - const d = new MessageTrait(doc); - expect(d.hasTitle()).toEqual(false); - }); - }); - - describe('.title()', function() { - it('should return the value', function() { - const doc = { title: '...' }; - const d = new MessageTrait(doc); - expect(d.title()).toEqual(doc.title); - }); - - it('should return undefined when there is no value', function() { - const doc = {}; - const d = new MessageTrait(doc); - expect(d.title()).toBeUndefined(); - }); - }); - - describe('.hasSummary()', function() { - it('should return true when there is a value', function() { - const doc = { summary: '...' }; - const d = new MessageTrait(doc); - expect(d.hasSummary()).toEqual(true); - }); - - it('should return false when there is no value', function() { - const doc = {}; - const d = new MessageTrait(doc); - expect(d.hasSummary()).toEqual(false); - }); - }); - - describe('.summary()', function() { - it('should return the value', function() { - const doc = { summary: '...' }; - const d = new MessageTrait(doc); - expect(d.summary()).toEqual(doc.summary); - }); - - it('should return undefined when there is no value', function() { - const doc = {}; - const d = new MessageTrait(doc); - expect(d.summary()).toBeUndefined(); - }); - }); - describe('.examples()', function() { it('should return collection of examples', function() { const doc = { examples: [{ name: '...' }] }; @@ -255,10 +199,6 @@ describe('MessageTrait model', function() { }); describe('mixins', function() { - assertBindings(MessageTrait); - assertDescription(MessageTrait); - assertExtensions(MessageTrait); - assertExternalDocumentation(MessageTrait); - assertTags(MessageTrait); + assertCoreModel(MessageTrait); }); }); diff --git a/test/models/v3/message.spec.ts b/test/models/v3/message.spec.ts index 4b4c8d78c..82e72ee17 100644 --- a/test/models/v3/message.spec.ts +++ b/test/models/v3/message.spec.ts @@ -9,7 +9,7 @@ import { Schema } from '../../../src/models/v3/schema'; import { Servers } from '../../../src/models/servers'; import { Server } from '../../../src/models/v3/server'; -import { assertBindings, assertDescription, assertExtensions, assertExternalDocumentation, assertTags } from './utils'; +import { assertCoreModel } from './utils'; describe('Message model', function() { describe('.id()', function() { @@ -181,10 +181,6 @@ describe('Message model', function() { }); describe('mixins', function() { - assertBindings(Message); - assertDescription(Message); - assertExtensions(Message); - assertExternalDocumentation(Message); - assertTags(Message); + assertCoreModel(Message); }); }); diff --git a/test/models/v3/operation-trait.spec.ts b/test/models/v3/operation-trait.spec.ts index 43d17acee..e5f871e1c 100644 --- a/test/models/v3/operation-trait.spec.ts +++ b/test/models/v3/operation-trait.spec.ts @@ -3,7 +3,7 @@ import { SecurityRequirement } from '../../../src/models/v3/security-requirement import { SecurityRequirements } from '../../../src/models/security-requirements'; import { SecurityScheme } from '../../../src/models/v3/security-scheme'; -import { assertBindings, assertDescription, assertExtensions, assertExternalDocumentation, assertTags } from './utils'; +import { assertCoreModel } from './utils'; describe('OperationTrait model', function() { describe('.id()', function() { @@ -32,34 +32,6 @@ describe('OperationTrait model', function() { }); }); - describe('.hasSummary()', function() { - it('should return true when there is a value', function() { - const doc = { summary: '...' }; - const d = new OperationTrait(doc); - expect(d.hasSummary()).toEqual(true); - }); - - it('should return false when there is no value', function() { - const doc = {}; - const d = new OperationTrait(doc); - expect(d.hasSummary()).toEqual(false); - }); - }); - - describe('.summary()', function() { - it('should return the value', function() { - const doc = { summary: '...' }; - const d = new OperationTrait(doc); - expect(d.summary()).toEqual(doc.summary); - }); - - it('should return undefined when there is no value', function() { - const doc = {}; - const d = new OperationTrait(doc); - expect(d.summary()).toBeUndefined(); - }); - }); - describe('.security()', function() { it('should return collection of security requirements', function() { const doc = { security: [{ requirement: [] }] }; @@ -86,10 +58,6 @@ describe('OperationTrait model', function() { }); describe('mixins', function() { - assertBindings(OperationTrait); - assertDescription(OperationTrait); - assertExtensions(OperationTrait); - assertExternalDocumentation(OperationTrait); - assertTags(OperationTrait); + assertCoreModel(OperationTrait); }); }); diff --git a/test/models/v3/operation.spec.ts b/test/models/v3/operation.spec.ts index bea5f06ae..6096e388d 100644 --- a/test/models/v3/operation.spec.ts +++ b/test/models/v3/operation.spec.ts @@ -8,7 +8,7 @@ import { Message } from '../../../src/models/v3/message'; import { Servers } from '../../../src/models/servers'; import { Server } from '../../../src/models/v3/server'; -import { assertBindings, assertDescription, assertExtensions, assertExternalDocumentation, assertTags } from './utils'; +import { assertCoreModel } from './utils'; describe('Operation model', function() { describe('.id()', function() { @@ -124,10 +124,6 @@ describe('Operation model', function() { }); describe('mixins', function() { - assertBindings(Operation); - assertDescription(Operation); - assertExtensions(Operation); - assertExternalDocumentation(Operation); - assertTags(Operation); + assertCoreModel(Operation); }); }); diff --git a/test/models/v3/server.spec.ts b/test/models/v3/server.spec.ts index 354d60409..454927b65 100644 --- a/test/models/v3/server.spec.ts +++ b/test/models/v3/server.spec.ts @@ -10,7 +10,7 @@ import { SecurityScheme } from '../../../src/models/v3/security-scheme'; import { SecurityRequirements } from '../../../src/models/security-requirements'; import { SecurityRequirement } from '../../../src/models/v3/security-requirement'; -import { serializeInput, assertBindings, assertDescription, assertExtensions } from './utils'; +import { serializeInput, assertCoreModel } from './utils'; import type { v3 } from '../../../src/spec-types'; @@ -198,9 +198,7 @@ describe('Server Model', function () { }); }); - describe('mixins inheritance', function () { - assertBindings(Server); - assertDescription(Server); - assertExtensions(Server); + describe('mixins', function () { + assertCoreModel(Server); }); }); diff --git a/test/models/v3/utils.ts b/test/models/v3/utils.ts index ee1f2750d..e2392e08f 100644 --- a/test/models/v3/utils.ts +++ b/test/models/v3/utils.ts @@ -1,7 +1,7 @@ import { BindingsV3, ExtensionsV3, ExternalDocumentationV3, TagsV3 } from '../../../src/models/v3'; import type { Constructor } from '../../../src/models/utils'; -import type { BindingsMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface, ExternalDocumentationMixinInterface, TagsMixinInterface } from '../../../src/models/mixins'; +import type { BindingsMixinInterface, CoreMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface, ExternalDocumentationMixinInterface, SummaryMixinInterface, TagsMixinInterface, TitleMixinInterface } from '../../../src/models/mixins'; type DeepPartial = T extends object ? { [P in keyof T]?: DeepPartial } : T; @@ -126,6 +126,41 @@ export function assertExternalDocumentation(model: Constructor) { + describe('.hasSummary()', () => { + const doc1 = { summary: 'Testing' }; + const doc2 = { summary: '' }; + const doc3 = {}; + const d1 = new model(doc1); + const d2 = new model(doc2); + const d3 = new model(doc3); + + it('should return a boolean indicating if the object has summary', () => { + expect(d1.hasSummary()).toEqual(true); + expect(d2.hasSummary()).toEqual(false); + expect(d3.hasSummary()).toEqual(false); + }); + }); + + describe('.summary()', () => { + const doc1 = { summary: 'Testing' }; + const doc2 = { summary: '' }; + const doc3 = {}; + const d1 = new model(doc1); + const d2 = new model(doc2); + const d3 = new model(doc3); + + it('should return a value', () => { + expect(d1.summary()).toEqual(doc1.summary); + expect(d2.summary()).toEqual(''); + }); + + it('should return an undefined', () => { + expect(d3.summary()).toEqual(undefined); + }); + }); +} + export function assertTags(model: Constructor) { describe('tags', () => { const doc1 = { tags: [{ name: 'test1' }, { name: 'test2' }] }; @@ -147,4 +182,49 @@ export function assertTags(model: Constructor) { expect(d3.tags().length).toEqual(0); }); }); -} \ No newline at end of file +} + +export function assertTitle(model: Constructor) { + describe('.hasTitle()', () => { + const doc1 = { title: 'Testing' }; + const doc2 = { title: '' }; + const doc3 = {}; + const d1 = new model(doc1); + const d2 = new model(doc2); + const d3 = new model(doc3); + + it('should return a boolean indicating if the object has title', () => { + expect(d1.hasTitle()).toEqual(true); + expect(d2.hasTitle()).toEqual(false); + expect(d3.hasTitle()).toEqual(false); + }); + }); + + describe('.title()', () => { + const doc1 = { title: 'Testing' }; + const doc2 = { title: '' }; + const doc3 = {}; + const d1 = new model(doc1); + const d2 = new model(doc2); + const d3 = new model(doc3); + + it('should return a value', () => { + expect(d1.title()).toEqual(doc1.title); + expect(d2.title()).toEqual(''); + }); + + it('should return an undefined', () => { + expect(d3.title()).toEqual(undefined); + }); + }); +} + +export function assertCoreModel(model: Constructor) { + assertBindings(model); + assertDescription(model); + assertExtensions(model); + assertExternalDocumentation(model); + assertSummary(model); + assertTags(model); + assertTitle(model); +}