From 30083e5e51cd628c9697b5af031c6c2f93b9b203 Mon Sep 17 00:00:00 2001 From: Idan Tene <12184618+idantene@users.noreply.github.com> Date: Wed, 24 Jul 2019 15:06:34 +0300 Subject: [PATCH] Fix small oversights (#102) * Fixes calls to state management with new types from PR #99 * Updates return type from responseCreatorFactory to new type * Fixes matcher replacing server path prefix * Adds test compilation --- .../unmock-cli/src/__tests__/tsconfig.json | 7 +++ .../src/__tests__/generator.test.ts | 6 +-- .../src/__tests__/serviceStore.test.ts | 44 ++++++++++--------- packages/unmock-core/src/generator.ts | 3 +- packages/unmock-core/src/service/matcher.ts | 8 ++-- packages/unmock/src/__tests__/tsconfig.json | 7 +++ 6 files changed, 45 insertions(+), 30 deletions(-) create mode 100644 packages/unmock-cli/src/__tests__/tsconfig.json create mode 100644 packages/unmock/src/__tests__/tsconfig.json diff --git a/packages/unmock-cli/src/__tests__/tsconfig.json b/packages/unmock-cli/src/__tests__/tsconfig.json new file mode 100644 index 00000000..7219b24e --- /dev/null +++ b/packages/unmock-cli/src/__tests__/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../../../tsconfig.test.base", + "include": ["**/*"], + "references": [ + { "path": "../../" } + ] +} \ No newline at end of file diff --git a/packages/unmock-core/src/__tests__/generator.test.ts b/packages/unmock-core/src/__tests__/generator.test.ts index 1dfd1ef7..f95c1185 100644 --- a/packages/unmock-core/src/__tests__/generator.test.ts +++ b/packages/unmock-core/src/__tests__/generator.test.ts @@ -31,9 +31,9 @@ describe("Tests generator", () => { const { stateStore } = responseCreatorFactory({ serviceDefLoader, }); - stateStore.slack(); // should pass - stateStore.petstore(); // should pass - expect(() => stateStore.github()).toThrow("service named 'github'"); // no github service + stateStore.slack({}); // should pass + stateStore.petstore({}); // should pass + expect(() => stateStore.github({})).toThrow("service named 'github'"); // no github service }); it("sets a state for swagger api converted to openapi", () => { diff --git a/packages/unmock-core/src/__tests__/serviceStore.test.ts b/packages/unmock-core/src/__tests__/serviceStore.test.ts index fb48be10..7f1c1577 100644 --- a/packages/unmock-core/src/__tests__/serviceStore.test.ts +++ b/packages/unmock-core/src/__tests__/serviceStore.test.ts @@ -63,58 +63,60 @@ describe("Fluent API and Service instantiation tests", () => { it("Store with existing path does not throw", () => { const store = stateFacadeFactory(PetStoreWithPseudoResponses); - store.petstore(); // Should pass + store.petstore({}); // Should pass }); it("Store with REST method call does not throw", () => { const store = stateFacadeFactory(PetStoreWithPseudoResponses); - store.petstore.get(); // Should pass + store.petstore.get({}); // Should pass }); it("Chaining multiple states without REST methods does not throw", () => { const store = stateFacadeFactory(PetStoreWithPseudoResponses); store - .petstore() - .petstore() - .petstore(); + .petstore({}) + .petstore({}) + .petstore({}); }); it("Chaining multiple states with REST methods does not throw", () => { const store = stateFacadeFactory(PetStoreWithPseudoResponses); store.petstore - .get() - .petstore.get() - .petstore(); + .get({}) + .petstore.get({}) + .petstore({}); }); it("Chaining multiple methods for a service does not throw", () => { const store = stateFacadeFactory(PetStoreWithPseudoResponses); store.petstore - .get() - .get() - .petstore(); + .get({}) + .get({}) + .petstore({}); }); it("Non HTTP methods are recognized as services and throws", () => { const store = stateFacadeFactory(PetStoreWithPseudoResponses); expect(store.get).toThrow("Can't find specification"); - expect(store.petstore.get().boom).toThrow("Can't find specification"); + expect(store.petstore.get({}).boom).toThrow("Can't find specification"); }); it("Specifying missing endpoint without rest method throws", () => { const store = stateFacadeFactory(PetStoreWithPseudoResponses); - store.petstore("/pets"); // should pass - expect(() => store.petstore("/pet")).toThrow("Can't find endpoint"); + store.petstore("/pets", {}); // should pass + expect(() => store.petstore("/pet", {})).toThrow("Can't find endpoint"); }); it("Specifying existing endpoint with rest method does not throw", () => { const store = stateFacadeFactory(PetStoreWithPseudoResponses); - store.petstore.get("/pets"); // should pass + store.petstore.get("/pets", {}); // should pass }); it("Specifying missing endpoint with rest method throws", () => { const store = stateFacadeFactory(PetStoreWithPseudoResponses); - expect(() => store.petstore.post("/pets")).toThrow("Can't find response"); - expect(() => store.petstore.get("/pet")).toThrow("Can't find endpoint"); + expect(() => store.petstore.post("/pets", {})).toThrow( + "Can't find response", + ); + expect(() => store.petstore.get("/pet", {})).toThrow("Can't find endpoint"); }); }); @@ -171,10 +173,10 @@ describe("Test paths matching on serviceStore", () => { it("Paths are converted to regexp", () => { const store = stateFacadeFactory(DynamicPathsService(petStoreParameters)); - store.petstore("/pets/2"); // Should pass - store.petstore("/pets/{petId}"); // should pass - expect(() => store.petstore("/pet/2")).toThrow("Can't find endpoint"); - expect(() => store.petstore("/pets/")).toThrow("Can't find endpoint"); + store.petstore("/pets/2", {}); // Should pass + store.petstore("/pets/{petId}", {}); // should pass + expect(() => store.petstore("/pet/2", {})).toThrow("Can't find endpoint"); + expect(() => store.petstore("/pets/", {})).toThrow("Can't find endpoint"); }); it("attempting to create a store with missing parameters throws", () => { diff --git a/packages/unmock-core/src/generator.ts b/packages/unmock-core/src/generator.ts index 5b3f78cb..bf5554c2 100644 --- a/packages/unmock-core/src/generator.ts +++ b/packages/unmock-core/src/generator.ts @@ -22,6 +22,7 @@ import { Response, Responses, Schema, + StateFacadeType, } from "./service/interfaces"; import { ServiceParser } from "./service/parser"; import { ServiceStore } from "./service/serviceStore"; @@ -40,7 +41,7 @@ export function responseCreatorFactory({ serviceDefLoader, }: { serviceDefLoader: IServiceDefLoader; -}): { stateStore: any; createResponse: CreateResponse } { +}): { stateStore: StateFacadeType; createResponse: CreateResponse } { const serviceDefs: IServiceDef[] = serviceDefLoader.loadSync(); const parser = new ServiceParser(); const services: IService[] = serviceDefs.map(serviceDef => diff --git a/packages/unmock-core/src/service/matcher.ts b/packages/unmock-core/src/service/matcher.ts index e818cd4a..fb8f59dd 100644 --- a/packages/unmock-core/src/service/matcher.ts +++ b/packages/unmock-core/src/service/matcher.ts @@ -28,11 +28,9 @@ export class OASMatcher { reqPath: string, serverPathPrefix: string, ) { - const serverUrlWithoutTrailingSlash = serverPathPrefix.replace(/\/$/, ""); - const regexToRemoveFromReqPath = new RegExp( - `^${serverUrlWithoutTrailingSlash}`, - ); - return reqPath.replace(regexToRemoveFromReqPath, ""); + const pathSuffix = serverPathPrefix.endsWith("/") ? "" : "/"; + const serverPathRegex = new RegExp(`^${serverPathPrefix + pathSuffix}`); + return reqPath.replace(serverPathRegex, "/"); } private static buildRegexpForPaths( diff --git a/packages/unmock/src/__tests__/tsconfig.json b/packages/unmock/src/__tests__/tsconfig.json new file mode 100644 index 00000000..7219b24e --- /dev/null +++ b/packages/unmock/src/__tests__/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../../../tsconfig.test.base", + "include": ["**/*"], + "references": [ + { "path": "../../" } + ] +} \ No newline at end of file