| 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 | })
|