eletrotupi / tcc/ commit / 22627d0

api: flesh sleep records tests

Pedro Lucas Porcellis porcellis@eletrotupi.com · 4 months ago 22627d0d2be10a13b161ae26877b3828677f36e1 Browse files
Parents 3213901
Changed 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 +
})