def test_shipping_gross_money(self):
        adapter = IShoppingSite(self.portal)
        adapter.shipping_method = mock.Mock(return_value=None)
        self.assertIsNone(adapter.shipping_gross_money())

        adapter.get_shipping_gross_money = mock.Mock()
        adapter.shipping_method = mock.Mock(return_value={'uuid': 'UUID'})
        adapter.shipping_gross_money()
        adapter.get_shipping_gross_money.assert_called_with('UUID')
    def shipping_methods(self):
        """Returns list of dictionary of shipping methods

        :rtype: list
        """
        shopping_site = IShoppingSite(self.context)
        default_charset = getattr(getattr(getToolByName(
            self.context, 'portal_properties'), 'site_properties'), 'default_charset', 'utf-8')
        res = []
        for brain in shopping_site.shipping_methods():
            uuid = brain.UID
            orig_uuid = shopping_site.shipping_method()['uuid']

            if uuid == orig_uuid:
                shipping_gross_money = shopping_site.shipping_gross_money()
            else:
                shipping_gross_money = shopping_site.get_shipping_gross_money(uuid)

            if shipping_gross_money.amount == 0.0:
                title = brain.Title
            else:
                title = '{}  {}'.format(brain.Title, shopping_site.format_money(shipping_gross_money).encode(default_charset))

            res.append({
                'description': brain.Description,
                'checked': uuid == orig_uuid,
                'title': title,
                'uuid': uuid,
            })

        return res
    def test_shipping_vat_money(self):
        adapter = IShoppingSite(self.portal)
        self.assertIsNone(adapter.shipping_vat_money())

        adapter.shipping_gross_money = mock.Mock(return_value=self.money('10.00'))
        adapter.shipping_method = mock.Mock(return_value={'vat_rate': 24.0})
        self.assertEqual(adapter.shipping_vat_money(), self.money('2.40'))
 def shipping_method(self):
     shopping_site = IShoppingSite(self.context)
     items = shopping_site.shipping_method().copy()
     if items['gross'].amount == 0.0:
         items['is_free'] = True
     else:
         items['is_free'] = False
     items['vat_rate'] = IVATAdapter(self.context).percent(items['vat_rate'])
     items['gross'] = shopping_site.format_money(items['gross'])
     return items
    def test_create_cart(self, create_order):
        adapter = IShoppingSite(self.portal)

        create_order.return_value = None
        self.assertIsNone(adapter.create_order())

        order1 = self.create_content('collective.cart.core.Order', id='1')
        create_order.return_value = order1
        self.assertEqual(adapter.create_order(), order1)
        with self.assertRaises(KeyError):
            order1['shipping_method']
        with self.assertRaises(KeyError):
            order1['billing']
        with self.assertRaises(KeyError):
            order1['shipping']

        adapter.shipping_method = mock.Mock(return_value={'gross': self.money('10.00')})
        order2 = self.create_content('collective.cart.core.Order', id='2')
        create_order.return_value = order2
        self.assertEqual(adapter.create_order(), order2)
        self.assertIsNotNone(order2['shipping_method'])
        with self.assertRaises(KeyError):
            order2['billing']
        with self.assertRaises(KeyError):
            order2['shipping']

        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)
        adapter.billing_same_as_shipping = mock.Mock(return_value=True)
        order3 = self.create_content('collective.cart.core.Order', id='3')
        create_order.return_value = order3
        self.assertEqual(adapter.create_order(), order3)
        self.assertIsNotNone(order3['shipping_method'])
        self.assertIsNotNone(order3['billing'])
        with self.assertRaises(KeyError):
            order3['shipping']

        adapter.billing_same_as_shipping = mock.Mock(return_value=False)
        order4 = self.create_content('collective.cart.core.Order', id='4')
        create_order.return_value = order4
        self.assertEqual(adapter.create_order(), order4)
        self.assertIsNotNone(order4['shipping_method'])
        self.assertIsNotNone(order4['billing'])
        self.assertIsNotNone(order4['shipping'])
    def test__calculated_weight(self):
        adapter = IShoppingSite(self.portal)
        self.assertEqual(adapter._calculated_weight(), 0.0)

        adapter.shipping_method = mock.Mock()
        self.assertEqual(adapter._calculated_weight(), 0.0)
        self.assertEqual(adapter._calculated_weight('RATE'), 0.0)
        self.assertEqual(adapter._calculated_weight(10.0), 0.0)

        adapter.cart_article_listing = mock.MagicMock(return_value=[{'weight': 100.0, 'depth': 10.0, 'height': 20.0, 'width': 30.0, 'quantity': 1}])
        self.assertEqual(adapter._calculated_weight(10.0), 0.1)

        adapter.cart_article_listing = mock.MagicMock(return_value=[
            {'weight': 100.0, 'depth': 10.0, 'height': 20.0, 'width': 30.0, 'quantity': 1},
            {'weight': 10.0, 'depth': 10.0, 'height': 20.0, 'width': 30.0, 'quantity': 1}])
        self.assertEqual(adapter._calculated_weight(10.0), 0.16)

        adapter.cart_article_listing = mock.MagicMock(return_value=[
            {'weight': 100.0, 'depth': 10.0, 'height': 20.0, 'width': 30.0, 'quantity': 2, 'vat_rate': 24.0}])
        self.assertEqual(adapter._calculated_weight(10.0), 0.2)
    def test_shipping_method(self):
        adapter = IShoppingSite(self.portal)
        self.assertIsNone(adapter.shipping_method())

        adapter.cart = mock.MagicMock(return_value={'shipping_method': 'SHIPPINIG_METHOD'})
        self.assertEqual(adapter.shipping_method(), 'SHIPPINIG_METHOD')
    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
        })