def test_update_address(self):
        adapter = IShoppingSite(self.portal)
        data = {}
        self.assertEqual(adapter.update_address('address', data), u'First name is missing.')

        data = {'address_first_name': 'F|RST'}
        self.assertEqual(adapter.update_address('address', data), u'Last name is missing.')

        data = {'address_first_name': 'F|RST', 'address_last_name': 'LÄST'}
        self.assertEqual(adapter.update_address('address', data), u'Invalid e-mail address.')

        data = {'address_first_name': 'F|RST', 'address_last_name': 'LÄST', 'address_email': 'EMAIL'}
        self.assertEqual(adapter.update_address('address', data), u'Invalid e-mail address.')

        data = {'address_first_name': 'F|RST', 'address_last_name': 'LÄST', 'address_email': '*****@*****.**'}
        self.assertEqual(adapter.update_address('address', data), u'Street address is missing.')

        data = {'address_first_name': 'F|RST', 'address_last_name': 'LÄST', 'address_email': '*****@*****.**', 'address_street': 'STR€€T'}
        self.assertEqual(adapter.update_address('address', data), u'Post code is missing.')

        data = {'address_first_name': 'F|RST', 'address_last_name': 'LÄST', 'address_email': '*****@*****.**', 'address_street': 'STR€€T',
            'address_post': 'PÖST'}
        self.assertEqual(adapter.update_address('address', data), u'City is missing.')

        data = {'address_first_name': 'F|RST', 'address_last_name': 'LÄST', 'address_email': '*****@*****.**', 'address_street': 'STR€€T',
            'address_post': 'PÖST', 'address_city': 'C|TY'}
        self.assertEqual(adapter.update_address('address', data), u'Phone number is missing.')

        data = {'address_first_name': 'F|RST', 'address_last_name': 'LÄST', 'address_email': '*****@*****.**', 'address_street': 'STR€€T',
            'address_city': 'C|TY', 'address_post': 'PÖST', 'address_phone': 'PHÖNE'}
        self.assertIsNone(adapter.update_address('address', data))

        adapter.get_address = mock.Mock(return_value=None)
        adapter.update_cart = mock.Mock()
        self.assertIsNone(adapter.update_address('address', data))
        adapter.update_cart.assert_called_with('address', {
            'city': 'C|TY',
            'email': '*****@*****.**',
            'first_name': 'F|RST',
            'last_name': 'LÄST',
            'phone': 'PHÖNE',
            'post': 'PÖST',
            'street': 'STR€€T',
        })

        names = ['city', 'last_name', 'first_name', 'email', 'phone', 'post', 'street']
        address = {}
        for name in names:
            address[name] = name.upper()
        adapter.get_address = mock.Mock(return_value=address)
        self.assertIsNone(adapter.update_address('address', data))
        adapter.update_cart.assert_called_with('address', {
            'city': 'C|TY',
            'email': '*****@*****.**',
            'first_name': 'F|RST',
            'last_name': 'LÄST',
            'phone': 'PHÖNE',
            'post': 'PÖST',
            'street': 'STR€€T',
        })
 def test_clean_articles_in_cart(self, clean_articles_in_cart, IStock):
     article1 = self.create_content('collective.cart.core.Article')
     uuid1 = IUUID(article1)
     article2 = self.create_content('collective.cart.core.Article')
     uuid2 = IUUID(article2)
     clean_articles_in_cart.return_value = {uuid1: {}, uuid2: {}}
     IStock().stock = 0
     instance = IShoppingSite(self.portal)
     instance.update_cart = mock.Mock()
     self.assertEqual(instance.clean_articles_in_cart(), {})
     instance.update_cart.assert_called_with('articles', {})
    def test_update_shipping_method(self):
        adapter = IShoppingSite(self.portal)
        self.assertIsNone(adapter.shipping_method())

        adapter.update_shipping_method()
        self.assertIsNone(adapter.shipping_method())

        session = adapter.getSessionData(create=True)
        session.set('collective.cart.core', {'articles': {
            '1': {'gross': self.money('10.00'), 'quantity': 2, 'vat_rate': 24.0}
        }})
        adapter.update_shipping_method()
        self.assertIsNone(adapter.shipping_method())

        alsoProvides(self.portal, IShoppingSiteRoot)
        container = self.create_content('collective.cart.shipping.ShippingMethodContainer')
        shippingmethod1 = self.create_atcontent('ShippingMethod', container, id='shippingmethod1', vat=self.decimal('24.00'))
        uuid1 = IUUID(shippingmethod1)
        adapter.update_shipping_method()
        self.assertEqual(adapter.shipping_method(), {
            'gross': None,
            'max_delivery_days': None,
            'uuid': uuid1,
            'title': '',
            'min_delivery_days': None,
            'vat_rate': self.decimal('24.00'),
            'net': None,
            'vat': None,
            'weight_dimension_rate': 250.0
        })

        articles = {'1': {'gross': self.money('10.00'), 'quantity': 2, 'weight': 100.0, 'depth': 10.0, 'height': 20.0, 'width': 30.0, 'vat_rate': 24.0}}
        adapter.update_cart('articles', articles)
        adapter.update_shipping_method()

        self.assertEqual(adapter.shipping_method(), {
            'gross': self.money('3.00'),
            'max_delivery_days': None,
            'uuid': uuid1,
            'title': '',
            'min_delivery_days': None,
            'vat_rate': self.decimal('24.00'),
            'net': self.money('2.28'),
            'vat': self.money('0.72'),
            'weight_dimension_rate': 250.0
        })

        articles = {'1': {'gross': self.money('10.00'), 'quantity': 4, 'weight': 100.0, 'depth': 10.0, 'height': 20.0, 'width': 30.0, 'vat_rate': 24.0}}
        adapter.update_cart('articles', articles)
        adapter.update_shipping_method(uuid1)
        self.assertEqual(adapter.shipping_method(), {
            'gross': self.money('6.00'),
            'max_delivery_days': None,
            'uuid': uuid1,
            'title': '',
            'min_delivery_days': None,
            'vat_rate': self.decimal('24.00'),
            'net': self.money('4.56'),
            'vat': self.money('1.44'),
            'weight_dimension_rate': 250.0
        })

        articles = {'1': {'gross': self.money('10.00'), 'quantity': 2, 'weight': 100.0, 'depth': 10.0, 'height': 20.0, 'width': 30.0, 'vat_rate': 24.0}}
        adapter.update_cart('articles', articles)
        adapter.update_shipping_method('UUID')
        self.assertEqual(adapter.shipping_method(), {
            'gross': self.money('3.00'),
            'max_delivery_days': None,
            'uuid': uuid1,
            'title': '',
            'min_delivery_days': None,
            'vat_rate': self.decimal('24.00'),
            'net': self.money('2.28'),
            'vat': self.money('0.72'),
            'weight_dimension_rate': 250.0
        })

        articles = {'1': {'gross': self.money('10.00'), 'quantity': 4, 'weight': 100.0, 'depth': 10.0, 'height': 20.0, 'width': 30.0, 'vat_rate': 24.0}}
        adapter.update_cart('articles', articles)
        adapter.update_shipping_method(uuid1)
        self.assertEqual(adapter.shipping_method(), {
            'gross': self.money('6.00'),
            'max_delivery_days': None,
            'uuid': uuid1,
            'title': '',
            'min_delivery_days': None,
            'vat_rate': self.decimal('24.00'),
            'net': self.money('4.56'),
            'vat': self.money('1.44'),
            'weight_dimension_rate': 250.0
        })

        shippingmethod2 = self.create_atcontent('ShippingMethod', container, id='shippingmethod2', vat=self.decimal('24.00'), weight_dimension_rate=1.0)
        uuid2 = IUUID(shippingmethod2)
        articles = {'1': {'gross': self.money('10.00'), 'quantity': 2, 'weight': 100.0, 'depth': 10.0, 'height': 20.0, 'width': 30.0, 'vat_rate': 24.0}}
        adapter.update_cart('articles', articles)
        adapter.update_shipping_method(uuid2)
        self.assertEqual(adapter.shipping_method(), {
            'gross': self.money('0.20'),
            'max_delivery_days': None,
            'uuid': uuid2,
            'title': '',
            'min_delivery_days': None,
            'vat_rate': self.decimal('24.00'),
            'net': self.money('0.15'),
            'vat': self.money('0.05'),
            'weight_dimension_rate': 1.0
        })

        articles = {'1': {'gross': self.money('10.00'), 'quantity': 4, 'weight': 100.0, 'depth': 10.0, 'height': 20.0, 'width': 30.0, 'vat_rate': 24.0}}
        adapter.update_cart('articles', articles)
        adapter.update_shipping_method(uuid1)
        self.assertEqual(adapter.shipping_method(), {
            'gross': self.money('6.00'),
            'max_delivery_days': None,
            'uuid': uuid1,
            'title': '',
            'min_delivery_days': None,
            'vat_rate': self.decimal('24.00'),
            'net': self.money('4.56'),
            'vat': self.money('1.44'),
            'weight_dimension_rate': 250.0
        })

        adapter.remove_from_cart('shipping_method')
        self.assertIsNone(adapter.shipping_method())
        adapter.update_shipping_method(uuid1)
        self.assertEqual(adapter.shipping_method(), {
            'gross': self.money('6.00'),
            'max_delivery_days': None,
            'uuid': uuid1,
            'title': '',
            'min_delivery_days': None,
            'vat_rate': self.decimal('24.00'),
            'net': self.money('4.56'),
            'vat': self.money('1.44'),
            'weight_dimension_rate': 250.0
        })