Esempio n. 1
0
 def _create_cart(self):
     self.product = DiaryProduct(isbn='1234567890', number_of_pages=100)
     self.product.name = 'test'
     self.product.slug = 'test'
     self.product.short_description = 'test'
     self.product.long_description = 'test'
     self.product.unit_price = Decimal('1.0')
     self.product.save()
     self.cart = get_or_create_cart(self.request)
     self.cart.add_product(self.product, 1)
     self.cart.save()
 def _create_mock_diary(self):
     self.diary = DiaryProduct(isbn='1234567890', number_of_pages=100)
     self.diary.name = 'Diary'
     self.diary.slug = 'mock-diary'
     self.diary.short_description = 'test'
     self.diary.long_description = 'test'
     self.diary.unit_price = Decimal('1.0')
     self.diary.save()
     options_group = OptionGroup.objects.all()[0]
     self.diary.options_groups.add(options_group)
     text_options = TextOption.objects.all()[0]
     self.diary.text_options.add(text_options)
Esempio n. 3
0
 def setUp(self):
     self.request = Mock()
     setattr(self.request, 'session', {})
     self.user = User.objects.create(username="******",
                                     email="*****@*****.**",
                                     first_name="Test",
                                     last_name="Tester")
     self.product = DiaryProduct(isbn='1234567890', number_of_pages=100)
     self.product.name = 'test'
     self.product.slug = 'test'
     self.product.short_description = 'test'
     self.product.long_description = 'test'
     self.product.unit_price = Decimal('1.0')
     self.product.save()
     setattr(self.request, 'user', self.user)
 def _create_mock_diary(self):
     self.diary = DiaryProduct(isbn='1234567890', number_of_pages=100)
     self.diary.name = 'Diary'
     self.diary.slug = 'mock-diary'
     self.diary.short_description = 'test'
     self.diary.long_description = 'test'
     self.diary.unit_price = Decimal('1.0')
     self.diary.save()
     options_group = OptionGroup.objects.all()[0]
     self.diary.options_groups.add(options_group)
     text_options = TextOption.objects.all()[0]
     self.diary.text_options.add(text_options)
Esempio n. 5
0
 def setUp(self):
     self.request = Mock()
     setattr(self.request, 'session', {})
     self.user = User.objects.create(username="******",
                                     email="*****@*****.**",
                                     first_name="Test",
                                     last_name="Tester")
     self.product = DiaryProduct(isbn='1234567890', number_of_pages=100)
     self.product.name = 'test'
     self.product.slug = 'test'
     self.product.short_description = 'test'
     self.product.long_description = 'test'
     self.product.unit_price = Decimal('1.0')
     self.product.save()
     setattr(self.request, 'user', self.user)
