apskel-pos-backend/internal/transformer/analytics_transformer_test.go

114 lines
3.3 KiB
Go

package transformer
import (
"encoding/json"
"testing"
"time"
"apskel-pos-be/internal/contract"
"apskel-pos-be/internal/models"
"github.com/google/uuid"
"github.com/stretchr/testify/require"
)
func TestPurchasingAnalyticsContractToModelParsesDateRangeAndOutlet(t *testing.T) {
orgID := uuid.New()
outletID := uuid.New().String()
req := &contract.PurchasingAnalyticsRequest{
OrganizationID: orgID,
OutletID: &outletID,
DateFrom: "01-05-2026",
DateTo: "02-05-2026",
GroupBy: "week",
}
result := PurchasingAnalyticsContractToModel(req)
require.Equal(t, orgID, result.OrganizationID)
require.NotNil(t, result.OutletID)
require.Equal(t, outletID, result.OutletID.String())
require.Equal(t, "week", result.GroupBy)
location, err := time.LoadLocation("Asia/Jakarta")
require.NoError(t, err)
require.Equal(t, time.Date(2026, 5, 1, 0, 0, 0, 0, location), result.DateFrom)
require.Equal(t, time.Date(2026, 5, 2, 23, 59, 59, int(time.Second-time.Nanosecond), location), result.DateTo)
}
func TestPurchasingAnalyticsContractToModelIgnoresInvalidOutlet(t *testing.T) {
outletID := "not-a-uuid"
result := PurchasingAnalyticsContractToModel(&contract.PurchasingAnalyticsRequest{
OutletID: &outletID,
DateFrom: "01-05-2026",
DateTo: "02-05-2026",
})
require.Nil(t, result.OutletID)
}
func TestPurchasingAnalyticsModelToContractCopiesOutletName(t *testing.T) {
outletID := uuid.New()
outletName := "Main Outlet"
result := PurchasingAnalyticsModelToContract(&models.PurchasingAnalyticsResponse{
OrganizationID: uuid.New(),
OutletID: &outletID,
OutletName: &outletName,
})
require.NotNil(t, result)
require.Equal(t, &outletID, result.OutletID)
require.NotNil(t, result.OutletName)
require.Equal(t, outletName, *result.OutletName)
}
func TestPurchasingAnalyticsModelToContractOmitsNilOutletName(t *testing.T) {
result := PurchasingAnalyticsModelToContract(&models.PurchasingAnalyticsResponse{
OrganizationID: uuid.New(),
})
payload, err := json.Marshal(result)
require.NoError(t, err)
require.NotContains(t, string(payload), "outlet_name")
}
func TestProfitLossAnalyticsContractToModelParsesDateRange(t *testing.T) {
orgID := uuid.New()
outletID := uuid.New().String()
result, err := ProfitLossAnalyticsContractToModel(&contract.ProfitLossAnalyticsRequest{
OrganizationID: orgID,
OutletID: &outletID,
DateFrom: "01-05-2026",
DateTo: "29-05-2026",
})
require.NoError(t, err)
require.Equal(t, orgID, result.OrganizationID)
require.NotNil(t, result.OutletID)
require.Equal(t, outletID, result.OutletID.String())
location, err := time.LoadLocation("Asia/Jakarta")
require.NoError(t, err)
require.Equal(t, time.Date(2026, 5, 1, 0, 0, 0, 0, location), result.DateFrom)
require.Equal(t, time.Date(2026, 5, 29, 23, 59, 59, int(time.Second-time.Nanosecond), location), result.DateTo)
}
func TestProfitLossAnalyticsModelToContractCopiesDateRange(t *testing.T) {
dateFrom := time.Date(2026, 5, 1, 0, 0, 0, 0, time.UTC)
dateTo := time.Date(2026, 5, 29, 23, 59, 59, int(time.Second-time.Nanosecond), time.UTC)
result := ProfitLossAnalyticsModelToContract(&models.ProfitLossAnalyticsResponse{
OrganizationID: uuid.New(),
DateFrom: dateFrom,
DateTo: dateTo,
})
require.NotNil(t, result)
require.Equal(t, dateFrom, result.DateFrom)
require.Equal(t, dateTo, result.DateTo)
}