Skip to content

Commit df55c3d

Browse files
committed
test: add loader regression test for purchase verify redirect
Add test covering the critical invariant that VERIFIED transactions are redirected to /dashboard/purchase/completed by the loader. This protects the dead-code removal in the component (disabled props) from future regressions. Also remove .zed/ from tracking and add to .gitignore.
1 parent b159dc9 commit df55c3d

4 files changed

Lines changed: 70 additions & 156 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,4 @@ bv-pages/
4646

4747
# Local backup files
4848
prisma/backups/
49+
.zed/

.zed/settings.json

Lines changed: 0 additions & 88 deletions
This file was deleted.

.zed/tasks.json

Lines changed: 0 additions & 68 deletions
This file was deleted.
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import { beforeEach, describe, expect, it, vi } from 'vitest'
2+
import { redirect } from '@remix-run/node'
3+
import { loader } from '../dashboard.purchase.verify'
4+
import { TRANSACTION_STATUS } from '~/models/enum'
5+
import { requireUser } from '~/services/auth.server'
6+
import { getFirstTransaction } from '~/models/transaction'
7+
8+
vi.mock('~/services/auth.server', () => ({
9+
requireUser: vi.fn(),
10+
}))
11+
12+
vi.mock('~/models/transaction', () => ({
13+
getFirstTransaction: vi.fn(),
14+
}))
15+
16+
function buildRequest(url = 'http://example.com/dashboard/purchase/verify') {
17+
return new Request(url, { method: 'GET' })
18+
}
19+
20+
const fakeUser = { id: 'user-1', email: 'test@example.com' }
21+
22+
describe('dashboard.purchase.verify loader', () => {
23+
beforeEach(() => {
24+
vi.mocked(requireUser).mockResolvedValue(fakeUser as never)
25+
})
26+
27+
it('redirects to /dashboard/purchase when no transaction exists', async () => {
28+
vi.mocked(getFirstTransaction).mockResolvedValue(null)
29+
30+
const response = await loader({
31+
request: buildRequest(),
32+
params: {},
33+
context: {},
34+
})
35+
36+
expect(response).toEqual(redirect('/dashboard/purchase'))
37+
})
38+
39+
it('redirects to /dashboard/purchase/completed when transaction is VERIFIED', async () => {
40+
vi.mocked(getFirstTransaction).mockResolvedValue({
41+
id: 'tx-1',
42+
status: TRANSACTION_STATUS.VERIFIED,
43+
} as never)
44+
45+
const response = await loader({
46+
request: buildRequest(),
47+
params: {},
48+
context: {},
49+
})
50+
51+
expect(response).toEqual(redirect('/dashboard/purchase/completed'))
52+
})
53+
54+
it('returns transaction and user when transaction is not verified', async () => {
55+
const fakeTransaction = {
56+
id: 'tx-1',
57+
status: TRANSACTION_STATUS.CREATED,
58+
}
59+
vi.mocked(getFirstTransaction).mockResolvedValue(fakeTransaction as never)
60+
61+
const response = await loader({
62+
request: buildRequest(),
63+
params: {},
64+
context: {},
65+
})
66+
67+
expect(response).toEqual({ transaction: fakeTransaction, user: fakeUser })
68+
})
69+
})

0 commit comments

Comments
 (0)