eletrotupi / tcc/ api/tests/medicine-logs/create.test.tsd597464ddbba25d2555e9bbfc543ffc8c881b781
4.0 KB | 148 lines Raw
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
})