From 4c9fb8d2f27913c6a4e318864d598b64e94e749e Mon Sep 17 00:00:00 2001 From: Mark Vass Date: Mon, 3 Aug 2026 12:27:09 +0200 Subject: [PATCH 1/2] fix(ledger): nit comments from #4731 fix: active entitlement validation blocking meter delete (#4835) Co-authored-by: Robert Borbely fix: meter delete in tx (#4838) Co-authored-by: Alex Goth <64845621+GAlexIHU@users.noreply.github.com> --- .../customers/charges/convert_test.go | 2 +- .../customers/credits/convert_test.go | 2 +- .../charges/creditpurchase/charge_test.go | 2 +- .../creditpurchase/service/external_test.go | 2 +- .../service/promotional_test.go | 2 +- .../charges/creditpurchase/settlement.go | 15 +++--- .../flatfee/adapter/detailedline_test.go | 2 +- .../flatfee/adapter/intentoverride_test.go | 2 +- .../flatfee/adapter/realizationrun_test.go | 2 +- .../billing/charges/flatfee/charge_test.go | 2 +- .../billing/charges/lineage/lineage_test.go | 2 +- .../billing/charges/service/base_test.go | 2 +- .../charges/service/creditpurchase_test.go | 2 +- .../charges/service/invoicable_test.go | 2 +- .../billing/charges/service/lineage_test.go | 2 +- .../billing/charges/service/taxcode_test.go | 2 +- .../charges/service/truncation_test.go | 2 +- .../usagebased/adapter/detailedline_test.go | 2 +- .../usagebased/adapter/intentoverride_test.go | 2 +- .../billing/charges/usagebased/charge_test.go | 2 +- .../service/creditheninvoice_test.go | 2 +- .../usagebased/service/creditsonly_test.go | 2 +- .../usagebased/service/rating/service_test.go | 2 +- .../service/rating/subtract/subtract_test.go | 2 +- .../service/rating/testutils/testutils.go | 2 +- .../usagebased/service/run/payment_test.go | 2 +- .../service/reconciler/patchcharge_test.go | 2 +- .../service/sync_credittheninvoice_test.go | 2 +- .../currencies/adapter/currencies_test.go | 9 ++-- openmeter/currencies/currency.go | 50 +++++++++++++++---- openmeter/currencies/currency_test.go | 29 +++++++++-- .../currencyresolver/resolver_test.go | 3 +- openmeter/currencies/service/service_test.go | 3 +- openmeter/currencies/testutils/currency.go | 29 +++++++++++ .../currencies/testutils/currency/currency.go | 40 --------------- .../currencies/testutils/{ => env}/env.go | 2 +- .../ledger/chargeadapter/creditpurchase.go | 8 +-- .../creditpurchase_customcurrency_test.go | 2 +- .../chargeadapter/creditpurchase_test.go | 2 +- .../ledger/chargeadapter/flatfee_test.go | 2 +- .../usagebased_customcurrency_test.go | 2 +- .../ledger/chargeadapter/usagebased_test.go | 2 +- .../ledger/collector/collection_fbo_test.go | 2 +- .../creditvoid_customcurrency_test.go | 2 +- .../customerbalance/expired_loader_test.go | 2 +- .../ledger/customerbalance/service_test.go | 2 +- .../ledger/customerbalance/testenv_test.go | 2 +- openmeter/ledger/recognizer/service_test.go | 2 +- test/app/stripe/invoice_credits_test.go | 2 +- test/credits/base.go | 2 +- 50 files changed, 154 insertions(+), 114 deletions(-) delete mode 100644 openmeter/currencies/testutils/currency/currency.go rename openmeter/currencies/testutils/{ => env}/env.go (99%) diff --git a/api/v3/handlers/customers/charges/convert_test.go b/api/v3/handlers/customers/charges/convert_test.go index 8cdb93e9b3..26c8048701 100644 --- a/api/v3/handlers/customers/charges/convert_test.go +++ b/api/v3/handlers/customers/charges/convert_test.go @@ -12,7 +12,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing" "github.com/openmeterio/openmeter/openmeter/billing/charges/meta" "github.com/openmeterio/openmeter/openmeter/billing/charges/usagebased" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/productcatalog" "github.com/openmeterio/openmeter/pkg/timeutil" ) diff --git a/api/v3/handlers/customers/credits/convert_test.go b/api/v3/handlers/customers/credits/convert_test.go index d69b44b021..192c080ac8 100644 --- a/api/v3/handlers/customers/credits/convert_test.go +++ b/api/v3/handlers/customers/credits/convert_test.go @@ -11,7 +11,7 @@ import ( api "github.com/openmeterio/openmeter/api/v3" "github.com/openmeterio/openmeter/openmeter/billing/charges/creditpurchase" "github.com/openmeterio/openmeter/openmeter/billing/charges/meta" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/pkg/clock" "github.com/openmeterio/openmeter/pkg/models" ) diff --git a/openmeter/billing/charges/creditpurchase/charge_test.go b/openmeter/billing/charges/creditpurchase/charge_test.go index e6894f4065..9cd7144223 100644 --- a/openmeter/billing/charges/creditpurchase/charge_test.go +++ b/openmeter/billing/charges/creditpurchase/charge_test.go @@ -7,7 +7,7 @@ import ( "github.com/stretchr/testify/require" "github.com/openmeterio/openmeter/openmeter/billing/charges/meta" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/pkg/timeutil" ) diff --git a/openmeter/billing/charges/creditpurchase/service/external_test.go b/openmeter/billing/charges/creditpurchase/service/external_test.go index bc57c18d29..e79e90e236 100644 --- a/openmeter/billing/charges/creditpurchase/service/external_test.go +++ b/openmeter/billing/charges/creditpurchase/service/external_test.go @@ -17,7 +17,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/charges/meta" "github.com/openmeterio/openmeter/openmeter/billing/charges/models/ledgertransaction" "github.com/openmeterio/openmeter/openmeter/billing/charges/models/payment" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/pkg/currencyx" "github.com/openmeterio/openmeter/pkg/models" "github.com/openmeterio/openmeter/pkg/timeutil" diff --git a/openmeter/billing/charges/creditpurchase/service/promotional_test.go b/openmeter/billing/charges/creditpurchase/service/promotional_test.go index 9e9781d6eb..55b7b260c8 100644 --- a/openmeter/billing/charges/creditpurchase/service/promotional_test.go +++ b/openmeter/billing/charges/creditpurchase/service/promotional_test.go @@ -13,7 +13,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/charges/lineage" "github.com/openmeterio/openmeter/openmeter/billing/charges/meta" "github.com/openmeterio/openmeter/openmeter/billing/charges/models/ledgertransaction" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/pkg/clock" "github.com/openmeterio/openmeter/pkg/models" "github.com/openmeterio/openmeter/pkg/timeutil" diff --git a/openmeter/billing/charges/creditpurchase/settlement.go b/openmeter/billing/charges/creditpurchase/settlement.go index 67d4534375..1815cef98f 100644 --- a/openmeter/billing/charges/creditpurchase/settlement.go +++ b/openmeter/billing/charges/creditpurchase/settlement.go @@ -7,6 +7,7 @@ import ( "slices" "github.com/alpacahq/alpacadecimal" + "github.com/samber/lo" "github.com/openmeterio/openmeter/pkg/currencyx" "github.com/openmeterio/openmeter/pkg/models" @@ -331,23 +332,23 @@ func (s Settlement) GetCostBasis() (alpacadecimal.Decimal, error) { // GetCurrency returns the fiat currency real money settles in. Promotional // settlements never move real money, so they return an empty currency rather // than an error. -func (s Settlement) GetCurrency() (currencyx.FiatCode, error) { +func (s Settlement) GetCurrency() (*currencyx.FiatCode, error) { switch s.t { case SettlementTypeInvoice: if s.invoice == nil { - return "", fmt.Errorf("invoice is nil") + return nil, fmt.Errorf("invoice is nil") } - return s.invoice.Currency, nil + return lo.ToPtr(s.invoice.Currency), nil case SettlementTypeExternal: if s.external == nil { - return "", fmt.Errorf("external is nil") + return nil, fmt.Errorf("external is nil") } - return s.external.Currency, nil + return &s.external.Currency, nil case SettlementTypePromotional: - return "", nil + return nil, nil default: - return "", fmt.Errorf("invalid settlement type: %s", s.t) + return nil, fmt.Errorf("invalid settlement type: %s", s.t) } } diff --git a/openmeter/billing/charges/flatfee/adapter/detailedline_test.go b/openmeter/billing/charges/flatfee/adapter/detailedline_test.go index ab5f3680dc..c18000a1e9 100644 --- a/openmeter/billing/charges/flatfee/adapter/detailedline_test.go +++ b/openmeter/billing/charges/flatfee/adapter/detailedline_test.go @@ -16,7 +16,7 @@ import ( metaadapter "github.com/openmeterio/openmeter/openmeter/billing/charges/meta/adapter" "github.com/openmeterio/openmeter/openmeter/billing/models/stddetailedline" "github.com/openmeterio/openmeter/openmeter/billing/models/totals" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" entdb "github.com/openmeterio/openmeter/openmeter/ent/db" dbchargeflatfee "github.com/openmeterio/openmeter/openmeter/ent/db/chargeflatfee" dbchargeflatfeerundetailedline "github.com/openmeterio/openmeter/openmeter/ent/db/chargeflatfeerundetailedline" diff --git a/openmeter/billing/charges/flatfee/adapter/intentoverride_test.go b/openmeter/billing/charges/flatfee/adapter/intentoverride_test.go index 30399799ad..96e041fdf0 100644 --- a/openmeter/billing/charges/flatfee/adapter/intentoverride_test.go +++ b/openmeter/billing/charges/flatfee/adapter/intentoverride_test.go @@ -14,7 +14,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/charges/flatfee" chargesmeta "github.com/openmeterio/openmeter/openmeter/billing/charges/meta" metaadapter "github.com/openmeterio/openmeter/openmeter/billing/charges/meta/adapter" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" entdb "github.com/openmeterio/openmeter/openmeter/ent/db" "github.com/openmeterio/openmeter/openmeter/productcatalog" taxcodetestutils "github.com/openmeterio/openmeter/openmeter/taxcode/testutils" diff --git a/openmeter/billing/charges/flatfee/adapter/realizationrun_test.go b/openmeter/billing/charges/flatfee/adapter/realizationrun_test.go index e220def9e5..ba078bd5fa 100644 --- a/openmeter/billing/charges/flatfee/adapter/realizationrun_test.go +++ b/openmeter/billing/charges/flatfee/adapter/realizationrun_test.go @@ -13,7 +13,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/charges/flatfee" chargesmeta "github.com/openmeterio/openmeter/openmeter/billing/charges/meta" metaadapter "github.com/openmeterio/openmeter/openmeter/billing/charges/meta/adapter" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" entdb "github.com/openmeterio/openmeter/openmeter/ent/db" "github.com/openmeterio/openmeter/openmeter/productcatalog" taxcodetestutils "github.com/openmeterio/openmeter/openmeter/taxcode/testutils" diff --git a/openmeter/billing/charges/flatfee/charge_test.go b/openmeter/billing/charges/flatfee/charge_test.go index 04aac92353..22571bd49d 100644 --- a/openmeter/billing/charges/flatfee/charge_test.go +++ b/openmeter/billing/charges/flatfee/charge_test.go @@ -13,7 +13,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/charges/meta" "github.com/openmeterio/openmeter/openmeter/billing/charges/models/costbasis" "github.com/openmeterio/openmeter/openmeter/currencies" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/productcatalog" "github.com/openmeterio/openmeter/pkg/currencyx" "github.com/openmeterio/openmeter/pkg/datetime" diff --git a/openmeter/billing/charges/lineage/lineage_test.go b/openmeter/billing/charges/lineage/lineage_test.go index efa723bd67..554e516fed 100644 --- a/openmeter/billing/charges/lineage/lineage_test.go +++ b/openmeter/billing/charges/lineage/lineage_test.go @@ -9,7 +9,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/charges/meta" "github.com/openmeterio/openmeter/openmeter/billing/charges/models/creditrealization" "github.com/openmeterio/openmeter/openmeter/currencies" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/pkg/currencyx" ) diff --git a/openmeter/billing/charges/service/base_test.go b/openmeter/billing/charges/service/base_test.go index 683f1bd72f..753272a4ab 100644 --- a/openmeter/billing/charges/service/base_test.go +++ b/openmeter/billing/charges/service/base_test.go @@ -34,7 +34,7 @@ import ( currencyadapter "github.com/openmeterio/openmeter/openmeter/currencies/adapter" "github.com/openmeterio/openmeter/openmeter/currencies/currencyresolver" currencyservice "github.com/openmeterio/openmeter/openmeter/currencies/service" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/customer" "github.com/openmeterio/openmeter/openmeter/ledger/recognizer" "github.com/openmeterio/openmeter/openmeter/productcatalog" diff --git a/openmeter/billing/charges/service/creditpurchase_test.go b/openmeter/billing/charges/service/creditpurchase_test.go index 8d53b47782..a3122e9486 100644 --- a/openmeter/billing/charges/service/creditpurchase_test.go +++ b/openmeter/billing/charges/service/creditpurchase_test.go @@ -23,7 +23,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/charges/meta" "github.com/openmeterio/openmeter/openmeter/billing/charges/models/payment" "github.com/openmeterio/openmeter/openmeter/currencies" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/customer" "github.com/openmeterio/openmeter/openmeter/productcatalog" "github.com/openmeterio/openmeter/pkg/clock" diff --git a/openmeter/billing/charges/service/invoicable_test.go b/openmeter/billing/charges/service/invoicable_test.go index 3bf3cf0bc8..5df9ac2e89 100644 --- a/openmeter/billing/charges/service/invoicable_test.go +++ b/openmeter/billing/charges/service/invoicable_test.go @@ -29,7 +29,7 @@ import ( billingtotals "github.com/openmeterio/openmeter/openmeter/billing/models/totals" billingratingservice "github.com/openmeterio/openmeter/openmeter/billing/rating/service" "github.com/openmeterio/openmeter/openmeter/currencies" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/customer" "github.com/openmeterio/openmeter/openmeter/productcatalog" streamingtestutils "github.com/openmeterio/openmeter/openmeter/streaming/testutils" diff --git a/openmeter/billing/charges/service/lineage_test.go b/openmeter/billing/charges/service/lineage_test.go index 875a840c29..257558cbcb 100644 --- a/openmeter/billing/charges/service/lineage_test.go +++ b/openmeter/billing/charges/service/lineage_test.go @@ -24,7 +24,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/charges/models/creditrealization" "github.com/openmeterio/openmeter/openmeter/billing/charges/models/ledgertransaction" "github.com/openmeterio/openmeter/openmeter/billing/charges/usagebased" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/customer" entdb "github.com/openmeterio/openmeter/openmeter/ent/db" "github.com/openmeterio/openmeter/openmeter/ent/db/creditrealizationlineage" diff --git a/openmeter/billing/charges/service/taxcode_test.go b/openmeter/billing/charges/service/taxcode_test.go index f2a4e95e9c..23a3994845 100644 --- a/openmeter/billing/charges/service/taxcode_test.go +++ b/openmeter/billing/charges/service/taxcode_test.go @@ -20,7 +20,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/charges/models/creditrealization" "github.com/openmeterio/openmeter/openmeter/billing/charges/models/ledgertransaction" "github.com/openmeterio/openmeter/openmeter/billing/charges/usagebased" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/productcatalog" "github.com/openmeterio/openmeter/openmeter/taxcode" "github.com/openmeterio/openmeter/pkg/clock" diff --git a/openmeter/billing/charges/service/truncation_test.go b/openmeter/billing/charges/service/truncation_test.go index 696da81b21..b77d1a966c 100644 --- a/openmeter/billing/charges/service/truncation_test.go +++ b/openmeter/billing/charges/service/truncation_test.go @@ -14,7 +14,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/charges/flatfee" "github.com/openmeterio/openmeter/openmeter/billing/charges/meta" "github.com/openmeterio/openmeter/openmeter/billing/charges/usagebased" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/productcatalog" "github.com/openmeterio/openmeter/pkg/clock" "github.com/openmeterio/openmeter/pkg/datetime" diff --git a/openmeter/billing/charges/usagebased/adapter/detailedline_test.go b/openmeter/billing/charges/usagebased/adapter/detailedline_test.go index 7d8a89ab0d..86b5aba337 100644 --- a/openmeter/billing/charges/usagebased/adapter/detailedline_test.go +++ b/openmeter/billing/charges/usagebased/adapter/detailedline_test.go @@ -18,7 +18,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/charges/usagebased" "github.com/openmeterio/openmeter/openmeter/billing/models/stddetailedline" "github.com/openmeterio/openmeter/openmeter/billing/models/totals" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" entdb "github.com/openmeterio/openmeter/openmeter/ent/db" dbchargeusagebasedrundetailedline "github.com/openmeterio/openmeter/openmeter/ent/db/chargeusagebasedrundetailedline" dbchargeusagebasedruns "github.com/openmeterio/openmeter/openmeter/ent/db/chargeusagebasedruns" diff --git a/openmeter/billing/charges/usagebased/adapter/intentoverride_test.go b/openmeter/billing/charges/usagebased/adapter/intentoverride_test.go index 1e0909338d..5f8794d46c 100644 --- a/openmeter/billing/charges/usagebased/adapter/intentoverride_test.go +++ b/openmeter/billing/charges/usagebased/adapter/intentoverride_test.go @@ -15,7 +15,7 @@ import ( chargesmeta "github.com/openmeterio/openmeter/openmeter/billing/charges/meta" metaadapter "github.com/openmeterio/openmeter/openmeter/billing/charges/meta/adapter" "github.com/openmeterio/openmeter/openmeter/billing/charges/usagebased" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" entdb "github.com/openmeterio/openmeter/openmeter/ent/db" "github.com/openmeterio/openmeter/openmeter/productcatalog" taxcodetestutils "github.com/openmeterio/openmeter/openmeter/taxcode/testutils" diff --git a/openmeter/billing/charges/usagebased/charge_test.go b/openmeter/billing/charges/usagebased/charge_test.go index aec98e28ad..5c9f2b3278 100644 --- a/openmeter/billing/charges/usagebased/charge_test.go +++ b/openmeter/billing/charges/usagebased/charge_test.go @@ -12,7 +12,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/charges/meta" "github.com/openmeterio/openmeter/openmeter/billing/charges/models/costbasis" "github.com/openmeterio/openmeter/openmeter/currencies" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/productcatalog" "github.com/openmeterio/openmeter/pkg/currencyx" "github.com/openmeterio/openmeter/pkg/models" diff --git a/openmeter/billing/charges/usagebased/service/creditheninvoice_test.go b/openmeter/billing/charges/usagebased/service/creditheninvoice_test.go index 3d5259dbf0..09b514eaf0 100644 --- a/openmeter/billing/charges/usagebased/service/creditheninvoice_test.go +++ b/openmeter/billing/charges/usagebased/service/creditheninvoice_test.go @@ -14,7 +14,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/charges/models/invoicedusage" chargestatemachine "github.com/openmeterio/openmeter/openmeter/billing/charges/statemachine" "github.com/openmeterio/openmeter/openmeter/billing/charges/usagebased" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/productcatalog" "github.com/openmeterio/openmeter/pkg/models" "github.com/openmeterio/openmeter/pkg/timeutil" diff --git a/openmeter/billing/charges/usagebased/service/creditsonly_test.go b/openmeter/billing/charges/usagebased/service/creditsonly_test.go index b9fcf7182a..6d1ae85c63 100644 --- a/openmeter/billing/charges/usagebased/service/creditsonly_test.go +++ b/openmeter/billing/charges/usagebased/service/creditsonly_test.go @@ -16,7 +16,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/charges/usagebased" usagebasedrating "github.com/openmeterio/openmeter/openmeter/billing/charges/usagebased/service/rating" usagebasedrun "github.com/openmeterio/openmeter/openmeter/billing/charges/usagebased/service/run" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/productcatalog" "github.com/openmeterio/openmeter/pkg/currencyx" "github.com/openmeterio/openmeter/pkg/models" diff --git a/openmeter/billing/charges/usagebased/service/rating/service_test.go b/openmeter/billing/charges/usagebased/service/rating/service_test.go index 632979ad71..b928e7ee3d 100644 --- a/openmeter/billing/charges/usagebased/service/rating/service_test.go +++ b/openmeter/billing/charges/usagebased/service/rating/service_test.go @@ -19,7 +19,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/models/totals" billingrating "github.com/openmeterio/openmeter/openmeter/billing/rating" billingratingservice "github.com/openmeterio/openmeter/openmeter/billing/rating/service" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/customer" "github.com/openmeterio/openmeter/openmeter/meter" "github.com/openmeterio/openmeter/openmeter/productcatalog" diff --git a/openmeter/billing/charges/usagebased/service/rating/subtract/subtract_test.go b/openmeter/billing/charges/usagebased/service/rating/subtract/subtract_test.go index 7e52728671..3915785d21 100644 --- a/openmeter/billing/charges/usagebased/service/rating/subtract/subtract_test.go +++ b/openmeter/billing/charges/usagebased/service/rating/subtract/subtract_test.go @@ -14,7 +14,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/models/totals" billingrating "github.com/openmeterio/openmeter/openmeter/billing/rating" billingratingservice "github.com/openmeterio/openmeter/openmeter/billing/rating/service" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/productcatalog" "github.com/openmeterio/openmeter/pkg/models" "github.com/openmeterio/openmeter/pkg/timeutil" diff --git a/openmeter/billing/charges/usagebased/service/rating/testutils/testutils.go b/openmeter/billing/charges/usagebased/service/rating/testutils/testutils.go index ad4c7955f6..6164cf2112 100644 --- a/openmeter/billing/charges/usagebased/service/rating/testutils/testutils.go +++ b/openmeter/billing/charges/usagebased/service/rating/testutils/testutils.go @@ -14,7 +14,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/charges/usagebased" "github.com/openmeterio/openmeter/openmeter/billing/models/stddetailedline" "github.com/openmeterio/openmeter/openmeter/billing/models/totals" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/productcatalog" "github.com/openmeterio/openmeter/pkg/timeutil" ) diff --git a/openmeter/billing/charges/usagebased/service/run/payment_test.go b/openmeter/billing/charges/usagebased/service/run/payment_test.go index 57b598cc0a..2edb381cdb 100644 --- a/openmeter/billing/charges/usagebased/service/run/payment_test.go +++ b/openmeter/billing/charges/usagebased/service/run/payment_test.go @@ -15,7 +15,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/charges/models/payment" "github.com/openmeterio/openmeter/openmeter/billing/charges/usagebased" "github.com/openmeterio/openmeter/openmeter/billing/models/totals" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/productcatalog" "github.com/openmeterio/openmeter/pkg/currencyx" "github.com/openmeterio/openmeter/pkg/models" diff --git a/openmeter/billing/worker/subscriptionsync/service/reconciler/patchcharge_test.go b/openmeter/billing/worker/subscriptionsync/service/reconciler/patchcharge_test.go index aaafc65abb..943d337be3 100644 --- a/openmeter/billing/worker/subscriptionsync/service/reconciler/patchcharge_test.go +++ b/openmeter/billing/worker/subscriptionsync/service/reconciler/patchcharge_test.go @@ -13,7 +13,7 @@ import ( chargesusagebased "github.com/openmeterio/openmeter/openmeter/billing/charges/usagebased" "github.com/openmeterio/openmeter/openmeter/billing/worker/subscriptionsync/service/persistedstate" "github.com/openmeterio/openmeter/openmeter/billing/worker/subscriptionsync/service/targetstate" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/productcatalog" "github.com/openmeterio/openmeter/openmeter/subscription" "github.com/openmeterio/openmeter/pkg/currencyx" diff --git a/openmeter/billing/worker/subscriptionsync/service/sync_credittheninvoice_test.go b/openmeter/billing/worker/subscriptionsync/service/sync_credittheninvoice_test.go index c16fd7289e..72dbd410d7 100644 --- a/openmeter/billing/worker/subscriptionsync/service/sync_credittheninvoice_test.go +++ b/openmeter/billing/worker/subscriptionsync/service/sync_credittheninvoice_test.go @@ -24,7 +24,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/models/totals" "github.com/openmeterio/openmeter/openmeter/billing/worker/subscriptionsync" "github.com/openmeterio/openmeter/openmeter/currencies" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/customer" enttx "github.com/openmeterio/openmeter/openmeter/ent/tx" "github.com/openmeterio/openmeter/openmeter/ledger" diff --git a/openmeter/currencies/adapter/currencies_test.go b/openmeter/currencies/adapter/currencies_test.go index fd7ebb18e7..ff01fc2f3a 100644 --- a/openmeter/currencies/adapter/currencies_test.go +++ b/openmeter/currencies/adapter/currencies_test.go @@ -12,6 +12,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/currencies" currencyadapter "github.com/openmeterio/openmeter/openmeter/currencies/adapter" currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" + currenciestestenvutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/env" entdb "github.com/openmeterio/openmeter/openmeter/ent/db" customcurrencydb "github.com/openmeterio/openmeter/openmeter/ent/db/customcurrency" "github.com/openmeterio/openmeter/pkg/currencyx" @@ -20,7 +21,7 @@ import ( ) func TestListCustomCurrenciesFiltersCurrencyType(t *testing.T) { - env := currenciestestutils.NewTestEnv(t) + env := currenciestestenvutils.NewTestEnv(t) t.Cleanup(func() { env.Close(t) }) @@ -81,7 +82,7 @@ func TestListCustomCurrenciesFiltersCurrencyType(t *testing.T) { } func TestCostBasisEagerLoaders(t *testing.T) { - env := currenciestestutils.NewTestEnv(t) + env := currenciestestenvutils.NewTestEnv(t) t.Cleanup(func() { env.Close(t) }) @@ -376,7 +377,7 @@ func TestCostBasisEagerLoaders(t *testing.T) { func loadCostBasisIDs( t *testing.T, - env *currenciestestutils.TestEnv, + env *currenciestestenvutils.TestEnv, currencyID string, eagerLoad func(*entdb.CustomCurrencyQuery) *entdb.CustomCurrencyQuery, ) []string { @@ -397,7 +398,7 @@ func loadCostBasisIDs( } func TestGetCostBasisAt(t *testing.T) { - env := currenciestestutils.NewTestEnv(t) + env := currenciestestenvutils.NewTestEnv(t) t.Cleanup(func() { env.Close(t) }) diff --git a/openmeter/currencies/currency.go b/openmeter/currencies/currency.go index 557e5780d0..fe63ed2c4c 100644 --- a/openmeter/currencies/currency.go +++ b/openmeter/currencies/currency.go @@ -170,39 +170,57 @@ func (r CurrencyReference) MarshalJSON() ([]byte, error) { }) } -func ParseCurrencyReference(value []byte) (CurrencyReference, error) { +// UnmarshalJSON preserves the public object representation after implementing +// encoding.TextUnmarshaler for the ledger currency dimension. +func (r *CurrencyReference) UnmarshalJSON(value []byte) error { + type currencyReference CurrencyReference + + var reference currencyReference + if err := json.Unmarshal(value, &reference); err != nil { + return err + } + + *r = CurrencyReference(reference) + + return nil +} + +// UnmarshalText parses a persisted currency reference and replaces the +// receiver only after the complete value has been validated. +func (r *CurrencyReference) UnmarshalText(value []byte) error { serialized := string(value) segments := strings.Split(serialized, currencyReferenceSerializationDelimiter) if len(segments) == 1 { reference := NewCurrencyReference(currencyx.Code(serialized)) if err := reference.Validate(); err != nil { - return CurrencyReference{}, err + return err } if !reference.IsFiat() { - return CurrencyReference{}, errors.New("custom currency reference snapshot is required") + return errors.New("custom currency reference snapshot is required") } - return reference, nil + *r = reference + return nil } if len(segments) != 5 || segments[0] != "custom" { - return CurrencyReference{}, fmt.Errorf("invalid currency reference %q", serialized) + return fmt.Errorf("invalid currency reference %q", serialized) } if segments[1] != currencyReferenceSerializationVersionV1 { - return CurrencyReference{}, fmt.Errorf("unsupported currency reference version %q", segments[1]) + return fmt.Errorf("unsupported currency reference version %q", segments[1]) } code := currencyx.Code(segments[2]) if !code.IsCustom() { - return CurrencyReference{}, fmt.Errorf("custom currency reference requires a custom currency code: %q", code) + return fmt.Errorf("custom currency reference requires a custom currency code: %q", code) } if segments[3] == "" { - return CurrencyReference{}, errors.New("custom currency id is required") + return errors.New("custom currency id is required") } precision, err := strconv.ParseUint(segments[4], 10, 32) if err != nil { - return CurrencyReference{}, fmt.Errorf("invalid custom currency precision %q: %w", segments[4], err) + return fmt.Errorf("invalid custom currency precision %q: %w", segments[4], err) } resolved, err := currencyx.NewCurrencyBuilder(currencyx.CurrencyTypeCustom). @@ -211,7 +229,7 @@ func ParseCurrencyReference(value []byte) (CurrencyReference, error) { WithPrecision(uint32(precision)). Build() if err != nil { - return CurrencyReference{}, fmt.Errorf("build custom currency snapshot: %w", err) + return fmt.Errorf("build custom currency snapshot: %w", err) } currency := Currency{ @@ -219,7 +237,17 @@ func ParseCurrencyReference(value []byte) (CurrencyReference, error) { Currency: resolved, } - return currency.Reference(), nil + *r = currency.Reference() + return nil +} + +func ParseCurrencyReference(value []byte) (CurrencyReference, error) { + var reference CurrencyReference + if err := reference.UnmarshalText(value); err != nil { + return CurrencyReference{}, err + } + + return reference, nil } func (r CurrencyReference) Validate() error { diff --git a/openmeter/currencies/currency_test.go b/openmeter/currencies/currency_test.go index 3dbecd818b..dbc74898df 100644 --- a/openmeter/currencies/currency_test.go +++ b/openmeter/currencies/currency_test.go @@ -8,7 +8,6 @@ import ( "github.com/openmeterio/openmeter/openmeter/currencies" currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" - currencytestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" "github.com/openmeterio/openmeter/pkg/currencyx" ) @@ -32,7 +31,7 @@ func TestCurrencyValidate(t *testing.T) { }) t.Run("valid currency", func(t *testing.T) { - currency := currencytestutils.NewFiatCurrency(t, "USD") + currency := currenciestestutils.NewFiatCurrency(t, "USD") require.NoError(t, currency.Validate()) }) @@ -44,7 +43,7 @@ func TestCurrencyGetCode(t *testing.T) { }) t.Run("returns currency code", func(t *testing.T) { - currency := currencytestutils.NewFiatCurrency(t, "USD") + currency := currenciestestutils.NewFiatCurrency(t, "USD") require.Equal(t, currencyx.Code("USD"), currency.GetCode()) }) @@ -139,10 +138,14 @@ func TestCurrencyReferenceSerialization(t *testing.T) { require.NoError(t, err) require.True(t, reference.Equal(parsed)) require.True(t, parsed.IsResolved()) + + var unmarshaled currencies.CurrencyReference + require.NoError(t, unmarshaled.UnmarshalText(serialized)) + require.True(t, reference.Equal(unmarshaled)) }) t.Run("custom", func(t *testing.T) { - custom := currencytestutils.NewCustomCurrency(t, "CRED:ITS", 2) + custom := currenciestestutils.NewCustomCurrency(t, "CRED:ITS", 2) reference := custom.Reference() serialized, err := reference.MarshalText() @@ -156,6 +159,17 @@ func TestCurrencyReferenceSerialization(t *testing.T) { require.NoError(t, err) require.True(t, reference.Equal(parsed)) require.True(t, parsed.IsResolved()) + + var unmarshaled currencies.CurrencyReference + require.NoError(t, unmarshaled.UnmarshalText(serialized)) + require.True(t, reference.Equal(unmarshaled)) + require.True(t, unmarshaled.IsResolved()) + + referenceCurrency, ok := reference.CustomCurrency() + require.True(t, ok) + unmarshaledCurrency, ok := unmarshaled.CustomCurrency() + require.True(t, ok) + require.Equal(t, referenceCurrency.Details().Precision, unmarshaledCurrency.Details().Precision) require.False(t, parsed.IsCostBasisResolved()) resolved, ok := parsed.CustomCurrency() @@ -190,11 +204,16 @@ func TestCurrencyReferenceSerialization(t *testing.T) { }) t.Run("json representation remains an object", func(t *testing.T) { - custom := currencytestutils.NewCustomCurrency(t, "CREDITS", 2) + custom := currenciestestutils.NewCustomCurrency(t, "CREDITS", 2) serialized, err := json.Marshal(custom.Reference()) require.NoError(t, err) require.JSONEq(t, `{"code":"CREDITS","custom_currency_id":"`+custom.ID+`"}`, string(serialized)) + + var unmarshaled currencies.CurrencyReference + require.NoError(t, json.Unmarshal(serialized, &unmarshaled)) + require.True(t, custom.Reference().Equal(unmarshaled)) + require.False(t, unmarshaled.IsResolved()) }) } diff --git a/openmeter/currencies/currencyresolver/resolver_test.go b/openmeter/currencies/currencyresolver/resolver_test.go index d1309946eb..e5f303a9a2 100644 --- a/openmeter/currencies/currencyresolver/resolver_test.go +++ b/openmeter/currencies/currencyresolver/resolver_test.go @@ -9,6 +9,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/currencies" "github.com/openmeterio/openmeter/openmeter/currencies/currencyresolver" currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" + currenciestestenvutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/env" "github.com/openmeterio/openmeter/pkg/clock" "github.com/openmeterio/openmeter/pkg/currencyx" "github.com/openmeterio/openmeter/pkg/models" @@ -20,7 +21,7 @@ func TestNew(t *testing.T) { } func TestCurrencyResolver(t *testing.T) { - env := currenciestestutils.NewTestEnv(t) + env := currenciestestenvutils.NewTestEnv(t) t.Cleanup(func() { env.Close(t) }) diff --git a/openmeter/currencies/service/service_test.go b/openmeter/currencies/service/service_test.go index e9f0b96464..5837dedc02 100644 --- a/openmeter/currencies/service/service_test.go +++ b/openmeter/currencies/service/service_test.go @@ -12,6 +12,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/currencies" currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" + currenciestestenvutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/env" "github.com/openmeterio/openmeter/pkg/clock" "github.com/openmeterio/openmeter/pkg/currencyx" "github.com/openmeterio/openmeter/pkg/filter" @@ -24,7 +25,7 @@ func TestCurrenciesService(t *testing.T) { clock.FreezeTime(now) defer clock.UnFreeze() - env := currenciestestutils.NewTestEnv(t) + env := currenciestestenvutils.NewTestEnv(t) t.Cleanup(func() { env.Close(t) }) diff --git a/openmeter/currencies/testutils/currency.go b/openmeter/currencies/testutils/currency.go index 9b6a219561..41cc634dff 100644 --- a/openmeter/currencies/testutils/currency.go +++ b/openmeter/currencies/testutils/currency.go @@ -3,6 +3,7 @@ package testutils import ( "testing" + "github.com/oklog/ulid/v2" "github.com/stretchr/testify/require" "github.com/openmeterio/openmeter/openmeter/currencies" @@ -42,3 +43,31 @@ func NewCreateCurrencyInput(namespace string, code currencyx.Code, name, symbol }, } } + +func NewFiatCurrency[T ~string](t testing.TB, code T) currencies.Currency { + t.Helper() + + currency, err := currencies.NewFiatCurrency(currencyx.Code(code)) + require.NoError(t, err) + + return currency +} + +// NewCustomCurrency builds a custom currency value for tests that only need +// the resolved calculator (code, precision) and a stable fixture managed ID, +// not a persisted custom_currencies row. +func NewCustomCurrency[T ~string](t testing.TB, code T, precision uint32) currencies.Currency { + t.Helper() + + built, err := currencyx.NewCurrencyBuilder(currencyx.CurrencyTypeCustom). + WithCode(currencyx.Code(code)). + WithName(string(code)). + WithPrecision(precision). + Build() + require.NoError(t, err) + + return currencies.Currency{ + NamespacedID: models.NamespacedID{ID: ulid.Make().String()}, + Currency: built, + } +} diff --git a/openmeter/currencies/testutils/currency/currency.go b/openmeter/currencies/testutils/currency/currency.go deleted file mode 100644 index 2bff8cc442..0000000000 --- a/openmeter/currencies/testutils/currency/currency.go +++ /dev/null @@ -1,40 +0,0 @@ -package currency - -import ( - "testing" - - "github.com/oklog/ulid/v2" - "github.com/stretchr/testify/require" - - "github.com/openmeterio/openmeter/openmeter/currencies" - "github.com/openmeterio/openmeter/pkg/currencyx" - "github.com/openmeterio/openmeter/pkg/models" -) - -func NewFiatCurrency[T ~string](t testing.TB, code T) currencies.Currency { - t.Helper() - - currency, err := currencies.NewFiatCurrency(currencyx.Code(code)) - require.NoError(t, err) - - return currency -} - -// NewCustomCurrency builds a custom currency value for tests that only need -// the resolved calculator (code, precision) and a stable fixture managed ID, -// not a persisted custom_currencies row. -func NewCustomCurrency[T ~string](t testing.TB, code T, precision uint32) currencies.Currency { - t.Helper() - - built, err := currencyx.NewCurrencyBuilder(currencyx.CurrencyTypeCustom). - WithCode(currencyx.Code(code)). - WithName(string(code)). - WithPrecision(precision). - Build() - require.NoError(t, err) - - return currencies.Currency{ - NamespacedID: models.NamespacedID{ID: ulid.Make().String()}, - Currency: built, - } -} diff --git a/openmeter/currencies/testutils/env.go b/openmeter/currencies/testutils/env/env.go similarity index 99% rename from openmeter/currencies/testutils/env.go rename to openmeter/currencies/testutils/env/env.go index 690f800f20..3716774550 100644 --- a/openmeter/currencies/testutils/env.go +++ b/openmeter/currencies/testutils/env/env.go @@ -1,4 +1,4 @@ -package testutils +package env import ( "log/slog" diff --git a/openmeter/ledger/chargeadapter/creditpurchase.go b/openmeter/ledger/chargeadapter/creditpurchase.go index 2689f2a249..843f4e8dbf 100644 --- a/openmeter/ledger/chargeadapter/creditpurchase.go +++ b/openmeter/ledger/chargeadapter/creditpurchase.go @@ -462,11 +462,11 @@ func settlementPaymentCurrency( if err != nil { return "", fmt.Errorf("get settlement currency: %w", err) } - if settlementCurrency == "" { + if settlementCurrency == nil { return "", fmt.Errorf("settlement currency is required for a custom currency purchase") } - return currencyx.Code(settlementCurrency), nil + return currencyx.Code(lo.FromPtr(settlementCurrency)), nil } // settlementCostBasisCurrency returns the fiat currency a custom-currency @@ -481,11 +481,11 @@ func settlementCostBasisCurrency(currency currencies.Currency, settlement charge if err != nil { return nil, fmt.Errorf("get settlement currency: %w", err) } - if settlementCurrency == "" { + if settlementCurrency == nil { return nil, nil } - return lo.ToPtr(currencyx.Code(settlementCurrency)), nil + return lo.ToPtr(currencyx.Code(lo.FromPtr(settlementCurrency))), nil } // advanceAttribution is the posting plan for one slice of existing advance diff --git a/openmeter/ledger/chargeadapter/creditpurchase_customcurrency_test.go b/openmeter/ledger/chargeadapter/creditpurchase_customcurrency_test.go index c80eeca5e9..ad61cf42bc 100644 --- a/openmeter/ledger/chargeadapter/creditpurchase_customcurrency_test.go +++ b/openmeter/ledger/chargeadapter/creditpurchase_customcurrency_test.go @@ -11,7 +11,7 @@ import ( chargecreditpurchase "github.com/openmeterio/openmeter/openmeter/billing/charges/creditpurchase" "github.com/openmeterio/openmeter/openmeter/billing/charges/meta" "github.com/openmeterio/openmeter/openmeter/currencies" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/ledger" "github.com/openmeterio/openmeter/openmeter/ledger/transactions" "github.com/openmeterio/openmeter/openmeter/productcatalog" diff --git a/openmeter/ledger/chargeadapter/creditpurchase_test.go b/openmeter/ledger/chargeadapter/creditpurchase_test.go index cf426723e9..5dbfff1f36 100644 --- a/openmeter/ledger/chargeadapter/creditpurchase_test.go +++ b/openmeter/ledger/chargeadapter/creditpurchase_test.go @@ -11,7 +11,7 @@ import ( chargecreditpurchase "github.com/openmeterio/openmeter/openmeter/billing/charges/creditpurchase" "github.com/openmeterio/openmeter/openmeter/billing/charges/meta" "github.com/openmeterio/openmeter/openmeter/currencies" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" entdb "github.com/openmeterio/openmeter/openmeter/ent/db" ledgerbreakagerecorddb "github.com/openmeterio/openmeter/openmeter/ent/db/ledgerbreakagerecord" ledgerentrydb "github.com/openmeterio/openmeter/openmeter/ent/db/ledgerentry" diff --git a/openmeter/ledger/chargeadapter/flatfee_test.go b/openmeter/ledger/chargeadapter/flatfee_test.go index 3600bfbc3a..8990c1160e 100644 --- a/openmeter/ledger/chargeadapter/flatfee_test.go +++ b/openmeter/ledger/chargeadapter/flatfee_test.go @@ -18,7 +18,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/charges/models/invoicedusage" "github.com/openmeterio/openmeter/openmeter/billing/models/totals" "github.com/openmeterio/openmeter/openmeter/currencies" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" ledgertransactiondb "github.com/openmeterio/openmeter/openmeter/ent/db/ledgertransaction" ledgertransactiongroupdb "github.com/openmeterio/openmeter/openmeter/ent/db/ledgertransactiongroup" enttx "github.com/openmeterio/openmeter/openmeter/ent/tx" diff --git a/openmeter/ledger/chargeadapter/usagebased_customcurrency_test.go b/openmeter/ledger/chargeadapter/usagebased_customcurrency_test.go index acb2476adb..2484164d00 100644 --- a/openmeter/ledger/chargeadapter/usagebased_customcurrency_test.go +++ b/openmeter/ledger/chargeadapter/usagebased_customcurrency_test.go @@ -12,7 +12,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/charges/meta" chargeusagebased "github.com/openmeterio/openmeter/openmeter/billing/charges/usagebased" "github.com/openmeterio/openmeter/openmeter/currencies" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/ledger" "github.com/openmeterio/openmeter/openmeter/ledger/transactions" "github.com/openmeterio/openmeter/openmeter/productcatalog" diff --git a/openmeter/ledger/chargeadapter/usagebased_test.go b/openmeter/ledger/chargeadapter/usagebased_test.go index 72d6922862..4eae4b1a17 100644 --- a/openmeter/ledger/chargeadapter/usagebased_test.go +++ b/openmeter/ledger/chargeadapter/usagebased_test.go @@ -20,7 +20,7 @@ import ( chargeusagebased "github.com/openmeterio/openmeter/openmeter/billing/charges/usagebased" "github.com/openmeterio/openmeter/openmeter/billing/models/totals" "github.com/openmeterio/openmeter/openmeter/currencies" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" ledgertransactiondb "github.com/openmeterio/openmeter/openmeter/ent/db/ledgertransaction" enttx "github.com/openmeterio/openmeter/openmeter/ent/tx" "github.com/openmeterio/openmeter/openmeter/ledger" diff --git a/openmeter/ledger/collector/collection_fbo_test.go b/openmeter/ledger/collector/collection_fbo_test.go index e8c0781c3c..85d5cdd66a 100644 --- a/openmeter/ledger/collector/collection_fbo_test.go +++ b/openmeter/ledger/collector/collection_fbo_test.go @@ -11,7 +11,7 @@ import ( "github.com/stretchr/testify/require" "github.com/openmeterio/openmeter/openmeter/currencies" - currencytestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currencytestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" enttx "github.com/openmeterio/openmeter/openmeter/ent/tx" "github.com/openmeterio/openmeter/openmeter/ledger" ledgerbreakage "github.com/openmeterio/openmeter/openmeter/ledger/breakage" diff --git a/openmeter/ledger/customerbalance/creditvoid_customcurrency_test.go b/openmeter/ledger/customerbalance/creditvoid_customcurrency_test.go index 553590f560..29ba819823 100644 --- a/openmeter/ledger/customerbalance/creditvoid_customcurrency_test.go +++ b/openmeter/ledger/customerbalance/creditvoid_customcurrency_test.go @@ -7,7 +7,7 @@ import ( "github.com/oklog/ulid/v2" "github.com/stretchr/testify/require" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/ledger" "github.com/openmeterio/openmeter/openmeter/ledger/creditvoid" "github.com/openmeterio/openmeter/openmeter/ledger/transactions" diff --git a/openmeter/ledger/customerbalance/expired_loader_test.go b/openmeter/ledger/customerbalance/expired_loader_test.go index 1d2792108e..6dfa35f413 100644 --- a/openmeter/ledger/customerbalance/expired_loader_test.go +++ b/openmeter/ledger/customerbalance/expired_loader_test.go @@ -14,7 +14,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing" "github.com/openmeterio/openmeter/openmeter/billing/charges/creditpurchase" chargemeta "github.com/openmeterio/openmeter/openmeter/billing/charges/meta" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/ledger" ledgerbreakage "github.com/openmeterio/openmeter/openmeter/ledger/breakage" "github.com/openmeterio/openmeter/openmeter/ledger/transactions" diff --git a/openmeter/ledger/customerbalance/service_test.go b/openmeter/ledger/customerbalance/service_test.go index 25fb3c4a91..d51f004d15 100644 --- a/openmeter/ledger/customerbalance/service_test.go +++ b/openmeter/ledger/customerbalance/service_test.go @@ -18,7 +18,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/charges/models/payment" "github.com/openmeterio/openmeter/openmeter/billing/charges/usagebased" "github.com/openmeterio/openmeter/openmeter/currencies" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/customer" "github.com/openmeterio/openmeter/openmeter/ledger" "github.com/openmeterio/openmeter/openmeter/productcatalog" diff --git a/openmeter/ledger/customerbalance/testenv_test.go b/openmeter/ledger/customerbalance/testenv_test.go index 00c4058c9a..cefd4ff5d1 100644 --- a/openmeter/ledger/customerbalance/testenv_test.go +++ b/openmeter/ledger/customerbalance/testenv_test.go @@ -32,7 +32,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/currencies" currencyadapter "github.com/openmeterio/openmeter/openmeter/currencies/adapter" currencyservice "github.com/openmeterio/openmeter/openmeter/currencies/service" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/customer" enttx "github.com/openmeterio/openmeter/openmeter/ent/tx" ledgerbreakage "github.com/openmeterio/openmeter/openmeter/ledger/breakage" diff --git a/openmeter/ledger/recognizer/service_test.go b/openmeter/ledger/recognizer/service_test.go index 7d4df86dd5..539101e2b2 100644 --- a/openmeter/ledger/recognizer/service_test.go +++ b/openmeter/ledger/recognizer/service_test.go @@ -14,7 +14,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/charges/meta" "github.com/openmeterio/openmeter/openmeter/billing/charges/models/creditrealization" "github.com/openmeterio/openmeter/openmeter/billing/charges/models/ledgertransaction" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" enttx "github.com/openmeterio/openmeter/openmeter/ent/tx" "github.com/openmeterio/openmeter/openmeter/ledger/recognizer" ledgertestutils "github.com/openmeterio/openmeter/openmeter/ledger/testutils" diff --git a/test/app/stripe/invoice_credits_test.go b/test/app/stripe/invoice_credits_test.go index f3692c96fa..b16eca9073 100644 --- a/test/app/stripe/invoice_credits_test.go +++ b/test/app/stripe/invoice_credits_test.go @@ -21,7 +21,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/charges/models/payment" "github.com/openmeterio/openmeter/openmeter/billing/charges/usagebased" "github.com/openmeterio/openmeter/openmeter/billing/creditgrant" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/customer" "github.com/openmeterio/openmeter/openmeter/productcatalog" "github.com/openmeterio/openmeter/pkg/clock" diff --git a/test/credits/base.go b/test/credits/base.go index 8f6ee50638..bba8751dfe 100644 --- a/test/credits/base.go +++ b/test/credits/base.go @@ -22,7 +22,7 @@ import ( chargestestutils "github.com/openmeterio/openmeter/openmeter/billing/charges/testutils" "github.com/openmeterio/openmeter/openmeter/billing/charges/usagebased" "github.com/openmeterio/openmeter/openmeter/currencies" - currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils/currency" + currenciestestutils "github.com/openmeterio/openmeter/openmeter/currencies/testutils" "github.com/openmeterio/openmeter/openmeter/customer" enttx "github.com/openmeterio/openmeter/openmeter/ent/tx" "github.com/openmeterio/openmeter/openmeter/ledger" From c16ec0d254206f6c7258919abf8a20c7a4fd7ba3 Mon Sep 17 00:00:00 2001 From: Mark Vass Date: Tue, 4 Aug 2026 10:56:23 +0200 Subject: [PATCH 2/2] fix: settlementcurrency validation --- openmeter/ledger/chargeadapter/creditpurchase.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/openmeter/ledger/chargeadapter/creditpurchase.go b/openmeter/ledger/chargeadapter/creditpurchase.go index 843f4e8dbf..b9833107f6 100644 --- a/openmeter/ledger/chargeadapter/creditpurchase.go +++ b/openmeter/ledger/chargeadapter/creditpurchase.go @@ -466,7 +466,13 @@ func settlementPaymentCurrency( return "", fmt.Errorf("settlement currency is required for a custom currency purchase") } - return currencyx.Code(lo.FromPtr(settlementCurrency)), nil + sc := lo.FromPtr(settlementCurrency) + + if err := sc.Validate(); err != nil { + return "", fmt.Errorf("settlement currency is invalid: %w", err) + } + + return currencyx.Code(sc), nil } // settlementCostBasisCurrency returns the fiat currency a custom-currency