From c8d4bbecc1dcb10c63ecb17cb7fec349ec1a55ba Mon Sep 17 00:00:00 2001 From: souvik Date: Mon, 28 Mar 2022 09:29:50 +0530 Subject: [PATCH 1/4] refactor: port server-variable model to ts --- src/models/server-variable.ts | 11 +++++++++++ src/models/server-variables.ts | 4 ++++ src/models/v2/server-variable.ts | 28 ++++++++++++++++++++++++++++ src/models/v2/server-variables.ts | 15 +++++++++++++++ 4 files changed, 58 insertions(+) create mode 100644 src/models/server-variable.ts create mode 100644 src/models/server-variables.ts create mode 100644 src/models/v2/server-variable.ts create mode 100644 src/models/v2/server-variables.ts diff --git a/src/models/server-variable.ts b/src/models/server-variable.ts new file mode 100644 index 000000000..c198d3b6c --- /dev/null +++ b/src/models/server-variable.ts @@ -0,0 +1,11 @@ +import {BaseModel} from './base'; +import { DescriptionMixinInterface, ExtensionsMixinInterface } from './mixins'; + +export interface ServerVariableInterface extends BaseModel, DescriptionMixinInterface, ExtensionsMixinInterface { + id(): string; + hasDefaultValue(): boolean; + defaultValue(): string | undefined; + hasAllowedValue(): boolean; + allowedValue(): string | undefined; + examples(): Array +} \ No newline at end of file diff --git a/src/models/server-variables.ts b/src/models/server-variables.ts new file mode 100644 index 000000000..4a908a830 --- /dev/null +++ b/src/models/server-variables.ts @@ -0,0 +1,4 @@ +import { Collection } from './collection'; +import { ServerVariableInterface } from './server-variable'; + +export interface ServerVariablesInterface extends Collection { } \ No newline at end of file diff --git a/src/models/v2/server-variable.ts b/src/models/v2/server-variable.ts new file mode 100644 index 000000000..25412e6d2 --- /dev/null +++ b/src/models/v2/server-variable.ts @@ -0,0 +1,28 @@ +import { BaseModel } from '../base'; +import { Mixin } from '../utils'; +import { ServerVariableInterface } from '../server-variable'; +import { DescriptionMixin } from './mixins/description'; +import { ExtensionsMixin } from './mixins/extensions'; + + +export class ServerVariable extends Mixin(BaseModel, DescriptionMixin, ExtensionsMixin) implements ServerVariableInterface { + id(): string { + throw new Error('Method not implemented.'); + } + hasDefaultValue(): boolean { + return !!this._json.default + } + defaultValue(): string | undefined { + return this._json.default; + } + hasAllowedValue(): boolean { + throw new Error('Method not implemented.'); + } + allowedValue(): string | undefined { + throw new Error('Method not implemented.'); + } + examples(): string[] { + return this._json.examples + } + +} \ No newline at end of file diff --git a/src/models/v2/server-variables.ts b/src/models/v2/server-variables.ts new file mode 100644 index 000000000..b61cb55d0 --- /dev/null +++ b/src/models/v2/server-variables.ts @@ -0,0 +1,15 @@ +import { ServerVariablesInterface } from '../server-variables'; +import { Collection } from '../collection'; +import { ServerVariableInterface } from '../server-variable'; + +export class ServerVariables extends Collection implements ServerVariablesInterface { + get(id: string): ServerVariableInterface | undefined { + return this.collections.find(serverVariable => serverVariable.id() === id); + } + + has(id: string): boolean { + return this.collections.some(serverVariable => serverVariable.id() === id); + } + +} + From a635dba8bd81a964798d2d1b21d914f08d6e167b Mon Sep 17 00:00:00 2001 From: souvik Date: Mon, 28 Mar 2022 10:33:37 +0530 Subject: [PATCH 2/4] chore: add test --- src/models/v2/server-variable.ts | 11 +++++++++-- src/models/v3/server-variable.ts | 28 ++++++++++++++++++++++++++++ src/models/v3/server-variables.ts | 14 ++++++++++++++ test/models/v2/server-variable.ts | 25 +++++++++++++++++++++++++ 4 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 src/models/v3/server-variable.ts create mode 100644 src/models/v3/server-variables.ts create mode 100644 test/models/v2/server-variable.ts diff --git a/src/models/v2/server-variable.ts b/src/models/v2/server-variable.ts index 25412e6d2..2eeedccbf 100644 --- a/src/models/v2/server-variable.ts +++ b/src/models/v2/server-variable.ts @@ -1,4 +1,4 @@ -import { BaseModel } from '../base'; +import { BaseModel, ModelMetadata } from '../base'; import { Mixin } from '../utils'; import { ServerVariableInterface } from '../server-variable'; import { DescriptionMixin } from './mixins/description'; @@ -6,8 +6,15 @@ import { ExtensionsMixin } from './mixins/extensions'; export class ServerVariable extends Mixin(BaseModel, DescriptionMixin, ExtensionsMixin) implements ServerVariableInterface { + constructor( + private readonly _id: string, + _json: Record, + _meta: ModelMetadata = {} as any + ){ + super(_json, _meta); + } id(): string { - throw new Error('Method not implemented.'); + return this._id; } hasDefaultValue(): boolean { return !!this._json.default diff --git a/src/models/v3/server-variable.ts b/src/models/v3/server-variable.ts new file mode 100644 index 000000000..25412e6d2 --- /dev/null +++ b/src/models/v3/server-variable.ts @@ -0,0 +1,28 @@ +import { BaseModel } from '../base'; +import { Mixin } from '../utils'; +import { ServerVariableInterface } from '../server-variable'; +import { DescriptionMixin } from './mixins/description'; +import { ExtensionsMixin } from './mixins/extensions'; + + +export class ServerVariable extends Mixin(BaseModel, DescriptionMixin, ExtensionsMixin) implements ServerVariableInterface { + id(): string { + throw new Error('Method not implemented.'); + } + hasDefaultValue(): boolean { + return !!this._json.default + } + defaultValue(): string | undefined { + return this._json.default; + } + hasAllowedValue(): boolean { + throw new Error('Method not implemented.'); + } + allowedValue(): string | undefined { + throw new Error('Method not implemented.'); + } + examples(): string[] { + return this._json.examples + } + +} \ No newline at end of file diff --git a/src/models/v3/server-variables.ts b/src/models/v3/server-variables.ts new file mode 100644 index 000000000..037cf7540 --- /dev/null +++ b/src/models/v3/server-variables.ts @@ -0,0 +1,14 @@ +import { ServerVariablesInterface } from '../server-variables'; +import { Collection } from '../collection'; +import { ServerVariableInterface } from '../server-variable'; + +export class ServerVariables extends Collection implements ServerVariablesInterface { + get(id: string): ServerVariableInterface | undefined { + return this.collections.find(serverVariable => serverVariable.id() === id); + } + + has(id: string): boolean { + return this.collections.some(serverVariable => serverVariable.id() === id); + } + +} \ No newline at end of file diff --git a/test/models/v2/server-variable.ts b/test/models/v2/server-variable.ts new file mode 100644 index 000000000..e535bde4f --- /dev/null +++ b/test/models/v2/server-variable.ts @@ -0,0 +1,25 @@ +import {ServerVariable} from '../../../src/models/v2/server-variable'; + +const doc = { + default: 'demo', +} + +const sv = new ServerVariable('username', doc); + +describe('server variable ', function() { + describe('.id()', function() { + expect(sv.id()).toMatch('username'); + }) + + describe('.hasDefaultValue()', function() { + it('should return true if default value is passed', function(){ + expect(sv.hasDefaultValue()).toBeTruthy(); + }) + }) + + describe('.defaultValue()', function(){ + it('shoudl return default value', function() { + expect(sv.defaultValue()).toMatch(doc.default); + }) + }) +}) \ No newline at end of file From f7246c6796d948e0a0103c04198eb9e55682706a Mon Sep 17 00:00:00 2001 From: souvik Date: Tue, 29 Mar 2022 10:29:15 +0530 Subject: [PATCH 3/4] feat: add server-variable object to server object --- src/models/server-variable.ts | 2 +- src/models/server.ts | 2 ++ src/models/v2/server-variable.ts | 6 +++--- src/models/v2/server.ts | 14 ++++++++++++++ src/models/v3/server-variable.ts | 6 +++--- src/models/v3/server.ts | 14 ++++++++++++++ test/models/v2/server-variable.ts | 22 ++++++++++++++++++---- test/models/v2/server.spec.ts | 15 ++++++++++++++- 8 files changed, 69 insertions(+), 12 deletions(-) diff --git a/src/models/server-variable.ts b/src/models/server-variable.ts index c198d3b6c..0f49d4150 100644 --- a/src/models/server-variable.ts +++ b/src/models/server-variable.ts @@ -6,6 +6,6 @@ export interface ServerVariableInterface extends BaseModel, DescriptionMixinInte hasDefaultValue(): boolean; defaultValue(): string | undefined; hasAllowedValue(): boolean; - allowedValue(): string | undefined; + allowedValue(): any[] examples(): Array } \ No newline at end of file diff --git a/src/models/server.ts b/src/models/server.ts index 70576066b..92bfc0050 100644 --- a/src/models/server.ts +++ b/src/models/server.ts @@ -1,5 +1,6 @@ import type { BaseModel } from "./base"; import type { BindingsMixinInterface, DescriptionMixinInterface, ExtensionsMixinInterface } from './mixins'; +import { ServerVariablesInterface } from "./server-variables"; export interface ServerInterface extends BaseModel, DescriptionMixinInterface, BindingsMixinInterface, ExtensionsMixinInterface { id(): string @@ -7,4 +8,5 @@ export interface ServerInterface extends BaseModel, DescriptionMixinInterface, B protocol(): string | undefined; protocolVersion(): string; hasProtocolVersion(): boolean; + variables(): ServerVariablesInterface } \ No newline at end of file diff --git a/src/models/v2/server-variable.ts b/src/models/v2/server-variable.ts index 2eeedccbf..9325a10fc 100644 --- a/src/models/v2/server-variable.ts +++ b/src/models/v2/server-variable.ts @@ -23,10 +23,10 @@ export class ServerVariable extends Mixin(BaseModel, DescriptionMixin, Extension return this._json.default; } hasAllowedValue(): boolean { - throw new Error('Method not implemented.'); + return !!this._json.enum; } - allowedValue(): string | undefined { - throw new Error('Method not implemented.'); + allowedValue(): any[] { + return this._json.enum; } examples(): string[] { return this._json.examples diff --git a/src/models/v2/server.ts b/src/models/v2/server.ts index 672af9696..21ef5bffc 100644 --- a/src/models/v2/server.ts +++ b/src/models/v2/server.ts @@ -7,6 +7,9 @@ import { ExtensionsMixin } from './mixins/extensions'; import type { ModelMetadata } from "../base"; import type { ServerInterface } from '../server'; +import { ServerVariablesInterface } from '../server-variables'; +import { ServerVariables } from './server-variables'; +import { ServerVariable } from './server-variable'; export class Server extends Mixin(BaseModel, BindingsMixin, DescriptionMixin, ExtensionsMixin) implements ServerInterface { constructor( @@ -36,4 +39,15 @@ export class Server extends Mixin(BaseModel, BindingsMixin, DescriptionMixin, Ex protocolVersion(): string { return this._json.protocolVersion; } + + variables(): ServerVariablesInterface { + return new ServerVariables( + Object.entries( + this._json.variables + ).map( + ([serverVariableName, serverVariable]) => this.createModel( + ServerVariable, serverVariable, { id: serverVariableName, pointer: `variables/${serverVariableName}` } + ) + )) + } } \ No newline at end of file diff --git a/src/models/v3/server-variable.ts b/src/models/v3/server-variable.ts index 25412e6d2..1f931e83f 100644 --- a/src/models/v3/server-variable.ts +++ b/src/models/v3/server-variable.ts @@ -16,10 +16,10 @@ export class ServerVariable extends Mixin(BaseModel, DescriptionMixin, Extension return this._json.default; } hasAllowedValue(): boolean { - throw new Error('Method not implemented.'); + return !!this._json.enum } - allowedValue(): string | undefined { - throw new Error('Method not implemented.'); + allowedValue(): any[] { + return this._json.enum } examples(): string[] { return this._json.examples diff --git a/src/models/v3/server.ts b/src/models/v3/server.ts index 672af9696..c3b7bd039 100644 --- a/src/models/v3/server.ts +++ b/src/models/v3/server.ts @@ -4,6 +4,9 @@ import { Mixin } from '../utils'; import { BindingsMixin } from './mixins/bindings'; import { DescriptionMixin } from './mixins/description'; import { ExtensionsMixin } from './mixins/extensions'; +import {ServerVariable} from './server-variable'; +import {ServerVariables} from './server-variables'; +import {ServerVariablesInterface} from '../server-variables'; import type { ModelMetadata } from "../base"; import type { ServerInterface } from '../server'; @@ -36,4 +39,15 @@ export class Server extends Mixin(BaseModel, BindingsMixin, DescriptionMixin, Ex protocolVersion(): string { return this._json.protocolVersion; } + + variables(): ServerVariablesInterface { + return new ServerVariables( + Object.entries( + this._json.variables + ).map( + ([serverVariableName, serverVariable]) => this.createModel( + ServerVariable, serverVariable, { id: serverVariableName, pointer: `variables/${serverVariableName}` } + ) + )) + } } \ No newline at end of file diff --git a/test/models/v2/server-variable.ts b/test/models/v2/server-variable.ts index e535bde4f..4ff3fef4d 100644 --- a/test/models/v2/server-variable.ts +++ b/test/models/v2/server-variable.ts @@ -1,14 +1,16 @@ import {ServerVariable} from '../../../src/models/v2/server-variable'; const doc = { - default: 'demo', + description: 'Secure connection (TLS) is available through port 8883.', + default: '1883', + enum: ['1883', '8883'] } -const sv = new ServerVariable('username', doc); +const sv = new ServerVariable('doc', doc); describe('server variable ', function() { describe('.id()', function() { - expect(sv.id()).toMatch('username'); + expect(sv.id()).toMatch('doc'); }) describe('.hasDefaultValue()', function() { @@ -18,8 +20,20 @@ describe('server variable ', function() { }) describe('.defaultValue()', function(){ - it('shoudl return default value', function() { + it('should return default value', function() { expect(sv.defaultValue()).toMatch(doc.default); }) }) + + describe('.hasAllowedValue()', function() { + it('should return true when enum is passed', function(){ + expect(sv.hasAllowedValue()).toBeTruthy(); + }) + }) + + describe('.allowedValue()', function(){ + it('should return enum object', function(){ + expect(sv.allowedValue()).toEqual(doc.enum) + }) + }) }) \ No newline at end of file diff --git a/test/models/v2/server.spec.ts b/test/models/v2/server.spec.ts index 3a43ee1da..b1f04a4db 100644 --- a/test/models/v2/server.spec.ts +++ b/test/models/v2/server.spec.ts @@ -1,4 +1,5 @@ import { Server } from '../../../src/models/v2/server'; +import {ServerVariables} from '../../../src/models/v2/server-variables'; import { assertDescriptionMixinInheritance, @@ -9,7 +10,13 @@ const doc = { 'development': { protocol: 'mqtt', protocolVersion: '1.0.0', - url: 'development.gigantic-server.com' + url: 'development.gigantic-server.com', + variables: { + username: { + default: 'demo', + description: 'This value is assigned by the service provider, in this example `gigantic-server.com`' + } + } } }; const docItem = new Server('development', doc.development); @@ -54,6 +61,12 @@ describe('Server Model', function () { }); }); + describe('.servers()', function(){ + it('should return ServerVariables object', function(){ + expect(docItem.variables() instanceof ServerVariables).toBeTruthy(); + }) + }) + describe('mixins inheritance', function() { assertDescriptionMixinInheritance(Server); assertExtensionsMixinInheritance(Server); From 0e19010346597a0955fe19db9c14b4b26ed4833a Mon Sep 17 00:00:00 2001 From: Souvikns Date: Fri, 1 Apr 2022 19:14:43 +0530 Subject: [PATCH 4/4] refactor: add requested changes --- src/models/v2/server.ts | 5 ++++- src/models/v3/server.ts | 11 +++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/models/v2/server.ts b/src/models/v2/server.ts index 21ef5bffc..53ac4f6a1 100644 --- a/src/models/v2/server.ts +++ b/src/models/v2/server.ts @@ -46,7 +46,10 @@ export class Server extends Mixin(BaseModel, BindingsMixin, DescriptionMixin, Ex this._json.variables ).map( ([serverVariableName, serverVariable]) => this.createModel( - ServerVariable, serverVariable, { id: serverVariableName, pointer: `variables/${serverVariableName}` } + ServerVariable, serverVariable, { + id: serverVariableName, + pointer: `${this._meta.pointer}/variables/${serverVariableName}` + } ) )) } diff --git a/src/models/v3/server.ts b/src/models/v3/server.ts index c3b7bd039..4a454b932 100644 --- a/src/models/v3/server.ts +++ b/src/models/v3/server.ts @@ -4,9 +4,9 @@ import { Mixin } from '../utils'; import { BindingsMixin } from './mixins/bindings'; import { DescriptionMixin } from './mixins/description'; import { ExtensionsMixin } from './mixins/extensions'; -import {ServerVariable} from './server-variable'; -import {ServerVariables} from './server-variables'; -import {ServerVariablesInterface} from '../server-variables'; +import { ServerVariable } from './server-variable'; +import { ServerVariables } from './server-variables'; +import { ServerVariablesInterface } from '../server-variables'; import type { ModelMetadata } from "../base"; import type { ServerInterface } from '../server'; @@ -46,7 +46,10 @@ export class Server extends Mixin(BaseModel, BindingsMixin, DescriptionMixin, Ex this._json.variables ).map( ([serverVariableName, serverVariable]) => this.createModel( - ServerVariable, serverVariable, { id: serverVariableName, pointer: `variables/${serverVariableName}` } + ServerVariable, serverVariable, { + id: serverVariableName, + pointer: `${this._meta.pointer}/variables/${serverVariableName}` + } ) )) }