class ProductVariationsTest(TestCase):
    def setUp(self):
        """Sets up the TestModel."""
        self._create_options()
        self._create_mock_diary()
        self._create_mock_calendar()
        self.user = User.objects.create(username="******",
                                        email="*****@*****.**",
                                        first_name="Test",
                                        last_name="Tester")

    def test_get_product_returns_correctly(self):
        request = Mock()
        view = DiaryDetailView(request=request, kwargs={'pk': self.diary.id})
        setattr(view, 'object', None)
        obj = view.get_object()
        self.assertTrue(isinstance(obj, DiaryProduct))

    def test_get_templates_return_expected_values(self):
        view = DiaryDetailView()
        setattr(view, 'object', None)
        tmp = view.get_template_names()
        self.assertGreaterEqual(len(tmp), 1)

    def test_add_diary_to_cart_using_post(self):
        # create form data with a product containing variations and simulate POST
        post = {
            'product_action': 'add_to_cart',
            'add_item_id': self.diary.id,
            'add_item_quantity': 1,
            'add_item_option_group_1': 2,  # Color: green
            'add_item_text_option_1': 'Doctor Diary',  # Engraving
        }
        request = self._get_post_request(post)
        view = DiaryDetailView(request=request, kwargs={'pk': self.diary.id})
        view.post()
        ret = self._get_from_cart()

        # check if the product is in the cart
        self.assertEqual(len(ret['cart_items']), 1)
        values = ret['cart_items'].values()[0]
        self.assertEqual(values['product_id'], self.diary.id)
        self.assertEqual(values['quantity'], 1)
        variation = json.loads(values['variation'])
        self.assertEqual(variation['option_groups']['1']['name'], 'Color')
        self.assertEqual(variation['option_groups']['1']['option']['name'],
                         'green')
        self.assertEqual(variation['text_options']['1']['text'],
                         'Doctor Diary')

        # add the same product with missing quantity field
        del post['add_item_quantity']
        request = self._get_post_request(post)
        view = DiaryDetailView(request=request, kwargs={'pk': self.diary.id})
        view.post()
        ret = self._get_from_cart()
        values = ret['cart_items'].values()[0]
        self.assertEqual(values['quantity'], 2)

    def test_add_calendar_to_cart_using_post(self):
        # create form data with a product containing variations and simulate POST
        post = {
            'product_action': 'add_to_cart',
            'add_item_id': self.calendar.id,
            'add_item_quantity': 1,
            'add_item_option_group_1': 1,  # Color: red
        }
        request = self._get_post_request(post)
        view = CalendarDetailView(request=request,
                                  kwargs={'pk': self.calendar.id})
        setattr(view, 'object', None)
        view.post()
        ret = self._get_from_cart()

        # check if the product is in the cart
        self.assertEqual(len(ret['cart_items']), 1)
        values = ret['cart_items'].values()[0]
        self.assertEqual(values['product_id'], self.calendar.id)
        self.assertEqual(values['quantity'], 1)
        variation = json.loads(values['variation'])
        self.assertEqual(variation['option_groups']['1']['name'], 'Color')
        self.assertEqual(variation['option_groups']['1']['option']['name'],
                         'red')
        self.assertFalse('text_options' in variation)

    def _get_post_request(self, post):
        request = Mock()
        setattr(request, 'is_ajax', lambda: False)
        setattr(request, 'user', self.user)
        setattr(request, 'POST', post)
        return request

    def _get_from_cart(self):
        request = Mock()
        setattr(request, 'user', self.user)
        view = CartDetails(request=request)
        ret = view.get_context_data()
        self.assertNotEqual(ret, None)
        return ret

    def _create_options(self):
        option_group = OptionGroup(name='Color', slug='color')
        option_group.save()
        price = Decimal('1.25')
        Option(name='red', price=price, group=option_group).save()
        Option(name='green', price=price, group=option_group).save()
        Option(name='blue', price=price, group=option_group).save()
        TextOption(name='Engraving', price=price, max_length=12).save()

    def _create_mock_diary(self):
        self.diary = DiaryProduct(isbn='1234567890', number_of_pages=100)
        self.diary.name = 'Diary'
        self.diary.slug = 'mock-diary'
        self.diary.short_description = 'test'
        self.diary.long_description = 'test'
        self.diary.unit_price = Decimal('1.0')
        self.diary.save()
        options_group = OptionGroup.objects.all()[0]
        self.diary.options_groups.add(options_group)
        text_options = TextOption.objects.all()[0]
        self.diary.text_options.add(text_options)

    def _create_mock_calendar(self):
        self.calendar = CalendarProduct(isbn='1234567890', number_of_pages=100)
        self.calendar.name = 'Calendar'
        self.calendar.slug = 'mock-calendar'
        self.calendar.short_description = 'test'
        self.calendar.long_description = 'test'
        self.calendar.unit_price = Decimal('1.0')
        self.calendar.save()
        options_group = OptionGroup.objects.all()[0]
        self.calendar.options_groups.add(options_group)
