api: flesh sleep records tests
Pedro Lucas Porcellis porcellis@eletrotupi.com · 4 months ago
22627d0d2be10a13b161ae26877b3828677f36e1 Browse filesParents
3213901Changed files
1
Additions
+176
Deletions
0
/dev/null → api/tests/sleep-records/crud.test.ts
1 +
import { describe, it, expect, afterAll, beforeEach } from 'vitest'
2 +
import request from 'supertest'
3 +
import { createApp } from '@app/createApp'
4 +
import {
5 +
buildPrisma,
6 +
cleanupTestDb,
7 +
createTestUser,
8 +
generateTestToken
9 +
} from '../test-helper'
10 +
11 +
const app = createApp()
12 +
const db = buildPrisma()
13 +
14 +
afterAll(() => db.$disconnect())
15 +
beforeEach(() => cleanupTestDb(db))
16 +
17 +
async function seedSleepRecord(
18 +
userId: number,
19 +
overrides: { average?: number; annotations?: string } = {}
20 +
) {
21 +
return db.sleepRecord.create({
22 +
data: {
23 +
userId,
24 +
date: new Date(),
25 +
average: overrides.average ?? 7,
26 +
annotations: overrides.annotations,
27 +
},
28 +
})
29 +
}
30 +
31 +
describe('POST /sleep_records', () => {
32 +
it('creates a sleep record and returns it', async () => {
33 +
const user = await createTestUser(db)
34 +
const token = generateTestToken(user.id, user.email)
35 +
36 +
const res = await request(app)
37 +
.post('/sleep_records')
38 +
.set('Authorization', `Bearer ${token}`)
39 +
.send({
40 +
sleepRecord: {
41 +
date: new Date().toISOString(),
42 +
average: 8,
43 +
annotations: 'Slept well',
44 +
},
45 +
})
46 +
47 +
expect(res.status).toBe(201)
48 +
expect(res.body.sleepRecord.average).toBe(8)
49 +
expect(res.body.sleepRecord.annotations).toBe('Slept well')
50 +
51 +
const dbRecord = await db.sleepRecord.findFirst({ where: { userId: user.id } })
52 +
53 +
expect(dbRecord).not.toBeNull()
54 +
})
55 +
56 +
it('returns 400 for out-of-range average', async () => {
57 +
const user = await createTestUser(db)
58 +
const token = generateTestToken(user.id, user.email)
59 +
60 +
const res = await request(app)
61 +
.post('/sleep_records')
62 +
.set('Authorization', `Bearer ${token}`)
63 +
.send({ sleepRecord: { date: new Date().toISOString(), average: 20 } })
64 +
65 +
expect(res.status).toBe(400)
66 +
})
67 +
68 +
it('returns 400 for missing required fields', async () => {
69 +
const user = await createTestUser(db)
70 +
const token = generateTestToken(user.id, user.email)
71 +
72 +
const res = await request(app)
73 +
.post('/sleep_records')
74 +
.set('Authorization', `Bearer ${token}`)
75 +
.send({ sleepRecord: { annotations: 'No date or average' } })
76 +
77 +
expect(res.status).toBe(400)
78 +
})
79 +
80 +
it('returns 401 without a token', async () => {
81 +
const res = await request(app)
82 +
.post('/sleep_records')
83 +
.send({ sleepRecord: { date: new Date().toISOString(), average: 7 } })
84 +
85 +
expect(res.status).toBe(401)
86 +
})
87 +
})
88 +
89 +
describe('GET /sleep_records', () => {
90 +
it('returns only the authenticated user\'s records', async () => {
91 +
const user = await createTestUser(db)
92 +
const other = await createTestUser(db, { email: 'other@example.com' })
93 +
const token = generateTestToken(user.id, user.email)
94 +
95 +
await seedSleepRecord(user.id, { average: 6 })
96 +
await seedSleepRecord(user.id, { average: 8 })
97 +
await seedSleepRecord(other.id, { average: 5 })
98 +
99 +
const res = await request(app)
100 +
.get('/sleep_records')
101 +
.set('Authorization', `Bearer ${token}`)
102 +
103 +
expect(res.status).toBe(200)
104 +
expect(res.body.entries).toHaveLength(2)
105 +
expect(res.body.entries.every((r: any) => r.userId === user.id)).toBe(true)
106 +
})
107 +
108 +
it('returns an empty list when no records exist', async () => {
109 +
const user = await createTestUser(db)
110 +
const token = generateTestToken(user.id, user.email)
111 +
112 +
const res = await request(app)
113 +
.get('/sleep_records')
114 +
.set('Authorization', `Bearer ${token}`)
115 +
116 +
expect(res.status).toBe(200)
117 +
expect(res.body.entries).toEqual([])
118 +
expect(res.body.total).toBe(0)
119 +
})
120 +
})
121 +
122 +
describe('GET /sleep_records/:id', () => {
123 +
it('returns a single sleep record', async () => {
124 +
const user = await createTestUser(db)
125 +
const token = generateTestToken(user.id, user.email)
126 +
const record = await seedSleepRecord(
127 +
user.id, { average: 9, annotations: 'Great night' }
128 +
)
129 +
130 +
const res = await request(app)
131 +
.get(`/sleep_records/${record.id}`)
132 +
.set('Authorization', `Bearer ${token}`)
133 +
134 +
expect(res.status).toBe(200)
135 +
expect(res.body.id).toBe(record.id)
136 +
expect(res.body.average).toBe(9)
137 +
expect(res.body.annotations).toBe('Great night')
138 +
})
139 +
})
140 +
141 +
describe('PUT /sleep_records/:id', () => {
142 +
it('updates sleep record fields', async () => {
143 +
const user = await createTestUser(db)
144 +
const token = generateTestToken(user.id, user.email)
145 +
const record = await seedSleepRecord(user.id, { average: 5 })
146 +
147 +
const res = await request(app)
148 +
.put(`/sleep_records/${record.id}`)
149 +
.set('Authorization', `Bearer ${token}`)
150 +
.send({ sleepRecord: { average: 10, annotations: 'Dreamt with Sade' } })
151 +
152 +
expect(res.status).toBe(200)
153 +
expect(res.body.sleepRecord.average).toBe(10)
154 +
expect(res.body.sleepRecord.annotations).toBe('Dreamt with Sade')
155 +
})
156 +
})
157 +
158 +
describe('DELETE /sleep_records/:id', () => {
159 +
it('deletes a sleep record', async () => {
160 +
const user = await createTestUser(db)
161 +
const token = generateTestToken(user.id, user.email)
162 +
const record = await seedSleepRecord(user.id)
163 +
164 +
const res = await request(app)
165 +
.delete(`/sleep_records/${record.id}`)
166 +
.set('Authorization', `Bearer ${token}`)
167 +
168 +
expect(res.status).toBe(200)
169 +
170 +
const dbRecord = await db.sleepRecord.findUnique({
171 +
where: { id: record.id }
172 +
})
173 +
174 +
expect(dbRecord).toBeNull()
175 +
})
176 +
})