Coverage for benefits/enrollment_littlepay/models.py: 100%

29 statements  

« prev     ^ index     » next       coverage.py v7.10.2, created at 2025-08-08 16:26 +0000

1from django.core.exceptions import ValidationError 

2from django.db import models 

3 

4from benefits.core.models import SecretNameField, Environment, EnrollmentGroup, TransitProcessorConfig 

5from benefits.secrets import get_secret_by_name 

6 

7 

8class LittlepayConfig(TransitProcessorConfig): 

9 """Configuration for connecting to Littlepay, an entity that applies transit agency fare rules to rider transactions.""" 

10 

11 audience = models.TextField( 

12 help_text="This agency's audience value used to access the TransitProcessor's API.", default="", blank=True 

13 ) 

14 client_id = models.TextField( 

15 help_text="This agency's client_id value used to access the TransitProcessor's API.", default="", blank=True 

16 ) 

17 client_secret_name = SecretNameField( 

18 help_text="The name of the secret containing this agency's client_secret value used to access the TransitProcessor's API.", # noqa: E501 

19 default="", 

20 blank=True, 

21 ) 

22 

23 @property 

24 def api_base_url(self): 

25 if self.environment == Environment.QA.value: 

26 return get_secret_by_name("littlepay-qa-api-base-url") 

27 elif self.environment == Environment.PROD.value: 

28 return get_secret_by_name("littlepay-prod-api-base-url") 

29 else: 

30 raise ValueError(f"Unexpected value for environment: {self.environment}") 

31 

32 @property 

33 def client_secret(self): 

34 secret_field = self._meta.get_field("client_secret_name") 

35 return secret_field.secret_value(self) 

36 

37 def clean(self): 

38 field_errors = {} 

39 

40 if self.transit_agency and self.transit_agency.active: 

41 message = "This field is required when this configuration is referenced by an active transit agency." 

42 needed = dict(audience=self.audience, client_id=self.client_id, client_secret_name=self.client_secret_name) 

43 field_errors.update({k: ValidationError(message) for k, v in needed.items() if not v}) 

44 

45 if field_errors: 

46 raise ValidationError(field_errors) 

47 

48 

49class LittlepayGroup(EnrollmentGroup): 

50 group_id = models.UUIDField(default=None, blank=True, help_text="The ID of the Littlepay group for user enrollment.")