Esempio n. 7
0
class WishlistsTest(TestCase):
    def setUp(self):
        self.request = Mock()
        setattr(self.request, 'session', {})
        self.user = User.objects.create(username="******",
                                        email="*****@*****.**",
                                        first_name="Test",
                                        last_name="Tester")
        self.product = DiaryProduct(isbn='1234567890', number_of_pages=100)
        self.product.name = 'test'
        self.product.slug = 'test'
        self.product.short_description = 'test'
        self.product.long_description = 'test'
        self.product.unit_price = Decimal('1.0')
        self.product.save()
        setattr(self.request, 'user', self.user)

    def test_get_templates_return_expected_values(self):
        view = DiaryDetailView()
        setattr(view, 'object', None)
        tmp = view.get_template_names()
        self.assertGreaterEqual(len(tmp), 1)

    def test_no_wishlist_for_anonymous_user(self):
        """Wishlists for anonymous users are not allowed"""
        setattr(self.request, 'user', None)
        self.assertRaises(exceptions.PermissionDenied, get_or_create_wishlist,
                          self.request)
        self.assertRaises(exceptions.PermissionDenied,
                          create_additional_wishlist, self.request)

    def test_create_wishlist(self):
        """Asking for a wishlist twice, shall create only one"""
        wishlist = get_or_create_wishlist(self.request)

        # check that wishlist is stored in request
        self.assertEqual(wishlist, get_or_create_wishlist(self.request))
        self.assertTrue(hasattr(self.request, '_wishlist'))
        self.assertTrue(self.request.session.has_key('active_wishlist'))

        # check that wishlist is stored in session
        request = Mock()
        setattr(request, 'session', {'active_wishlist': wishlist.id})
        setattr(request, 'user', self.user)
        self.assertEqual(wishlist, get_or_create_wishlist(request))

        # check that wishlist is stored for current user
        request = Mock()
        setattr(request, 'session', {})
        setattr(request, 'user', self.user)
        self.assertEqual(wishlist, get_or_create_wishlist(request))
        self.assertEqual(request.session['active_wishlist'], wishlist.id)
        self.assertEqual(request._wishlist, wishlist)

    def test_do_not_share_wishlists(self):
        """"Different users shall never share a wishlist"""
        wishlist = get_or_create_wishlist(self.request)
        request = Mock()
        setattr(request, 'session', {})
        user2 = User.objects.create(username="******",
                                    email="*****@*****.**",
                                    first_name="Test2",
                                    last_name="Tester2")
        setattr(request, 'user', user2)
        self.assertNotEqual(wishlist, get_or_create_wishlist(request))

    def test_is_product_on_active_wishlist(self):
        """A product IS on the wishlist independently of its variation"""
        wishlist = get_or_create_wishlist(self.request)
        variation1 = {'foo': 'bar'}
        variation2 = {'foo': 'baz'}
        wishlist.add_product(self.product, variation=variation1)
        wishlist.add_product(self.product, variation=variation2)
        self.assertTrue(
            is_product_on_active_wishlist(self.request, self.product))
        items = wishlist.get_all_items()
        self.assertEqual(len(items), 2)
        wishlist.delete_item(items[0].id)
        self.assertEqual(len(wishlist.get_all_items()), 1)
        self.assertTrue(
            is_product_on_active_wishlist(self.request, self.product))
        wishlist.delete_item(items[1].id)
        self.assertFalse(
            is_product_on_active_wishlist(self.request, self.product))

    def test_find_product_on_active_wishlist(self):
        """Products added to the wishlist must be found again"""
        wishlist = get_or_create_wishlist(self.request)
        variation = {'foo': 'bar'}
        wishlist.add_product(self.product, variation=variation)
        self.assertEqual(len(wishlist.get_all_items()), 1)
        items = wishlist.find_item(self.product)
        self.assertEqual(len(items), 0)
        items = wishlist.find_item(self.product, variation=variation)
        self.assertEqual(len(items), 1)
        wishlist.add_product(self.product, variation={'foo': 'baz'})
        self.assertEqual(len(wishlist.get_all_items()), 2)
        wishlist.add_product(self.product)
        self.assertEqual(len(wishlist.get_all_items()), 3)

    def test_copy_product_to_cart(self):
        """Products added to the wishlist must be transferable to the cart"""
        wishlist = get_or_create_wishlist(self.request)
        variation = {'foo': 'bar'}
        wishlist.add_product(self.product, variation=variation)
        self.assertEqual(len(wishlist.get_all_items()), 1)
        item = wishlist.get_all_items()[0]
        copy_item_to_cart(self.request, item.id)
        cart = get_or_create_cart(self.request)
        cart_item = CartItem.objects.all()[0]
        self.assertEqual(self.product, cart_item.product)
        self.assertEqual(variation, cart_item.variation)

    def test_create_additional_wishlist(self):
        get_or_create_wishlist(self.request)
        self.assertEqual(Wishlist.objects.all().count(), 1)
        wishlist = create_additional_wishlist(self.request)
        self.assertEqual(Wishlist.objects.all().count(), 2)
        self.assertEqual(self.request._wishlist, wishlist)
        self.assertEqual(self.request.session['active_wishlist'], wishlist.id)
        self.assertEqual(self.request._wishlist, wishlist)

    def test_switch_wishlist(self):
        self.assertRaises(exceptions.ObjectDoesNotExist, switch_wishlist,
                          self.request, 987)
        wishlist1 = get_or_create_wishlist(self.request)
        wishlist2 = create_additional_wishlist(self.request)
        self.assertEqual(self.request.session['active_wishlist'], wishlist2.id)
        self.assertEqual(self.request._wishlist, wishlist2)
        switch_wishlist(self.request, wishlist1.id)
        self.assertEqual(self.request.session['active_wishlist'], wishlist1.id)
        self.assertEqual(self.request._wishlist, wishlist1)

    def test_rename_wishlist(self):
        """Products added to the wishlist must be found again"""
        self.assertRaises(exceptions.ObjectDoesNotExist,
                          rename_active_wishlist, self.request, 'DEF')
        wishlist = get_or_create_wishlist(self.request)
        self.assertEqual(wishlist.name, _('My wishlist'))
        rename_active_wishlist(self.request, 'ABC')
        self.assertEqual(wishlist.name, 'ABC')
        request = Mock()
        setattr(request, 'user', self.user)
        setattr(request, 'session', {'active_wishlist': wishlist.id})
        rename_active_wishlist(request, 'DEF')
        wishlist = get_or_create_wishlist(request)
        self.assertEqual(wishlist.name, 'DEF')

    def test_delete_wishlist(self):
        """Deleting a wishlist also deletes all its items"""
        self.assertRaises(exceptions.ObjectDoesNotExist,
                          delete_active_wishlist, self.request)
        wishlist = get_or_create_wishlist(self.request)
        wishlist.add_product(self.product)
        self.assertEqual(
            WishlistItem.objects.filter(wishlist=wishlist).count(), 1)
        self.assertEqual(Wishlist.objects.all().count(), 1)
        request = Mock()
        setattr(request, 'user', self.user)
        setattr(request, 'session', {'active_wishlist': wishlist.id})
        delete_active_wishlist(request)
        self.assertFalse(hasattr(request, '_wishlist'))
        self.assertFalse(request.session.has_key('active_wishlist'))
        self.assertEqual(Wishlist.objects.all().count(), 0)
        # check for automatic delete cascade
        self.assertEqual(
            WishlistItem.objects.filter(wishlist=wishlist).count(), 0)
        get_or_create_wishlist(request)
        self.assertEqual(Wishlist.objects.all().count(), 1)
        delete_active_wishlist(request)
        self.assertEqual(Wishlist.objects.all().count(), 0)

    def test_tag_select_wishlist(self):
        """Create a select field with all wishlists"""
        get_or_create_wishlist(self.request)
        wishlist = create_additional_wishlist(self.request)
        context = {'request': self.request}
        select_wishlist(context)
        self.assertEqual(len(context['wishlists']), 2)
        self.assertEqual(context['active_wishlist'],
                         self.request.session['active_wishlist'])
        self.assertEqual(context['active_wishlist'], wishlist.id)
