Files
carvalho-finances/apps/api/internal/service/dashboard_test.go
T
Mlcavalho1andClaude Sonnet 4.6 e3b3433703 feat(#37): módulo de cartão de crédito com faturas mensais
- Migration 011: closing_day/due_day em accounts + tabela credit_bills
- CreditBillService: cria/atualiza fatura corrente on-demand no GET /accounts
- Widget FATURA ATUAL no dashboard com total e botão PAGAR
- AccountsView: campos closing_day/due_day para contas credit + painel fatura
- Dashboard: current_bills lista faturas não pagas de todos os cartões

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-05-27 15:12:53 -03:00

89 lines
2.4 KiB
Go

package service_test
import (
"context"
"testing"
"financeiro-carvalho/internal/model"
"financeiro-carvalho/internal/service"
)
type mockDashboardRepo struct {
income float64
expenses float64
}
func (m *mockDashboardRepo) MonthlySummary(_ context.Context, _ string) (float64, float64, error) {
return m.income, m.expenses, nil
}
func (m *mockDashboardRepo) ByCategory(_ context.Context, _ string) ([]model.CategoryTotal, error) {
return nil, nil
}
func (m *mockDashboardRepo) MonthlyEvolution(_ context.Context, _ string) ([]model.MonthEvolution, error) {
return nil, nil
}
func (m *mockDashboardRepo) RecentTransactions(_ context.Context, _ string) ([]model.RecentTransaction, error) {
return nil, nil
}
type mockPatrimony struct{}
func (m *mockPatrimony) TotalPatrimony(_ context.Context) (float64, error) { return 0, nil }
func newDashboardSvc(income, expenses float64) *service.DashboardService {
repo := &mockAccountRepo{}
recurrSvc := service.NewRecurringService(newMockRecurring(nil), &mockTxRepo{})
billSvc := service.NewCreditBillService(&mockCreditBillRepo{}, repo)
return service.NewDashboardService(&mockDashboardRepo{income: income, expenses: expenses}, recurrSvc, &mockPatrimony{}, billSvc)
}
func TestDashboard_SavingsPct_40(t *testing.T) {
svc := newDashboardSvc(10000, 6000)
data, err := svc.Get(context.Background(), "2024-03")
if err != nil {
t.Fatal(err)
}
if data.SavingsPct != 40.0 {
t.Errorf("expected 40.0, got %.2f", data.SavingsPct)
}
}
func TestDashboard_SavingsPct_NoIncome(t *testing.T) {
svc := newDashboardSvc(0, 500)
data, err := svc.Get(context.Background(), "2024-03")
if err != nil {
t.Fatal(err)
}
if data.SavingsPct != 0 {
t.Errorf("expected 0.0 when no income, got %.2f", data.SavingsPct)
}
}
func TestDashboard_SavingsPct_Above40(t *testing.T) {
svc := newDashboardSvc(10000, 5000)
data, err := svc.Get(context.Background(), "2024-03")
if err != nil {
t.Fatal(err)
}
if data.SavingsPct != 50.0 {
t.Errorf("expected 50.0, got %.2f", data.SavingsPct)
}
}
func TestDashboard_EmptySlices(t *testing.T) {
svc := newDashboardSvc(0, 0)
data, err := svc.Get(context.Background(), "2024-03")
if err != nil {
t.Fatal(err)
}
if data.ByCategory == nil {
t.Error("ByCategory should not be nil")
}
if data.MonthlyEvolution == nil {
t.Error("MonthlyEvolution should not be nil")
}
if data.RecentTransactions == nil {
t.Error("RecentTransactions should not be nil")
}
}