From 8df56918f68219a56e7074ab7432dc4da7317b33 Mon Sep 17 00:00:00 2001 From: Nicolas Lunet Date: Wed, 8 Jun 2022 14:59:38 +0200 Subject: [PATCH] fix: mockdata generation now works as intended (#141) * fix: mockdata generation now works as intended * fix: test coverage --- .changeset/heavy-foxes-switch.md | 6 + packages/fe-mockserver-core/src/api.ts | 2 + .../fe-mockserver-core/src/data/dataAccess.ts | 3 + packages/fe-mockserver-core/src/index.ts | 8 +- .../test/__snapshots__/index.spec.ts.snap | 313 ++++++++++++++++++ .../test/cds/valid-withmorecommon.cds | 118 +++++++ .../test/index.spec.ts | 4 + .../src/configResolver.ts | 5 + .../test/configResolver.test.ts | 8 +- 9 files changed, 463 insertions(+), 4 deletions(-) create mode 100644 .changeset/heavy-foxes-switch.md create mode 100644 packages/fe-mockserver-plugin-cds/test/cds/valid-withmorecommon.cds diff --git a/.changeset/heavy-foxes-switch.md b/.changeset/heavy-foxes-switch.md new file mode 100644 index 00000000..6647725c --- /dev/null +++ b/.changeset/heavy-foxes-switch.md @@ -0,0 +1,6 @@ +--- +'@sap-ux/fe-mockserver-core': patch +'@sap-ux/ui5-middleware-fe-mockserver': patch +--- + +Fix mock data generation and reorganize some part of the code diff --git a/packages/fe-mockserver-core/src/api.ts b/packages/fe-mockserver-core/src/api.ts index c9b10058..70a21e61 100644 --- a/packages/fe-mockserver-core/src/api.ts +++ b/packages/fe-mockserver-core/src/api.ts @@ -50,6 +50,7 @@ export interface BaseServerConfig { watch?: boolean; noETag?: boolean; contextBasedIsolation?: boolean; + generateMockData?: boolean; fileLoader?: string; /** Name of the package to use for the metadata provider **/ metadataProcessor?: { @@ -91,6 +92,7 @@ export type ServiceConfigEx = ServiceConfig & { export interface MockserverConfiguration { debug?: boolean; contextBasedIsolation?: boolean; + generateMockData?: boolean; watch?: boolean; strictKeyMode?: boolean; annotations?: AnnotationConfig[]; diff --git a/packages/fe-mockserver-core/src/data/dataAccess.ts b/packages/fe-mockserver-core/src/data/dataAccess.ts index 99a859b5..a03eaa37 100644 --- a/packages/fe-mockserver-core/src/data/dataAccess.ts +++ b/packages/fe-mockserver-core/src/data/dataAccess.ts @@ -50,6 +50,9 @@ export class DataAccess implements DataAccessInterface { this.generateMockData = !!service.generateMockData; this.contextBasedIsolation = !!service.contextBasedIsolation; this.fileLoader = fileLoader; + if (this.generateMockData && this.debug) { + this.log.info('Missing mockdata will be generated'); + } this.initializeMockData(); } diff --git a/packages/fe-mockserver-core/src/index.ts b/packages/fe-mockserver-core/src/index.ts index ef5cce1e..dec180c5 100644 --- a/packages/fe-mockserver-core/src/index.ts +++ b/packages/fe-mockserver-core/src/index.ts @@ -2,6 +2,7 @@ import type { MockserverConfiguration } from './api'; import Router from 'router'; import type { IRouter } from 'router'; import { createMockMiddleware } from './middleware'; +import * as path from 'path'; export interface IFileLoader { loadFile(filePath: string): Promise; @@ -26,11 +27,14 @@ export default class FEMockserver { } private async initialize() { - const FileLoaderClass = (await import(this.configuration.fileLoader || './plugins/fileSystemLoader')).default; + const FileLoaderClass = + (this.configuration.fileLoader as any) || (await import('./plugins/fileSystemLoader')).default; this.fileLoader = new FileLoaderClass() as IFileLoader; const MetadataProviderClass = ( - await import(this.configuration.metadataProcessor?.name || './plugins/metadataProvider') + await this.fileLoader.loadJS( + this.configuration.metadataProcessor?.name || path.resolve(__dirname, './plugins/metadataProvider') + ) ).default; this.metadataProvider = new MetadataProviderClass( this.fileLoader, diff --git a/packages/fe-mockserver-plugin-cds/test/__snapshots__/index.spec.ts.snap b/packages/fe-mockserver-plugin-cds/test/__snapshots__/index.spec.ts.snap index 1fd2cfd1..347cf476 100644 --- a/packages/fe-mockserver-plugin-cds/test/__snapshots__/index.spec.ts.snap +++ b/packages/fe-mockserver-plugin-cds/test/__snapshots__/index.spec.ts.snap @@ -478,3 +478,316 @@ exports[`FE Mockserver CDS Plugin can compile valid CDS file using common stuff " `; + +exports[`FE Mockserver CDS Plugin can compile valid CDS file using more common stuff 1`] = ` +" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Draft_DraftAdministrativeData}\\"/> + + + + Draft_DraftUUID}\\"/> + + + Draft_CreationDateTime}\\"/> + + + Draft_CreatedByUser}\\"/> + + + + Draft_DraftIsCreatedByMe}\\"/> + + + Draft_LastChangeDateTime}\\"/> + + + Draft_LastChangedByUser}\\"/> + + + Draft_InProcessByUser}\\"/> + + + + Draft_DraftIsProcessedByMe}\\"/> + + + +" +`; diff --git a/packages/fe-mockserver-plugin-cds/test/cds/valid-withmorecommon.cds b/packages/fe-mockserver-plugin-cds/test/cds/valid-withmorecommon.cds new file mode 100644 index 00000000..5c93a86f --- /dev/null +++ b/packages/fe-mockserver-plugin-cds/test/cds/valid-withmorecommon.cds @@ -0,0 +1,118 @@ +using { + cuid, + managed +} from '@sap/cds/common'; + +service Service { + @odata.draft.enabled + entity RootEntity { + key ID : Integer @title : 'ID'; + StringProperty : String @title : 'String'; + IntegerProperty : Integer @title : 'Integer'; + NumberProperty : Decimal(4, 2) @title : 'Number'; + BooleanProperty : Boolean @title : 'Boolean'; + DateProperty : Date @title : 'Date'; + TimeProperty : Time @title : 'Time'; + PropertyWithUnit : Integer64 @title : 'With Unit' @Measures.Unit : Unit; + PropertyWithCurrency : Integer64 @title : 'With Currency' @Measures.ISOCurrency : Currency; + Unit : String @title : 'UoM'; + Currency : String @title : 'Currency'; + TextProperty : String @title : 'Text'; + TextArrangementTextOnlyProperty : String @title : 'Text Only'; + TextArrangementTextLastProperty : String @title : 'Text Last'; + TextArrangementTextFirstProperty : String @title : 'Text First'; + TextArrangementTextSeparateProperty : String @title : 'TextSeparate'; + PropertyWithValueHelp : String @title : 'With Value Help'; + } + + entity RootEntity2 { + key ID : Integer @title : 'ID'; + StringProperty : String @title : 'String'; + } + + @cds.autoexpose + entity ValueHelpEntity { + key KeyProp : String(1) @title : 'Value Help Key'; + @Core.Immutable + Description : String(20) @title : 'Value Help Description'; + } + + @cds.autoexpose + entity ValueHelpCurrencyEntity { + key Currency : String(3) @title : 'Currency Key'; + @Core.Immutable + Description : String(20) @title : 'Currency Name'; + } + + annotate RootEntity2 with @(UI : {LineItem : [ + {Value : ID}, + {Value : StringProperty} + ]}); + + annotate RootEntity with @(UI : {LineItem : [ + {Value : ID}, + {Value : BooleanProperty}, + {Value : TextArrangementTextFirstProperty}, + {Value : PropertyWithValueHelp}, + {Value : PropertyWithCurrency} + ]}) { + TextArrangementTextOnlyProperty @Common : { + Text : TextProperty, + TextArrangement : #TextOnly + }; + TextArrangementTextLastProperty @Common : { + Text : TextProperty, + TextArrangement : #TextLast + }; + TextArrangementTextFirstProperty @Common : { + Text : TextProperty, + TextArrangement : #TextFirst + }; + TextArrangementTextSeparateProperty @Common : { + Text : TextProperty, + TextArrangement : #TextSeparate + }; + PropertyWithValueHelp @(Common : {ValueList : { + Label : 'Value with Value Help', + CollectionPath : 'ValueHelpEntity', + Parameters : [ + { + $Type : 'Common.ValueListParameterInOut', + LocalDataProperty : PropertyWithValueHelp, + ValueListProperty : 'KeyProp' + }, + { + $Type : 'Common.ValueListParameterDisplayOnly', + ValueListProperty : 'Description' + } + ] + }}); + Currency @(Common : { + ValueListWithFixedValues, + ValueList : { + Label : 'Currency Value Help', + CollectionPath : 'ValueHelpCurrencyEntity', + Parameters : [ + { + $Type : 'Common.ValueListParameterInOut', + LocalDataProperty : Currency, + ValueListProperty : 'Currency' + }, + { + $Type : 'Common.ValueListParameterDisplayOnly', + ValueListProperty : 'Description' + } + ] + } + }); + }; + + annotate ValueHelpEntity with { + KeyProp @(Common : { + Text : Description, + TextArrangement : #TextFirst + }, + + ); + }; +} diff --git a/packages/fe-mockserver-plugin-cds/test/index.spec.ts b/packages/fe-mockserver-plugin-cds/test/index.spec.ts index 116cdc74..fb4649c9 100644 --- a/packages/fe-mockserver-plugin-cds/test/index.spec.ts +++ b/packages/fe-mockserver-plugin-cds/test/index.spec.ts @@ -21,6 +21,10 @@ describe('FE Mockserver CDS Plugin', () => { const edmx = await myCDSProvider.loadMetadata(path.join(cdsDataPath, 'valid-withCommon.cds')); expect(edmx).toMatchSnapshot(); }); + it('can compile valid CDS file using more common stuff', async () => { + const edmx = await myCDSProvider.loadMetadata(path.join(cdsDataPath, 'valid-withmorecommon.cds')); + expect(edmx).toMatchSnapshot(); + }); it('can also load XML files', async () => { const edmx = await myCDSProvider.loadMetadata(path.join(xmlDataPath, 'valid.xml')); expect(edmx).toMatchSnapshot(); diff --git a/packages/ui5-middleware-fe-mockserver/src/configResolver.ts b/packages/ui5-middleware-fe-mockserver/src/configResolver.ts index 07c3f0dc..548ba6dc 100644 --- a/packages/ui5-middleware-fe-mockserver/src/configResolver.ts +++ b/packages/ui5-middleware-fe-mockserver/src/configResolver.ts @@ -79,6 +79,7 @@ function processServicesConfig( noETag: inService.noETag, debug: inService.debug, strictKeyMode: inService.strictKeyMode, + generateMockData: inService.generateMockData, contextBasedIsolation: inService.contextBasedIsolation } as any; const metadataPath = inService.metadataPath || inService.metadataXmlPath || inService.metadataCdsPath; @@ -109,6 +110,9 @@ function processServicesConfig( if (inConfig.contextBasedIsolation && !inService.hasOwnProperty('contextBasedIsolation')) { myServiceConfig.contextBasedIsolation = inConfig.contextBasedIsolation; } + if (inConfig.generateMockData && !inService.hasOwnProperty('generateMockData')) { + myServiceConfig.generateMockData = inConfig.generateMockData; + } return myServiceConfig; }); @@ -138,6 +142,7 @@ export function resolveConfig(inConfig: ServerConfig, basePath: string): Mockser watch: !!inConfig.watch, strictKeyMode: !!inConfig.strictKeyMode, debug: !!inConfig.debug, + generateMockData: !!inConfig.generateMockData, annotations: annotations, services: services, fileLoader: inConfig.fileLoader, diff --git a/packages/ui5-middleware-fe-mockserver/test/configResolver.test.ts b/packages/ui5-middleware-fe-mockserver/test/configResolver.test.ts index ca43847c..4426de74 100644 --- a/packages/ui5-middleware-fe-mockserver/test/configResolver.test.ts +++ b/packages/ui5-middleware-fe-mockserver/test/configResolver.test.ts @@ -151,14 +151,16 @@ describe('The config resolver', () => { debug: false, strictKeyMode: false, contextBasedIsolation: false, - noETag: false + noETag: false, + generateMockData: false } ], watch: true, debug: true, strictKeyMode: true, contextBasedIsolation: true, - noETag: true + noETag: true, + generateMockData: true }, '/' ); @@ -172,5 +174,7 @@ describe('The config resolver', () => { expect(myBaseResolvedConfig.services[1].contextBasedIsolation).toBe(false); expect(myBaseResolvedConfig.services[0].noETag).toBe(true); expect(myBaseResolvedConfig.services[1].noETag).toBe(false); + expect(myBaseResolvedConfig.services[0].generateMockData).toBe(true); + expect(myBaseResolvedConfig.services[1].generateMockData).toBe(false); }); });