Skip to content

Commit 2a30e4b

Browse files
committed
chore: prior run values
1 parent 8d5b6ff commit 2a30e4b

15 files changed

Lines changed: 676 additions & 314 deletions
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
package adapter
2+
3+
import (
4+
"log/slog"
5+
"time"
6+
7+
"github.com/alpacahq/alpacadecimal"
8+
"github.com/stretchr/testify/require"
9+
"github.com/stretchr/testify/suite"
10+
11+
"github.com/openmeterio/openmeter/openmeter/billing"
12+
chargesmeta "github.com/openmeterio/openmeter/openmeter/billing/charges/meta"
13+
metaadapter "github.com/openmeterio/openmeter/openmeter/billing/charges/meta/adapter"
14+
"github.com/openmeterio/openmeter/openmeter/billing/charges/usagebased"
15+
"github.com/openmeterio/openmeter/openmeter/billing/models/totals"
16+
entdb "github.com/openmeterio/openmeter/openmeter/ent/db"
17+
"github.com/openmeterio/openmeter/openmeter/productcatalog"
18+
"github.com/openmeterio/openmeter/openmeter/testutils"
19+
"github.com/openmeterio/openmeter/pkg/currencyx"
20+
"github.com/openmeterio/openmeter/pkg/timeutil"
21+
"github.com/openmeterio/openmeter/tools/migrate"
22+
)
23+
24+
type usageBasedAdapterBaseSuite struct {
25+
suite.Suite
26+
27+
testDB *testutils.TestDB
28+
dbClient *entdb.Client
29+
adapter usagebased.Adapter
30+
}
31+
32+
func (s *usageBasedAdapterBaseSuite) SetupSuite() {
33+
t := s.T()
34+
35+
s.testDB = testutils.InitPostgresDB(t)
36+
s.dbClient = entdb.NewClient(entdb.Driver(s.testDB.EntDriver.Driver()))
37+
38+
migrator, err := migrate.New(migrate.MigrateOptions{
39+
ConnectionString: s.testDB.URL,
40+
Migrations: migrate.OMMigrationsConfig,
41+
Logger: slog.Default(),
42+
})
43+
require.NoError(t, err)
44+
defer migrator.CloseOrLogError()
45+
require.NoError(t, migrator.Up())
46+
47+
metaAdapter, err := metaadapter.New(metaadapter.Config{
48+
Client: s.dbClient,
49+
Logger: slog.Default(),
50+
})
51+
require.NoError(t, err)
52+
53+
a, err := New(Config{
54+
Client: s.dbClient,
55+
Logger: slog.Default(),
56+
MetaAdapter: metaAdapter,
57+
})
58+
require.NoError(t, err)
59+
60+
s.adapter = a
61+
}
62+
63+
func (s *usageBasedAdapterBaseSuite) TearDownSuite() {
64+
s.dbClient.Close()
65+
s.testDB.EntDriver.Close()
66+
s.testDB.PGDriver.Close()
67+
}
68+
69+
func (s *usageBasedAdapterBaseSuite) createUsageBasedCharge(namespace string, servicePeriod timeutil.ClosedPeriod) usagebased.Charge {
70+
s.T().Helper()
71+
72+
customerID := s.createCustomer(namespace)
73+
s.createFeature(namespace, "feature-1")
74+
75+
createdCharges, err := s.adapter.CreateCharges(s.T().Context(), usagebased.CreateChargesInput{
76+
Namespace: namespace,
77+
Intents: []usagebased.CreateIntent{
78+
{
79+
Intent: usagebased.Intent{
80+
Intent: chargesmeta.Intent{
81+
Name: "usage-charge",
82+
ManagedBy: billing.SubscriptionManagedLine,
83+
UniqueReferenceID: nil,
84+
CustomerID: customerID,
85+
Currency: currencyx.Code("USD"),
86+
ServicePeriod: servicePeriod,
87+
FullServicePeriod: servicePeriod,
88+
BillingPeriod: servicePeriod,
89+
},
90+
InvoiceAt: servicePeriod.To,
91+
SettlementMode: productcatalog.CreditOnlySettlementMode,
92+
FeatureKey: "feature-1",
93+
Price: *productcatalog.NewPriceFrom(productcatalog.UnitPrice{
94+
Amount: alpacadecimal.NewFromFloat(0.1),
95+
}),
96+
},
97+
FeatureID: "feature-1",
98+
},
99+
},
100+
})
101+
s.Require().NoError(err)
102+
s.Require().Len(createdCharges, 1)
103+
104+
return createdCharges[0]
105+
}
106+
107+
func (s *usageBasedAdapterBaseSuite) createRun(
108+
charge usagebased.Charge,
109+
runType usagebased.RealizationRunType,
110+
servicePeriodTo time.Time,
111+
meteredQuantity int64,
112+
) usagebased.RealizationRunBase {
113+
s.T().Helper()
114+
115+
run, err := s.adapter.CreateRealizationRun(s.T().Context(), charge.GetChargeID(), usagebased.CreateRealizationRunInput{
116+
FeatureID: "feature-1",
117+
Type: runType,
118+
StoredAtLT: servicePeriodTo,
119+
ServicePeriodTo: servicePeriodTo,
120+
MeteredQuantity: alpacadecimal.NewFromInt(meteredQuantity),
121+
Totals: totals.Totals{
122+
Amount: alpacadecimal.NewFromFloat(float64(meteredQuantity) * 0.1),
123+
ChargesTotal: alpacadecimal.NewFromFloat(float64(meteredQuantity) * 0.1),
124+
Total: alpacadecimal.NewFromFloat(float64(meteredQuantity) * 0.1),
125+
},
126+
})
127+
s.Require().NoError(err)
128+
129+
return run
130+
}
131+
132+
func (s *usageBasedAdapterBaseSuite) createCustomer(namespace string) string {
133+
s.T().Helper()
134+
135+
customer, err := s.dbClient.Customer.Create().
136+
SetNamespace(namespace).
137+
SetName("test-customer").
138+
Save(s.T().Context())
139+
s.Require().NoError(err)
140+
141+
return customer.ID
142+
}
143+
144+
func (s *usageBasedAdapterBaseSuite) createFeature(namespace, featureID string) {
145+
s.T().Helper()
146+
147+
_, err := s.dbClient.Feature.Create().
148+
SetNamespace(namespace).
149+
SetID(featureID).
150+
SetName("test-feature").
151+
SetKey(featureID).
152+
Save(s.T().Context())
153+
s.Require().NoError(err)
154+
}

openmeter/billing/charges/usagebased/adapter/detailedline_test.go

Lines changed: 3 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,29 @@
11
package adapter
22

33
import (
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

2921
func TestDetailedLineAdapter(t *testing.T) {
3022
suite.Run(t, new(DetailedLineAdapterSuite))
3123
}
3224

3325
type DetailedLineAdapterSuite struct {
34-
suite.Suite
35-
36-
testDB *testutils.TestDB
37-
dbClient *entdb.Client
38-
adapter usagebased.Adapter
26+
usageBasedAdapterBaseSuite
3927
}
4028

4129
type 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-
8738
func (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-
233117
func (s *DetailedLineAdapterSuite) newDetailedLine(input newDetailedLineInput) usagebased.DetailedLine {
234118
s.T().Helper()
235119

0 commit comments

Comments
 (0)