chore: replace int amount_cents for string storage and decimal pkg

This commit is contained in:
juancwu 2026-03-14 14:43:39 -04:00
commit c8a1eb5b7a
No known key found for this signature in database
45 changed files with 706 additions and 587 deletions

View file

@ -7,6 +7,7 @@ import (
"git.juancwu.dev/juancwu/budgit/internal/model"
"git.juancwu.dev/juancwu/budgit/internal/repository"
"git.juancwu.dev/juancwu/budgit/internal/testutil"
"github.com/shopspring/decimal"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@ -24,7 +25,7 @@ func TestExpenseService_CreateExpense(t *testing.T) {
SpaceID: space.ID,
UserID: user.ID,
Description: "Lunch",
Amount: 1500,
Amount: decimal.RequireFromString("15.00"),
Type: model.ExpenseTypeExpense,
Date: time.Now(),
TagIDs: []string{tag.ID},
@ -32,7 +33,7 @@ func TestExpenseService_CreateExpense(t *testing.T) {
require.NoError(t, err)
assert.NotEmpty(t, expense.ID)
assert.Equal(t, "Lunch", expense.Description)
assert.Equal(t, 1500, expense.AmountCents)
assert.True(t, decimal.RequireFromString("15.00").Equal(expense.Amount))
assert.Equal(t, model.ExpenseTypeExpense, expense.Type)
})
}
@ -46,7 +47,7 @@ func TestExpenseService_CreateExpense_EmptyDescription(t *testing.T) {
SpaceID: "some-space",
UserID: "some-user",
Description: "",
Amount: 1000,
Amount: decimal.RequireFromString("10.00"),
Type: model.ExpenseTypeExpense,
Date: time.Now(),
})
@ -64,7 +65,7 @@ func TestExpenseService_CreateExpense_ZeroAmount(t *testing.T) {
SpaceID: "some-space",
UserID: "some-user",
Description: "Something",
Amount: 0,
Amount: decimal.Zero,
Type: model.ExpenseTypeExpense,
Date: time.Now(),
})
@ -87,7 +88,7 @@ func TestExpenseService_GetExpensesWithTagsForSpacePaginated(t *testing.T) {
SpaceID: space.ID,
UserID: user.ID,
Description: "Bus fare",
Amount: 250,
Amount: decimal.RequireFromString("2.50"),
Type: model.ExpenseTypeExpense,
Date: time.Now(),
TagIDs: []string{tag.ID},
@ -99,7 +100,7 @@ func TestExpenseService_GetExpensesWithTagsForSpacePaginated(t *testing.T) {
SpaceID: space.ID,
UserID: user.ID,
Description: "Coffee",
Amount: 500,
Amount: decimal.RequireFromString("5.00"),
Type: model.ExpenseTypeExpense,
Date: time.Now(),
})
@ -132,12 +133,12 @@ func TestExpenseService_GetBalanceForSpace(t *testing.T) {
user := testutil.CreateTestUser(t, dbi.DB, "exp-svc-balance@example.com", nil)
space := testutil.CreateTestSpace(t, dbi.DB, user.ID, "Expense Svc Balance Space")
testutil.CreateTestExpense(t, dbi.DB, space.ID, user.ID, "Topup", 10000, model.ExpenseTypeTopup)
testutil.CreateTestExpense(t, dbi.DB, space.ID, user.ID, "Groceries", 3000, model.ExpenseTypeExpense)
testutil.CreateTestExpense(t, dbi.DB, space.ID, user.ID, "Topup", decimal.RequireFromString("100.00"), model.ExpenseTypeTopup)
testutil.CreateTestExpense(t, dbi.DB, space.ID, user.ID, "Groceries", decimal.RequireFromString("30.00"), model.ExpenseTypeExpense)
balance, err := svc.GetBalanceForSpace(space.ID)
require.NoError(t, err)
assert.Equal(t, 7000, balance)
assert.True(t, decimal.RequireFromString("70.00").Equal(balance))
})
}
@ -156,7 +157,7 @@ func TestExpenseService_GetExpensesByTag(t *testing.T) {
SpaceID: space.ID,
UserID: user.ID,
Description: "Dinner",
Amount: 2500,
Amount: decimal.RequireFromString("25.00"),
Type: model.ExpenseTypeExpense,
Date: now,
TagIDs: []string{tag.ID},
@ -169,7 +170,7 @@ func TestExpenseService_GetExpensesByTag(t *testing.T) {
require.NoError(t, err)
require.Len(t, summaries, 1)
assert.Equal(t, tag.ID, summaries[0].TagID)
assert.Equal(t, 2500, summaries[0].TotalAmount)
assert.True(t, decimal.RequireFromString("25.00").Equal(summaries[0].TotalAmount))
})
}
@ -185,7 +186,7 @@ func TestExpenseService_UpdateExpense(t *testing.T) {
SpaceID: space.ID,
UserID: user.ID,
Description: "Old Description",
Amount: 1000,
Amount: decimal.RequireFromString("10.00"),
Type: model.ExpenseTypeExpense,
Date: time.Now(),
})
@ -195,13 +196,13 @@ func TestExpenseService_UpdateExpense(t *testing.T) {
ID: created.ID,
SpaceID: space.ID,
Description: "New Description",
Amount: 2000,
Amount: decimal.RequireFromString("20.00"),
Type: model.ExpenseTypeExpense,
Date: time.Now(),
})
require.NoError(t, err)
assert.Equal(t, "New Description", updated.Description)
assert.Equal(t, 2000, updated.AmountCents)
assert.True(t, decimal.RequireFromString("20.00").Equal(updated.Amount))
})
}
@ -217,7 +218,7 @@ func TestExpenseService_DeleteExpense(t *testing.T) {
SpaceID: space.ID,
UserID: user.ID,
Description: "Doomed Expense",
Amount: 500,
Amount: decimal.RequireFromString("5.00"),
Type: model.ExpenseTypeExpense,
Date: time.Now(),
})