Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 4 additions & 24 deletions enterprise_access/apps/api/v1/tests/test_checkout_bff_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
EnterpriseCustomerSerializer,
PriceSerializer
)
from enterprise_access.apps.bffs.tests.utils import default_field_constraints
from enterprise_access.apps.core.constants import SYSTEM_ENTERPRISE_LEARNER_ROLE
from enterprise_access.apps.customer_billing.constants import CheckoutIntentState
from enterprise_access.apps.customer_billing.models import CheckoutIntent
Expand Down Expand Up @@ -109,14 +110,7 @@ def test_response_serializer_validation(self):
'default_by_lookup_key': 'b2b_enterprise_self_service_yearly',
'prices': []
},
'field_constraints': {
'quantity': {'min': 5, 'max': 30},
'enterprise_slug': {
'min_length': 3,
'max_length': 30,
'pattern': '^[a-z0-9-]+$'
}
}
'field_constraints': default_field_constraints
}

# Validate using our serializer
Expand All @@ -134,14 +128,7 @@ def test_response_serializer_validation_with_intent(self):
'default_by_lookup_key': 'b2b_enterprise_self_service_yearly',
'prices': []
},
'field_constraints': {
'quantity': {'min': 5, 'max': 30},
'enterprise_slug': {
'min_length': 3,
'max_length': 30,
'pattern': '^[a-z0-9-]+$'
}
},
'field_constraints': default_field_constraints,
'checkout_intent': self.mock_checkout_intent_data
}

Expand All @@ -159,14 +146,7 @@ def test_response_serializer_validation_null_intent(self):
'default_by_lookup_key': 'b2b_enterprise_self_service_yearly',
'prices': []
},
'field_constraints': {
'quantity': {'min': 5, 'max': 30},
'enterprise_slug': {
'min_length': 3,
'max_length': 30,
'pattern': '^[a-z0-9-]+$'
}
},
'field_constraints': default_field_constraints,
'checkout_intent': None
}

Expand Down
16 changes: 10 additions & 6 deletions enterprise_access/apps/bffs/checkout/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,13 @@ class QuantityConstraintSerializer(serializers.Serializer):
max = serializers.IntegerField(help_text="Maximum allowed quantity")


class SlugConstraintSerializer(serializers.Serializer):
class StringConstraintSerializer(serializers.Serializer):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good idea

"""
Serializer for enterprise slug constraints.
Serializer for enterprise string constraints.
"""
min_length = serializers.IntegerField(help_text="Minimum slug length")
max_length = serializers.IntegerField(help_text="Maximum slug length")
pattern = serializers.CharField(help_text="Regex pattern for valid slugs")
min_length = serializers.IntegerField(help_text="Minimum string length")
max_length = serializers.IntegerField(help_text="Maximum string length")
pattern = serializers.CharField(required=False, help_text="Regex pattern for valid ")


