From 0617db7b8f3c8e7b6976327779a0160e28e86085 Mon Sep 17 00:00:00 2001 From: anandtiwary <52081890+anandtiwary@users.noreply.github.com> Date: Tue, 9 Nov 2021 15:55:50 -0800 Subject: [PATCH 1/6] feat: add additional specification array to entity spec --- .../observability-specification-builder.ts | 5 +- .../entity-specification-builder.test.ts | 115 ++++++++++++++++++ .../entity/entity-specification-builder.ts | 44 ++++++- 3 files changed, 156 insertions(+), 8 deletions(-) diff --git a/projects/observability/src/shared/graphql/request/builders/selections/observability-specification-builder.ts b/projects/observability/src/shared/graphql/request/builders/selections/observability-specification-builder.ts index 13dbe52c2..47183bf2d 100644 --- a/projects/observability/src/shared/graphql/request/builders/selections/observability-specification-builder.ts +++ b/projects/observability/src/shared/graphql/request/builders/selections/observability-specification-builder.ts @@ -37,9 +37,10 @@ export class ObservabilitySpecificationBuilder extends SpecificationBuilder { idKey: string, nameKey: string, entityType?: EntityType, - additionalAttributes?: string[] + additionalAttributes?: string[], + additionalSpecifications: Specification[] = [] ): EntitySpecification { - return this.entitySpecBuilder.build(idKey, nameKey, entityType, additionalAttributes); + return this.entitySpecBuilder.build(idKey, nameKey, entityType, additionalAttributes, additionalSpecifications); } public neighborAttributeSpecificationForKey( diff --git a/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts b/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts index 2d83ad133..66640f305 100644 --- a/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts +++ b/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts @@ -1,4 +1,6 @@ import { entityIdKey, entityTypeKey, ObservabilityEntityType } from '../../../../model/schema/entity'; +import { TraceStatusType } from '../../../../model/schema/trace'; +import { TraceStatusSpecificationBuilder } from './../trace/trace-status/trace-status-specification-builder'; import { EntitySpecificationBuilder } from './entity-specification-builder'; describe('Entity Specification Builder', () => { @@ -69,6 +71,119 @@ describe('Entity Specification Builder', () => { }); }); + test('correctly builds entity specification with explicit entity type and additional specification', () => { + const traceSpec = new TraceStatusSpecificationBuilder().build(); + + const entitySpec = entitySpecificationBuilder.build( + 'id', + 'name', + ObservabilityEntityType.Api, + ['attribute1', 'attribute2'], + + [traceSpec] + ); + + expect(entitySpec.asGraphQlSelections()).toEqual([ + { + path: 'attribute', + alias: 'id', + arguments: [ + { + name: 'key', + value: 'id' + } + ] + }, + { + path: 'attribute', + alias: 'name', + arguments: [ + { + name: 'key', + value: 'name' + } + ] + }, + { + path: 'attribute', + alias: 'attribute1', + arguments: [ + { + name: 'key', + value: 'attribute1' + } + ] + }, + { + path: 'attribute', + alias: 'attribute2', + arguments: [ + { + name: 'key', + value: 'attribute2' + } + ] + }, + [ + { + path: 'attribute', + alias: 'status', + arguments: [ + { + name: 'key', + value: 'status' + } + ] + }, + { + path: 'attribute', + alias: 'statusCode', + arguments: [ + { + name: 'key', + value: 'statusCode' + } + ] + }, + { + path: 'attribute', + alias: 'statusMessage', + arguments: [ + { + name: 'key', + value: 'statusMessage' + } + ] + } + ] + ]); + + expect( + entitySpec.extractFromServerData({ + id: 'test-id', + name: 'test-name', + attribute1: 'test-value-attrib1', + attribute2: 'test-value-attrib2', + [traceSpec.resultAlias()]: { + status: TraceStatusType.FAIL, + statusCode: '404', + statusMessage: 'Not Found' + } + }) + ).toEqual({ + [entityIdKey]: 'test-id', + [entityTypeKey]: ObservabilityEntityType.Api, + name: 'test-name', + attribute1: 'test-value-attrib1', + attribute2: 'test-value-attrib2', + [traceSpec.resultAlias()]: { + status: TraceStatusType.FAIL, + statusCode: '404', + statusMessage: 'Not Found' + } + }); + }); + test('correctly builds entity specification without entity type', () => { const entitySpec = entitySpecificationBuilder.build('id', 'name'); diff --git a/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.ts b/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.ts index e39250db5..60c9a88fa 100644 --- a/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.ts +++ b/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.ts @@ -9,6 +9,7 @@ import { } from '../../../../model/schema/entity'; import { EntitySpecification } from '../../../../model/schema/specifications/entity-specification'; import { GraphQlArgumentBuilder } from '../../argument/graphql-argument-builder'; +import { Specification } from './../../../../model/schema/specifier/specification'; export class EntitySpecificationBuilder { private static readonly DEFAULT_TYPE_FIELD: string = 'type'; @@ -19,15 +20,29 @@ export class EntitySpecificationBuilder { idKey: string, nameKey: string, entityType?: EntityType, - additionalAttributes: string[] = [] + additionalAttributes: string[] = [], + additionalSpecifications: Specification[] = [] ): EntitySpecification { return { resultAlias: () => this.buildResultAlias(idKey, nameKey, entityType), name: idKey, asGraphQlSelections: () => - this.buildGraphQlSelections(idKey, nameKey, entityType === undefined, additionalAttributes), + this.buildGraphQlSelections( + idKey, + nameKey, + entityType === undefined, + additionalAttributes, + additionalSpecifications + ), extractFromServerData: serverData => - this.extractFromServerData(serverData, idKey, nameKey, entityType, additionalAttributes), + this.extractFromServerData( + serverData, + idKey, + nameKey, + entityType, + additionalAttributes, + additionalSpecifications + ), asGraphQlOrderByFragment: () => ({ key: nameKey }) @@ -42,7 +57,8 @@ export class EntitySpecificationBuilder { idKey: string, nameKey: string, withEntityType: boolean, - additionalAttributes: string[] = [] + additionalAttributes: string[] = [], + additionalSpecifications: Specification[] = [] ): GraphQlSelection[] { const graphqlSelections: GraphQlSelection[] = [ { @@ -59,7 +75,13 @@ export class EntitySpecificationBuilder { path: 'attribute', alias: attribute, arguments: [this.argBuilder.forAttributeKey(attribute)] - })) + })), + ...additionalSpecifications.map( + (specification): GraphQlSelection => ({ + path: specification.resultAlias(), + children: [specification.asGraphQlSelections()].flat() + }) + ) ]; if (withEntityType) { @@ -74,7 +96,8 @@ export class EntitySpecificationBuilder { idKey: string, nameKey: string, entityType?: EntityType, - additionalAttributes: string[] = [] + additionalAttributes: string[] = [], + additionalSpecifications: Specification[] = [] ): Entity { let entity = { [entityIdKey]: serverData[idKey] as string, @@ -85,6 +108,15 @@ export class EntitySpecificationBuilder { entity = { ...entity, [attribute]: serverData[attribute] }; }); + additionalSpecifications.forEach(specification => { + entity = { + ...entity, + [specification.name]: specification.extractFromServerData( + serverData[specification.resultAlias()] as Dictionary + ) + }; + }); + return entity; } From b15833e37343d334e64e3feb6bba3baf0f037ccd Mon Sep 17 00:00:00 2001 From: anandtiwary <52081890+anandtiwary@users.noreply.github.com> Date: Tue, 9 Nov 2021 16:28:31 -0800 Subject: [PATCH 2/6] refactor: fixing test --- .../entity-specification-builder.test.ts | 67 ++++++++++--------- 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts b/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts index 66640f305..651b3daca 100644 --- a/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts +++ b/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts @@ -124,38 +124,41 @@ describe('Entity Specification Builder', () => { } ] }, - [ - { - path: 'attribute', - alias: 'status', - arguments: [ - { - name: 'key', - value: 'status' - } - ] - }, - { - path: 'attribute', - alias: 'statusCode', - arguments: [ - { - name: 'key', - value: 'statusCode' - } - ] - }, - { - path: 'attribute', - alias: 'statusMessage', - arguments: [ - { - name: 'key', - value: 'statusMessage' - } - ] - } - ] + { + path: traceSpec.resultAlias(), + children: [ + { + path: 'attribute', + alias: 'status', + arguments: [ + { + name: 'key', + value: 'status' + } + ] + }, + { + path: 'attribute', + alias: 'statusCode', + arguments: [ + { + name: 'key', + value: 'statusCode' + } + ] + }, + { + path: 'attribute', + alias: 'statusMessage', + arguments: [ + { + name: 'key', + value: 'statusMessage' + } + ] + } + ] + } ]); expect( From 0757d3866336d876ccb2d9bd5ce1a16f46941a0f Mon Sep 17 00:00:00 2001 From: anandtiwary <52081890+anandtiwary@users.noreply.github.com> Date: Tue, 9 Nov 2021 16:45:11 -0800 Subject: [PATCH 3/6] refactor: fix test --- .../entity-specification-builder.test.ts | 67 +++++++++---------- .../entity/entity-specification-builder.ts | 14 +--- 2 files changed, 34 insertions(+), 47 deletions(-) diff --git a/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts b/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts index 651b3daca..66640f305 100644 --- a/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts +++ b/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts @@ -124,41 +124,38 @@ describe('Entity Specification Builder', () => { } ] }, - { - path: traceSpec.resultAlias(), - children: [ - { - path: 'attribute', - alias: 'status', - arguments: [ - { - name: 'key', - value: 'status' - } - ] - }, - { - path: 'attribute', - alias: 'statusCode', - arguments: [ - { - name: 'key', - value: 'statusCode' - } - ] - }, - { - path: 'attribute', - alias: 'statusMessage', - arguments: [ - { - name: 'key', - value: 'statusMessage' - } - ] - } - ] - } + [ + { + path: 'attribute', + alias: 'status', + arguments: [ + { + name: 'key', + value: 'status' + } + ] + }, + { + path: 'attribute', + alias: 'statusCode', + arguments: [ + { + name: 'key', + value: 'statusCode' + } + ] + }, + { + path: 'attribute', + alias: 'statusMessage', + arguments: [ + { + name: 'key', + value: 'statusMessage' + } + ] + } + ] ]); expect( diff --git a/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.ts b/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.ts index 60c9a88fa..0f46ffad4 100644 --- a/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.ts +++ b/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.ts @@ -76,12 +76,7 @@ export class EntitySpecificationBuilder { alias: attribute, arguments: [this.argBuilder.forAttributeKey(attribute)] })), - ...additionalSpecifications.map( - (specification): GraphQlSelection => ({ - path: specification.resultAlias(), - children: [specification.asGraphQlSelections()].flat() - }) - ) + ...additionalSpecifications.map(specification => specification.asGraphQlSelections()).flat() ]; if (withEntityType) { @@ -109,12 +104,7 @@ export class EntitySpecificationBuilder { }); additionalSpecifications.forEach(specification => { - entity = { - ...entity, - [specification.name]: specification.extractFromServerData( - serverData[specification.resultAlias()] as Dictionary - ) - }; + entity = { ...entity, [specification.name]: specification.extractFromServerData(serverData) }; }); return entity; From d294828675eab68330826db666899f9dedc9f559 Mon Sep 17 00:00:00 2001 From: anandtiwary <52081890+anandtiwary@users.noreply.github.com> Date: Tue, 9 Nov 2021 17:05:50 -0800 Subject: [PATCH 4/6] refactor: fix test --- .../entity-specification-builder.test.ts | 62 +++++++++---------- 1 file changed, 30 insertions(+), 32 deletions(-) diff --git a/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts b/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts index 66640f305..f008f07a5 100644 --- a/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts +++ b/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts @@ -124,38 +124,36 @@ describe('Entity Specification Builder', () => { } ] }, - [ - { - path: 'attribute', - alias: 'status', - arguments: [ - { - name: 'key', - value: 'status' - } - ] - }, - { - path: 'attribute', - alias: 'statusCode', - arguments: [ - { - name: 'key', - value: 'statusCode' - } - ] - }, - { - path: 'attribute', - alias: 'statusMessage', - arguments: [ - { - name: 'key', - value: 'statusMessage' - } - ] - } - ] + { + path: 'attribute', + alias: 'status', + arguments: [ + { + name: 'key', + value: 'status' + } + ] + }, + { + path: 'attribute', + alias: 'statusCode', + arguments: [ + { + name: 'key', + value: 'statusCode' + } + ] + }, + { + path: 'attribute', + alias: 'statusMessage', + arguments: [ + { + name: 'key', + value: 'statusMessage' + } + ] + } ]); expect( From bfdc125a0cdb709f785ac577fa87e3c84671a751 Mon Sep 17 00:00:00 2001 From: anandtiwary <52081890+anandtiwary@users.noreply.github.com> Date: Tue, 9 Nov 2021 17:13:06 -0800 Subject: [PATCH 5/6] refactor: fix test --- .../entity/entity-specification-builder.test.ts | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts b/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts index f008f07a5..c0eb16401 100644 --- a/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts +++ b/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts @@ -162,11 +162,9 @@ describe('Entity Specification Builder', () => { name: 'test-name', attribute1: 'test-value-attrib1', attribute2: 'test-value-attrib2', - [traceSpec.resultAlias()]: { - status: TraceStatusType.FAIL, - statusCode: '404', - statusMessage: 'Not Found' - } + status: TraceStatusType.FAIL, + statusCode: '404', + statusMessage: 'Not Found' }) ).toEqual({ [entityIdKey]: 'test-id', @@ -174,11 +172,9 @@ describe('Entity Specification Builder', () => { name: 'test-name', attribute1: 'test-value-attrib1', attribute2: 'test-value-attrib2', - [traceSpec.resultAlias()]: { - status: TraceStatusType.FAIL, - statusCode: '404', - statusMessage: 'Not Found' - } + status: TraceStatusType.FAIL, + statusCode: '404', + statusMessage: 'Not Found' }); }); From 897cedcdd9cb83e026879e4dcab87ce72008a76c Mon Sep 17 00:00:00 2001 From: anandtiwary <52081890+anandtiwary@users.noreply.github.com> Date: Tue, 9 Nov 2021 17:28:21 -0800 Subject: [PATCH 6/6] refactor: fix test again --- .../entity/entity-specification-builder.test.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts b/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts index c0eb16401..b4faf9711 100644 --- a/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts +++ b/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts @@ -172,9 +172,11 @@ describe('Entity Specification Builder', () => { name: 'test-name', attribute1: 'test-value-attrib1', attribute2: 'test-value-attrib2', - status: TraceStatusType.FAIL, - statusCode: '404', - statusMessage: 'Not Found' + [traceSpec.name]: { + status: TraceStatusType.FAIL, + statusCode: '404', + statusMessage: 'Not Found' + } }); });