| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 |
- from django.urls import reverse
- from django.utils import timezone
-
- from oscar.apps.offer import models
- from oscar.test import factories, testcases
-
-
- class TestAnAdmin(testcases.WebTestCase):
- # New version of offer tests buy using WebTest
- is_staff = True
-
- def setUp(self):
- super().setUp()
- self.range = models.Range.objects.create(
- name="All products", includes_all_products=True)
-
- def test_can_create_an_offer(self):
- list_page = self.get(reverse('dashboard:offer-list'))
-
- metadata_page = list_page.click('Create new offer')
- metadata_form = metadata_page.form
- metadata_form['name'] = "Test offer"
- metadata_form['offer_type'] = models.ConditionalOffer.SITE
-
- benefit_page = metadata_form.submit().follow()
- benefit_form = benefit_page.form
- benefit_form['range'] = self.range.id
- benefit_form['type'] = "Percentage"
- benefit_form['value'] = "25"
-
- condition_page = benefit_form.submit().follow()
- condition_form = condition_page.form
- condition_form['range'] = self.range.id
- condition_form['type'] = "Count"
- condition_form['value'] = "3"
-
- restrictions_page = condition_form.submit().follow()
- restrictions_page.form.submit()
-
- offers = models.ConditionalOffer.objects.all()
- self.assertEqual(1, len(offers))
- offer = offers[0]
- self.assertEqual("Test offer", offer.name)
- self.assertEqual(3, offer.condition.value)
- self.assertEqual(25, offer.benefit.value)
-
- def test_offer_list_page(self):
- offer = factories.create_offer(name="Offer A")
-
- list_page = self.get(reverse('dashboard:offer-list'))
- form = list_page.forms[0]
- form['name'] = "I do not exist"
- res = form.submit()
- self.assertTrue("No offers found" in res.text)
-
- form['name'] = "Offer A"
- res = form.submit()
- self.assertFalse("No offers found" in res.text)
-
- form['is_active'] = "true"
- res = form.submit()
- self.assertFalse("No offers found" in res.text)
-
- yesterday = timezone.now() - timezone.timedelta(days=1)
- offer.end_datetime = yesterday
- offer.save()
-
- form['is_active'] = "true"
- res = form.submit()
- self.assertTrue("No offers found" in res.text)
-
- tomorrow = timezone.now() + timezone.timedelta(days=1)
- offer.end_datetime = tomorrow
- offer.save()
-
- form['offer_type'] = "Site"
- res = form.submit()
- self.assertFalse("No offers found" in res.text)
-
- form['offer_type'] = "Voucher"
- res = form.submit()
- self.assertTrue("No offers found" in res.text)
-
- def test_can_update_an_existing_offer(self):
- factories.create_offer(name="Offer A")
-
- list_page = self.get(reverse('dashboard:offer-list'))
- detail_page = list_page.click('Offer A')
-
- metadata_page = detail_page.click(linkid="edit_metadata")
- metadata_form = metadata_page.form
- metadata_form['name'] = "Offer A+"
- metadata_form['offer_type'] = models.ConditionalOffer.SITE
-
- benefit_page = metadata_form.submit().follow()
- benefit_form = benefit_page.form
-
- condition_page = benefit_form.submit().follow()
- condition_form = condition_page.form
-
- restrictions_page = condition_form.submit().follow()
- restrictions_page.form.submit()
-
- models.ConditionalOffer.objects.get(name="Offer A+")
-
- def test_can_update_an_existing_offer_save_directly(self):
- # see if we can save the offer directly without completing all
- # steps
- offer = factories.create_offer(name="Offer A")
- name_and_description_page = self.get(
- reverse('dashboard:offer-metadata', kwargs={'pk': offer.pk}))
- res = name_and_description_page.form.submit('save').follow()
- self.assertEqual(200, res.status_code)
-
- def test_can_jump_to_intermediate_step_for_existing_offer(self):
- offer = factories.create_offer()
- url = reverse('dashboard:offer-condition',
- kwargs={'pk': offer.id})
- self.assertEqual(200, self.get(url).status_code)
-
- def test_cannot_jump_to_intermediate_step(self):
- for url_name in ('dashboard:offer-condition',
- 'dashboard:offer-benefit',
- 'dashboard:offer-restrictions'):
- response = self.get(reverse(url_name))
- self.assertEqual(302, response.status_code)
-
- def test_can_suspend_an_offer(self):
- # Create an offer
- offer = factories.create_offer()
- self.assertFalse(offer.is_suspended)
-
- detail_page = self.get(reverse('dashboard:offer-detail',
- kwargs={'pk': offer.pk}))
- form = detail_page.forms['status_form']
- form.submit('suspend')
-
- offer.refresh_from_db()
- self.assertTrue(offer.is_suspended)
-
- def test_can_reinstate_a_suspended_offer(self):
- # Create a suspended offer
- offer = factories.create_offer()
- offer.suspend()
- self.assertTrue(offer.is_suspended)
-
- detail_page = self.get(reverse('dashboard:offer-detail',
- kwargs={'pk': offer.pk}))
- form = detail_page.forms['status_form']
- form.submit('unsuspend')
-
- offer.refresh_from_db()
- self.assertFalse(offer.is_suspended)
-
- def test_can_change_offer_priority(self):
- offer = factories.create_offer()
- restrictions_page = self.get(reverse('dashboard:offer-restrictions', kwargs={'pk': offer.pk}))
- restrictions_page.form['priority'] = '12'
- restrictions_page.form.submit()
- offer.refresh_from_db()
-
- self.assertEqual(offer.priority, 12)
-
- def test_jump_back_to_incentive_step_for_new_offer(self):
- list_page = self.get(reverse('dashboard:offer-list'))
-
- metadata_page = list_page.click('Create new offer')
- metadata_form = metadata_page.form
- metadata_form['name'] = "Test offer"
- metadata_form['offer_type'] = models.ConditionalOffer.SITE
-
- benefit_page = metadata_form.submit().follow()
- benefit_form = benefit_page.form
- benefit_form['range'] = self.range.id
- benefit_form['type'] = "Percentage"
- benefit_form['value'] = "25"
-
- benefit_form.submit()
- benefit_page = self.get(reverse('dashboard:offer-benefit'))
- # Accessing through context because WebTest form does not include an 'errors' field
- benefit_form = benefit_page.context['form']
-
- self.assertFalse('range' in benefit_form.errors)
- self.assertEqual(len(benefit_form.errors), 0)
-
- def test_jump_back_to_condition_step_for_new_offer(self):
- list_page = self.get(reverse('dashboard:offer-list'))
-
- metadata_page = list_page.click('Create new offer')
- metadata_form = metadata_page.form
- metadata_form['name'] = "Test offer"
- metadata_form['offer_type'] = models.ConditionalOffer.SITE
-
- benefit_page = metadata_form.submit().follow()
- benefit_form = benefit_page.form
- benefit_form['range'] = self.range.id
- benefit_form['type'] = "Percentage"
- benefit_form['value'] = "25"
-
- condition_page = benefit_form.submit().follow()
- condition_form = condition_page.form
- condition_form['range'] = self.range.id
- condition_form['type'] = "Count"
- condition_form['value'] = "3"
-
- condition_form.submit()
- condition_page = self.get(reverse('dashboard:offer-condition'))
-
- self.assertFalse('range' in condition_page.errors)
- self.assertEqual(len(condition_page.errors), 0)
-
- def test_jump_to_incentive_step_for_existing_offer(self):
- offer = factories.create_offer()
- url = reverse('dashboard:offer-benefit', kwargs={'pk': offer.id})
-
- condition_page = self.get(url)
-
- self.assertFalse('range' in condition_page.errors)
- self.assertEqual(len(condition_page.errors), 0)
-
- def test_jump_to_condition_step_for_existing_offer(self):
- offer = factories.create_offer()
- url = reverse('dashboard:offer-condition', kwargs={'pk': offer.id})
-
- condition_page = self.get(url)
-
- self.assertFalse('range' in condition_page.errors)
- self.assertEqual(len(condition_page.errors), 0)
-
- def test_remove_offer_from_combinations(self):
- offer_a = factories.create_offer("Offer A")
- offer_b = factories.create_offer("Offer B")
- offer_b.exclusive = False
- offer_b.save()
-
- restrictions_page = self.get(reverse(
- 'dashboard:offer-restrictions', kwargs={'pk': offer_a.pk}))
- restrictions_page.form['exclusive'] = False
- restrictions_page.form['combinations'] = [offer_b.id]
- restrictions_page.form.submit()
-
- self.assertIn(offer_a, offer_b.combinations.all())
-
- restrictions_page = self.get(reverse(
- 'dashboard:offer-restrictions', kwargs={'pk': offer_a.pk}))
- restrictions_page.form['combinations'] = []
- restrictions_page.form.submit()
-
- self.assertNotIn(offer_a, offer_b.combinations.all())
-
-
- class TestOfferListSearch(testcases.WebTestCase):
- is_staff = True
-
- TEST_CASES = [
- ({}, []),
- (
- {'name': 'Bob Smith'},
- ['Name matches "Bob Smith"']
- ),
- (
- {'is_active': True},
- ['Is active']
- ),
- (
- {'is_active': False},
- ['Is inactive']
- ),
- (
- {'offer_type': 'Site'},
- ['Is of type "Site offer - available to all users"']
- ),
- (
- {'has_vouchers': True},
- ['Has vouchers']
- ),
- (
- {'has_vouchers': False},
- ['Has no vouchers']
- ),
- (
- {'voucher_code': 'abcd1234'},
- ['Voucher code matches "abcd1234"']
- ),
- (
- {
- 'name': 'Bob Smith',
- 'is_active': True,
- 'offer_type': 'Site',
- 'has_vouchers': True,
- 'voucher_code': 'abcd1234',
- },
- [
- 'Name matches "Bob Smith"',
- 'Is active',
- 'Is of type "Site offer - available to all users"',
- 'Has vouchers',
- 'Voucher code matches "abcd1234"',
- ]
- ),
- ]
-
- def test_search_filter_descriptions(self):
- url = reverse('dashboard:offer-list')
- for params, expected_filters in self.TEST_CASES:
- response = self.get(url, params=params)
- self.assertEqual(response.status_code, 200)
- applied_filters = [
- el.text.strip() for el in
- response.html.select('.search-filter-list .badge')
- ]
- self.assertEqual(applied_filters, expected_filters)
|