api: flesh sleep records tests
Parents:
32139011 file(s) changed
- api/tests/sleep-records/crud.test.ts +176 -0
api/tests/sleep-records/crud.test.ts
@@ -0,0 +1,176 @@
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 + })