eletrotupi / tcc/ api/tests/medicine-regimens/crud.test.tsc901c35af9c84b6a29e5185545ced1129f33b8f4
6.0 KB | 196 lines Raw
1
import { describe, it, expect, afterAll, beforeEach } from 'vitest'
2
import request from 'supertest'
3
import { createApp } from '@app/createApp'
4
import { buildPrisma, cleanupTestDb, createTestUser, generateTestToken } from '../test-helper'
5

6
const app = createApp()
7
const db = buildPrisma()
8

9
afterAll(() => db.$disconnect())
10
beforeEach(() => cleanupTestDb(db))
11

12
async function seedRegimen(
13
  userId: number,
14
  overrides: { name?: string; active?: boolean } = {}
15
) {
16
  return db.medicineRegimen.create({
17
    data: {
18
      userId,
19
      name: overrides.name ?? 'Sertralina',
20
      dosage: '50mg',
21
      periodicity: 'DAILY',
22
      scheduledAt: [],
23
      active: overrides.active ?? true,
24
    },
25
  })
26
}
27

28
describe('POST /medicine-regimens', () => {
29
  it('creates a regimen and returns it', async () => {
30
    const user = await createTestUser(db)
31
    const token = generateTestToken(user.id, user.email)
32

33
    const res = await request(app)
34
      .post('/medicine-regimens')
35
      .set('Authorization', `Bearer ${token}`)
36
      .send({
37
        regimen: {
38
          name: 'Clonazepam',
39
          dosage: '0.5mg',
40
          periodicity: 'DAILY',
41
          scheduledAt: ['08:00', '20:00'],
42
        },
43
      })
44

45
    expect(res.status).toBe(201)
46
    expect(res.body.regimen.name).toBe('Clonazepam')
47
    expect(res.body.regimen.active).toBe(true)
48
    expect(res.body.regimen.scheduledAt).toEqual(['08:00', '20:00'])
49

50
    const dbRecord = await db.medicineRegimen.findFirst({
51
      where: { userId: user.id }
52
    })
53

54
    expect(dbRecord).not.toBeNull()
55
  })
56

57
  it('returns 400 for missing required fields', async () => {
58
    const user = await createTestUser(db)
59
    const token = generateTestToken(user.id, user.email)
60

61
    const res = await request(app)
62
      .post('/medicine-regimens')
63
      .set('Authorization', `Bearer ${token}`)
64
      .send({ regimen: { name: 'X' } })
65

66
    expect(res.status).toBe(400)
67
  })
68
})
69

70
describe('GET /medicine-regimens', () => {
71
  it('returns all regimens for the user', async () => {
72
    const user = await createTestUser(db)
73
    const other = await createTestUser(db, { email: 'other@example.com' })
74
    const token = generateTestToken(user.id, user.email)
75

76
    await seedRegimen(user.id, { name: 'Sertralina' })
77
    await seedRegimen(user.id, { name: 'Ritalina' })
78
    await seedRegimen(other.id, { name: 'OutroMed' })
79

80
    const res = await request(app)
81
      .get('/medicine-regimens')
82
      .set('Authorization', `Bearer ${token}`)
83

84
    expect(res.status).toBe(200)
85
    expect(res.body.regimens).toHaveLength(2)
86
    expect(res.body.regimens.every((r: any) => r.userId === user.id)).toBe(true)
87
  })
88
})
89

90
describe('GET /medicine-regimens/:id', () => {
91
  it('returns a single regimen', async () => {
92
    const user = await createTestUser(db)
93
    const token = generateTestToken(user.id, user.email)
94
    const regimen = await seedRegimen(user.id)
95

96
    const res = await request(app)
97
      .get(`/medicine-regimens/${regimen.id}`)
98
      .set('Authorization', `Bearer ${token}`)
99

100
    expect(res.status).toBe(200)
101
    expect(res.body.regimen.id).toBe(regimen.id)
102
    expect(res.body.regimen.name).toBe('Sertralina')
103
  })
104

105
  it('returns 404 for a regimen belonging to another user', async () => {
106
    const user = await createTestUser(db)
107
    const other = await createTestUser(db, { email: 'other@example.com' })
108
    const token = generateTestToken(user.id, user.email)
109
    const regimen = await seedRegimen(other.id)
110

111
    const res = await request(app)
112
      .get(`/medicine-regimens/${regimen.id}`)
113
      .set('Authorization', `Bearer ${token}`)
114

115
    expect(res.status).toBe(404)
116
  })
117
})
118

119
describe('PATCH /medicine-regimens/:id', () => {
120
  it('updates regimen fields', async () => {
121
    const user = await createTestUser(db)
122
    const token = generateTestToken(user.id, user.email)
123
    const regimen = await seedRegimen(user.id)
124

125
    const res = await request(app)
126
      .patch(`/medicine-regimens/${regimen.id}`)
127
      .set('Authorization', `Bearer ${token}`)
128
      .send({ regimen: { dosage: '100mg', scheduledAt: ['09:00'] } })
129

130
    expect(res.status).toBe(200)
131
    expect(res.body.regimen.dosage).toBe('100mg')
132
    expect(res.body.regimen.scheduledAt).toEqual(['09:00'])
133
  })
134
})
135

136
describe('PATCH /medicine-regimens/:id/active', () => {
137
  it('deactivates a regimen', async () => {
138
    const user = await createTestUser(db)
139
    const token = generateTestToken(user.id, user.email)
140
    const regimen = await seedRegimen(user.id, { active: true })
141

142
    const res = await request(app)
143
      .patch(`/medicine-regimens/${regimen.id}/active`)
144
      .set('Authorization', `Bearer ${token}`)
145
      .send({ active: false })
146

147
    expect(res.status).toBe(200)
148
    expect(res.body.regimen.active).toBe(false)
149

150
    const dbRecord = await db.medicineRegimen.findUnique({
151
      where: { id: regimen.id }
152
    })
153

154
    expect(dbRecord!.active).toBe(false)
155
  })
156
})
157

158
describe('DELETE /medicine-regimens/:id', () => {
159
  it('deactivates (soft-deletes) the regimen', async () => {
160
    const user = await createTestUser(db)
161
    const token = generateTestToken(user.id, user.email)
162
    const regimen = await seedRegimen(user.id, { active: true })
163

164
    const res = await request(app)
165
      .delete(`/medicine-regimens/${regimen.id}`)
166
      .set('Authorization', `Bearer ${token}`)
167

168
    expect(res.status).toBe(200)
169

170
    const dbRecord = await db.medicineRegimen.findUnique({
171
      where: { id: regimen.id }
172
    })
173

174
    expect(dbRecord).not.toBeNull()
175
    expect(dbRecord!.active).toBe(false)
176
  })
177
})
178

179
describe('GET /medicine-regimens/today', () => {
180
  it('returns active regimens with their logs', async () => {
181
    const user = await createTestUser(db)
182
    const token = generateTestToken(user.id, user.email)
183

184
    await seedRegimen(user.id, { name: 'Melatonina', active: true })
185
    await seedRegimen(user.id, { name: 'Inativa', active: false })
186

187
    const res = await request(app)
188
      .get('/medicine-regimens/today')
189
      .set('Authorization', `Bearer ${token}`)
190

191
    expect(res.status).toBe(200)
192
    expect(res.body.regimens).toHaveLength(1)
193
    expect(res.body.regimens[0].regimen.name).toBe('Melatonina')
194
    expect(res.body.regimens[0].logs).toBeInstanceOf(Array)
195
  })
196
})