api: flesh tests for medicine logs + medicine regimen autocreation
Pedro Lucas Porcellis porcellis@eletrotupi.com · 4 months ago
52edfe2a750dc47201b3d3136156a02a8cfa08a5 Browse filesParents
22627d0Changed files
1
Additions
+148
Deletions
0
/dev/null → api/tests/medicine-logs/create.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 +
const moment = new Date().toISOString()
15 +
16 +
afterAll(() => db.$disconnect())
17 +
beforeEach(() => cleanupTestDb(db))
18 +
19 +
describe('Medicine logs (via POST /care-actions)', () => {
20 +
it('creates a medicine log linked to an existing regimen', async () => {
21 +
const user = await createTestUser(db)
22 +
const token = generateTestToken(user.id, user.email)
23 +
24 +
const regimen = await db.medicineRegimen.create({
25 +
data: {
26 +
userId: user.id,
27 +
name: 'Sertralina',
28 +
dosage: '50mg',
29 +
periodicity: 'DAILY',
30 +
scheduledAt: [],
31 +
},
32 +
})
33 +
34 +
const res = await request(app)
35 +
.post('/care-actions')
36 +
.set('Authorization', `Bearer ${token}`)
37 +
.send({
38 +
careAction: { type: 'MEDICINE', moment, regimenId: regimen.id },
39 +
})
40 +
41 +
expect(res.status).toBe(201)
42 +
43 +
const log = await db.medicineLog.findFirst({
44 +
where: { regimenId: regimen.id },
45 +
include: { regimen: true },
46 +
})
47 +
48 +
expect(log).not.toBeNull()
49 +
expect(log!.regimen.name).toBe('Sertralina')
50 +
expect(log!.regimen.dosage).toBe('50mg')
51 +
})
52 +
53 +
it('creates a medicine log and a new regimen when sending inline medicine', async () => {
54 +
const user = await createTestUser(db)
55 +
const token = generateTestToken(user.id, user.email)
56 +
57 +
const res = await request(app)
58 +
.post('/care-actions')
59 +
.set('Authorization', `Bearer ${token}`)
60 +
.send({
61 +
careAction: {
62 +
type: 'MEDICINE',
63 +
moment,
64 +
medicine: {
65 +
name: 'Melatonina',
66 +
dosage: '5mg',
67 +
periodicity: 'DAILY',
68 +
scheduledAt: ['22:00'],
69 +
},
70 +
},
71 +
})
72 +
73 +
expect(res.status).toBe(201)
74 +
75 +
const regimen = await db.medicineRegimen.findFirst({ where: { userId: user.id } })
76 +
expect(regimen).not.toBeNull()
77 +
expect(regimen!.name).toBe('Melatonina')
78 +
79 +
const log = await db.medicineLog.findFirst({
80 +
where: { regimenId: regimen!.id },
81 +
})
82 +
expect(log).not.toBeNull()
83 +
})
84 +
85 +
it('links the medicine log to the care action', async () => {
86 +
const user = await createTestUser(db)
87 +
const token = generateTestToken(user.id, user.email)
88 +
89 +
const regimen = await db.medicineRegimen.create({
90 +
data: {
91 +
userId: user.id,
92 +
name: 'Ritalina',
93 +
dosage: '10mg',
94 +
periodicity: 'DAILY',
95 +
scheduledAt: [],
96 +
},
97 +
})
98 +
99 +
const res = await request(app)
100 +
.post('/care-actions')
101 +
.set('Authorization', `Bearer ${token}`)
102 +
.send({
103 +
careAction: { type: 'MEDICINE', moment, regimenId: regimen.id },
104 +
})
105 +
106 +
expect(res.status).toBe(201)
107 +
108 +
const careActionId = res.body.careAction.id
109 +
const careAction = await db.careAction.findUnique({
110 +
where: { id: careActionId },
111 +
include: { medicineLog: { include: { regimen: true } } },
112 +
})
113 +
114 +
expect(careAction!.medicineLog).not.toBeNull()
115 +
expect(careAction!.medicineLog!.regimenId).toBe(regimen.id)
116 +
})
117 +
118 +
it('records the taken time on the medicine log', async () => {
119 +
const user = await createTestUser(db)
120 +
const token = generateTestToken(user.id, user.email)
121 +
122 +
const regimen = await db.medicineRegimen.create({
123 +
data: {
124 +
userId: user.id,
125 +
name: 'Clonazepam',
126 +
dosage: '0.5mg',
127 +
periodicity: 'DAILY',
128 +
scheduledAt: [],
129 +
},
130 +
})
131 +
132 +
const takenAt = new Date().toISOString()
133 +
134 +
await request(app)
135 +
.post('/care-actions')
136 +
.set('Authorization', `Bearer ${token}`)
137 +
.send({
138 +
careAction: { type: 'MEDICINE', moment: takenAt, regimenId: regimen.id },
139 +
})
140 +
141 +
const log = await db.medicineLog.findFirst({ where: { regimenId: regimen.id } })
142 +
expect(log).not.toBeNull()
143 +
144 +
expect(
145 +
new Date(log!.takenAt).getTime()
146 +
).toBeCloseTo(new Date(takenAt).getTime(), -3)
147 +
})
148 +
})