eletrotupi / tcc/ api/tests/sleep-records/crud.test.tsc901c35af9c84b6a29e5185545ced1129f33b8f4
5.2 KB | 176 lines Raw
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
})