Esempio n. 8
0
class WishlistsTest(TestCase):    
    def setUp(self):
        self.request = Mock()
        setattr(self.request, 'session', {})
        self.user = User.objects.create(username="******",
                                        email="*****@*****.**",
                                        first_name="Test",
                                        last_name="Tester")
        self.product = DiaryProduct(isbn='1234567890', number_of_pages=100)
        self.product.name = 'test'
        self.product.slug = 'test'
        self.product.short_description = 'test'
        self.product.long_description = 'test'
        self.product.unit_price = Decimal('1.0')
        self.product.save()
        setattr(self.request, 'user', self.user)

    def test_get_templates_return_expected_values(self):
        view = DiaryDetailView()
        setattr(view, 'object', None)
        tmp = view.get_template_names()
        self.assertGreaterEqual(len(tmp), 1)

    def test_no_wishlist_for_anonymous_user(self):
        """Wishlists for anonymous users are not allowed"""
        setattr(self.request, 'user', None)
        self.assertRaises(exceptions.PermissionDenied, get_or_create_wishlist, self.request)
        self.assertRaises(exceptions.PermissionDenied, create_additional_wishlist, self.request)

    def test_create_wishlist(self):
        """Asking for a wishlist twice, shall create only one"""
        wishlist = get_or_create_wishlist(self.request)

        # check that wishlist is stored in request
        self.assertEqual(wishlist, get_or_create_wishlist(self.request))
        self.assertTrue(hasattr(self.request, '_wishlist'))
        self.assertTrue(self.request.session.has_key('active_wishlist'))

        # check that wishlist is stored in session
        request = Mock()
        setattr(request, 'session', {'active_wishlist': wishlist.id})
        setattr(request, 'user', self.user)
        self.assertEqual(wishlist, get_or_create_wishlist(request))

        # check that wishlist is stored for current user
        request = Mock()
        setattr(request, 'session', {})
        setattr(request, 'user', self.user)
        self.assertEqual(wishlist, get_or_create_wishlist(request))
        self.assertEqual(request.session['active_wishlist'], wishlist.id)
        self.assertEqual(request._wishlist, wishlist)

    def test_do_not_share_wishlists(self):
        """"Different users shall never share a wishlist"""
        wishlist = get_or_create_wishlist(self.request)
        request = Mock()
        setattr(request, 'session', {})
        user2 = User.objects.create(username="******", email="*****@*****.**",
                                      first_name="Test2", last_name="Tester2")
        setattr(request, 'user', user2)
        self.assertNotEqual(wishlist, get_or_create_wishlist(request))

    def test_is_product_on_active_wishlist(self):
        """A product IS on the wishlist independently of its variation"""
        wishlist = get_or_create_wishlist(self.request)
        variation1 = {'foo': 'bar'}
        variation2 = {'foo': 'baz'}
        wishlist.add_product(self.product, variation=variation1)
        wishlist.add_product(self.product, variation=variation2)
        self.assertTrue(is_product_on_active_wishlist(self.request, self.product))
        items = wishlist.get_all_items()
        self.assertEqual(len(items), 2)
        wishlist.delete_item(items[0].id)
        self.assertEqual(len(wishlist.get_all_items()), 1)
        self.assertTrue(is_product_on_active_wishlist(self.request, self.product))
        wishlist.delete_item(items[1].id)
        self.assertFalse(is_product_on_active_wishlist(self.request, self.product))

    def test_find_product_on_active_wishlist(self):
        """Products added to the wishlist must be found again"""
        wishlist = get_or_create_wishlist(self.request)
        variation = {'foo': 'bar'}
        wishlist.add_product(self.product, variation=variation)
        self.assertEqual(len(wishlist.get_all_items()), 1)
        items = wishlist.find_item(self.product)
        self.assertEqual(len(items), 0)
        items = wishlist.find_item(self.product, variation=variation)
        self.assertEqual(len(items), 1)
        wishlist.add_product(self.product, variation={'foo': 'baz'})
        self.assertEqual(len(wishlist.get_all_items()), 2)
        wishlist.add_product(self.product)
        self.assertEqual(len(wishlist.get_all_items()), 3)

    def test_copy_product_to_cart(self):
        """Products added to the wishlist must be transferable to the cart"""
        wishlist = get_or_create_wishlist(self.request)
        variation = {'foo': 'bar'}
        wishlist.add_product(self.product, variation=variation)
        self.assertEqual(len(wishlist.get_all_items()), 1)
        item = wishlist.get_all_items()[0]
        copy_item_to_cart(self.request, item.id)
        cart = get_or_create_cart(self.request)
        cart_item = CartItem.objects.all()[0]
        self.assertEqual(self.product, cart_item.product)
        self.assertEqual(variation, cart_item.variation)        

    def test_create_additional_wishlist(self):
        get_or_create_wishlist(self.request)
        self.assertEqual(Wishlist.objects.all().count(), 1)
        wishlist = create_additional_wishlist(self.request)
        self.assertEqual(Wishlist.objects.all().count(), 2)
        self.assertEqual(self.request._wishlist, wishlist)
        self.assertEqual(self.request.session['active_wishlist'], wishlist.id)
        self.assertEqual(self.request._wishlist, wishlist)        

    def test_switch_wishlist(self):
        self.assertRaises(exceptions.ObjectDoesNotExist, switch_wishlist, self.request, 987)
        wishlist1 = get_or_create_wishlist(self.request)
        wishlist2 = create_additional_wishlist(self.request)
        self.assertEqual(self.request.session['active_wishlist'], wishlist2.id)
        self.assertEqual(self.request._wishlist, wishlist2)
        switch_wishlist(self.request, wishlist1.id)
        self.assertEqual(self.request.session['active_wishlist'], wishlist1.id)
        self.assertEqual(self.request._wishlist, wishlist1)
    
    def test_rename_wishlist(self):
        """Products added to the wishlist must be found again"""
        self.assertRaises(exceptions.ObjectDoesNotExist, rename_active_wishlist, self.request, 'DEF')
        wishlist = get_or_create_wishlist(self.request)
        self.assertEqual(wishlist.name, _('My wishlist'))
        rename_active_wishlist(self.request, 'ABC')
        self.assertEqual(wishlist.name, 'ABC')
        request = Mock()
        setattr(request, 'user', self.user)
        setattr(request, 'session', {'active_wishlist': wishlist.id})
        rename_active_wishlist(request, 'DEF')
        wishlist = get_or_create_wishlist(request)
        self.assertEqual(wishlist.name, 'DEF')

    def test_delete_wishlist(self):
        """Deleting a wishlist also deletes all its items"""
        self.assertRaises(exceptions.ObjectDoesNotExist, delete_active_wishlist, self.request)
        wishlist = get_or_create_wishlist(self.request)
        wishlist.add_product(self.product)
        self.assertEqual(WishlistItem.objects.filter(wishlist=wishlist).count(), 1)
        self.assertEqual(Wishlist.objects.all().count(), 1)
        request = Mock()
        setattr(request, 'user', self.user)
        setattr(request, 'session', {'active_wishlist': wishlist.id})
        delete_active_wishlist(request)
        self.assertFalse(hasattr(request, '_wishlist'))
        self.assertFalse(request.session.has_key('active_wishlist'))
        self.assertEqual(Wishlist.objects.all().count(), 0)
        # check for automatic delete cascade
        self.assertEqual(WishlistItem.objects.filter(wishlist=wishlist).count(), 0)
        get_or_create_wishlist(request)
        self.assertEqual(Wishlist.objects.all().count(), 1)
        delete_active_wishlist(request)
        self.assertEqual(Wishlist.objects.all().count(), 0)

    def test_tag_select_wishlist(self):
        """Create a select field with all wishlists"""
        get_or_create_wishlist(self.request)
        wishlist = create_additional_wishlist(self.request)
        context = { 'request': self.request }
        select_wishlist(context)
        self.assertEqual(len(context['wishlists']), 2)
        self.assertEqual(context['active_wishlist'], self.request.session['active_wishlist'])
        self.assertEqual(context['active_wishlist'], wishlist.id)
