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<object>("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();
	});
});