api: flesh tests for medicine logs + medicine regimen autocreation
Parents:
22627d01 file(s) changed
- api/tests/medicine-logs/create.test.ts +148 -0
api/tests/medicine-logs/create.test.ts
@@ -0,0 +1,148 @@
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 + })