class ProductVariationsTest(TestCase):    
    def setUp(self):
        """Sets up the TestModel."""
        self._create_options()
        self._create_mock_diary()
        self._create_mock_calendar()
        self.user = User.objects.create(username="******",
                                        email="*****@*****.**",
                                        first_name="Test",
                                        last_name="Tester")

    def test_get_product_returns_correctly(self):
        request = Mock()
        view = DiaryDetailView(request=request, kwargs={'pk': self.diary.id})
        setattr(view, 'object', None)
        obj = view.get_object()
        self.assertTrue(isinstance(obj, DiaryProduct))

    def test_get_templates_return_expected_values(self):
        view = DiaryDetailView()
        setattr(view, 'object', None)
        tmp = view.get_template_names()
        self.assertGreaterEqual(len(tmp), 1)

    def test_add_diary_to_cart_using_post(self):
        # create form data with a product containing variations and simulate POST
        post = {
            'product_action': 'add_to_cart',
            'add_item_id': self.diary.id,
            'add_item_quantity': 1,
            'add_item_option_group_1': 2, # Color: green
            'add_item_text_option_1': 'Doctor Diary', # Engraving
        }
        request = self._get_post_request(post)
        view = DiaryDetailView(request=request, kwargs={'pk': self.diary.id})
        view.post()
        ret = self._get_from_cart()

        # check if the product is in the cart
        self.assertEqual(len(ret['cart_items']), 1)
        values = ret['cart_items'].values()[0]
        self.assertEqual(values['product_id'], self.diary.id)
        self.assertEqual(values['quantity'], 1)
        variation = json.loads(values['variation'])
        self.assertEqual(variation['option_groups']['1']['name'], 'Color')
        self.assertEqual(variation['option_groups']['1']['option']['name'], 'green')
        self.assertEqual(variation['text_options']['1']['text'], 'Doctor Diary')

        # add the same product with missing quantity field
        del post['add_item_quantity']
        request = self._get_post_request(post)
        view = DiaryDetailView(request=request, kwargs={'pk': self.diary.id})
        view.post()
        ret = self._get_from_cart()
        values = ret['cart_items'].values()[0]
        self.assertEqual(values['quantity'], 2)        

    def test_add_calendar_to_cart_using_post(self):
        # create form data with a product containing variations and simulate POST
        post = {
            'product_action': 'add_to_cart',
            'add_item_id': self.calendar.id,
            'add_item_quantity': 1,
            'add_item_option_group_1': 1, # Color: red
        }
        request = self._get_post_request(post)
        view = CalendarDetailView(request=request, kwargs={'pk': self.calendar.id})
        setattr(view, 'object', None)
        view.post()
        ret = self._get_from_cart()

        # check if the product is in the cart
        self.assertEqual(len(ret['cart_items']), 1)
        values = ret['cart_items'].values()[0]
        self.assertEqual(values['product_id'], self.calendar.id)
        self.assertEqual(values['quantity'], 1)
        variation = json.loads(values['variation'])
        self.assertEqual(variation['option_groups']['1']['name'], 'Color')
        self.assertEqual(variation['option_groups']['1']['option']['name'], 'red')
        self.assertFalse('text_options' in variation)

    def _get_post_request(self, post):
        request = Mock()
        setattr(request, 'is_ajax', lambda: False)
        setattr(request, 'user', self.user)
        setattr(request, 'POST', post)
        return request
        
    def _get_from_cart(self):
        request = Mock()
        setattr(request, 'user', self.user)
        view = CartDetails(request=request)
        ret = view.get_context_data()
        self.assertNotEqual(ret, None)
        return ret

    def _create_options(self):
        option_group = OptionGroup(name='Color', slug='color')
        option_group.save()
        price = Decimal('1.25')
        Option(name='red', price=price, group=option_group).save()
        Option(name='green', price=price, group=option_group).save()
        Option(name='blue', price=price, group=option_group).save()
        TextOption(name='Engraving', price=price, max_length=12).save()

    def _create_mock_diary(self):
        self.diary = DiaryProduct(isbn='1234567890', number_of_pages=100)
        self.diary.name = 'Diary'
        self.diary.slug = 'mock-diary'
        self.diary.short_description = 'test'
        self.diary.long_description = 'test'
        self.diary.unit_price = Decimal('1.0')
        self.diary.save()
        options_group = OptionGroup.objects.all()[0]
        self.diary.options_groups.add(options_group)
        text_options = TextOption.objects.all()[0]
        self.diary.text_options.add(text_options)

    def _create_mock_calendar(self):
        self.calendar = CalendarProduct(isbn='1234567890', number_of_pages=100)
        self.calendar.name = 'Calendar'
        self.calendar.slug = 'mock-calendar'
        self.calendar.short_description = 'test'
        self.calendar.long_description = 'test'
        self.calendar.unit_price = Decimal('1.0')
        self.calendar.save()
        options_group = OptionGroup.objects.all()[0]
        self.calendar.options_groups.add(options_group)
