Merge branch 'master' into outgoing-calls

This commit is contained in:
m5r
2021-08-30 06:58:00 +08:00
92 changed files with 6276 additions and 3211 deletions

View File

@ -24,7 +24,7 @@ export const LoginForm = (props: LoginFormProps) => {
try {
await loginMutation(values);
props.onSuccess?.();
} catch (error) {
} catch (error: any) {
if (error instanceof AuthenticationError) {
return { [FORM_ERROR]: "Sorry, those credentials are invalid" };
} else {

View File

@ -24,7 +24,7 @@ export const SignupForm = (props: SignupFormProps) => {
try {
await signupMutation(values);
props.onSuccess?.();
} catch (error) {
} catch (error: any) {
if (error.code === "P2002" && error.meta?.target?.includes("email")) {
// This error comes from Prisma
return { email: "This email is already being used" };

View File

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

View File

@ -1,6 +1,6 @@
import { resolver, SecurePassword, AuthenticationError } from "blitz";
import db, { GlobalRole } from "../../../db";
import db from "../../../db";
import { Login } from "../validations";
export const authenticateUser = async (rawEmail: string, rawPassword: string) => {

View File

@ -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);
});
});

View File

@ -27,7 +27,7 @@ const ForgotPasswordPage: BlitzPage = () => {
onSubmit={async (values) => {
try {
await forgotPasswordMutation(values);
} catch (error) {
} catch (error: any) {
return {
[FORM_ERROR]: "Sorry, we had an unexpected error. Please try again.",
};

View File

@ -19,7 +19,7 @@ const ResetPasswordPage: BlitzPage = () => {
<div>
<h2>Password Reset Successfully</h2>
<p>
Go to the <Link href={Routes.Home()}>homepage</Link>
Go to the <Link href={Routes.LandingPage()}>homepage</Link>
</p>
</div>
) : (
@ -34,7 +34,7 @@ const ResetPasswordPage: BlitzPage = () => {
onSubmit={async (values) => {
try {
await resetPasswordMutation(values);
} catch (error) {
} catch (error: any) {
if (error.name === "ResetPasswordError") {
return {
[FORM_ERROR]: error.message,