@@ -117,6 +117,33 @@ func createCustomerWithSubject(t *testing.T, subjectRepo subject.Service, custom
117117 return cust
118118}
119119
120+ func createCustomerWithSubjectAndKey (t * testing.T , subjectRepo subject.Service , customerRepo customer.Adapter , namespace string , subjectKey string , customerKey string ) * customer.Customer {
121+ t .Helper ()
122+
123+ ctx , cancel := context .WithCancel (context .Background ())
124+ defer cancel ()
125+
126+ _ , err := subjectRepo .Create (ctx , subject.CreateInput {
127+ Namespace : namespace ,
128+ Key : subjectKey ,
129+ })
130+ require .NoError (t , err )
131+
132+ cust , err := customerRepo .CreateCustomer (ctx , customer.CreateCustomerInput {
133+ Namespace : namespace ,
134+ CustomerMutate : customer.CustomerMutate {
135+ Key : lo .ToPtr (customerKey ),
136+ Name : "Customer 1" ,
137+ UsageAttribution : & customer.CustomerUsageAttribution {
138+ SubjectKeys : []string {subjectKey },
139+ },
140+ },
141+ })
142+ require .NoError (t , err )
143+
144+ return cust
145+ }
146+
120147func TestUpsertEntitlementCurrentPeriods (t * testing.T ) {
121148 ns := "ns1"
122149 featureKey := "feature1"
@@ -518,3 +545,78 @@ func TestEntitlementLoadsSubjectAndCustomerAndPreservesAcrossTypedMapping(t *tes
518545 }
519546 }
520547}
548+
549+ func TestListEntitlementsFiltersByCustomerKeysAndFeatureIDsOrKeys (t * testing.T ) {
550+ ctx := context .Background ()
551+ ns := "ns-list-filters"
552+
553+ repo , cleanup := setup (t )
554+ defer cleanup ()
555+
556+ featureByKey , err := repo .featureRepo .CreateFeature (ctx , feature.CreateFeatureInputs {
557+ Namespace : ns ,
558+ Key : "free_plan_usage" ,
559+ Name : "Free plan usage" ,
560+ })
561+ require .NoError (t , err )
562+
563+ featureByID , err := repo .featureRepo .CreateFeature (ctx , feature.CreateFeatureInputs {
564+ Namespace : ns ,
565+ Key : "pro_plan_usage" ,
566+ Name : "Pro plan usage" ,
567+ })
568+ require .NoError (t , err )
569+
570+ customerA := createCustomerWithSubjectAndKey (t , repo .subjectRepo , repo .customerRepo , ns , "subject-a" , "customer-a" )
571+ customerB := createCustomerWithSubjectAndKey (t , repo .subjectRepo , repo .customerRepo , ns , "subject-b" , "customer-b" )
572+
573+ entA , err := repo .entRepo .CreateEntitlement (ctx , entitlement.CreateEntitlementRepoInputs {
574+ Namespace : ns ,
575+ FeatureID : featureByKey .ID ,
576+ FeatureKey : featureByKey .Key ,
577+ UsageAttribution : customerA .GetUsageAttribution (),
578+ EntitlementType : entitlement .EntitlementTypeBoolean ,
579+ })
580+ require .NoError (t , err )
581+
582+ entB , err := repo .entRepo .CreateEntitlement (ctx , entitlement.CreateEntitlementRepoInputs {
583+ Namespace : ns ,
584+ FeatureID : featureByID .ID ,
585+ FeatureKey : featureByID .Key ,
586+ UsageAttribution : customerB .GetUsageAttribution (),
587+ EntitlementType : entitlement .EntitlementTypeBoolean ,
588+ })
589+ require .NoError (t , err )
590+
591+ t .Run ("Should filter by customer key and feature key" , func (t * testing.T ) {
592+ res , err := repo .entRepo .ListEntitlements (ctx , entitlement.ListEntitlementsParams {
593+ Namespaces : []string {ns },
594+ CustomerKeys : []string {"customer-a" },
595+ FeatureIDsOrKeys : []string {featureByKey .Key },
596+ })
597+ require .NoError (t , err )
598+ require .Len (t , res .Items , 1 )
599+ require .Equal (t , entA .ID , res .Items [0 ].ID )
600+ })
601+
602+ t .Run ("Should filter by customer key and feature ID" , func (t * testing.T ) {
603+ res , err := repo .entRepo .ListEntitlements (ctx , entitlement.ListEntitlementsParams {
604+ Namespaces : []string {ns },
605+ CustomerKeys : []string {"customer-b" },
606+ FeatureIDsOrKeys : []string {featureByID .ID },
607+ })
608+ require .NoError (t , err )
609+ require .Len (t , res .Items , 1 )
610+ require .Equal (t , entB .ID , res .Items [0 ].ID )
611+ })
612+
613+ t .Run ("Should return empty result without querying entitlements when customer key does not exist" , func (t * testing.T ) {
614+ res , err := repo .entRepo .ListEntitlements (ctx , entitlement.ListEntitlementsParams {
615+ Namespaces : []string {ns },
616+ CustomerKeys : []string {"missing-customer" },
617+ })
618+ require .NoError (t , err )
619+ require .Empty (t , res .Items )
620+ require .Zero (t , res .TotalCount )
621+ })
622+ }
0 commit comments