diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 383bb0a..e3b0150 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,4 +1,4 @@ -name: Deploy to Railway +name: Deployment pipeline on: [push, pull_request] diff --git a/app/auth/mutations/forgot-password.test.ts b/app/auth/mutations/forgot-password.test.ts deleted file mode 100644 index ff0b068..0000000 --- a/app/auth/mutations/forgot-password.test.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { hash256, Ctx } from "blitz"; -import previewEmail from "preview-email"; - -import forgotPassword from "./forgot-password"; -import db from "../../../db"; - -beforeEach(async () => { - await db.$reset(); -}); - -const generatedToken = "plain-token"; -jest.mock("blitz", () => ({ - ...jest.requireActual("blitz")!, - generateToken: () => generatedToken, -})); -jest.mock("preview-email", () => jest.fn()); - -describe.skip("forgotPassword mutation", () => { - it("does not throw error if user doesn't exist", async () => { - await expect(forgotPassword({ email: "no-user@email.com" }, {} as Ctx)).resolves.not.toThrow(); - }); - - it("works correctly", async () => { - // Create test user - const user = await db.user.create({ - data: { - email: "user@example.com", - tokens: { - // Create old token to ensure it's deleted - create: { - type: "RESET_PASSWORD", - hashedToken: "token", - expiresAt: new Date(), - sentTo: "user@example.com", - }, - }, - }, - include: { tokens: true }, - }); - - // Invoke the mutation - await forgotPassword({ email: user.email }, {} as Ctx); - - const tokens = await db.token.findMany({ where: { userId: user.id } }); - const token = tokens[0]; - if (!user.tokens[0]) throw new Error("Missing user token"); - if (!token) throw new Error("Missing token"); - - // delete's existing tokens - expect(tokens.length).toBe(1); - - expect(token.id).not.toBe(user.tokens[0].id); - expect(token.type).toBe("RESET_PASSWORD"); - expect(token.sentTo).toBe(user.email); - expect(token.hashedToken).toBe(hash256(generatedToken)); - expect(token.expiresAt > new Date()).toBe(true); - expect(previewEmail).toBeCalled(); - }); -}); diff --git a/app/auth/mutations/reset-password.test.ts b/app/auth/mutations/reset-password.test.ts deleted file mode 100644 index 5407d4f..0000000 --- a/app/auth/mutations/reset-password.test.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { hash256, SecurePassword } from "blitz"; - -import db from "../../../db"; -import resetPassword from "./reset-password"; - -beforeEach(async () => { - await db.$reset(); -}); - -const mockCtx: any = { - session: { - $create: jest.fn, - }, -}; - -describe.skip("resetPassword mutation", () => { - it("works correctly", async () => { - expect(true).toBe(true); - - // Create test user - const goodToken = "randomPasswordResetToken"; - const expiredToken = "expiredRandomPasswordResetToken"; - const future = new Date(); - future.setHours(future.getHours() + 4); - const past = new Date(); - past.setHours(past.getHours() - 4); - - const user = await db.user.create({ - data: { - email: "user@example.com", - tokens: { - // Create old token to ensure it's deleted - create: [ - { - type: "RESET_PASSWORD", - hashedToken: hash256(expiredToken), - expiresAt: past, - sentTo: "user@example.com", - }, - { - type: "RESET_PASSWORD", - hashedToken: hash256(goodToken), - expiresAt: future, - sentTo: "user@example.com", - }, - ], - }, - }, - include: { tokens: true }, - }); - - const newPassword = "newPassword"; - - // Non-existent token - await expect( - resetPassword({ token: "no-token", password: "", passwordConfirmation: "" }, mockCtx), - ).rejects.toThrowError(); - - // Expired token - await expect( - resetPassword({ token: expiredToken, password: newPassword, passwordConfirmation: newPassword }, mockCtx), - ).rejects.toThrowError(); - - // Good token - await resetPassword({ token: goodToken, password: newPassword, passwordConfirmation: newPassword }, mockCtx); - - // Delete's the token - const numberOfTokens = await db.token.count({ where: { userId: user.id } }); - expect(numberOfTokens).toBe(0); - - // Updates user's password - const updatedUser = await db.user.findFirst({ where: { id: user.id } }); - expect(await SecurePassword.verify(updatedUser!.hashedPassword, newPassword)).toBe(SecurePassword.VALID); - }); -}); diff --git a/app/pages/index.test.tsx b/app/pages/index.test.tsx deleted file mode 100644 index f7ebc06..0000000 --- a/app/pages/index.test.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { GlobalRole } from "db"; -import { render } from "../../test/utils"; -import Home from "./index"; -import useCurrentUser from "../core/hooks/use-current-user"; - -jest.mock("../core/hooks/use-current-user"); -const mockUseCurrentUser = useCurrentUser as jest.MockedFunction; - -test.skip("renders blitz documentation link", () => { - // This is an example of how to ensure a specific item is in the document - // But it's disabled by default (by test.skip) so the test doesn't fail - // when you remove the the default content from the page - - // This is an example on how to mock api hooks when testing - mockUseCurrentUser.mockReturnValue({ - organization: undefined, - user: { - id: uuidv4(), - name: "name", - email: "email@test.com", - role: GlobalRole.CUSTOMER, - memberships: [], - }, - hasFilledTwilioCredentials: false, - hasCompletedOnboarding: undefined, - }); - - const { getByText } = render(); - const linkElement = getByText(/Documentation/i); - expect(linkElement).toBeInTheDocument(); -}); - -function uuidv4() { - return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { - const r = (Math.random() * 16) | 0, - v = c == "x" ? r : (r & 0x3) | 0x8; - return v.toString(16); - }); -}