Skip to content

Commit 5450eb8

Browse files
feat: add smoke tests for Calculator Page and update InvestmentResult component with data-testid attributes
1 parent f2dd3c7 commit 5450eb8

2 files changed

Lines changed: 99 additions & 2 deletions

File tree

app/components/InvestmentResult.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<template>
2-
<div class="bg-white dark:bg-gray-800 rounded-xl shadow-lg dark:shadow-white/10 overflow-hidden border border-gray-100 dark:border-gray-700 hover:shadow-xl dark:hover:shadow-white/15 transition-shadow duration-300 not-prose">
2+
<div data-testid="result-card" class="bg-white dark:bg-gray-800 rounded-xl shadow-lg dark:shadow-white/10 overflow-hidden border border-gray-100 dark:border-gray-700 hover:shadow-xl dark:hover:shadow-white/15 transition-shadow duration-300 not-prose">
33
<!-- Header with gradient background -->
44
<div
55
class="px-6 py-4 bg-gradient-to-r"
@@ -24,7 +24,7 @@
2424
Valor Total Líquido
2525
</p>
2626
</div>
27-
<p class="text-2xl font-bold text-gray-900 dark:text-gray-100">
27+
<p data-testid="result-total-amount" class="text-2xl font-bold text-gray-900 dark:text-gray-100">
2828
{{ totalAmountDisplay }}
2929
</p>
3030
</div>

test/nuxt/CalculatorPage.test.ts

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import { describe, it, expect, beforeEach } from 'vitest'
2+
import { mountSuspended } from '@nuxt/test-utils/runtime'
3+
import { flushPromises } from '@vue/test-utils'
4+
import type { VueWrapper } from '@vue/test-utils'
5+
import IndexPage from '~/pages/index.vue'
6+
import { useInvestmentStore } from '~/store/investment'
7+
8+
function getResultCard(wrapper: VueWrapper, name: string) {
9+
return wrapper
10+
.findAll('[data-testid="result-card"]')
11+
.find(card => card.find('h3').text() === name)!
12+
}
13+
14+
function getTotalAmount(card: VueWrapper) {
15+
return card.find('[data-testid="result-total-amount"]').text()
16+
}
17+
18+
describe('Calculator Page — Smoke Tests', () => {
19+
let wrapper: VueWrapper
20+
let store: ReturnType<typeof useInvestmentStore>
21+
22+
beforeEach(async () => {
23+
wrapper = await mountSuspended(IndexPage)
24+
store = useInvestmentStore()
25+
store.initializeStore()
26+
await flushPromises()
27+
})
28+
29+
describe('Page Load', () => {
30+
it('renders all three result card headers', () => {
31+
const cards = wrapper.findAll('[data-testid="result-card"]')
32+
const headers = cards.map(card => card.find('h3').text())
33+
expect(headers).toContain('Poupança')
34+
expect(headers).toContain('CDB / RDB')
35+
expect(headers).toContain('LCI / LCA')
36+
})
37+
38+
it('displays a non-empty formatted total amount for Poupança', () => {
39+
const total = getTotalAmount(getResultCard(wrapper, 'Poupança'))
40+
expect(total).not.toBe('')
41+
expect(total).toMatch(/R\$/)
42+
})
43+
})
44+
45+
describe('Amount Change', () => {
46+
it('updates CDB result when amount changes', async () => {
47+
const card = getResultCard(wrapper, 'CDB / RDB')
48+
const before = getTotalAmount(card)
49+
50+
await wrapper.find('#amount-input').setValue(5000)
51+
await flushPromises()
52+
53+
const after = getTotalAmount(getResultCard(wrapper, 'CDB / RDB'))
54+
expect(after).not.toBe(before)
55+
expect(after).not.toBe('')
56+
})
57+
})
58+
59+
describe('DI Rate Change', () => {
60+
it('updates CDB result when DI rate changes', async () => {
61+
const before = getTotalAmount(getResultCard(wrapper, 'CDB / RDB'))
62+
63+
store.setDi(10)
64+
await flushPromises()
65+
66+
const after = getTotalAmount(getResultCard(wrapper, 'CDB / RDB'))
67+
expect(after).not.toBe(before)
68+
expect(after).not.toBe('')
69+
})
70+
})
71+
72+
describe('CDB Percentage Change', () => {
73+
it('updates CDB result when CDB % changes', async () => {
74+
const before = getTotalAmount(getResultCard(wrapper, 'CDB / RDB'))
75+
76+
await wrapper.find('#cdb-input').setValue(110)
77+
await flushPromises()
78+
79+
const after = getTotalAmount(getResultCard(wrapper, 'CDB / RDB'))
80+
expect(after).not.toBe(before)
81+
expect(after).not.toBe('')
82+
})
83+
})
84+
85+
describe('LCI/LCA Percentage Change', () => {
86+
it('updates LCI/LCA result when LCX % changes', async () => {
87+
const before = getTotalAmount(getResultCard(wrapper, 'LCI / LCA'))
88+
89+
await wrapper.find('#lcx-input').setValue(90)
90+
await flushPromises()
91+
92+
const after = getTotalAmount(getResultCard(wrapper, 'LCI / LCA'))
93+
expect(after).not.toBe(before)
94+
expect(after).not.toBe('')
95+
})
96+
})
97+
})

0 commit comments

Comments
 (0)