UNPKG

@hyper-fetch/core

Version:

Cache, Queue and Persist your requests no matter if you are online or offline!

183 lines (135 loc) 7.18 kB
import { createHttpMockingServer } from "@hyper-fetch/testing"; import { Client } from "client"; import { Request } from "request"; const { resetMocks, startServer, stopServer } = createHttpMockingServer(); describe("Client [ fromJSON ]", () => { let client = new Client({ url: "shared-base-url" }); beforeAll(() => { startServer(); }); beforeEach(() => { client = new Client({ url: "shared-base-url" }); resetMocks(); }); afterAll(() => { stopServer(); }); describe("When reconstructing a request from JSON", () => { it("should return a Request class instance", () => { const original = client.createRequest()({ endpoint: "/users", method: "GET" }); const json = original.toJSON(); const restored = client.fromJSON(json); expect(restored).toBeInstanceOf(Request); }); it("should preserve endpoint from the original request", () => { const original = client.createRequest()({ endpoint: "/users/:id", method: "GET" }); const json = original.toJSON(); const restored = client.fromJSON(json); expect(restored.endpoint).toBe("/users/:id"); }); it("should preserve method from the original request", () => { const original = client.createRequest()({ endpoint: "/users", method: "POST" }); const json = original.toJSON(); const restored = client.fromJSON(json); expect(restored.method).toBe("POST"); }); it("should preserve request options through serialization", () => { const original = client.createRequest()({ endpoint: "/data", method: "PUT", cache: true, retry: 3, cacheTime: 5000, }); const json = original.toJSON(); const restored = client.fromJSON(json); expect(restored.cache).toBe(true); expect(restored.retry).toBe(3); expect(restored.cacheTime).toBe(5000); }); it("should bind the restored request to the client", () => { const original = client.createRequest()({ endpoint: "/test", method: "GET" }); const json = original.toJSON(); const restored = client.fromJSON(json); expect(restored.client).toBe(client); }); }); describe("When using type generics", () => { it("should produce the same response type as createRequest", () => { type Props = { response: { id: number; name: string } }; const created = client.createRequest<Props>()({ endpoint: "/users", method: "GET" }); const restored = client.fromJSON<Props>(created.toJSON()); type CreatedData = Awaited<ReturnType<typeof created.send>>["data"]; type RestoredData = Awaited<ReturnType<typeof restored.send>>["data"]; expectTypeOf<RestoredData>().toEqualTypeOf<CreatedData>(); }); it("should produce the same payload type as createRequest", () => { type Props = { response: { id: number }; payload: { name: string; email: string } }; const created = client.createRequest<Props>()({ endpoint: "/users", method: "POST" }); const restored = client.fromJSON<Props>(created.toJSON()); type CreatedPayload = Parameters<typeof created.setPayload>[0]; type RestoredPayload = Parameters<typeof restored.setPayload>[0]; expectTypeOf<RestoredPayload>().toEqualTypeOf<CreatedPayload>(); }); it("should produce the same error type as createRequest", () => { type Props = { error: { code: string; message: string } }; const created = client.createRequest<Props>()({ endpoint: "/fail", method: "GET" }); const restored = client.fromJSON<Props>(created.toJSON()); type CreatedError = Awaited<ReturnType<typeof created.send>>["error"]; type RestoredError = Awaited<ReturnType<typeof restored.send>>["error"]; expectTypeOf<RestoredError>().toEqualTypeOf<CreatedError>(); }); it("should produce the same defaults as createRequest when no generics are passed", () => { const created = client.createRequest()({ endpoint: "/test", method: "GET" }); const restored = client.fromJSON(created.toJSON()); type CreatedData = Awaited<ReturnType<typeof created.send>>["data"]; type RestoredData = Awaited<ReturnType<typeof restored.send>>["data"]; type CreatedPayload = Parameters<typeof created.setPayload>[0]; type RestoredPayload = Parameters<typeof restored.setPayload>[0]; expectTypeOf<RestoredData>().toEqualTypeOf<CreatedData>(); expectTypeOf<RestoredPayload>().toEqualTypeOf<CreatedPayload>(); }); it("should produce the same endpoint params type as createRequest", () => { type Props = { response: { id: number }; endpoint: "/users/:userId" }; const created = client.createRequest<Props>()({ endpoint: "/users/:userId", method: "GET" }); const restored = client.fromJSON<Props>(created.toJSON()); type CreatedParams = Parameters<typeof created.setParams>[0]; type RestoredParams = Parameters<typeof restored.setParams>[0]; expectTypeOf<RestoredParams>().toEqualTypeOf<CreatedParams>(); }); it("should produce the same query params type as createRequest", () => { type Props = { queryParams: { search?: string; page?: number } }; const created = client.createRequest<Props>()({ endpoint: "/search", method: "GET" }); const restored = client.fromJSON<Props>(created.toJSON()); type CreatedQueryParams = Parameters<typeof created.setQueryParams>[0]; type RestoredQueryParams = Parameters<typeof restored.setQueryParams>[0]; expectTypeOf<RestoredQueryParams>().toEqualTypeOf<CreatedQueryParams>(); }); it("should produce matching types for all generics combined", () => { type Props = { response: { id: number }; payload: { name: string }; error: { msg: string }; queryParams: { limit: number }; endpoint: "/items/:itemId"; }; const created = client.createRequest<Props>()({ endpoint: "/items/:itemId", method: "POST" }); const restored = client.fromJSON<Props>(created.toJSON()); type CreatedData = Awaited<ReturnType<typeof created.send>>["data"]; type RestoredData = Awaited<ReturnType<typeof restored.send>>["data"]; expectTypeOf<RestoredData>().toEqualTypeOf<CreatedData>(); type CreatedError = Awaited<ReturnType<typeof created.send>>["error"]; type RestoredError = Awaited<ReturnType<typeof restored.send>>["error"]; expectTypeOf<RestoredError>().toEqualTypeOf<CreatedError>(); type CreatedPayload = Parameters<typeof created.setPayload>[0]; type RestoredPayload = Parameters<typeof restored.setPayload>[0]; expectTypeOf<RestoredPayload>().toEqualTypeOf<CreatedPayload>(); type CreatedParams = Parameters<typeof created.setParams>[0]; type RestoredParams = Parameters<typeof restored.setParams>[0]; expectTypeOf<RestoredParams>().toEqualTypeOf<CreatedParams>(); type CreatedQueryParams = Parameters<typeof created.setQueryParams>[0]; type RestoredQueryParams = Parameters<typeof restored.setQueryParams>[0]; expectTypeOf<RestoredQueryParams>().toEqualTypeOf<CreatedQueryParams>(); }); }); });