eletrotupi / tcc/ commit / 52edfe2

api: flesh tests for medicine logs + medicine regimen autocreation

Pedro Lucas Porcellis porcellis@eletrotupi.com · 4 months ago 52edfe2a750dc47201b3d3136156a02a8cfa08a5 Browse files
Parents 22627d0
Changed 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 +
})