From cd5b778934be0795cbd286a84da16a434f582900 Mon Sep 17 00:00:00 2001 From: Nicolas Lunet Date: Mon, 19 Jun 2023 08:45:28 +0200 Subject: [PATCH] feat: strict mode is now properly evaluated on the request (#639) * feat: strict mode is now properly evaluated on the request * chore: test --- .changeset/lemon-bears-pretend.md | 5 +++++ .../src/mockdata/functionBasedMockData.ts | 16 ++++++++-------- .../src/request/odataRequest.ts | 2 ++ .../test/unit/__testData/Requestor.ts | 2 +- .../test/unit/__testData/RootElement.js | 3 +++ .../test/unit/__testData/RootElement.json | 2 +- .../test/unit/middleware.test.ts | 13 +++++++++++++ 7 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 .changeset/lemon-bears-pretend.md diff --git a/.changeset/lemon-bears-pretend.md b/.changeset/lemon-bears-pretend.md new file mode 100644 index 00000000..8604243e --- /dev/null +++ b/.changeset/lemon-bears-pretend.md @@ -0,0 +1,5 @@ +--- +'@sap-ux/fe-mockserver-core': patch +--- + +Strict mode is now properly evaluated on the odataRequest diff --git a/packages/fe-mockserver-core/src/mockdata/functionBasedMockData.ts b/packages/fe-mockserver-core/src/mockdata/functionBasedMockData.ts index 49660e51..369d5c06 100644 --- a/packages/fe-mockserver-core/src/mockdata/functionBasedMockData.ts +++ b/packages/fe-mockserver-core/src/mockdata/functionBasedMockData.ts @@ -13,10 +13,10 @@ export type MockDataContributor = { removeEntry?: (keyValues: KeyDefinitions, odataRequest: ODataRequest) => void; hasEntry?: (keyValues: KeyDefinitions, odataRequest: ODataRequest) => boolean; hasEntries?: (odataRequest: ODataRequest) => boolean; - fetchEntries?: (keyValues: KeyDefinitions, odataRequest: ODataRequest) => object[]; - getAllEntries?: (odataRequest: ODataRequest) => object[]; - getEmptyObject?: (odataRequest: ODataRequest) => object; - getDefaultElement?: (odataRequest: ODataRequest) => object; + fetchEntries?: (keyValues: KeyDefinitions, odataRequest: ODataRequest) => T[]; + getAllEntries?: (odataRequest: ODataRequest) => T[]; + getEmptyObject?: (odataRequest: ODataRequest) => T; + getDefaultElement?: (odataRequest: ODataRequest) => T; getReferentialConstraints?: ( _navigationProperty: NavigationProperty @@ -86,11 +86,11 @@ export type MockDataContributor = { updateEntry: (keyValues: KeyDefinitions, newData: T, odataRequest: ODataRequest) => Promise; removeEntry: (keyValues: KeyDefinitions, odataRequest: ODataRequest) => Promise; hasEntry: (keyValues: KeyDefinitions, odataRequest: ODataRequest) => boolean; - fetchEntries: (keyValues: KeyDefinitions, odataRequest: ODataRequest) => object[]; + fetchEntries: (keyValues: KeyDefinitions, odataRequest: ODataRequest) => T[]; hasEntries: (odataRequest: ODataRequest) => boolean; - getAllEntries: (odataRequest: ODataRequest) => object[]; - getEmptyObject: (odataRequest: ODataRequest) => object; - getDefaultElement: (odataRequest: ODataRequest) => object; + getAllEntries: (odataRequest: ODataRequest) => T[]; + getEmptyObject: (odataRequest: ODataRequest) => T; + getDefaultElement: (odataRequest: ODataRequest) => T; getParentEntityInterface: () => Promise; getEntityInterface: (entityName: string) => Promise; checkSearchQuery: (mockData: any, searchQuery: string, odataRequest: ODataRequest) => boolean; diff --git a/packages/fe-mockserver-core/src/request/odataRequest.ts b/packages/fe-mockserver-core/src/request/odataRequest.ts index d2330b5b..c94d350b 100644 --- a/packages/fe-mockserver-core/src/request/odataRequest.ts +++ b/packages/fe-mockserver-core/src/request/odataRequest.ts @@ -41,6 +41,7 @@ export type QueryPath = { export default class ODataRequest { private isMinimalRepresentation: boolean; + public isStrictMode: boolean; public tenantId: string; public queryPath: QueryPath[]; public searchQuery: string[]; @@ -75,6 +76,7 @@ export default class ODataRequest { this.addResponseHeader('sap-tenantid', this.tenantId); } this.isMinimalRepresentation = requestContent.headers?.['prefer'] === 'return=minimal'; + this.isStrictMode = requestContent.headers?.['prefer']?.includes('handling=strict') ?? false; this.queryPath = this.parsePath(parsedUrl.pathname.substring(1)); this.parseParameters(parsedUrl.searchParams); } diff --git a/packages/fe-mockserver-core/test/unit/__testData/Requestor.ts b/packages/fe-mockserver-core/test/unit/__testData/Requestor.ts index f75fb32d..2880bb91 100644 --- a/packages/fe-mockserver-core/test/unit/__testData/Requestor.ts +++ b/packages/fe-mockserver-core/test/unit/__testData/Requestor.ts @@ -265,7 +265,7 @@ export class ODataV4ObjectRequest extends ODataRequest { targetPath: string, protected objectKey: ODataKey = {}, protected method: string = 'GET', - protected headers: Record = {} + public headers: Record = {} ) { super(odataRootUri, targetPath); diff --git a/packages/fe-mockserver-core/test/unit/__testData/RootElement.js b/packages/fe-mockserver-core/test/unit/__testData/RootElement.js index 5eb568a2..f3af3dbd 100644 --- a/packages/fe-mockserver-core/test/unit/__testData/RootElement.js +++ b/packages/fe-mockserver-core/test/unit/__testData/RootElement.js @@ -13,6 +13,9 @@ module.exports = { case 'boundActionReturnsVoid': return undefined; case 'baseFunction': + if (odataRequest.isStrictMode) { + return `STRICT :: ${actionData.data}`; + } return actionData.data; default: this.throwError('Not implemented', 501, { diff --git a/packages/fe-mockserver-core/test/unit/__testData/RootElement.json b/packages/fe-mockserver-core/test/unit/__testData/RootElement.json index 6e26ef01..1973721d 100644 --- a/packages/fe-mockserver-core/test/unit/__testData/RootElement.json +++ b/packages/fe-mockserver-core/test/unit/__testData/RootElement.json @@ -1,7 +1,7 @@ [ { "ID": 1, - "Prop1": "SomethingElse", + "Prop1": "First Prop", "Prop2": "Second Prop", "isBoundAction1Hidden": false, "isBoundAction2Hidden": false, diff --git a/packages/fe-mockserver-core/test/unit/middleware.test.ts b/packages/fe-mockserver-core/test/unit/middleware.test.ts index 789117c4..e3900bca 100644 --- a/packages/fe-mockserver-core/test/unit/middleware.test.ts +++ b/packages/fe-mockserver-core/test/unit/middleware.test.ts @@ -103,6 +103,12 @@ describe('V4 Requestor', function () { ) .execute('GET'); expect(dataRes).toMatchInlineSnapshot(`"I am data"`); + const dataResStrict = dataRequestor.callGETAction( + "/RootElement(ID=1,IsActiveEntity=true)/sap.fe.core.ActionVisibility.baseFunction(data='I am data')" + ); + dataResStrict.headers['Prefer'] = 'handling=strict'; + const strictResult = await dataResStrict.execute('GET'); + expect(strictResult).toMatchInlineSnapshot(`"STRICT :: I am data"`); const dataRes2 = await dataRequestor .callGETAction('/RootElement(ID=1,IsActiveEntity=true)/_Elements') .execute('GET'); @@ -350,4 +356,11 @@ describe('V4 Requestor', function () { myJSON[0].Prop1 = 'First Prop'; fs.writeFileSync(path.join(__dirname, '__testData', 'RootElement.json'), JSON.stringify(myJSON, null, 4)); }); + afterAll(() => { + const myJSON = JSON.parse( + fs.readFileSync(path.join(__dirname, '__testData', 'RootElement.json')).toString('utf-8') + ); + myJSON[0].Prop1 = 'First Prop'; + fs.writeFileSync(path.join(__dirname, '__testData', 'RootElement.json'), JSON.stringify(myJSON, null, 4)); + }); });