134 lines
3.4 KiB
TypeScript
134 lines
3.4 KiB
TypeScript
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
import { isHttpError, isRedirect, isActionFailure, redirect } from '@sveltejs/kit';
|
|
import { createLocals, mockUser, createFormRequest } from '$lib/test-utils';
|
|
import { serverFormatPhoneNumber } from '$lib/utils';
|
|
|
|
const { create, findUnique } = vi.hoisted(() => ({
|
|
create: vi.fn(),
|
|
findUnique: vi.fn()
|
|
}));
|
|
|
|
vi.mock('$lib/db', () => ({
|
|
prisma: {
|
|
user: {
|
|
findUnique
|
|
},
|
|
profile: {
|
|
create
|
|
}
|
|
}
|
|
}));
|
|
|
|
vi.mock('$lib/utils', () => ({
|
|
serverFormatPhoneNumber: vi.fn((val: string) => `formatted-${val}`)
|
|
}));
|
|
|
|
import { load, actions } from './+page.server';
|
|
|
|
const invokeDefault = (request: Request) => actions.default({ request } as any);
|
|
|
|
describe('profile setup page server load', () => {
|
|
beforeEach(() => {
|
|
create.mockReset();
|
|
});
|
|
|
|
it('throws 403 when user is not logged in', async () => {
|
|
const err = await Promise.resolve(load({ locals: createLocals() } as any)).catch(
|
|
(e: unknown) => e
|
|
);
|
|
expect(isHttpError(err, 403)).toBe(true);
|
|
});
|
|
|
|
it('returns user data when logged in', async () => {
|
|
const user = mockUser({ id: 'user-1', name: 'Jane Doe' });
|
|
findUnique.mockResolvedValue(user);
|
|
|
|
const result = await load({ locals: createLocals(user as any) } as any);
|
|
expect(result).toEqual({ user });
|
|
});
|
|
});
|
|
|
|
describe('profile setup page server action', () => {
|
|
beforeEach(() => {
|
|
create.mockReset();
|
|
});
|
|
|
|
it('redirects to /dashboard on successful profile creation', async () => {
|
|
create.mockResolvedValue({ id: 'profile-1', userId: 'user-1' });
|
|
|
|
const request = createFormRequest({
|
|
userId: 'user-1',
|
|
firstName: 'Jane',
|
|
lastName: 'Doe',
|
|
phoneNumber: '555-0100'
|
|
});
|
|
|
|
const err = await Promise.resolve(invokeDefault(request)).catch((e: unknown) => e);
|
|
expect(isRedirect(err)).toBe(true);
|
|
if (isRedirect(err)) {
|
|
expect(err.status).toBe(303);
|
|
expect(err.location).toBe('/dashboard');
|
|
}
|
|
expect(serverFormatPhoneNumber).toHaveBeenCalledWith('555-0100');
|
|
expect(create).toHaveBeenCalledWith({
|
|
data: {
|
|
userId: 'user-1',
|
|
firstName: 'Jane',
|
|
lastName: 'Doe',
|
|
phoneNumber: 'formatted-555-0100'
|
|
}
|
|
});
|
|
});
|
|
|
|
it('returns fail(400) when profile.create returns falsy', async () => {
|
|
create.mockResolvedValue(null);
|
|
|
|
const request = createFormRequest({
|
|
userId: 'user-1',
|
|
firstName: 'Jane',
|
|
lastName: 'Doe',
|
|
phoneNumber: '555-0100'
|
|
});
|
|
|
|
const result = await invokeDefault(request);
|
|
expect(isActionFailure(result)).toBe(true);
|
|
});
|
|
|
|
it('throws 400 error when profile.create throws', async () => {
|
|
create.mockRejectedValue(new Error('db error'));
|
|
|
|
const request = createFormRequest({
|
|
userId: 'user-1',
|
|
firstName: 'Jane',
|
|
lastName: 'Doe',
|
|
phoneNumber: '555-0100'
|
|
});
|
|
|
|
const err = await Promise.resolve(invokeDefault(request)).catch((e: unknown) => e);
|
|
expect(isHttpError(err, 400)).toBe(true);
|
|
if (isHttpError(err)) {
|
|
expect(err.body.message).toBe('bad request');
|
|
}
|
|
});
|
|
|
|
it('re-throws redirect errors from profile.create', async () => {
|
|
let redirectError: unknown;
|
|
try {
|
|
redirect(303, '/dashboard');
|
|
} catch (e) {
|
|
redirectError = e;
|
|
}
|
|
create.mockRejectedValue(redirectError);
|
|
|
|
const request = createFormRequest({
|
|
userId: 'user-1',
|
|
firstName: 'Jane',
|
|
lastName: 'Doe',
|
|
phoneNumber: '555-0100'
|
|
});
|
|
|
|
const err = await Promise.resolve(invokeDefault(request)).catch((e: unknown) => e);
|
|
expect(err).toBe(redirectError);
|
|
});
|
|
});
|