class FieldConstraintsSerializer(serializers.Serializer):
Expand All @@ -77,7 +77,11 @@ class FieldConstraintsSerializer(serializers.Serializer):
https://github.com/edx/frontend-app-enterprise-checkout/blob/main/src/constants.ts#L13-L39
"""
quantity = QuantityConstraintSerializer(help_text="Constraints for license quantity")
enterprise_slug = SlugConstraintSerializer(help_text="Constraints for enterprise slug")
enterprise_slug = StringConstraintSerializer(help_text="Constraints for enterprise slug")
full_name = StringConstraintSerializer(help_text="Constraints for enterprise user full name")
admin_email = StringConstraintSerializer(help_text="Constraints for admin email address")
country = StringConstraintSerializer(help_text="Constraints for enterprise country")
company_name = StringConstraintSerializer(help_text="Constraints for enterprise company name")
embargoed_countries = serializers.ListField(
child=serializers.CharField(max_length=2),
help_text="Embargoed country codes",
Expand Down
57 changes: 28 additions & 29 deletions enterprise_access/apps/bffs/tests/test_checkout_response_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
CheckoutValidationResponseBuilder
)
from enterprise_access.apps.bffs.checkout.serializers import CheckoutSuccessResponseSerializer
from enterprise_access.apps.bffs.tests.utils import default_field_constraints
from test_utils import APITest


Expand Down Expand Up @@ -68,14 +69,7 @@ def _create_minimal_valid_context(self):
'default_by_lookup_key': 'subscription_licenses_yearly',
'prices': []
}
context.field_constraints = {
'quantity': {'min': 5, 'max': 30},
'enterprise_slug': {
'min_length': 3,
'max_length': 30,
'pattern': '^[a-z0-9-]+$'
}
}
context.field_constraints = default_field_constraints
return context

def test_build_complete_context(self):
Expand Down Expand Up @@ -108,15 +102,7 @@ def test_build_complete_context(self):
}
]
}
context.field_constraints = {
'quantity': {'min': 5, 'max': 30},
'enterprise_slug': {
'min_length': 3,
'max_length': 30,
'pattern': '^[a-z0-9-]+$'
}
}

context.field_constraints = default_field_constraints
# Create and build response
builder = CheckoutContextResponseBuilder(context)
builder.build()
Expand Down Expand Up @@ -155,9 +141,19 @@ def test_build_complete_context(self):
constraints = data['field_constraints']
self.assertEqual(constraints['quantity']['min'], 5)
self.assertEqual(constraints['quantity']['max'], 30)
self.assertEqual(constraints['enterprise_slug']['min_length'], 3)
self.assertEqual(constraints['enterprise_slug']['max_length'], 30)
self.assertEqual(constraints['enterprise_slug']['min_length'], 1)
self.assertEqual(constraints['enterprise_slug']['max_length'], 255)
self.assertEqual(constraints['enterprise_slug']['pattern'], '^[a-z0-9-]+$')
self.assertEqual(constraints['full_name']['min_length'], 1)
self.assertEqual(constraints['full_name']['max_length'], 150)
self.assertEqual(constraints['admin_email']['min_length'], 6)
self.assertEqual(constraints['admin_email']['max_length'], 253)
self.assertEqual(constraints['admin_email']['pattern'], '^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$')
self.assertEqual(constraints['country']['min_length'], 2)
self.assertEqual(constraints['country']['max_length'], 2)
self.assertEqual(constraints['country']['pattern'], '^[A-Z]{2}$')
self.assertEqual(constraints['company_name']['min_length'], 1)
self.assertEqual(constraints['company_name']['max_length'], 255)

def test_build_minimal_context(self):
"""
Expand Down Expand Up @@ -216,14 +212,7 @@ def test_serialize_response_data(self):
}
]
}
context.field_constraints = {
'quantity': {'min': 5, 'max': 30},
'enterprise_slug': {
'min_length': 3,
'max_length': 30,
'pattern': '^[a-z0-9-]+$'
}
}
context.field_constraints = default_field_constraints

# Build response
builder = CheckoutContextResponseBuilder(context)
Expand Down Expand Up @@ -263,9 +252,19 @@ def test_serialize_response_data(self):
constraints = data['field_constraints']
self.assertEqual(constraints['quantity']['min'], 5)
self.assertEqual(constraints['quantity']['max'], 30)
self.assertEqual(constraints['enterprise_slug']['min_length'], 3)
self.assertEqual(constraints['enterprise_slug']['max_length'], 30)
self.assertEqual(constraints['enterprise_slug']['min_length'], 1)
self.assertEqual(constraints['enterprise_slug']['max_length'], 255)
self.assertEqual(constraints['enterprise_slug']['pattern'], '^[a-z0-9-]+$')
self.assertEqual(constraints['full_name']['min_length'], 1)
self.assertEqual(constraints['full_name']['max_length'], 150)
self.assertEqual(constraints['admin_email']['min_length'], 6)
self.assertEqual(constraints['admin_email']['max_length'], 253)
self.assertEqual(constraints['admin_email']['pattern'], '^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$')
self.assertEqual(constraints['country']['min_length'], 2)
self.assertEqual(constraints['country']['max_length'], 2)
self.assertEqual(constraints['country']['pattern'], '^[A-Z]{2}$')
self.assertEqual(constraints['company_name']['min_length'], 1)
self.assertEqual(constraints['company_name']['max_length'], 255)

def test_serializer_validation_error(self):
"""
Expand Down
31 changes: 31 additions & 0 deletions enterprise_access/apps/bffs/tests/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,37 @@
from enterprise_access.apps.core.tests.factories import UserFactory
from enterprise_access.utils import _days_from_now

default_field_constraints = {
'quantity': {
'min': 5,
'max': 30
},
'enterprise_slug': {
'min_length': 1,
'max_length': 255,
'pattern': '^[a-z0-9-]+$'
},
'full_name': {
'min_length': 1,
'max_length': 150
},
'admin_email': {
'min_length': 6,
'max_length': 253,
'pattern': '^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$'
},
'country': {
'min_length': 2,
'max_length': 2,
'pattern': '^[A-Z]{2}$'
},
'company_name': {
'min_length': 1,
'max_length': 255
},
'embargoed_countries': []
}


class TestHandlerContextMixin(TestCase):
"""
Expand Down