Esempio n. 10
0
class IPaymentTest(LiveServerTestCase):
    def setUp(self):
        current_site = Site.objects.get(id=settings.SITE_ID)
        current_site.domain = settings.HOST_NAME
        current_site.save()
        self._create_fake_order()
        self.ipayment_backend = backends_pool.get_payment_backends_list()[0]
        self.factory = RequestFactory()
        self.request = Mock()
        setattr(self.request, 'session', {})
        setattr(self.request, 'is_secure', lambda: False)
        user = User.objects.create(username="******", email="*****@*****.**",
            first_name="Test", last_name="Tester",
            password="******")
        setattr(self.request, 'user', user)
        self.country_usa = Country(name='USA')
        self.country_usa.save()
        self.client = Client()
        self.client.login(username='******', password='******')
        self._create_cart()
        self._go_shopping()

    def tearDown(self):
        time.sleep(10)  # this keeps the server running for a while

    def _create_cart(self):
        self.product = DiaryProduct(isbn='1234567890', number_of_pages=100)
        self.product.name = 'test'
        self.product.slug = 'test'
        self.product.short_description = 'test'
        self.product.long_description = 'test'
        self.product.unit_price = Decimal('1.0')
        self.product.save()
        self.cart = get_or_create_cart(self.request)
        self.cart.add_product(self.product, 1)
        self.cart.save()

    def _go_shopping(self):
        # add address information
        post = {
            'ship-name': 'John Doe',
            'ship-address': 'Rosestreet',
            'ship-address2': '',
            'ship-zip_code': '01234',
            'ship-city': 'Toledeo',
            'ship-state': 'Ohio',
            'ship-country': self.country_usa.pk,
            'bill-name': 'John Doe',
            'bill-address': 'Rosestreet',
            'bill-address2': '',
            'bill-zip_code': '01234',
            'bill-city': 'Toledeo',
            'bill-state': 'Ohio',
            'bill-country': self.country_usa.pk,
            'shipping_method': 'flat',
            'payment_method': 'ipayment',
        }
        response = self.client.post(reverse('checkout_selection'), post, follow=True)
        urlobj = urlparse.urlparse(response.redirect_chain[0][0])
        self.assertEqual(resolve(urlobj.path).url_name, 'checkout_shipping')
        urlobj = urlparse.urlparse(response.redirect_chain[1][0])
        self.assertEqual(resolve(urlobj.path).url_name, 'flat')
        self.order = self.ipayment_backend.shop.get_order(self.request)

    def _simulate_payment(self):
        """
        Simulate a payment to the IPayment processor.
        The full payment information is sent with method POST. Make sure your
        test environment is reachable from the Internet. This test will
        a) invoke a POST request from IPayment to this server
        b) redirect the client to a given URL on this server
        Both actions shall result in the confirmation of the payment.
        """
        post = self.ipayment_backend.get_hidden_context(self.order)
        post['advanced_strict_id_check'] = 0  # disabled for testing only
        # (see ipayment_Technik-Handbuch.pdf page 32)
        if settings.IPAYMENT['useSessionId']:
            post['ipayment_session_id'] = self.ipayment_backend.get_session_id(self.request, self.order)
        else:
            post.update(self.ipayment_backend.get_sessionless_context(self.request, self.order))
            post['trx_securityhash'] = self.ipayment_backend._calc_trx_security_hash(post)
        post.update({
            'addr_name': 'John Doe',
            'cc_number': '4012888888881881',  # Visa test credit card number
            'cc_checkcode': '123',
            'cc_expdate_month': '12',
            'cc_expdate_year': '2029',
        })
        ipayment_uri = '/merchant/%s/processor/2.0/' % settings.IPAYMENT['accountId']
        headers = {
            "Content-type": "application/x-www-form-urlencoded",
            "Accept": "text/plain"
        }
        conn = httplib.HTTPSConnection('ipayment.de')
        conn.request("POST", ipayment_uri, urllib.urlencode(post), headers)
        httpresp = conn.getresponse()
        self.assertEqual(httpresp.status, 302, 'Expected to be redirected back from IPayment')
        redir_url = urlparse.urlparse(httpresp.getheader('location'))
        query_params = urlparse.parse_qs(redir_url.query)
        redir_uri = redir_url.path + '?' + redir_url.query
        conn.close()
        self.assertEqual(query_params['ret_status'][0], 'SUCCESS', 'IPayment reported: ' + redir_uri)

        # IPayent redirected the customer onto 'redir_uri'. Continue to complete the order.
        response = self.client.get(redir_uri, follow=True)
        self.assertEqual(len(response.redirect_chain), 1, '')
        urlobj = urlparse.urlparse(response.redirect_chain[0][0])
        self.assertEqual(resolve(urlobj.path).url_name, 'thank_you_for_your_order')
        self.assertEqual(response.status_code, 200)
        order = Order.objects.get(pk=self.order.id)
        self.assertEqual(order.status, Order.COMPLETED)
        confirmation = Confirmation.objects.get(shopper_id=self.order.id)
        self.assertEqual(confirmation.ret_status, 'SUCCESS')

    def _create_fake_order(self):
        """
        Create a fake order with a random order id, so that the following real
        order does not start with 1. Otherwise this could cause errors if this
        test is invoked multiple times.
        """
        order_id = random.randint(100001, 999999)
        Order.objects.create(id=order_id, status=Order.CANCELLED)

    def test_without_session(self):
        """
        Simulate a payment to the IPayment processor without using a session.
        """
        setattr(settings, 'IPAYMENT', settings.IPAYMENT_WITHOUT_SESSION)
        self._simulate_payment()

    def test_with_session(self):
        """
        Simulate a payment to the IPayment processor using a session id generated
        through a SOAP invocation.
        """
        setattr(settings, 'IPAYMENT', settings.IPAYMENT_WITH_SESSION)
        self._simulate_payment()