File size: 3,356 Bytes
16cdcb7 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | package subscriptiontestutils
import (
"context"
"testing"
"github.com/samber/lo"
"github.com/openmeterio/openmeter/openmeter/customer"
customeradapter "github.com/openmeterio/openmeter/openmeter/customer/adapter"
customerservice "github.com/openmeterio/openmeter/openmeter/customer/service"
"github.com/openmeterio/openmeter/openmeter/subject"
subjectadapter "github.com/openmeterio/openmeter/openmeter/subject/adapter"
subjectservice "github.com/openmeterio/openmeter/openmeter/subject/service"
"github.com/openmeterio/openmeter/openmeter/testutils"
"github.com/openmeterio/openmeter/openmeter/watermill/eventbus"
"github.com/openmeterio/openmeter/pkg/currencyx"
"github.com/openmeterio/openmeter/pkg/models"
)
func NewCustomerAdapter(t *testing.T, dbDeps *DBDeps) *testCustomerRepo {
t.Helper()
logger := testutils.NewLogger(t)
repo, err := customeradapter.New(customeradapter.Config{
Client: dbDeps.DBClient,
Logger: logger,
})
if err != nil {
t.Fatalf("failed to create customer repo: %v", err)
}
subjectService := NewSubjectService(t, dbDeps)
return &testCustomerRepo{
Adapter: repo,
subjectService: subjectService,
}
}
func NewSubjectService(t *testing.T, dbDeps *DBDeps) subject.Service {
t.Helper()
subjectAdapter, err := subjectadapter.New(dbDeps.DBClient)
if err != nil {
t.Fatalf("failed to create subject adapter: %v", err)
}
subjectService, err := subjectservice.New(subjectAdapter)
if err != nil {
t.Fatalf("failed to create subject service: %v", err)
}
return subjectService
}
func NewCustomerService(t *testing.T, dbDeps *DBDeps) customer.Service {
t.Helper()
customerAdapter := NewCustomerAdapter(t, dbDeps)
customerService, err := customerservice.New(customerservice.Config{
Adapter: customerAdapter,
Publisher: eventbus.NewMock(t),
})
if err != nil {
t.Fatalf("failed to create customer service: %v", err)
}
return customerService
}
type testCustomerRepo struct {
customer.Adapter
subjectService subject.Service
}
func (a *testCustomerRepo) CreateExampleCustomer(t *testing.T) *customer.Customer {
t.Helper()
// Create the subjects first
for _, subjectKey := range ExampleCreateCustomerInput.UsageAttribution.SubjectKeys {
_, err := a.subjectService.Create(context.Background(), subject.CreateInput{
Namespace: ExampleCreateCustomerInput.Namespace,
Key: subjectKey,
})
if err != nil {
t.Fatalf("failed to create subject %s: %v", subjectKey, err)
}
}
c, err := a.CreateCustomer(context.Background(), ExampleCreateCustomerInput)
if err != nil {
t.Fatalf("failed to create example customer: %v", err)
}
return c
}
var ExampleCustomerEntity customer.Customer = customer.Customer{
ManagedResource: models.ManagedResource{
Name: "John Doe",
},
PrimaryEmail: lo.ToPtr("mail@me.uk"),
Currency: lo.ToPtr(currencyx.Code("USD")),
UsageAttribution: &customer.CustomerUsageAttribution{
SubjectKeys: []string{"john-doe"},
},
}
var ExampleCreateCustomerInput customer.CreateCustomerInput = customer.CreateCustomerInput{
Namespace: ExampleNamespace,
CustomerMutate: customer.CustomerMutate{
Name: ExampleCustomerEntity.Name,
PrimaryEmail: ExampleCustomerEntity.PrimaryEmail,
Currency: ExampleCustomerEntity.Currency,
UsageAttribution: ExampleCustomerEntity.UsageAttribution,
},
}
|