def test_save_create_special_char_title(self): """ When the Enterprise's name is international, new objects should still be created.""" enterprise_customer_uuid = uuid.uuid4() data = self.generate_data( enterprise_customer_uuid=enterprise_customer_uuid, enterprise_customer_name=u'Sp\xe1nish Enterprise', ) self.mock_specific_enterprise_customer_api(data['enterprise_customer_uuid'], name=u'Sp\xe1nish Enterprise') form = EnterpriseOfferForm(request=self.request, data=data) form.is_valid() offer = form.save() self.assert_enterprise_offer_conditions( offer, data['enterprise_customer_uuid'], data['enterprise_customer_name'], data['enterprise_customer_catalog_uuid'], data['benefit_value'], data['benefit_type'], 'Discount of type Site provided by Spánish Enterprise for {}.'.format( data['enterprise_customer_catalog_uuid'] ), data['contract_discount_type'], data['contract_discount_value'], data['prepaid_invoice_amount'], data['sales_force_id'], data['max_global_applications'], data['max_discount'], )
def test_save_offer_name(self): """ If a request object is sent, the offer name should include the enterprise name. """ data = self.generate_data() self.mock_specific_enterprise_customer_api(data['enterprise_customer_uuid']) form = EnterpriseOfferForm(request=self.request, data=data) form.is_valid() offer = form.save() self.assert_enterprise_offer_conditions( offer, data['enterprise_customer_uuid'], data['enterprise_customer_name'], data['enterprise_customer_catalog_uuid'], data['benefit_value'], data['benefit_type'], 'Discount of type {} provided by {} for {}.'.format( ConditionalOffer.SITE, data['enterprise_customer_name'][:48], data['enterprise_customer_catalog_uuid'] ), data['contract_discount_type'], data['contract_discount_value'], data['prepaid_invoice_amount'], data['sales_force_id'], data['max_global_applications'], data['max_discount'], )
def test_max_user_discount_clean_with_refunded_enrollments(self): """ Verify that `clean` for `max_user_discount` and `max_user_applications` does not raise error when total consumed discount and total max user applications after refund is still less than the value, and the existing offer updates with new per user limit and max user application values. """ current_refund_count = 0 data = self.generate_data(max_user_applications=3, max_user_discount=300) self.mock_specific_enterprise_customer_api( data['enterprise_customer_uuid']) # create an enterprise offer that can provide max $500 discount and consume $400 offer = factories.EnterpriseOfferFactory(max_user_applications=5, max_user_discount=500) for _ in range(4): order = OrderFactory(user=self.user, status=ORDER.COMPLETE) OrderDiscountFactory(order=order, offer_id=offer.id, amount=100) # create a refund of $200 so the total consumed discount becomes $200 if current_refund_count < 2: RefundFactory(order=order, user=self.user, status=REFUND.COMPLETE) current_refund_count += 1 # now try to update the offer with max_user_discount set to $300 # which is still greater than the consumed discount after refund $200 form = EnterpriseOfferForm(request=self.request, data=data, instance=offer) self.assertTrue(form.is_valid()) offer = form.save() self.assertEqual(offer.max_user_applications, data['max_user_applications']) self.assertEqual(offer.max_user_discount, data['max_user_discount'])
def test_save_create(self): """ A new ConditionalOffer, Benefit, Condition, and EnterpriseContractMetadata should be created. """ data = self.generate_data() self.mock_specific_enterprise_customer_api( data['enterprise_customer_uuid']) form = EnterpriseOfferForm(request=self.request, data=data) form.is_valid() offer = form.save() self.assert_enterprise_offer_conditions( offer, data['enterprise_customer_uuid'], data['enterprise_customer_name'], data['enterprise_customer_catalog_uuid'], data['benefit_value'], data['benefit_type'], 'Discount of type {} provided by {} for {}.'.format( ConditionalOffer.SITE, data['enterprise_customer_name'][:48], data['enterprise_customer_catalog_uuid']), data['contract_discount_type'], data['contract_discount_value'], data['prepaid_invoice_amount'], )
def test_save_without_commit(self): """ No data should be persisted to the database if the commit kwarg is set to False. """ data = self.generate_data() form = EnterpriseOfferForm(request=self.request, data=data) self.mock_specific_enterprise_customer_api(data['enterprise_customer_uuid']) form.is_valid() instance = form.save(commit=False) self.assertIsNone(instance.pk) self.assertFalse(hasattr(instance, 'benefit')) self.assertFalse(hasattr(instance, 'condition'))
def test_emails_for_usage_alert(self, emails_for_usage_alert, is_valid_form, expected_errors): """ Test emails_for_usage_alert field with valid and invalid data """ data = self.generate_data(emails_for_usage_alert=emails_for_usage_alert) form = EnterpriseOfferForm(data=data) if is_valid_form: self.assertTrue(form.is_valid()) else: self.assert_form_errors(data, {'emails_for_usage_alert': expected_errors})
def test_create_when_conditional_offer_with_uuid_exists(self): """ An Enterprise Offer can be created if a conditional offer with different type and same UUIDs already exists. """ data = self.generate_data() factories.EnterpriseOfferFactory( condition__enterprise_customer_uuid=data['enterprise_customer_uuid'], condition__enterprise_customer_name=data['enterprise_customer_name'], condition__enterprise_customer_catalog_uuid=data['enterprise_customer_catalog_uuid'], offer_type=ConditionalOffer.VOUCHER, ) form = EnterpriseOfferForm(request=self.request, data=data) self.assertTrue(form.is_valid())
def _test_sales_force_id(self, sales_force_id, expected_error, is_update_view): """ Verify that `clean` for `sales_force_id` field is working as expected. """ instance = None if is_update_view: instance = factories.EnterpriseOfferFactory() data = self.generate_data(sales_force_id=sales_force_id) if expected_error: expected_errors = {'sales_force_id': [expected_error]} self.assert_form_errors(data, expected_errors, instance) else: form = EnterpriseOfferForm(data=data, instance=instance) self.assertTrue(form.is_valid())
def test_offer_form_help_text_and_labels(self): """ Verify that `help_text` and `label` are correct for enterprise offer form fields. """ data = self.generate_data() factories.EnterpriseOfferFactory() form = EnterpriseOfferForm(request=self.request, data=data) self.assertEqual(form.fields['max_global_applications'].label, 'Enrollment Limit') self.assertEqual(form.fields['max_discount'].label, 'Bookings Limit') self.assertEqual( form.fields['max_global_applications'].help_text, 'The maximum number of enrollments that can redeem this offer.' ) self.assertEqual( form.fields['max_discount'].help_text, 'The maximum USD dollar amount that can be redeemed by this offer.' ) self.assertEqual(form.fields['max_discount'].widget.attrs['min'], 0) self.assertEqual(form.fields['max_user_applications'].label, 'Per User Enrollment Limit') self.assertEqual(form.fields['max_user_discount'].label, 'Per User Bookings Limit') self.assertEqual( form.fields['max_user_applications'].help_text, 'The maximum number of enrollments, by a user, that can redeem this offer.' ) self.assertEqual( form.fields['max_user_discount'].help_text, 'The maximum USD dollar amount that can be redeemed using this offer by a user.' ) self.assertEqual(form.fields['max_user_discount'].widget.attrs['min'], 0)
def test_init(self): """ The constructor should pull initial data from the passed-in instance. """ enterprise_offer = factories.EnterpriseOfferFactory() ecm = EnterpriseContractMetadata( discount_value=25, discount_type=EnterpriseContractMetadata.PERCENTAGE, amount_paid=12345 ) enterprise_offer.enterprise_contract_metadata = ecm enterprise_offer.max_global_applications = 2 enterprise_offer.max_discount = 300 form = EnterpriseOfferForm(instance=enterprise_offer) self.assertEqual( uuid.UUID(form['enterprise_customer_uuid'].value()), enterprise_offer.condition.enterprise_customer_uuid ) self.assertEqual( uuid.UUID(form['enterprise_customer_catalog_uuid'].value()), enterprise_offer.condition.enterprise_customer_catalog_uuid ) self.assertEqual(form['benefit_type'].value(), enterprise_offer.benefit.proxy().benefit_class_type) self.assertEqual(form['benefit_value'].value(), enterprise_offer.benefit.value) self.assertEqual(form['contract_discount_type'].value(), EnterpriseContractMetadata.PERCENTAGE) self.assertEqual(form['contract_discount_value'].value(), 25) self.assertEqual(form['prepaid_invoice_amount'].value(), 12345) self.assertEqual(form['max_global_applications'].value(), 2) self.assertEqual(form['max_discount'].value(), 300)
def test_save_create_special_char_title(self): """ When the Enterprise's name is international, new objects should still be created.""" enterprise_customer_uuid = uuid.uuid4() data = self.generate_data( enterprise_customer_uuid=enterprise_customer_uuid, enterprise_customer_name=u'Sp\xe1nish Enterprise', ) self.mock_specific_enterprise_customer_api( data['enterprise_customer_uuid'], name=u'Sp\xe1nish Enterprise') form = EnterpriseOfferForm(request=self.request, data=data) form.is_valid() offer = form.save() self.assert_enterprise_offer_conditions( offer, data['enterprise_customer_uuid'], data['enterprise_customer_name'], data['enterprise_customer_catalog_uuid'], data['benefit_value'], data['benefit_type'], 'Discount provided by Spánish Enterprise.')
def test_offer_form_with_per_user_increased_limits(self): """ Verify that an existing enterprise offer can be updated with per user increased limits. """ data = self.generate_data(max_user_applications=40, max_user_discount=7000) self.mock_specific_enterprise_customer_api(data['enterprise_customer_uuid']) # create an enterprise offer with both max_global_applications and max_discount factories.EnterpriseOfferFactory( max_user_applications=30, max_user_discount=5000 ) # now try to update the offer with increased values form = EnterpriseOfferForm(request=self.request, data=data) self.assertTrue(form.is_valid()) offer = form.save() self.assertEqual(offer.max_user_applications, data['max_user_applications']) self.assertEqual(offer.max_user_discount, data['max_user_discount'])
def test_save_create(self): """ A new ConditionalOffer, Benefit, and Condition should be created. """ data = self.generate_data() self.mock_specific_enterprise_customer_api( data['enterprise_customer_uuid']) form = EnterpriseOfferForm(request=self.request, data=data) form.is_valid() offer = form.save() self.assert_enterprise_offer_conditions( offer, data['enterprise_customer_uuid'], data['enterprise_customer_name'], data['enterprise_customer_catalog_uuid'], data['benefit_value'], data['benefit_type'], 'Discount provided by {}.'.format( data['enterprise_customer_name']), )
def test_save_offer_name(self): """ If a request object is sent, the offer name should include the enterprise name. """ data = self.generate_data() self.mock_specific_enterprise_customer_api( data['enterprise_customer_uuid']) form = EnterpriseOfferForm(request=self.request, data=data) form.is_valid() offer = form.save() self.assert_enterprise_offer_conditions( offer, data['enterprise_customer_uuid'], data['enterprise_customer_name'], data['enterprise_customer_catalog_uuid'], data['benefit_value'], data['benefit_type'], 'Discount provided by {}.'.format( data['enterprise_customer_name']), )
def test_contract_metadata_required_on_edit(self): """ Contract metadata should be required on edit, specifically the contract discount type and value fields. """ enterprise_offer = factories.EnterpriseOfferFactory() form = EnterpriseOfferForm(instance=enterprise_offer) self.assertTrue(form['contract_discount_type'].field.required) self.assertTrue(form['contract_discount_value'].field.required)
def test_save_edit(self): """ Previously-created ConditionalOffer, Benefit, and Condition instances should be updated. """ offer = factories.EnterpriseOfferFactory() data = self.generate_data( enterprise_customer_uuid=offer.condition.enterprise_customer_uuid, benefit_type=Benefit.FIXED) self.mock_specific_enterprise_customer_api( data['enterprise_customer_uuid']) form = EnterpriseOfferForm(request=self.request, data=data, instance=offer) form.is_valid() form.save() offer.refresh_from_db() self.assert_enterprise_offer_conditions( offer, data['enterprise_customer_uuid'], data['enterprise_customer_name'], data['enterprise_customer_catalog_uuid'], data['benefit_value'], data['benefit_type'], 'Discount of type {} provided by {} for {}.'.format( ConditionalOffer.SITE, data['enterprise_customer_name'][:48], data['enterprise_customer_catalog_uuid']), )
def test_init(self): """ The constructor should pull initial data from the passed-in instance. """ enterprise_offer = factories.EnterpriseOfferFactory() form = EnterpriseOfferForm(instance=enterprise_offer) self.assertEqual( form['enterprise_customer_uuid'].value(), enterprise_offer.condition.enterprise_customer_uuid.hex) self.assertEqual( form['enterprise_customer_catalog_uuid'].value(), enterprise_offer.condition.enterprise_customer_catalog_uuid.hex) self.assertEqual(form['benefit_type'].value(), enterprise_offer.benefit.proxy().benefit_class_type) self.assertEqual(form['benefit_value'].value(), enterprise_offer.benefit.value)
def test_save_edit(self): """ Previously-created ConditionalOffer, Benefit, and Condition instances should be updated. """ offer = factories.EnterpriseOfferFactory() ecm = EnterpriseContractMetadata( discount_value=self.contract_discount_value, discount_type=self.contract_discount_type, amount_paid=self.prepaid_invoice_amount, ) offer.enterprise_contract_metadata = ecm data = self.generate_data( enterprise_customer_uuid=offer.condition.enterprise_customer_uuid, benefit_type=Benefit.FIXED ) self.mock_specific_enterprise_customer_api(data['enterprise_customer_uuid']) form = EnterpriseOfferForm(request=self.request, data=data, instance=offer) form.is_valid() form.save() offer.refresh_from_db() self.assert_enterprise_offer_conditions( offer, data['enterprise_customer_uuid'], data['enterprise_customer_name'], data['enterprise_customer_catalog_uuid'], data['benefit_value'], data['benefit_type'], 'Discount of type {} provided by {} for {}.'.format( ConditionalOffer.SITE, data['enterprise_customer_name'][:48], data['enterprise_customer_catalog_uuid'] ), data['contract_discount_type'], data['contract_discount_value'], data['prepaid_invoice_amount'], data['sales_force_id'], data['max_global_applications'], data['max_discount'], data['max_user_applications'], data['max_user_discount'], )
def assert_form_errors(self, data, expected_errors, instance=None): """ Assert that form validation fails with the expected errors. """ form = EnterpriseOfferForm(data=data, instance=instance) self.assertFalse(form.is_valid()) self.assertEqual(form.errors, expected_errors)