11package adapter
22
33import (
4- "log/slog"
54 "testing"
65 "time"
76
87 "github.com/alpacahq/alpacadecimal"
98 "github.com/samber/lo"
10- "github.com/stretchr/testify/require"
119 "github.com/stretchr/testify/suite"
1210
13- "github.com/openmeterio/openmeter/openmeter/billing"
1411 chargesmeta "github.com/openmeterio/openmeter/openmeter/billing/charges/meta"
15- metaadapter "github.com/openmeterio/openmeter/openmeter/billing/charges/meta/adapter"
1612 "github.com/openmeterio/openmeter/openmeter/billing/charges/usagebased"
1713 "github.com/openmeterio/openmeter/openmeter/billing/models/stddetailedline"
1814 "github.com/openmeterio/openmeter/openmeter/billing/models/totals"
19- entdb "github.com/openmeterio/openmeter/openmeter/ent/db"
2015 dbchargeusagebasedrundetailedline "github.com/openmeterio/openmeter/openmeter/ent/db/chargeusagebasedrundetailedline"
2116 "github.com/openmeterio/openmeter/openmeter/productcatalog"
22- "github.com/openmeterio/openmeter/openmeter/testutils"
23- "github.com/openmeterio/openmeter/pkg/currencyx"
2417 "github.com/openmeterio/openmeter/pkg/models"
2518 "github.com/openmeterio/openmeter/pkg/timeutil"
26- "github.com/openmeterio/openmeter/tools/migrate"
2719)
2820
2921func TestDetailedLineAdapter (t * testing.T ) {
3022 suite .Run (t , new (DetailedLineAdapterSuite ))
3123}
3224
3325type DetailedLineAdapterSuite struct {
34- suite.Suite
35-
36- testDB * testutils.TestDB
37- dbClient * entdb.Client
38- adapter usagebased.Adapter
26+ usageBasedAdapterBaseSuite
3927}
4028
4129type newDetailedLineInput struct {
@@ -47,97 +35,17 @@ type newDetailedLineInput struct {
4735 Description * string
4836}
4937
50- func (s * DetailedLineAdapterSuite ) SetupSuite () {
51- t := s .T ()
52-
53- s .testDB = testutils .InitPostgresDB (t )
54- s .dbClient = entdb .NewClient (entdb .Driver (s .testDB .EntDriver .Driver ()))
55-
56- migrator , err := migrate .New (migrate.MigrateOptions {
57- ConnectionString : s .testDB .URL ,
58- Migrations : migrate .OMMigrationsConfig ,
59- Logger : slog .Default (),
60- })
61- require .NoError (t , err )
62- defer migrator .CloseOrLogError ()
63- require .NoError (t , migrator .Up ())
64-
65- metaAdapter , err := metaadapter .New (metaadapter.Config {
66- Client : s .dbClient ,
67- Logger : slog .Default (),
68- })
69- require .NoError (t , err )
70-
71- a , err := New (Config {
72- Client : s .dbClient ,
73- Logger : slog .Default (),
74- MetaAdapter : metaAdapter ,
75- })
76- require .NoError (t , err )
77-
78- s .adapter = a
79- }
80-
81- func (s * DetailedLineAdapterSuite ) TearDownSuite () {
82- s .dbClient .Close ()
83- s .testDB .EntDriver .Close ()
84- s .testDB .PGDriver .Close ()
85- }
86-
8738func (s * DetailedLineAdapterSuite ) TestUpsertRunDetailedLinesReplacesAndSoftDeletesByChildUniqueReferenceID () {
8839 ctx := s .T ().Context ()
8940 namespace := "usagebased-detailedline-adapter"
90- customerID := s .createCustomer (namespace )
91- s .createFeature (namespace , "feature-1" )
9241
9342 servicePeriod := timeutil.ClosedPeriod {
9443 From : time .Date (2026 , 1 , 1 , 0 , 0 , 0 , 0 , time .UTC ),
9544 To : time .Date (2026 , 2 , 1 , 0 , 0 , 0 , 0 , time .UTC ),
9645 }
9746
98- createdCharges , err := s .adapter .CreateCharges (ctx , usagebased.CreateChargesInput {
99- Namespace : namespace ,
100- Intents : []usagebased.CreateIntent {
101- {
102- Intent : usagebased.Intent {
103- Intent : chargesmeta.Intent {
104- Name : "usage-charge" ,
105- ManagedBy : billing .SubscriptionManagedLine ,
106- UniqueReferenceID : nil ,
107- CustomerID : customerID ,
108- Currency : currencyx .Code ("USD" ),
109- ServicePeriod : servicePeriod ,
110- FullServicePeriod : servicePeriod ,
111- BillingPeriod : servicePeriod ,
112- },
113- InvoiceAt : servicePeriod .To ,
114- SettlementMode : productcatalog .CreditOnlySettlementMode ,
115- FeatureKey : "feature-1" ,
116- Price : * productcatalog .NewPriceFrom (productcatalog.UnitPrice {
117- Amount : alpacadecimal .NewFromFloat (0.1 ),
118- }),
119- },
120- FeatureID : "feature-1" ,
121- },
122- },
123- })
124- s .Require ().NoError (err )
125- s .Require ().Len (createdCharges , 1 )
126-
127- charge := createdCharges [0 ]
128- runBase , err := s .adapter .CreateRealizationRun (ctx , charge .GetChargeID (), usagebased.CreateRealizationRunInput {
129- FeatureID : "feature-1" ,
130- Type : usagebased .RealizationRunTypeFinalRealization ,
131- StoredAtLT : servicePeriod .To ,
132- ServicePeriodTo : servicePeriod .To ,
133- MeteredQuantity : alpacadecimal .NewFromInt (10 ),
134- Totals : totals.Totals {
135- Amount : alpacadecimal .NewFromInt (1 ),
136- ChargesTotal : alpacadecimal .NewFromInt (1 ),
137- Total : alpacadecimal .NewFromInt (1 ),
138- },
139- })
140- s .Require ().NoError (err )
47+ charge := s .createUsageBasedCharge (namespace , servicePeriod )
48+ runBase := s .createRun (charge , usagebased .RealizationRunTypeFinalRealization , servicePeriod .To , 10 )
14149
14250 initialLines := usagebased.DetailedLines {
14351 s .newDetailedLine (newDetailedLineInput {
@@ -206,30 +114,6 @@ func (s *DetailedLineAdapterSuite) TestUpsertRunDetailedLinesReplacesAndSoftDele
206114 s .NotNil (deletedRow .DeletedAt )
207115}
208116
209- func (s * DetailedLineAdapterSuite ) createCustomer (namespace string ) string {
210- s .T ().Helper ()
211-
212- customer , err := s .dbClient .Customer .Create ().
213- SetNamespace (namespace ).
214- SetName ("test-customer" ).
215- Save (s .T ().Context ())
216- s .Require ().NoError (err )
217-
218- return customer .ID
219- }
220-
221- func (s * DetailedLineAdapterSuite ) createFeature (namespace , featureID string ) {
222- s .T ().Helper ()
223-
224- _ , err := s .dbClient .Feature .Create ().
225- SetNamespace (namespace ).
226- SetID (featureID ).
227- SetName ("test-feature" ).
228- SetKey (featureID ).
229- Save (s .T ().Context ())
230- s .Require ().NoError (err )
231- }
232-
233117func (s * DetailedLineAdapterSuite ) newDetailedLine (input newDetailedLineInput ) usagebased.DetailedLine {
234118 s .T ().Helper ()
235119
0 commit comments