|  | @@ -1,100 +1,106 @@
 | 
		
	
		
			
			| 1 |  | -import datetime
 | 
		
	
		
			
			| 2 |  | -
 | 
		
	
		
			
			| 3 | 1 |  from django.core.urlresolvers import reverse
 | 
		
	
		
			
			| 4 |  | -from django.test import TestCase
 | 
		
	
		
			
			| 5 |  | -
 | 
		
	
		
			
			| 6 |  | -from oscar_testsupport.testcases import ClientTestCase
 | 
		
	
		
			
			| 7 |  | -from oscar.apps.offer.models import Range, ConditionalOffer, Condition, Benefit
 | 
		
	
		
			
			| 8 |  | -from oscar.apps.dashboard.offers.forms import MetaDataForm
 | 
		
	
		
			
			| 9 |  | -
 | 
		
	
		
			
			| 10 |  | -
 | 
		
	
		
			
			| 11 |  | -class ViewTests(ClientTestCase):
 | 
		
	
		
			
			| 12 |  | -    is_staff = True
 | 
		
	
		
			
			| 13 |  | -
 | 
		
	
		
			
			| 14 |  | -    def test_pages_exist(self):
 | 
		
	
		
			
			| 15 |  | -        urls = [reverse('dashboard:offer-list'),
 | 
		
	
		
			
			| 16 |  | -                reverse('dashboard:offer-metadata'),
 | 
		
	
		
			
			| 17 |  | -               ]
 | 
		
	
		
			
			| 18 |  | -        for url in urls:
 | 
		
	
		
			
			| 19 |  | -            self.assertIsOk(self.client.get(url))
 | 
		
	
		
			
			| 20 |  | -
 | 
		
	
		
			
			| 21 |  | -
 | 
		
	
		
			
			| 22 |  | -class MetadataFormTests(TestCase):
 | 
		
	
		
			
			|  | 2 | +from oscar_testsupport import testcases, factories
 | 
		
	
		
			
			| 23 | 3 |  
 | 
		
	
		
			
			| 24 |  | -    def test_dates_must_be_cronological(self):
 | 
		
	
		
			
			| 25 |  | -        start_date = datetime.date(2012, 1, 1)
 | 
		
	
		
			
			| 26 |  | -        end_date = datetime.date(2011, 1, 1)
 | 
		
	
		
			
			| 27 |  | -        post = {'name': 'dummy',
 | 
		
	
		
			
			| 28 |  | -                'description': 'dummy',
 | 
		
	
		
			
			| 29 |  | -                'start_date': start_date,
 | 
		
	
		
			
			| 30 |  | -                'end_date': end_date,}
 | 
		
	
		
			
			| 31 |  | -        form = MetaDataForm(post)
 | 
		
	
		
			
			| 32 |  | -        self.assertFalse(form.is_valid())
 | 
		
	
		
			
			|  | 4 | +from oscar.apps.offer import models
 | 
		
	
		
			
			| 33 | 5 |  
 | 
		
	
		
			
			| 34 | 6 |  
 | 
		
	
		
			
			| 35 |  | -class OfferUpdatingTests(ClientTestCase):
 | 
		
	
		
			
			|  | 7 | +class TestAnAdmin(testcases.WebTestCase):
 | 
		
	
		
			
			|  | 8 | +    # New version of offer tests buy using WebTest
 | 
		
	
		
			
			| 36 | 9 |      is_staff = True
 | 
		
	
		
			
			| 37 | 10 |  
 | 
		
	
		
			
			| 38 | 11 |      def setUp(self):
 | 
		
	
		
			
			| 39 |  | -        super(OfferUpdatingTests, self).setUp()
 | 
		
	
		
			
			| 40 |  | -        self.range = Range.objects.create(name='All products',
 | 
		
	
		
			
			| 41 |  | -                                          includes_all_products=True)
 | 
		
	
		
			
			| 42 |  | -        condition = Condition.objects.create(range=self.range,
 | 
		
	
		
			
			| 43 |  | -                                             type='Count',
 | 
		
	
		
			
			| 44 |  | -                                             value=3)
 | 
		
	
		
			
			| 45 |  | -        benefit = Benefit.objects.create(range=self.range,
 | 
		
	
		
			
			| 46 |  | -                                         type='Multibuy',
 | 
		
	
		
			
			| 47 |  | -                                         value=1)
 | 
		
	
		
			
			| 48 |  | -
 | 
		
	
		
			
			| 49 |  | -        start_date = datetime.date(2012, 1, 1)
 | 
		
	
		
			
			| 50 |  | -        end_date = datetime.date(2013, 1, 1)
 | 
		
	
		
			
			| 51 |  | -        self.offer = ConditionalOffer.objects.create(name='my offer',
 | 
		
	
		
			
			| 52 |  | -                                                     description='something',
 | 
		
	
		
			
			| 53 |  | -                                                     start_date=start_date,
 | 
		
	
		
			
			| 54 |  | -                                                     end_date=end_date,
 | 
		
	
		
			
			| 55 |  | -                                                     condition=condition,
 | 
		
	
		
			
			| 56 |  | -                                                     benefit=benefit)
 | 
		
	
		
			
			| 57 |  | -
 | 
		
	
		
			
			| 58 |  | -    def tearDown(self):
 | 
		
	
		
			
			| 59 |  | -        ConditionalOffer.objects.all().delete()
 | 
		
	
		
			
			| 60 |  | -
 | 
		
	
		
			
			| 61 |  | -    def test_happy_path(self):
 | 
		
	
		
			
			| 62 |  | -        metadata_url = reverse('dashboard:offer-metadata', kwargs={'pk': self.offer.id})
 | 
		
	
		
			
			| 63 |  | -        response = self.client.get(metadata_url)
 | 
		
	
		
			
			| 64 |  | -        self.assertTrue('my offer' in response.content)
 | 
		
	
		
			
			| 65 |  | -
 | 
		
	
		
			
			| 66 |  | -        response = self.client.post(metadata_url,
 | 
		
	
		
			
			| 67 |  | -                                    {'name': 'my new offer',
 | 
		
	
		
			
			| 68 |  | -                                     'description': 'something',
 | 
		
	
		
			
			| 69 |  | -                                     'start_date': '2012-01-01',
 | 
		
	
		
			
			| 70 |  | -                                     'end_date': '2013-01-01'})
 | 
		
	
		
			
			| 71 |  | -        self.assertIsRedirect(response)
 | 
		
	
		
			
			| 72 |  | -
 | 
		
	
		
			
			| 73 |  | -        condition_url = reverse('dashboard:offer-condition', kwargs={'pk': self.offer.id})
 | 
		
	
		
			
			| 74 |  | -        response = self.client.post(condition_url,
 | 
		
	
		
			
			| 75 |  | -                                    {'range': self.range.id,
 | 
		
	
		
			
			| 76 |  | -                                     'type': 'Count',
 | 
		
	
		
			
			| 77 |  | -                                     'value': '3',})
 | 
		
	
		
			
			| 78 |  | -        self.assertIsRedirect(response)
 | 
		
	
		
			
			| 79 |  | -
 | 
		
	
		
			
			| 80 |  | -        benefit_url = reverse('dashboard:offer-benefit', kwargs={'pk': self.offer.id})
 | 
		
	
		
			
			| 81 |  | -        response = self.client.post(benefit_url,
 | 
		
	
		
			
			| 82 |  | -                                    {'range': self.range.id,
 | 
		
	
		
			
			| 83 |  | -                                     'type': 'Multibuy',
 | 
		
	
		
			
			| 84 |  | -                                     'value': '',})
 | 
		
	
		
			
			| 85 |  | -        self.assertIsRedirect(response)
 | 
		
	
		
			
			| 86 |  | -
 | 
		
	
		
			
			| 87 |  | -        preview_url = reverse('dashboard:offer-preview', kwargs={'pk': self.offer.id})
 | 
		
	
		
			
			| 88 |  | -        response = self.client.get(preview_url)
 | 
		
	
		
			
			| 89 |  | -        self.assertTrue('my new offer' in response.content)
 | 
		
	
		
			
			| 90 |  | -
 | 
		
	
		
			
			| 91 |  | -        response = self.client.post(preview_url)
 | 
		
	
		
			
			| 92 |  | -        self.assertIsRedirect(response)
 | 
		
	
		
			
			| 93 |  | -
 | 
		
	
		
			
			| 94 |  | -        offer = ConditionalOffer.objects.get(id=self.offer.id)
 | 
		
	
		
			
			| 95 |  | -        self.assertEqual('my new offer', offer.name)
 | 
		
	
		
			
			| 96 |  | -
 | 
		
	
		
			
			| 97 |  | -    def test_can_jump_to_condition_step(self):
 | 
		
	
		
			
			| 98 |  | -        response = self.client.get(reverse('dashboard:offer-condition',
 | 
		
	
		
			
			| 99 |  | -                                           kwargs={'pk': self.offer.id}))
 | 
		
	
		
			
			| 100 |  | -        self.assertIsOk(response)
 | 
		
	
		
			
			|  | 12 | +        super(TestAnAdmin, self).setUp()
 | 
		
	
		
			
			|  | 13 | +        self.range = models.Range.objects.create(
 | 
		
	
		
			
			|  | 14 | +            name="All products", includes_all_products=True)
 | 
		
	
		
			
			|  | 15 | +
 | 
		
	
		
			
			|  | 16 | +    def test_can_create_an_offer(self):
 | 
		
	
		
			
			|  | 17 | +        list_page = self.get(reverse('dashboard:offer-list'))
 | 
		
	
		
			
			|  | 18 | +
 | 
		
	
		
			
			|  | 19 | +        metadata_page = list_page.click('Create new offer')
 | 
		
	
		
			
			|  | 20 | +        metadata_form = metadata_page.form
 | 
		
	
		
			
			|  | 21 | +        metadata_form['name'] = "Test offer"
 | 
		
	
		
			
			|  | 22 | +        metadata_form['start_date'] = "2012-01-01"
 | 
		
	
		
			
			|  | 23 | +        metadata_form['end_date'] = "2014-01-01"
 | 
		
	
		
			
			|  | 24 | +
 | 
		
	
		
			
			|  | 25 | +        condition_page = metadata_form.submit().follow()
 | 
		
	
		
			
			|  | 26 | +        condition_form = condition_page.form
 | 
		
	
		
			
			|  | 27 | +        condition_form['range'] = self.range.id
 | 
		
	
		
			
			|  | 28 | +        condition_form['type'] = "Count"
 | 
		
	
		
			
			|  | 29 | +        condition_form['value'] = "3"
 | 
		
	
		
			
			|  | 30 | +
 | 
		
	
		
			
			|  | 31 | +        benefit_page = condition_form.submit().follow()
 | 
		
	
		
			
			|  | 32 | +        benefit_form = benefit_page.form
 | 
		
	
		
			
			|  | 33 | +        benefit_form['range'] = self.range.id
 | 
		
	
		
			
			|  | 34 | +        benefit_form['type'] = "Percentage"
 | 
		
	
		
			
			|  | 35 | +        benefit_form['value'] = "25"
 | 
		
	
		
			
			|  | 36 | +
 | 
		
	
		
			
			|  | 37 | +        preview_page = benefit_form.submit().follow()
 | 
		
	
		
			
			|  | 38 | +        preview_page.form.submit()
 | 
		
	
		
			
			|  | 39 | +
 | 
		
	
		
			
			|  | 40 | +        offers = models.ConditionalOffer.objects.all()
 | 
		
	
		
			
			|  | 41 | +        self.assertEqual(1, len(offers))
 | 
		
	
		
			
			|  | 42 | +        offer = offers[0]
 | 
		
	
		
			
			|  | 43 | +        self.assertEqual("Test offer", offer.name)
 | 
		
	
		
			
			|  | 44 | +        self.assertEqual(3, offer.condition.value)
 | 
		
	
		
			
			|  | 45 | +        self.assertEqual(25, offer.benefit.value)
 | 
		
	
		
			
			|  | 46 | +
 | 
		
	
		
			
			|  | 47 | +    def test_can_update_an_existing_offer(self):
 | 
		
	
		
			
			|  | 48 | +        factories.create_offer(name="Offer A")
 | 
		
	
		
			
			|  | 49 | +
 | 
		
	
		
			
			|  | 50 | +        list_page = self.get(reverse('dashboard:offer-list'))
 | 
		
	
		
			
			|  | 51 | +        detail_page = list_page.click('Offer A')
 | 
		
	
		
			
			|  | 52 | +
 | 
		
	
		
			
			|  | 53 | +        metadata_page = detail_page.click(linkid="edit_metadata")
 | 
		
	
		
			
			|  | 54 | +        metadata_form = metadata_page.form
 | 
		
	
		
			
			|  | 55 | +        metadata_form['name'] = "Offer A+"
 | 
		
	
		
			
			|  | 56 | +
 | 
		
	
		
			
			|  | 57 | +        condition_page = metadata_form.submit().follow()
 | 
		
	
		
			
			|  | 58 | +        condition_form = condition_page.form
 | 
		
	
		
			
			|  | 59 | +
 | 
		
	
		
			
			|  | 60 | +        benefit_page = condition_form.submit().follow()
 | 
		
	
		
			
			|  | 61 | +        benefit_form = benefit_page.form
 | 
		
	
		
			
			|  | 62 | +
 | 
		
	
		
			
			|  | 63 | +        preview_page = benefit_form.submit().follow()
 | 
		
	
		
			
			|  | 64 | +        preview_page.form.submit()
 | 
		
	
		
			
			|  | 65 | +
 | 
		
	
		
			
			|  | 66 | +        models.ConditionalOffer.objects.get(name="Offer A+")
 | 
		
	
		
			
			|  | 67 | +
 | 
		
	
		
			
			|  | 68 | +    def test_can_jump_to_intermediate_step_for_existing_offer(self):
 | 
		
	
		
			
			|  | 69 | +        offer = factories.create_offer()
 | 
		
	
		
			
			|  | 70 | +        url = reverse('dashboard:offer-condition',
 | 
		
	
		
			
			|  | 71 | +                      kwargs={'pk': offer.id})
 | 
		
	
		
			
			|  | 72 | +        self.assertEqual(200, self.get(url).status_code)
 | 
		
	
		
			
			|  | 73 | +
 | 
		
	
		
			
			|  | 74 | +    def test_cannot_jump_to_intermediate_step(self):
 | 
		
	
		
			
			|  | 75 | +        for url_name in ('dashboard:offer-condition',
 | 
		
	
		
			
			|  | 76 | +                         'dashboard:offer-benefit',
 | 
		
	
		
			
			|  | 77 | +                         'dashboard:offer-preview'):
 | 
		
	
		
			
			|  | 78 | +            response = self.get(reverse(url_name))
 | 
		
	
		
			
			|  | 79 | +            self.assertEqual(302, response.status_code)
 | 
		
	
		
			
			|  | 80 | +
 | 
		
	
		
			
			|  | 81 | +    def test_can_suspend_an_offer(self):
 | 
		
	
		
			
			|  | 82 | +        # Create an offer
 | 
		
	
		
			
			|  | 83 | +        offer = factories.create_offer()
 | 
		
	
		
			
			|  | 84 | +        self.assertFalse(offer.is_suspended)
 | 
		
	
		
			
			|  | 85 | +
 | 
		
	
		
			
			|  | 86 | +        detail_page = self.get(reverse('dashboard:offer-detail',
 | 
		
	
		
			
			|  | 87 | +                                       kwargs={'pk': offer.pk}))
 | 
		
	
		
			
			|  | 88 | +        form = detail_page.forms['status_form']
 | 
		
	
		
			
			|  | 89 | +        form.submit('suspend')
 | 
		
	
		
			
			|  | 90 | +
 | 
		
	
		
			
			|  | 91 | +        reloaded_offer = models.ConditionalOffer.objects.get(pk=offer.pk)
 | 
		
	
		
			
			|  | 92 | +        self.assertTrue(reloaded_offer.is_suspended)
 | 
		
	
		
			
			|  | 93 | +
 | 
		
	
		
			
			|  | 94 | +    def test_can_reinstate_a_suspended_offer(self):
 | 
		
	
		
			
			|  | 95 | +        # Create a suspended offer
 | 
		
	
		
			
			|  | 96 | +        offer = factories.create_offer()
 | 
		
	
		
			
			|  | 97 | +        offer.suspend()
 | 
		
	
		
			
			|  | 98 | +        self.assertTrue(offer.is_suspended)
 | 
		
	
		
			
			|  | 99 | +
 | 
		
	
		
			
			|  | 100 | +        detail_page = self.get(reverse('dashboard:offer-detail',
 | 
		
	
		
			
			|  | 101 | +                                       kwargs={'pk': offer.pk}))
 | 
		
	
		
			
			|  | 102 | +        form = detail_page.forms['status_form']
 | 
		
	
		
			
			|  | 103 | +        form.submit('unsuspend')
 | 
		
	
		
			
			|  | 104 | +
 | 
		
	
		
			
			|  | 105 | +        reloaded_offer = models.ConditionalOffer.objects.get(pk=offer.pk)
 | 
		
	
		
			
			|  | 106 | +        self.assertFalse(reloaded_offer.is_suspended)
 |