From acd91f9fb050a9ede2a447fb796d1587e3a1e49f Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Sun, 9 Oct 2022 08:16:42 -0500 Subject: [PATCH] refactor: implement factories for testing --- frontend/lib/api/__test__/factories/index.ts | 32 +++++++++++++++++++ frontend/lib/api/__test__/public.test.ts | 16 ++-------- frontend/lib/api/__test__/user/labels.test.ts | 16 ++-------- .../lib/api/__test__/user/locations.test.ts | 14 ++------ 4 files changed, 41 insertions(+), 37 deletions(-) create mode 100644 frontend/lib/api/__test__/factories/index.ts diff --git a/frontend/lib/api/__test__/factories/index.ts b/frontend/lib/api/__test__/factories/index.ts new file mode 100644 index 0000000..6d2ab6f --- /dev/null +++ b/frontend/lib/api/__test__/factories/index.ts @@ -0,0 +1,32 @@ +import { faker } from "@faker-js/faker"; +import { LabelCreate, LocationCreate, UserRegistration } from "../../types/data-contracts"; + +/** + * Returns a random user registration object that can be + * used to signup a new user. + */ +function user(): UserRegistration { + return { + email: faker.internet.email(), + password: faker.internet.password(), + name: faker.name.firstName(), + token: "", + }; +} + +function location(): LocationCreate { + return { + name: faker.address.city(), + description: faker.lorem.sentence(), + }; +} + +function label(): LabelCreate { + return { + name: faker.lorem.word(), + description: faker.lorem.sentence(), + color: faker.internet.color(), + }; +} + +export const factories = { user, location, label }; diff --git a/frontend/lib/api/__test__/public.test.ts b/frontend/lib/api/__test__/public.test.ts index 4b07165..5137f11 100644 --- a/frontend/lib/api/__test__/public.test.ts +++ b/frontend/lib/api/__test__/public.test.ts @@ -1,17 +1,7 @@ import { describe, test, expect } from "vitest"; -import { faker } from "@faker-js/faker"; -import { UserRegistration } from "../types/data-contracts"; +import { factories } from "./factories"; import { client, sharedUserClient, userClient } from "./test-utils"; -function userFactory(): UserRegistration { - return { - email: faker.internet.email(), - password: faker.internet.password(), - name: faker.name.firstName(), - token: "", - }; -} - describe("[GET] /api/v1/status", () => { test("server should respond", async () => { const api = client(); @@ -23,7 +13,7 @@ describe("[GET] /api/v1/status", () => { describe("first time user workflow (register, login, join group)", () => { const api = client(); - const userData = userFactory(); + const userData = factories.user(); test("user should be able to register", async () => { const { response } = await api.register(userData); @@ -59,7 +49,7 @@ describe("first time user workflow (register, login, join group)", () => { // Create User 2 with token - const duplicateUser = userFactory(); + const duplicateUser = factories.user(); duplicateUser.token = data.token; const { response: registerResp } = await api.register(duplicateUser); diff --git a/frontend/lib/api/__test__/user/labels.test.ts b/frontend/lib/api/__test__/user/labels.test.ts index 1fc414a..5564e6b 100644 --- a/frontend/lib/api/__test__/user/labels.test.ts +++ b/frontend/lib/api/__test__/user/labels.test.ts @@ -1,23 +1,17 @@ import { describe, expect, test } from "vitest"; import { LabelOut } from "../../types/data-contracts"; import { UserClient } from "../../user"; +import { factories } from "../factories"; import { sharedUserClient } from "../test-utils"; describe("locations lifecycle (create, update, delete)", () => { - let increment = 0; - /** * useLabel sets up a label resource for testing, and returns a function * that can be used to delete the label from the backend server. */ async function useLabel(api: UserClient): Promise<[LabelOut, () => Promise]> { - const { response, data } = await api.labels.create({ - name: `__test__.label.name_${increment}`, - description: `__test__.label.description_${increment}`, - color: "", - }); + const { response, data } = await api.labels.create(factories.label()); expect(response.status).toBe(201); - increment++; const cleanup = async () => { const { response } = await api.labels.delete(data.id); @@ -29,11 +23,7 @@ describe("locations lifecycle (create, update, delete)", () => { test("user should be able to create a label", async () => { const api = await sharedUserClient(); - const labelData = { - name: "test-label", - description: "test-description", - color: "", - }; + const labelData = factories.label(); const { response, data } = await api.labels.create(labelData); diff --git a/frontend/lib/api/__test__/user/locations.test.ts b/frontend/lib/api/__test__/user/locations.test.ts index 8583074..eb7765e 100644 --- a/frontend/lib/api/__test__/user/locations.test.ts +++ b/frontend/lib/api/__test__/user/locations.test.ts @@ -1,22 +1,17 @@ import { describe, expect, test } from "vitest"; import { LocationOut } from "../../types/data-contracts"; import { UserClient } from "../../user"; +import { factories } from "../factories"; import { sharedUserClient } from "../test-utils"; describe("locations lifecycle (create, update, delete)", () => { - let increment = 0; - /** * useLocatio sets up a location resource for testing, and returns a function * that can be used to delete the location from the backend server. */ async function useLocation(api: UserClient): Promise<[LocationOut, () => Promise]> { - const { response, data } = await api.locations.create({ - name: `__test__.location.name_${increment}`, - description: `__test__.location.description_${increment}`, - }); + const { response, data } = await api.locations.create(factories.location()); expect(response.status).toBe(201); - increment++; const cleanup = async () => { const { response } = await api.locations.delete(data.id); @@ -29,10 +24,7 @@ describe("locations lifecycle (create, update, delete)", () => { test("user should be able to create a location", async () => { const api = await sharedUserClient(); - const locationData = { - name: "test-location", - description: "test-description", - }; + const locationData = factories.location(); const { response, data } = await api.locations.create(locationData);