diff --git a/package-lock.json b/package-lock.json index 226e940..15a8946 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@mockoon/commons-server", - "version": "1.1.0", + "version": "1.1.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@mockoon/commons-server", - "version": "1.0.5", + "version": "1.1.1", "license": "MIT", "dependencies": { "@mockoon/commons": "2.1.0", diff --git a/package.json b/package.json index 7124793..bf2bbd0 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@mockoon/commons-server", "description": "Mockoon's commons server library. Used in Mockoon desktop application and CLI.", - "version": "1.1.0", + "version": "1.1.1", "author": { "name": "Guillaume Monnet", "email": "hi@255kb.dev", diff --git a/src/libs/response-rules-interpreter.ts b/src/libs/response-rules-interpreter.ts index e7c550e..9a695e6 100644 --- a/src/libs/response-rules-interpreter.ts +++ b/src/libs/response-rules-interpreter.ts @@ -46,15 +46,19 @@ export class ResponseRulesInterpreter { (requestNumber - 1) % this.routeResponses.length ]; } else { - let response = this.routeResponses.find((routeResponse) => - routeResponse.rulesOperator === 'AND' - ? !!routeResponse.rules.every((rule) => + let response = this.routeResponses.find((routeResponse) => { + if (routeResponse.rules.length === 0) { + return false; + } + + return routeResponse.rulesOperator === 'AND' + ? routeResponse.rules.every((rule) => this.isValidRule(rule, requestNumber) ) - : !!routeResponse.rules.find((rule) => + : routeResponse.rules.some((rule) => this.isValidRule(rule, requestNumber) - ) - ); + ); + }); if (response === undefined) { response = this.routeResponses[0]; diff --git a/test/response-rules-interpreter.spec.ts b/test/response-rules-interpreter.spec.ts index fcf28c6..e2e959c 100644 --- a/test/response-rules-interpreter.spec.ts +++ b/test/response-rules-interpreter.spec.ts @@ -1792,5 +1792,52 @@ describe('Response rules interpreter', () => { ).chooseResponse(1); expect(routeResponse.body).to.be.equal('unauthorized'); }); + + it('should return second response if first one has no rule with AND', () => { + /** + * This test is here to prevent a bug that occured when first response had no rule but a AND operator. + * It intercepted everything and prevented to get the correct response. + * See https://github.com/mockoon/commons-server/issues/6 + */ + const request: Request = { + header: function (headerName: string) { + const headers = { + 'Content-Type': 'application/json', + 'Test-Header': 'headervalue' + }; + + return headers[headerName]; + }, + body: '{ "test": "bodyvalue" }' + } as Request; + + const routeResponse = new ResponseRulesInterpreter( + [ + { + ...routeResponseTemplate, + rules: [], + rulesOperator: 'AND', + body: 'response1' + }, + { + ...routeResponseTemplate, + rules: [ + { + target: 'body', + modifier: 'test', + value: 'bodyvalue', + isRegex: false + } + ], + rulesOperator: 'OR', + body: 'response2' + } + ], + request, + false, + false + ).chooseResponse(1); + expect(routeResponse.body).to.be.equal('response2'); + }); }); });