102 lines
3.1 KiB
Go
102 lines
3.1 KiB
Go
package mappers
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"apskel-pos-be/internal/constants"
|
|
"apskel-pos-be/internal/entities"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestCashAdvanceSettlementStatusFollowsTheMoney(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
amount float64
|
|
settled float64
|
|
returned float64
|
|
expectedStatus string
|
|
expectedRemaining float64
|
|
}{
|
|
{
|
|
name: "nothing spent or returned is still open",
|
|
amount: 500000,
|
|
expectedStatus: constants.CashAdvanceSettlementOpen,
|
|
expectedRemaining: 500000,
|
|
},
|
|
{
|
|
name: "some spending leaves it partial",
|
|
amount: 500000,
|
|
settled: 200000,
|
|
expectedStatus: constants.CashAdvanceSettlementPartial,
|
|
expectedRemaining: 300000,
|
|
},
|
|
{
|
|
name: "cash handed back counts the same as spending",
|
|
amount: 500000,
|
|
settled: 300000,
|
|
returned: 100000,
|
|
expectedStatus: constants.CashAdvanceSettlementPartial,
|
|
expectedRemaining: 100000,
|
|
},
|
|
{
|
|
name: "spending plus cash back covering the advance settles it",
|
|
amount: 500000,
|
|
settled: 420000,
|
|
returned: 80000,
|
|
expectedStatus: constants.CashAdvanceSettlementSettled,
|
|
expectedRemaining: 0,
|
|
},
|
|
{
|
|
// The team paid the difference out of pocket, so the outlet owes them.
|
|
name: "overspending settles the cash advance and goes negative",
|
|
amount: 500000,
|
|
settled: 620000,
|
|
expectedStatus: constants.CashAdvanceSettlementSettled,
|
|
expectedRemaining: -120000,
|
|
},
|
|
{
|
|
// Two decimals of money should not leave a cash advance a fraction short.
|
|
name: "a rounding crumb short still settles",
|
|
amount: 100000,
|
|
settled: 99999.999,
|
|
expectedStatus: constants.CashAdvanceSettlementSettled,
|
|
expectedRemaining: 0.001,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
response := CashAdvanceEntityToResponse(&entities.CashAdvance{
|
|
ID: uuid.New(),
|
|
TeamScope: constants.PurchaseTeamScopeCentral,
|
|
Amount: tt.amount,
|
|
SettledAmount: tt.settled,
|
|
ReturnedAmount: tt.returned,
|
|
})
|
|
|
|
require.Equal(t, tt.expectedStatus, response.SettlementStatus)
|
|
require.InDelta(t, tt.expectedRemaining, response.RemainingAmount, 0.0001)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestCashAdvanceTeamAlwaysRendered(t *testing.T) {
|
|
categoryID := uuid.New()
|
|
|
|
central := CashAdvanceEntityToResponse(&entities.CashAdvance{TeamScope: constants.PurchaseTeamScopeCentral})
|
|
require.NotNil(t, central.Team)
|
|
require.Equal(t, constants.PurchaseTeamCentralName, central.Team.Name)
|
|
require.Nil(t, central.Team.CategoryID)
|
|
|
|
category := CashAdvanceEntityToResponse(&entities.CashAdvance{
|
|
TeamScope: constants.PurchaseTeamScopeCategory,
|
|
TeamCategoryID: &categoryID,
|
|
TeamCategory: &entities.Category{ID: categoryID, Name: "Dapur"},
|
|
})
|
|
require.NotNil(t, category.Team)
|
|
require.Equal(t, "Dapur", category.Team.Name)
|
|
require.Equal(t, &categoryID, category.Team.CategoryID)
|
|
}
|