changeset a3e42f0ecef5 in modules/web_shop_vue_storefront:default
details: 
https://hg.tryton.org/modules/web_shop_vue_storefront?cmd=changeset&node=a3e42f0ecef5
description:
        Replace test setuptools command by unittest discover

        issue9215
        review389851002
diffstat:

 setup.py                              |    6 +-
 tests/__init__.py                     |    8 -
 tests/test_module.py                  |  902 +++++++++++++++++++++++++++++++++
 tests/test_scenario.py                |   22 +
 tests/test_web_shop_vue_storefront.py |  917 ----------------------------------
 tox.ini                               |    3 +-
 6 files changed, 929 insertions(+), 929 deletions(-)

diffs (1901 lines):

diff -r 5e40af829b45 -r a3e42f0ecef5 setup.py
--- a/setup.py  Sun Apr 10 19:11:40 2022 +0200
+++ b/setup.py  Sat Apr 16 18:30:20 2022 +0200
@@ -148,13 +148,13 @@
     license='GPL-3',
     python_requires='>=3.7',
     install_requires=requires,
+    extras_require={
+        'test': tests_require,
+        },
     dependency_links=dependency_links,
     zip_safe=False,
     entry_points="""
     [trytond.modules]
     web_shop_vue_storefront = trytond.modules.web_shop_vue_storefront
     """,
-    test_suite='tests',
-    test_loader='trytond.test_loader:Loader',
-    tests_require=tests_require,
     )
diff -r 5e40af829b45 -r a3e42f0ecef5 tests/__init__.py
--- a/tests/__init__.py Sun Apr 10 19:11:40 2022 +0200
+++ b/tests/__init__.py Sat Apr 16 18:30:20 2022 +0200
@@ -1,10 +1,2 @@
 # This file is part of Tryton.  The COPYRIGHT file at the top level of
 # this repository contains the full copyright notices and license terms.
-
-try:
-    from 
trytond.modules.web_shop_vue_storefront.tests.test_web_shop_vue_storefront 
import \
-        suite  # noqa: E501
-except ImportError:
-    from .test_web_shop_vue_storefront import suite
-
-__all__ = ['suite']
diff -r 5e40af829b45 -r a3e42f0ecef5 tests/test_module.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test_module.py      Sat Apr 16 18:30:20 2022 +0200
@@ -0,0 +1,902 @@
+# This file is part of Tryton.  The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from contextlib import contextmanager
+from decimal import Decimal
+from unittest.mock import ANY, patch
+
+from werkzeug.exceptions import Unauthorized
+
+from trytond.modules.company.tests import (
+    CompanyTestMixin, create_company, set_company)
+from trytond.modules.web_shop_vue_storefront.exceptions import LoginException
+from trytond.pool import Pool
+from trytond.tests.test_tryton import ModuleTestCase, with_transaction
+from trytond.transaction import Transaction
+
+CUSTOMER = {
+    'email': '[email protected]',
+    'firstname': 'John',
+    'lastname': 'Doe',
+    }
+ADDRESS = {
+    'region': {
+        'region': None,
+        },
+    'country_id': "US",
+    'street': [
+        "Cliff Street",
+        "300"
+        ],
+    'telephone': '+1 202-555-0148',
+    'postcode': '18503',
+    'city': "Scranton",
+    'firstname': CUSTOMER['firstname'],
+    'lastname': CUSTOMER['lastname'],
+    }
+ADDRESS_COMPANY = ADDRESS.copy()
+ADDRESS_COMPANY['company'] = 'Saber'
+ADDRESS_COMPANY['vat_id'] = 'BE0500923836'
+
+
+class WebVueStorefrontTestCase(CompanyTestMixin, ModuleTestCase):
+    'Test Web Shop Vue Storefront module'
+    module = 'web_shop_vue_storefront'
+    extras = [
+        'product_attribute',
+        'product_image',
+        'sale_promotion_coupon',
+        'sale_shipment_cost',
+        'carrier',
+        ]
+    maxDiff = None
+
+    @contextmanager
+    def create_web_shop(self):
+        pool = Pool()
+        WebShop = pool.get('web.shop')
+        Location = pool.get('stock.location')
+        Party = pool.get('party.party')
+
+        company = create_company()
+        warehouse, = Location.search([('type', '=', 'warehouse')], limit=1)
+        web_shop = WebShop(name="Web Shop")
+        web_shop.company = company
+        web_shop.currency = company.currency
+        web_shop.warehouses = [warehouse]
+        web_shop.type = 'vsf'
+        web_shop.guest_party = Party(name="Guest")
+        web_shop.save()
+        with Transaction().set_context(**web_shop.get_context()):
+            yield web_shop
+
+    def create_product(self, web_shop, quantity=0, code="CODE"):
+        pool = Pool()
+        Template = pool.get('product.template')
+        Product = pool.get('product.product')
+        Category = pool.get('product.category')
+        Uom = pool.get('product.uom')
+        Location = pool.get('stock.location')
+        Move = pool.get('stock.move')
+
+        unit, = Uom.search([('name', '=', "Unit")], limit=1)
+        template = Template(name="Product")
+        template.type = 'goods'
+        template.list_price = Decimal(100)
+        template.default_uom = unit
+        template.salable = True
+        template.sale_uom = unit
+        template.products = [Product(suffix_code=code, web_shops=[web_shop])]
+        template.account_category = Category(name="Category", accounting=True)
+        template.save()
+        product, = template.products
+
+        if quantity:
+            supplier, = Location.search([('code', '=', 'SUP')])
+            storage, = Location.search([('code', '=', 'STO')])
+            with set_company(web_shop.company):
+                move = Move(product=product)
+                move.uom = unit
+                move.quantity = quantity
+                move.from_location = supplier
+                move.to_location = storage
+                move.unit_price = Decimal(50)
+                move.save()
+                Move.do([move])
+        Product.set_vsf_identifier([product])
+        return product
+
+    def create_coupon(self, code='CODE'):
+        pool = Pool()
+        Promotion = pool.get('sale.promotion')
+        Coupon = pool.get('sale.promotion.coupon')
+
+        promotion = Promotion(name="10%")
+        promotion.formula = '0.9 * unit_price'
+        promotion.coupons = coupon, = [Coupon(name="Promo")]
+        coupon.numbers = [{'number': code}]
+        promotion.save()
+
+    def create_carrier(
+            self, name='Carrier', product_name="Delivery",
+            price=Decimal('10')):
+        pool = Pool()
+        Carrier = pool.get('carrier')
+        Party = pool.get('party.party')
+        Template = pool.get('product.template')
+        Product = pool.get('product.product')
+        Category = pool.get('product.category')
+        Uom = pool.get('product.uom')
+
+        unit, = Uom.search([('name', '=', "Unit")], limit=1)
+        template = Template(name=product_name)
+        template.type = 'service'
+        template.list_price = price
+        template.default_uom = template.sale_uom = unit
+        template.salable = True
+        template.products = [Product()]
+        template.account_category = Category(name="Service", accounting=True)
+        template.save()
+
+        carrier = Carrier()
+        carrier.party = Party(name=name)
+        carrier.carrier_product, = template.products
+        carrier.save()
+        return carrier
+
+    @with_transaction(user=0)
+    def test_user_create(self):
+        pool = Pool()
+        User = pool.get('web.user')
+        with self.create_web_shop() as web_shop:
+            result = web_shop.POST_vsf_user_create({
+                    "customer": CUSTOMER,
+                    "password": "SecretPassword"
+                    })
+            users = User.search([])
+
+            self.assertEqual(result, {
+                    "email": CUSTOMER['email'],
+                    "firstname": CUSTOMER['firstname'],
+                    "lastname": CUSTOMER['lastname'],
+                    "addresses": [],
+                    })
+            self.assertEqual(len(users), 1)
+
+    @with_transaction(user=0)
+    def test_user_login(self):
+        with self.create_web_shop() as web_shop:
+            web_shop.POST_vsf_user_create({
+                    "customer": CUSTOMER,
+                    "password": "TopSecretPassword",
+                    })
+
+            result = web_shop.POST_vsf_user_login({
+                    "username": CUSTOMER['email'],
+                    "password": "TopSecretPassword",
+                    })
+
+            self.assertTrue(result)
+
+    @with_transaction(user=0)
+    def test_user_login_wrong_password(self):
+        with self.create_web_shop() as web_shop:
+            web_shop.POST_vsf_user_create({
+                    "customer": CUSTOMER,
+                    "password": "TopSecretPassword",
+                    })
+
+            with self.assertRaises(LoginException):
+                web_shop.POST_vsf_user_login({
+                        "username": CUSTOMER['email'],
+                        "password": "Bad",
+                        })
+
+    @with_transaction(user=0)
+    def test_user_reset_password(self):
+        pool = Pool()
+        User = pool.get('web.user')
+        with self.create_web_shop() as web_shop:
+            web_shop.POST_vsf_user_create({
+                    "customer": CUSTOMER,
+                    "password": "SecretPassword",
+                    })
+
+            with patch.object(User, 'reset_password') as reset_password:
+                result = web_shop.POST_vsf_user_reset_password({
+                        "email": CUSTOMER['email'],
+                        })
+
+            self.assertFalse(result)
+            reset_password.assert_called_once_with(ANY)
+
+    @with_transaction(user=0)
+    def test_user_change_password(self):
+        with self.create_web_shop() as web_shop:
+            web_shop.POST_vsf_user_create({
+                    "customer": CUSTOMER,
+                    "password": "OldPassword",
+                    })
+            token = web_shop.POST_vsf_user_login({
+                    "username": CUSTOMER['email'],
+                    "password": "OldPassword",
+                    })
+
+            result = web_shop.POST_vsf_user_change_password({
+                    "currentPassword": "OldPassword",
+                    "newPassword": "NewPassword",
+                    }, token=token)
+
+            self.assertFalse(result)
+
+    @with_transaction(user=0)
+    def test_user_change_password_wrong_token(self):
+        with self.create_web_shop() as web_shop:
+            web_shop.POST_vsf_user_create({
+                    "customer": CUSTOMER,
+                    "password": "OldPassword",
+                    })
+
+            with self.assertRaises(Unauthorized):
+                web_shop.POST_vsf_user_change_password({
+                        "currentPassword": "BadPassword",
+                        "newPassword": "NewPassword",
+                        }, 'wrong token')
+
+    @with_transaction(user=0)
+    def test_user_change_password_wrong_password(self):
+        with self.create_web_shop() as web_shop:
+            web_shop.POST_vsf_user_create({
+                    "customer": CUSTOMER,
+                    "password": "OldPassword",
+                    })
+            token = web_shop.POST_vsf_user_login({
+                    "username": CUSTOMER['email'],
+                    "password": "OldPassword",
+                    })
+
+            with self.assertRaises(LoginException):
+                web_shop.POST_vsf_user_change_password({
+                        "currentPassword": "BadPassword",
+                        "newPassword": "NewPassword",
+                        }, token=token)
+
+    @with_transaction(user=0)
+    def test_user_order_history(self):
+        pool = Pool()
+        Country = pool.get('country.country')
+        Country(name="US", code="US").save()
+        with self.create_web_shop() as web_shop:
+            self.create_product(web_shop)
+            web_shop.POST_vsf_user_create({
+                    "customer": CUSTOMER,
+                    "password": "TopSecretPassword",
+                    })
+            token = web_shop.POST_vsf_user_login({
+                    "username": CUSTOMER['email'],
+                    "password": "TopSecretPassword",
+                    })
+            cart = web_shop.POST_vsf_cart_create(None, token=token)
+            web_shop.POST_vsf_order_create({
+                    'products': [{
+                            'sku': 'CODE',
+                            'qty': 2,
+                            }],
+                    'addressInformation': {
+                        'shippingAddress': ADDRESS,
+                        'billingAddress': ADDRESS_COMPANY,
+                        'shipping_method_code': None,
+                        'shipping_carrier_code': None,
+                        'payment_method_code': 'cashondelivery',
+                        'payment_method_additional': {},
+                        },
+                    }, cart, token=token)
+
+            items = web_shop.GET_vsf_user_order_history(None, token=token)
+
+            self.assertEqual(items, {
+                    'items': [{
+                            'entity_id': ANY,
+                            'increment_id': ANY,
+                            'created_at': ANY,
+                            'customer_firstname': CUSTOMER['firstname'],
+                            'customer_lastname': CUSTOMER['lastname'],
+                            'grand_total': 200,
+                            'status': "Confirmed",
+                            'items': [{
+                                    'name': "Product",
+                                    'sku': 'CODE',
+                                    'price_incl_tax': 100,
+                                    'qty_ordered': 2,
+                                    'row_total_incl_tax': 200,
+                                    }],
+                            }],
+                    })
+
+    @with_transaction(user=0)
+    def test_user_order_history_wrong_token(self):
+        with self.create_web_shop() as web_shop:
+            with self.assertRaises(Unauthorized):
+                web_shop.GET_vsf_user_order_history(None, 'wrong token')
+
+    @with_transaction(user=0)
+    def test_user_me(self):
+        pool = Pool()
+        Country = pool.get('country.country')
+        Country(name="US", code="US").save()
+        with self.create_web_shop() as web_shop:
+            web_shop.POST_vsf_user_create({
+                    "customer": CUSTOMER,
+                    "password": "TopSecretPassword",
+                    })
+            token = web_shop.POST_vsf_user_login({
+                    "username": CUSTOMER['email'],
+                    "password": "TopSecretPassword",
+                    })
+
+            result = web_shop.GET_vsf_user_me(None, token=token)
+
+            data = {'customer': CUSTOMER.copy()}
+            data['customer']['addresses'] = []
+            self.assertEqual(result, data['customer'])
+
+            data = {'customer': CUSTOMER.copy()}
+            data['customer']['addresses'] = [ADDRESS_COMPANY.copy()]
+            result = web_shop.POST_vsf_user_me(data, token=token)
+
+            data['customer']['addresses'][0]['id'] = ANY
+            data['customer']['addresses'][0].pop('region')
+            self.assertEqual(result, data['customer'])
+
+    @with_transaction(user=0)
+    def test_user_me_wrong_token(self):
+        with self.create_web_shop() as web_shop:
+
+            with self.assertRaises(Unauthorized):
+                web_shop.GET_vsf_user_me(None, 'wrong token')
+
+            with self.assertRaises(Unauthorized):
+                web_shop.POST_vsf_user_me({}, 'wrong token')
+
+    @with_transaction(user=0)
+    def test_user_me_change_address(self):
+        pool = Pool()
+        Address = pool.get('party.address')
+        Country = pool.get('country.country')
+        Country(name="US", code="US").save()
+        with self.create_web_shop() as web_shop:
+            web_shop.POST_vsf_user_create({
+                    "customer": CUSTOMER,
+                    "password": "TopSecretPassword",
+                    })
+            token = web_shop.POST_vsf_user_login({
+                    "username": CUSTOMER['email'],
+                    "password": "TopSecretPassword",
+                    })
+            data = {'customer': CUSTOMER.copy()}
+            data['customer']['addresses'] = [ADDRESS_COMPANY]
+            result = web_shop.POST_vsf_user_me(data, token=token)
+
+            data = {'customer': CUSTOMER.copy()}
+            address = ADDRESS.copy()
+            address['lastname'] = "Scott"
+            data['customer']['addresses'] = [address]
+            result = web_shop.POST_vsf_user_me(
+                {"customer": result}, token=token)
+
+            inactive_addresses = Address.search([('active', '=', False)])
+            self.assertEqual(len(inactive_addresses), 1)
+
+    @with_transaction(user=0)
+    def test_stock_check(self):
+        with self.create_web_shop() as web_shop:
+            product = self.create_product(web_shop, quantity=10)
+
+            result = web_shop.GET_vsf_stock_check(None, product.vsf_sku)
+
+            self.assertEqual(result, {
+                    'product_id': product.vsf_identifier.id,
+                    'qty': 10,
+                    'is_in_stock': True,
+                    })
+
+    @with_transaction(user=0)
+    def test_stock_list(self):
+        with self.create_web_shop() as web_shop:
+            product1 = self.create_product(web_shop, quantity=10)
+            product2 = self.create_product(web_shop, quantity=0, code="CODE2")
+
+            result = web_shop.GET_vsf_stock_list(
+                None, ','.join([p.vsf_sku for p in [product1, product2]]))
+
+            self.assertEqual(result, [{
+                        'product_id': product1.vsf_identifier.id,
+                        'qty': 10,
+                        'is_in_stock': True,
+                        }, {
+                        'product_id': product2.vsf_identifier.id,
+                        'qty': 0,
+                        'is_in_stock': False,
+                        }])
+
+    @with_transaction(user=0)
+    def test_cart_create_without_token(self):
+        with self.create_web_shop() as web_shop:
+            cart = web_shop.POST_vsf_cart_create(None)
+
+            self.assertIsInstance(cart, str)
+
+    @with_transaction(user=0)
+    def test_cart_create_with_token(self):
+        with self.create_web_shop() as web_shop:
+            web_shop.POST_vsf_user_create({
+                    "customer": CUSTOMER,
+                    "password": "TopSecretPassword",
+                    })
+            token = web_shop.POST_vsf_user_login({
+                    "username": CUSTOMER['email'],
+                    "password": "TopSecretPassword",
+                    })
+
+            cart = web_shop.POST_vsf_cart_create(None, token=token)
+
+            self.assertIsInstance(cart, int)
+
+    @with_transaction(user=0)
+    def test_cart_pull_without_token(self):
+        with self.create_web_shop() as web_shop:
+            self.create_product(web_shop)
+            cart = web_shop.POST_vsf_cart_create(None)
+            web_shop.POST_vsf_cart_update({
+                    'cartItem': {
+                        'sku': 'CODE',
+                        'qty': 1,
+                        },
+                    }, cart)
+
+            items = web_shop.GET_vsf_cart_pull(None, cart)
+
+            self.assertEqual(items, [{
+                        'item_id': ANY,
+                        'sku': 'CODE',
+                        'qty': 1,
+                        'name': 'Product',
+                        'price': 100,
+                        'product_type': 'simple',
+                        'quote_id': ANY,
+                        'product_option': {
+                            'extension_attributes': {},
+                            },
+                        }])
+
+    @with_transaction(user=0)
+    def test_cart_pull_with_token(self):
+        with self.create_web_shop() as web_shop:
+            self.create_product(web_shop)
+            web_shop.POST_vsf_user_create({
+                    "customer": CUSTOMER,
+                    "password": "TopSecretPassword",
+                    })
+            token = web_shop.POST_vsf_user_login({
+                    "username": CUSTOMER['email'],
+                    "password": "TopSecretPassword",
+                    })
+            cart = web_shop.POST_vsf_cart_create(None, token=token)
+            web_shop.POST_vsf_cart_update({
+                    'cartItem': {
+                        'sku': 'CODE',
+                        'qty': 1,
+                        },
+                    }, cart, token=token)
+
+            items = web_shop.GET_vsf_cart_pull(None, cart, token=token)
+
+            self.assertEqual(items, [{
+                        'item_id': ANY,
+                        'sku': 'CODE',
+                        'qty': 1,
+                        'name': 'Product',
+                        'price': 100,
+                        'product_type': 'simple',
+                        'quote_id': ANY,
+                        'product_option': {
+                            'extension_attributes': {},
+                            },
+                        }])
+
+    @with_transaction(user=0)
+    def test_cart_update_without_token(self):
+        pool = Pool()
+        SaleLine = pool.get('sale.line')
+        with self.create_web_shop() as web_shop:
+            self.create_product(web_shop)
+            cart = web_shop.POST_vsf_cart_create(None)
+
+            item = web_shop.POST_vsf_cart_update({
+                    'cartItem': {
+                        'sku': 'CODE',
+                        'qty': 1,
+                        },
+                    }, cart)
+
+            self.assertEqual(item, {
+                    'item_id': ANY,
+                    'sku': 'CODE',
+                    'qty': 1,
+                    'name': 'Product',
+                    'price': 100,
+                    'product_type': 'simple',
+                    'quote_id': ANY,
+                    'product_option': {
+                        'extension_attributes': {},
+                        },
+                    })
+            sale_lines = SaleLine.search([])
+            self.assertEqual(len(sale_lines), 1)
+
+    @with_transaction(user=0)
+    def test_cart_update_with_token(self):
+        pool = Pool()
+        SaleLine = pool.get('sale.line')
+        with self.create_web_shop() as web_shop:
+            self.create_product(web_shop)
+            web_shop.POST_vsf_user_create({
+                    "customer": CUSTOMER,
+                    "password": "TopSecretPassword",
+                    })
+            token = web_shop.POST_vsf_user_login({
+                    "username": CUSTOMER['email'],
+                    "password": "TopSecretPassword",
+                    })
+            cart = web_shop.POST_vsf_cart_create(None, token=token)
+
+            item = web_shop.POST_vsf_cart_update({
+                    'cartItem': {
+                        'sku': 'CODE',
+                        'qty': 1,
+                        },
+                    }, cart, token=token)
+
+            self.assertEqual(item, {
+                    'item_id': ANY,
+                    'sku': 'CODE',
+                    'qty': 1,
+                    'name': 'Product',
+                    'price': 100,
+                    'product_type': 'simple',
+                    'quote_id': ANY,
+                    'product_option': {
+                        'extension_attributes': {},
+                        },
+                    })
+            sale_lines = SaleLine.search([])
+            self.assertEqual(len(sale_lines), 1)
+
+    @with_transaction(user=0)
+    def test_cart_update2(self):
+        pool = Pool()
+        SaleLine = pool.get('sale.line')
+        with self.create_web_shop() as web_shop:
+            self.create_product(web_shop)
+            cart = web_shop.POST_vsf_cart_create(None)
+            item = web_shop.POST_vsf_cart_update({
+                    'cartItem': {
+                        'sku': 'CODE',
+                        'qty': 1,
+                        },
+                    }, cart)
+
+            item = web_shop.POST_vsf_cart_update({
+                    'cartItem': {
+                        'sku': 'CODE',
+                        'qty': 2,
+                        'item_id': item['item_id'],
+                        },
+                    }, cart)
+
+            self.assertEqual(item, {
+                    'item_id': ANY,
+                    'sku': 'CODE',
+                    'qty': 2,
+                    'name': 'Product',
+                    'price': 100,
+                    'product_type': 'simple',
+                    'quote_id': ANY,
+                    'product_option': {
+                        'extension_attributes': {},
+                        },
+                    })
+            sale_lines = SaleLine.search([])
+            self.assertEqual(len(sale_lines), 1)
+
+    @with_transaction(user=0)
+    def test_cart_delete(self):
+        pool = Pool()
+        SaleLine = pool.get('sale.line')
+        with self.create_web_shop() as web_shop:
+            self.create_product(web_shop)
+            cart = web_shop.POST_vsf_cart_create(None)
+            item = web_shop.POST_vsf_cart_update({
+                    'cartItem': {
+                        'sku': 'CODE',
+                        'qty': 1,
+                        },
+                    }, cart)
+
+            result = web_shop.POST_vsf_cart_delete({
+                    'cartItem': {
+                        'sku': 'CODE',
+                        'qty': 1,
+                        'item_id': item['item_id'],
+                        },
+                    }, cart)
+
+            self.assertTrue(result)
+            sale_lines = SaleLine.search([])
+            self.assertEqual(len(sale_lines), 0)
+
+    @with_transaction(user=0)
+    def test_cart_apply_coupon(self):
+        with self.create_web_shop() as web_shop:
+            self.create_coupon()
+            cart = web_shop.POST_vsf_cart_create(None)
+
+            result = web_shop.POST_vsf_cart_apply_coupon(None, cart, 'CODE')
+
+            self.assertTrue(result)
+
+    @with_transaction(user=0)
+    def test_cart_delete_coupon(self):
+        with self.create_web_shop() as web_shop:
+            self.create_coupon()
+            cart = web_shop.POST_vsf_cart_create(None)
+            web_shop.POST_vsf_cart_apply_coupon(None, cart, 'CODE')
+
+            result = web_shop.POST_vsf_cart_delete_coupon(None, cart)
+
+            self.assertTrue(result)
+
+    @with_transaction(user=0)
+    def test_cart_coupon(self):
+        with self.create_web_shop() as web_shop:
+            self.create_coupon()
+            cart = web_shop.POST_vsf_cart_create(None)
+            web_shop.POST_vsf_cart_apply_coupon(None, cart, 'CODE')
+
+            result = web_shop.POST_vsf_cart_coupon(None, cart)
+
+            self.assertEqual(result, 'CODE')
+
+    @with_transaction(user=0)
+    def test_cart_coupon_empty(self):
+        with self.create_web_shop() as web_shop:
+            cart = web_shop.POST_vsf_cart_create(None)
+
+            result = web_shop.POST_vsf_cart_coupon(None, cart)
+
+            self.assertEqual(result, '')
+
+    @with_transaction(user=0)
+    def test_cart_totals(self):
+        with self.create_web_shop() as web_shop:
+            self.create_product(web_shop)
+            cart = web_shop.POST_vsf_cart_create(None)
+            web_shop.POST_vsf_cart_update({
+                    'cartItem': {
+                        'sku': 'CODE',
+                        'qty': 1,
+                        },
+                    }, cart)
+
+            totals = web_shop.GET_vsf_cart_totals(None, cart)
+
+            self.assertEqual(totals, {
+                    'grand_total': 100,
+                    'items': [{
+                            'item_id': ANY,
+                            'sku': 'CODE',
+                            'qty': 1,
+                            'name': 'Product',
+                            'price': 100,
+                            'product_type': 'simple',
+                            'quote_id': ANY,
+                            'product_option': {
+                                'extension_attributes': {
+                                    },
+                                },
+                            }],
+                    'total_segments': [{
+                            'code': 'subtotal',
+                            'title': ANY,
+                            'value': 100,
+                            }, {
+                            'code': 'tax',
+                            'title': ANY,
+                            'value': 0,
+                            }, {
+                            'code': 'grand_total',
+                            'title': ANY,
+                            'value': 100,
+                            }],
+                    })
+
+    @with_transaction(user=0)
+    def test_cart_payment_methods(self):
+        with self.create_web_shop() as web_shop:
+            cart = web_shop.POST_vsf_cart_create(None)
+
+            result = web_shop.GET_vsf_cart_payment_methods(None, cart)
+
+            self.assertEqual(result, [])
+
+    @with_transaction(user=0)
+    def test_cart_shipping_methods(self):
+        pool = Pool()
+        Country = pool.get('country.country')
+        Country(name="US", code="US").save()
+        with self.create_web_shop() as web_shop:
+            carrier = self.create_carrier()
+            self.create_product(web_shop)
+            cart = web_shop.POST_vsf_cart_create(None)
+            web_shop.POST_vsf_cart_update({
+                    'cartItem': {
+                        'sku': 'CODE',
+                        'qty': 1,
+                        },
+                    }, cart)
+
+            methods = web_shop.POST_vsf_cart_shipping_methods(
+                {'address': {'country_id': 'US'}}, cart)
+
+            self.assertEqual(methods, [{
+                        'carrier_code': str(carrier.id),
+                        'method_code': str(carrier.id),
+                        'carrier_title': "Carrier",
+                        'method_title': "Delivery",
+                        'price_incl_tax': Decimal(10),
+                        }])
+
+    @with_transaction(user=0)
+    def test_cart_shipping_information(self):
+        pool = Pool()
+        Country = pool.get('country.country')
+        Country(name="US", code="US").save()
+        with self.create_web_shop() as web_shop:
+            carrier = self.create_carrier()
+            self.create_product(web_shop)
+            cart = web_shop.POST_vsf_cart_create(None)
+            web_shop.POST_vsf_cart_update({
+                    'cartItem': {
+                        'sku': 'CODE',
+                        'qty': 1,
+                        },
+                    }, cart)
+
+            information = web_shop.POST_vsf_cart_shipping_information({
+                    'addressInformation': {
+                        'shipping_address': {
+                            'country_id': 'US',
+                            },
+                        'shipping_method_code': str(carrier.id),
+                        'shipping_carrier_code': str(carrier.id),
+                        },
+                    }, cart)
+
+            self.assertEqual(information, {
+                    'grand_total': 110,
+                    'items': ANY,
+                    'total_segments': [{
+                            'code': 'subtotal',
+                            'title': ANY,
+                            'value': 100,
+                            }, {
+                            'code': 'shipping',
+                            'title': ANY,
+                            'value': 10,
+                            }, {
+                            'code': 'tax',
+                            'title': ANY,
+                            'value': 0,
+                            }, {
+                            'code': 'grand_total',
+                            'title': ANY,
+                            'value': 110,
+                            }],
+                    })
+
+    @with_transaction(user=0)
+    def test_order_create(self):
+        pool = Pool()
+        Sale = pool.get('sale.sale')
+        Country = pool.get('country.country')
+        Country(name="US", code="US").save()
+        with self.create_web_shop() as web_shop:
+            carrier = self.create_carrier()
+            self.create_product(web_shop)
+            web_shop.POST_vsf_user_create({
+                    "customer": CUSTOMER,
+                    "password": "TopSecretPassword",
+                    })
+            token = web_shop.POST_vsf_user_login({
+                    "username": CUSTOMER['email'],
+                    "password": "TopSecretPassword",
+                    })
+            cart = web_shop.POST_vsf_cart_create(None, token=token)
+            web_shop.POST_vsf_cart_update({
+                    'cartItem': {
+                        'sku': 'CODE',
+                        'qty': 1,
+                        },
+                    }, cart, token=token)
+
+            result = web_shop.POST_vsf_order_create({
+                    'products': [{
+                            'sku': 'CODE',
+                            'qty': 1,
+                            }],
+                    'addressInformation': {
+                        'shippingAddress': ADDRESS,
+                        'billingAddress': ADDRESS_COMPANY,
+                        'shipping_method_code': str(carrier.id),
+                        'shipping_carrier_code': str(carrier.id),
+                        'payment_method_code': 'cashondelivery',
+                        'payment_method_additional': {},
+                        },
+                    }, cart, token=token)
+
+            self.assertEqual(result, 'OK')
+
+            sale, = Sale.search([])
+            self.assertEqual(sale.state, 'confirmed')
+            self.assertEqual(len(sale.lines), 2)
+            self.assertEqual(sale.total_amount, Decimal(110))
+
+    @with_transaction(user=0)
+    def test_order_create_from_guest(self):
+        pool = Pool()
+        Sale = pool.get('sale.sale')
+        Country = pool.get('country.country')
+        Country(name="US", code="US").save()
+        with self.create_web_shop() as web_shop:
+            carrier = self.create_carrier()
+            self.create_product(web_shop)
+            cart = web_shop.POST_vsf_cart_create(None)
+            web_shop.POST_vsf_cart_update({
+                    'cartItem': {
+                        'sku': 'CODE',
+                        'qty': 1,
+                        },
+                    }, cart)
+            web_shop.POST_vsf_user_create({
+                    "customer": CUSTOMER,
+                    "password": "TopSecretPassword",
+                    })
+            token = web_shop.POST_vsf_user_login({
+                    "username": CUSTOMER['email'],
+                    "password": "TopSecretPassword",
+                    })
+            result = web_shop.POST_vsf_order_create({
+                    'products': [{
+                            'sku': 'CODE',
+                            'qty': 1,
+                            }],
+                    'addressInformation': {
+                        'shippingAddress': ADDRESS,
+                        'billingAddress': ADDRESS_COMPANY,
+                        'shipping_method_code': str(carrier.id),
+                        'shipping_carrier_code': str(carrier.id),
+                        'payment_method_code': 'cashondelivery',
+                        'payment_method_additional': {},
+                        },
+                    }, cart, token=token)
+
+            self.assertEqual(result, 'OK')
+
+            sale, = Sale.search([])
+            self.assertNotEqual(sale.party, web_shop.guest_party)
+            self.assertEqual(sale.state, 'confirmed')
+            self.assertEqual(len(sale.lines), 2)
+            self.assertEqual(sale.total_amount, Decimal(110))
+
+
+del ModuleTestCase
diff -r 5e40af829b45 -r a3e42f0ecef5 tests/test_scenario.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test_scenario.py    Sat Apr 16 18:30:20 2022 +0200
@@ -0,0 +1,22 @@
+# This file is part of Tryton.  The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+import doctest
+import glob
+import os
+
+from trytond.tests.test_tryton import doctest_checker, doctest_teardown
+
+
+def load_tests(loader, tests, pattern):
+    cwd = os.getcwd()
+    try:
+        os.chdir(os.path.dirname(__file__))
+        for scenario in glob.glob('*.rst'):
+            tests.addTests(doctest.DocFileSuite(
+                    scenario, tearDown=doctest_teardown, encoding='utf-8',
+                    checker=doctest_checker,
+                    optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+    finally:
+        os.chdir(cwd)
+    return tests
diff -r 5e40af829b45 -r a3e42f0ecef5 tests/test_web_shop_vue_storefront.py
--- a/tests/test_web_shop_vue_storefront.py     Sun Apr 10 19:11:40 2022 +0200
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,917 +0,0 @@
-# This file is part of Tryton.  The COPYRIGHT file at the top level of
-# this repository contains the full copyright notices and license terms.
-
-import doctest
-import unittest
-from contextlib import contextmanager
-from decimal import Decimal
-from unittest.mock import ANY, patch
-
-from werkzeug.exceptions import Unauthorized
-
-from trytond.modules.company.tests import (
-    CompanyTestMixin, create_company, set_company)
-from trytond.pool import Pool
-from trytond.tests.test_tryton import (
-    ModuleTestCase, doctest_checker, doctest_teardown)
-from trytond.tests.test_tryton import suite as test_suite
-from trytond.tests.test_tryton import with_transaction
-from trytond.transaction import Transaction
-
-from ..exceptions import LoginException
-
-CUSTOMER = {
-    'email': '[email protected]',
-    'firstname': 'John',
-    'lastname': 'Doe',
-    }
-ADDRESS = {
-    'region': {
-        'region': None,
-        },
-    'country_id': "US",
-    'street': [
-        "Cliff Street",
-        "300"
-        ],
-    'telephone': '+1 202-555-0148',
-    'postcode': '18503',
-    'city': "Scranton",
-    'firstname': CUSTOMER['firstname'],
-    'lastname': CUSTOMER['lastname'],
-    }
-ADDRESS_COMPANY = ADDRESS.copy()
-ADDRESS_COMPANY['company'] = 'Saber'
-ADDRESS_COMPANY['vat_id'] = 'BE0500923836'
-
-
-class WebVueStorefrontTestCase(CompanyTestMixin, ModuleTestCase):
-    'Test Web Shop Vue Storefront module'
-    module = 'web_shop_vue_storefront'
-    extras = [
-        'product_attribute',
-        'product_image',
-        'sale_promotion_coupon',
-        'sale_shipment_cost',
-        'carrier',
-        ]
-    maxDiff = None
-
-    @contextmanager
-    def create_web_shop(self):
-        pool = Pool()
-        WebShop = pool.get('web.shop')
-        Location = pool.get('stock.location')
-        Party = pool.get('party.party')
-
-        company = create_company()
-        warehouse, = Location.search([('type', '=', 'warehouse')], limit=1)
-        web_shop = WebShop(name="Web Shop")
-        web_shop.company = company
-        web_shop.currency = company.currency
-        web_shop.warehouses = [warehouse]
-        web_shop.type = 'vsf'
-        web_shop.guest_party = Party(name="Guest")
-        web_shop.save()
-        with Transaction().set_context(**web_shop.get_context()):
-            yield web_shop
-
-    def create_product(self, web_shop, quantity=0, code="CODE"):
-        pool = Pool()
-        Template = pool.get('product.template')
-        Product = pool.get('product.product')
-        Category = pool.get('product.category')
-        Uom = pool.get('product.uom')
-        Location = pool.get('stock.location')
-        Move = pool.get('stock.move')
-
-        unit, = Uom.search([('name', '=', "Unit")], limit=1)
-        template = Template(name="Product")
-        template.type = 'goods'
-        template.list_price = Decimal(100)
-        template.default_uom = unit
-        template.salable = True
-        template.sale_uom = unit
-        template.products = [Product(suffix_code=code, web_shops=[web_shop])]
-        template.account_category = Category(name="Category", accounting=True)
-        template.save()
-        product, = template.products
-
-        if quantity:
-            supplier, = Location.search([('code', '=', 'SUP')])
-            storage, = Location.search([('code', '=', 'STO')])
-            with set_company(web_shop.company):
-                move = Move(product=product)
-                move.uom = unit
-                move.quantity = quantity
-                move.from_location = supplier
-                move.to_location = storage
-                move.unit_price = Decimal(50)
-                move.save()
-                Move.do([move])
-        Product.set_vsf_identifier([product])
-        return product
-
-    def create_coupon(self, code='CODE'):
-        pool = Pool()
-        Promotion = pool.get('sale.promotion')
-        Coupon = pool.get('sale.promotion.coupon')
-
-        promotion = Promotion(name="10%")
-        promotion.formula = '0.9 * unit_price'
-        promotion.coupons = coupon, = [Coupon(name="Promo")]
-        coupon.numbers = [{'number': code}]
-        promotion.save()
-
-    def create_carrier(
-            self, name='Carrier', product_name="Delivery",
-            price=Decimal('10')):
-        pool = Pool()
-        Carrier = pool.get('carrier')
-        Party = pool.get('party.party')
-        Template = pool.get('product.template')
-        Product = pool.get('product.product')
-        Category = pool.get('product.category')
-        Uom = pool.get('product.uom')
-
-        unit, = Uom.search([('name', '=', "Unit")], limit=1)
-        template = Template(name=product_name)
-        template.type = 'service'
-        template.list_price = price
-        template.default_uom = template.sale_uom = unit
-        template.salable = True
-        template.products = [Product()]
-        template.account_category = Category(name="Service", accounting=True)
-        template.save()
-
-        carrier = Carrier()
-        carrier.party = Party(name=name)
-        carrier.carrier_product, = template.products
-        carrier.save()
-        return carrier
-
-    @with_transaction(user=0)
-    def test_user_create(self):
-        pool = Pool()
-        User = pool.get('web.user')
-        with self.create_web_shop() as web_shop:
-            result = web_shop.POST_vsf_user_create({
-                    "customer": CUSTOMER,
-                    "password": "SecretPassword"
-                    })
-            users = User.search([])
-
-            self.assertEqual(result, {
-                    "email": CUSTOMER['email'],
-                    "firstname": CUSTOMER['firstname'],
-                    "lastname": CUSTOMER['lastname'],
-                    "addresses": [],
-                    })
-            self.assertEqual(len(users), 1)
-
-    @with_transaction(user=0)
-    def test_user_login(self):
-        with self.create_web_shop() as web_shop:
-            web_shop.POST_vsf_user_create({
-                    "customer": CUSTOMER,
-                    "password": "TopSecretPassword",
-                    })
-
-            result = web_shop.POST_vsf_user_login({
-                    "username": CUSTOMER['email'],
-                    "password": "TopSecretPassword",
-                    })
-
-            self.assertTrue(result)
-
-    @with_transaction(user=0)
-    def test_user_login_wrong_password(self):
-        with self.create_web_shop() as web_shop:
-            web_shop.POST_vsf_user_create({
-                    "customer": CUSTOMER,
-                    "password": "TopSecretPassword",
-                    })
-
-            with self.assertRaises(LoginException):
-                web_shop.POST_vsf_user_login({
-                        "username": CUSTOMER['email'],
-                        "password": "Bad",
-                        })
-
-    @with_transaction(user=0)
-    def test_user_reset_password(self):
-        pool = Pool()
-        User = pool.get('web.user')
-        with self.create_web_shop() as web_shop:
-            web_shop.POST_vsf_user_create({
-                    "customer": CUSTOMER,
-                    "password": "SecretPassword",
-                    })
-
-            with patch.object(User, 'reset_password') as reset_password:
-                result = web_shop.POST_vsf_user_reset_password({
-                        "email": CUSTOMER['email'],
-                        })
-
-            self.assertFalse(result)
-            reset_password.assert_called_once_with(ANY)
-
-    @with_transaction(user=0)
-    def test_user_change_password(self):
-        with self.create_web_shop() as web_shop:
-            web_shop.POST_vsf_user_create({
-                    "customer": CUSTOMER,
-                    "password": "OldPassword",
-                    })
-            token = web_shop.POST_vsf_user_login({
-                    "username": CUSTOMER['email'],
-                    "password": "OldPassword",
-                    })
-
-            result = web_shop.POST_vsf_user_change_password({
-                    "currentPassword": "OldPassword",
-                    "newPassword": "NewPassword",
-                    }, token=token)
-
-            self.assertFalse(result)
-
-    @with_transaction(user=0)
-    def test_user_change_password_wrong_token(self):
-        with self.create_web_shop() as web_shop:
-            web_shop.POST_vsf_user_create({
-                    "customer": CUSTOMER,
-                    "password": "OldPassword",
-                    })
-
-            with self.assertRaises(Unauthorized):
-                web_shop.POST_vsf_user_change_password({
-                        "currentPassword": "BadPassword",
-                        "newPassword": "NewPassword",
-                        }, 'wrong token')
-
-    @with_transaction(user=0)
-    def test_user_change_password_wrong_password(self):
-        with self.create_web_shop() as web_shop:
-            web_shop.POST_vsf_user_create({
-                    "customer": CUSTOMER,
-                    "password": "OldPassword",
-                    })
-            token = web_shop.POST_vsf_user_login({
-                    "username": CUSTOMER['email'],
-                    "password": "OldPassword",
-                    })
-
-            with self.assertRaises(LoginException):
-                web_shop.POST_vsf_user_change_password({
-                        "currentPassword": "BadPassword",
-                        "newPassword": "NewPassword",
-                        }, token=token)
-
-    @with_transaction(user=0)
-    def test_user_order_history(self):
-        pool = Pool()
-        Country = pool.get('country.country')
-        Country(name="US", code="US").save()
-        with self.create_web_shop() as web_shop:
-            self.create_product(web_shop)
-            web_shop.POST_vsf_user_create({
-                    "customer": CUSTOMER,
-                    "password": "TopSecretPassword",
-                    })
-            token = web_shop.POST_vsf_user_login({
-                    "username": CUSTOMER['email'],
-                    "password": "TopSecretPassword",
-                    })
-            cart = web_shop.POST_vsf_cart_create(None, token=token)
-            web_shop.POST_vsf_order_create({
-                    'products': [{
-                            'sku': 'CODE',
-                            'qty': 2,
-                            }],
-                    'addressInformation': {
-                        'shippingAddress': ADDRESS,
-                        'billingAddress': ADDRESS_COMPANY,
-                        'shipping_method_code': None,
-                        'shipping_carrier_code': None,
-                        'payment_method_code': 'cashondelivery',
-                        'payment_method_additional': {},
-                        },
-                    }, cart, token=token)
-
-            items = web_shop.GET_vsf_user_order_history(None, token=token)
-
-            self.assertEqual(items, {
-                    'items': [{
-                            'entity_id': ANY,
-                            'increment_id': ANY,
-                            'created_at': ANY,
-                            'customer_firstname': CUSTOMER['firstname'],
-                            'customer_lastname': CUSTOMER['lastname'],
-                            'grand_total': 200,
-                            'status': "Confirmed",
-                            'items': [{
-                                    'name': "Product",
-                                    'sku': 'CODE',
-                                    'price_incl_tax': 100,
-                                    'qty_ordered': 2,
-                                    'row_total_incl_tax': 200,
-                                    }],
-                            }],
-                    })
-
-    @with_transaction(user=0)
-    def test_user_order_history_wrong_token(self):
-        with self.create_web_shop() as web_shop:
-            with self.assertRaises(Unauthorized):
-                web_shop.GET_vsf_user_order_history(None, 'wrong token')
-
-    @with_transaction(user=0)
-    def test_user_me(self):
-        pool = Pool()
-        Country = pool.get('country.country')
-        Country(name="US", code="US").save()
-        with self.create_web_shop() as web_shop:
-            web_shop.POST_vsf_user_create({
-                    "customer": CUSTOMER,
-                    "password": "TopSecretPassword",
-                    })
-            token = web_shop.POST_vsf_user_login({
-                    "username": CUSTOMER['email'],
-                    "password": "TopSecretPassword",
-                    })
-
-            result = web_shop.GET_vsf_user_me(None, token=token)
-
-            data = {'customer': CUSTOMER.copy()}
-            data['customer']['addresses'] = []
-            self.assertEqual(result, data['customer'])
-
-            data = {'customer': CUSTOMER.copy()}
-            data['customer']['addresses'] = [ADDRESS_COMPANY.copy()]
-            result = web_shop.POST_vsf_user_me(data, token=token)
-
-            data['customer']['addresses'][0]['id'] = ANY
-            data['customer']['addresses'][0].pop('region')
-            self.assertEqual(result, data['customer'])
-
-    @with_transaction(user=0)
-    def test_user_me_wrong_token(self):
-        with self.create_web_shop() as web_shop:
-
-            with self.assertRaises(Unauthorized):
-                web_shop.GET_vsf_user_me(None, 'wrong token')
-
-            with self.assertRaises(Unauthorized):
-                web_shop.POST_vsf_user_me({}, 'wrong token')
-
-    @with_transaction(user=0)
-    def test_user_me_change_address(self):
-        pool = Pool()
-        Address = pool.get('party.address')
-        Country = pool.get('country.country')
-        Country(name="US", code="US").save()
-        with self.create_web_shop() as web_shop:
-            web_shop.POST_vsf_user_create({
-                    "customer": CUSTOMER,
-                    "password": "TopSecretPassword",
-                    })
-            token = web_shop.POST_vsf_user_login({
-                    "username": CUSTOMER['email'],
-                    "password": "TopSecretPassword",
-                    })
-            data = {'customer': CUSTOMER.copy()}
-            data['customer']['addresses'] = [ADDRESS_COMPANY]
-            result = web_shop.POST_vsf_user_me(data, token=token)
-
-            data = {'customer': CUSTOMER.copy()}
-            address = ADDRESS.copy()
-            address['lastname'] = "Scott"
-            data['customer']['addresses'] = [address]
-            result = web_shop.POST_vsf_user_me(
-                {"customer": result}, token=token)
-
-            inactive_addresses = Address.search([('active', '=', False)])
-            self.assertEqual(len(inactive_addresses), 1)
-
-    @with_transaction(user=0)
-    def test_stock_check(self):
-        with self.create_web_shop() as web_shop:
-            product = self.create_product(web_shop, quantity=10)
-
-            result = web_shop.GET_vsf_stock_check(None, product.vsf_sku)
-
-            self.assertEqual(result, {
-                    'product_id': product.vsf_identifier.id,
-                    'qty': 10,
-                    'is_in_stock': True,
-                    })
-
-    @with_transaction(user=0)
-    def test_stock_list(self):
-        with self.create_web_shop() as web_shop:
-            product1 = self.create_product(web_shop, quantity=10)
-            product2 = self.create_product(web_shop, quantity=0, code="CODE2")
-
-            result = web_shop.GET_vsf_stock_list(
-                None, ','.join([p.vsf_sku for p in [product1, product2]]))
-
-            self.assertEqual(result, [{
-                        'product_id': product1.vsf_identifier.id,
-                        'qty': 10,
-                        'is_in_stock': True,
-                        }, {
-                        'product_id': product2.vsf_identifier.id,
-                        'qty': 0,
-                        'is_in_stock': False,
-                        }])
-
-    @with_transaction(user=0)
-    def test_cart_create_without_token(self):
-        with self.create_web_shop() as web_shop:
-            cart = web_shop.POST_vsf_cart_create(None)
-
-            self.assertIsInstance(cart, str)
-
-    @with_transaction(user=0)
-    def test_cart_create_with_token(self):
-        with self.create_web_shop() as web_shop:
-            web_shop.POST_vsf_user_create({
-                    "customer": CUSTOMER,
-                    "password": "TopSecretPassword",
-                    })
-            token = web_shop.POST_vsf_user_login({
-                    "username": CUSTOMER['email'],
-                    "password": "TopSecretPassword",
-                    })
-
-            cart = web_shop.POST_vsf_cart_create(None, token=token)
-
-            self.assertIsInstance(cart, int)
-
-    @with_transaction(user=0)
-    def test_cart_pull_without_token(self):
-        with self.create_web_shop() as web_shop:
-            self.create_product(web_shop)
-            cart = web_shop.POST_vsf_cart_create(None)
-            web_shop.POST_vsf_cart_update({
-                    'cartItem': {
-                        'sku': 'CODE',
-                        'qty': 1,
-                        },
-                    }, cart)
-
-            items = web_shop.GET_vsf_cart_pull(None, cart)
-
-            self.assertEqual(items, [{
-                        'item_id': ANY,
-                        'sku': 'CODE',
-                        'qty': 1,
-                        'name': 'Product',
-                        'price': 100,
-                        'product_type': 'simple',
-                        'quote_id': ANY,
-                        'product_option': {
-                            'extension_attributes': {},
-                            },
-                        }])
-
-    @with_transaction(user=0)
-    def test_cart_pull_with_token(self):
-        with self.create_web_shop() as web_shop:
-            self.create_product(web_shop)
-            web_shop.POST_vsf_user_create({
-                    "customer": CUSTOMER,
-                    "password": "TopSecretPassword",
-                    })
-            token = web_shop.POST_vsf_user_login({
-                    "username": CUSTOMER['email'],
-                    "password": "TopSecretPassword",
-                    })
-            cart = web_shop.POST_vsf_cart_create(None, token=token)
-            web_shop.POST_vsf_cart_update({
-                    'cartItem': {
-                        'sku': 'CODE',
-                        'qty': 1,
-                        },
-                    }, cart, token=token)
-
-            items = web_shop.GET_vsf_cart_pull(None, cart, token=token)
-
-            self.assertEqual(items, [{
-                        'item_id': ANY,
-                        'sku': 'CODE',
-                        'qty': 1,
-                        'name': 'Product',
-                        'price': 100,
-                        'product_type': 'simple',
-                        'quote_id': ANY,
-                        'product_option': {
-                            'extension_attributes': {},
-                            },
-                        }])
-
-    @with_transaction(user=0)
-    def test_cart_update_without_token(self):
-        pool = Pool()
-        SaleLine = pool.get('sale.line')
-        with self.create_web_shop() as web_shop:
-            self.create_product(web_shop)
-            cart = web_shop.POST_vsf_cart_create(None)
-
-            item = web_shop.POST_vsf_cart_update({
-                    'cartItem': {
-                        'sku': 'CODE',
-                        'qty': 1,
-                        },
-                    }, cart)
-
-            self.assertEqual(item, {
-                    'item_id': ANY,
-                    'sku': 'CODE',
-                    'qty': 1,
-                    'name': 'Product',
-                    'price': 100,
-                    'product_type': 'simple',
-                    'quote_id': ANY,
-                    'product_option': {
-                        'extension_attributes': {},
-                        },
-                    })
-            sale_lines = SaleLine.search([])
-            self.assertEqual(len(sale_lines), 1)
-
-    @with_transaction(user=0)
-    def test_cart_update_with_token(self):
-        pool = Pool()
-        SaleLine = pool.get('sale.line')
-        with self.create_web_shop() as web_shop:
-            self.create_product(web_shop)
-            web_shop.POST_vsf_user_create({
-                    "customer": CUSTOMER,
-                    "password": "TopSecretPassword",
-                    })
-            token = web_shop.POST_vsf_user_login({
-                    "username": CUSTOMER['email'],
-                    "password": "TopSecretPassword",
-                    })
-            cart = web_shop.POST_vsf_cart_create(None, token=token)
-
-            item = web_shop.POST_vsf_cart_update({
-                    'cartItem': {
-                        'sku': 'CODE',
-                        'qty': 1,
-                        },
-                    }, cart, token=token)
-
-            self.assertEqual(item, {
-                    'item_id': ANY,
-                    'sku': 'CODE',
-                    'qty': 1,
-                    'name': 'Product',
-                    'price': 100,
-                    'product_type': 'simple',
-                    'quote_id': ANY,
-                    'product_option': {
-                        'extension_attributes': {},
-                        },
-                    })
-            sale_lines = SaleLine.search([])
-            self.assertEqual(len(sale_lines), 1)
-
-    @with_transaction(user=0)
-    def test_cart_update2(self):
-        pool = Pool()
-        SaleLine = pool.get('sale.line')
-        with self.create_web_shop() as web_shop:
-            self.create_product(web_shop)
-            cart = web_shop.POST_vsf_cart_create(None)
-            item = web_shop.POST_vsf_cart_update({
-                    'cartItem': {
-                        'sku': 'CODE',
-                        'qty': 1,
-                        },
-                    }, cart)
-
-            item = web_shop.POST_vsf_cart_update({
-                    'cartItem': {
-                        'sku': 'CODE',
-                        'qty': 2,
-                        'item_id': item['item_id'],
-                        },
-                    }, cart)
-
-            self.assertEqual(item, {
-                    'item_id': ANY,
-                    'sku': 'CODE',
-                    'qty': 2,
-                    'name': 'Product',
-                    'price': 100,
-                    'product_type': 'simple',
-                    'quote_id': ANY,
-                    'product_option': {
-                        'extension_attributes': {},
-                        },
-                    })
-            sale_lines = SaleLine.search([])
-            self.assertEqual(len(sale_lines), 1)
-
-    @with_transaction(user=0)
-    def test_cart_delete(self):
-        pool = Pool()
-        SaleLine = pool.get('sale.line')
-        with self.create_web_shop() as web_shop:
-            self.create_product(web_shop)
-            cart = web_shop.POST_vsf_cart_create(None)
-            item = web_shop.POST_vsf_cart_update({
-                    'cartItem': {
-                        'sku': 'CODE',
-                        'qty': 1,
-                        },
-                    }, cart)
-
-            result = web_shop.POST_vsf_cart_delete({
-                    'cartItem': {
-                        'sku': 'CODE',
-                        'qty': 1,
-                        'item_id': item['item_id'],
-                        },
-                    }, cart)
-
-            self.assertTrue(result)
-            sale_lines = SaleLine.search([])
-            self.assertEqual(len(sale_lines), 0)
-
-    @with_transaction(user=0)
-    def test_cart_apply_coupon(self):
-        with self.create_web_shop() as web_shop:
-            self.create_coupon()
-            cart = web_shop.POST_vsf_cart_create(None)
-
-            result = web_shop.POST_vsf_cart_apply_coupon(None, cart, 'CODE')
-
-            self.assertTrue(result)
-
-    @with_transaction(user=0)
-    def test_cart_delete_coupon(self):
-        with self.create_web_shop() as web_shop:
-            self.create_coupon()
-            cart = web_shop.POST_vsf_cart_create(None)
-            web_shop.POST_vsf_cart_apply_coupon(None, cart, 'CODE')
-
-            result = web_shop.POST_vsf_cart_delete_coupon(None, cart)
-
-            self.assertTrue(result)
-
-    @with_transaction(user=0)
-    def test_cart_coupon(self):
-        with self.create_web_shop() as web_shop:
-            self.create_coupon()
-            cart = web_shop.POST_vsf_cart_create(None)
-            web_shop.POST_vsf_cart_apply_coupon(None, cart, 'CODE')
-
-            result = web_shop.POST_vsf_cart_coupon(None, cart)
-
-            self.assertEqual(result, 'CODE')
-
-    @with_transaction(user=0)
-    def test_cart_coupon_empty(self):
-        with self.create_web_shop() as web_shop:
-            cart = web_shop.POST_vsf_cart_create(None)
-
-            result = web_shop.POST_vsf_cart_coupon(None, cart)
-
-            self.assertEqual(result, '')
-
-    @with_transaction(user=0)
-    def test_cart_totals(self):
-        with self.create_web_shop() as web_shop:
-            self.create_product(web_shop)
-            cart = web_shop.POST_vsf_cart_create(None)
-            web_shop.POST_vsf_cart_update({
-                    'cartItem': {
-                        'sku': 'CODE',
-                        'qty': 1,
-                        },
-                    }, cart)
-
-            totals = web_shop.GET_vsf_cart_totals(None, cart)
-
-            self.assertEqual(totals, {
-                    'grand_total': 100,
-                    'items': [{
-                            'item_id': ANY,
-                            'sku': 'CODE',
-                            'qty': 1,
-                            'name': 'Product',
-                            'price': 100,
-                            'product_type': 'simple',
-                            'quote_id': ANY,
-                            'product_option': {
-                                'extension_attributes': {
-                                    },
-                                },
-                            }],
-                    'total_segments': [{
-                            'code': 'subtotal',
-                            'title': ANY,
-                            'value': 100,
-                            }, {
-                            'code': 'tax',
-                            'title': ANY,
-                            'value': 0,
-                            }, {
-                            'code': 'grand_total',
-                            'title': ANY,
-                            'value': 100,
-                            }],
-                    })
-
-    @with_transaction(user=0)
-    def test_cart_payment_methods(self):
-        with self.create_web_shop() as web_shop:
-            cart = web_shop.POST_vsf_cart_create(None)
-
-            result = web_shop.GET_vsf_cart_payment_methods(None, cart)
-
-            self.assertEqual(result, [])
-
-    @with_transaction(user=0)
-    def test_cart_shipping_methods(self):
-        pool = Pool()
-        Country = pool.get('country.country')
-        Country(name="US", code="US").save()
-        with self.create_web_shop() as web_shop:
-            carrier = self.create_carrier()
-            self.create_product(web_shop)
-            cart = web_shop.POST_vsf_cart_create(None)
-            web_shop.POST_vsf_cart_update({
-                    'cartItem': {
-                        'sku': 'CODE',
-                        'qty': 1,
-                        },
-                    }, cart)
-
-            methods = web_shop.POST_vsf_cart_shipping_methods(
-                {'address': {'country_id': 'US'}}, cart)
-
-            self.assertEqual(methods, [{
-                        'carrier_code': str(carrier.id),
-                        'method_code': str(carrier.id),
-                        'carrier_title': "Carrier",
-                        'method_title': "Delivery",
-                        'price_incl_tax': Decimal(10),
-                        }])
-
-    @with_transaction(user=0)
-    def test_cart_shipping_information(self):
-        pool = Pool()
-        Country = pool.get('country.country')
-        Country(name="US", code="US").save()
-        with self.create_web_shop() as web_shop:
-            carrier = self.create_carrier()
-            self.create_product(web_shop)
-            cart = web_shop.POST_vsf_cart_create(None)
-            web_shop.POST_vsf_cart_update({
-                    'cartItem': {
-                        'sku': 'CODE',
-                        'qty': 1,
-                        },
-                    }, cart)
-
-            information = web_shop.POST_vsf_cart_shipping_information({
-                    'addressInformation': {
-                        'shipping_address': {
-                            'country_id': 'US',
-                            },
-                        'shipping_method_code': str(carrier.id),
-                        'shipping_carrier_code': str(carrier.id),
-                        },
-                    }, cart)
-
-            self.assertEqual(information, {
-                    'grand_total': 110,
-                    'items': ANY,
-                    'total_segments': [{
-                            'code': 'subtotal',
-                            'title': ANY,
-                            'value': 100,
-                            }, {
-                            'code': 'shipping',
-                            'title': ANY,
-                            'value': 10,
-                            }, {
-                            'code': 'tax',
-                            'title': ANY,
-                            'value': 0,
-                            }, {
-                            'code': 'grand_total',
-                            'title': ANY,
-                            'value': 110,
-                            }],
-                    })
-
-    @with_transaction(user=0)
-    def test_order_create(self):
-        pool = Pool()
-        Sale = pool.get('sale.sale')
-        Country = pool.get('country.country')
-        Country(name="US", code="US").save()
-        with self.create_web_shop() as web_shop:
-            carrier = self.create_carrier()
-            self.create_product(web_shop)
-            web_shop.POST_vsf_user_create({
-                    "customer": CUSTOMER,
-                    "password": "TopSecretPassword",
-                    })
-            token = web_shop.POST_vsf_user_login({
-                    "username": CUSTOMER['email'],
-                    "password": "TopSecretPassword",
-                    })
-            cart = web_shop.POST_vsf_cart_create(None, token=token)
-            web_shop.POST_vsf_cart_update({
-                    'cartItem': {
-                        'sku': 'CODE',
-                        'qty': 1,
-                        },
-                    }, cart, token=token)
-
-            result = web_shop.POST_vsf_order_create({
-                    'products': [{
-                            'sku': 'CODE',
-                            'qty': 1,
-                            }],
-                    'addressInformation': {
-                        'shippingAddress': ADDRESS,
-                        'billingAddress': ADDRESS_COMPANY,
-                        'shipping_method_code': str(carrier.id),
-                        'shipping_carrier_code': str(carrier.id),
-                        'payment_method_code': 'cashondelivery',
-                        'payment_method_additional': {},
-                        },
-                    }, cart, token=token)
-
-            self.assertEqual(result, 'OK')
-
-            sale, = Sale.search([])
-            self.assertEqual(sale.state, 'confirmed')
-            self.assertEqual(len(sale.lines), 2)
-            self.assertEqual(sale.total_amount, Decimal(110))
-
-    @with_transaction(user=0)
-    def test_order_create_from_guest(self):
-        pool = Pool()
-        Sale = pool.get('sale.sale')
-        Country = pool.get('country.country')
-        Country(name="US", code="US").save()
-        with self.create_web_shop() as web_shop:
-            carrier = self.create_carrier()
-            self.create_product(web_shop)
-            cart = web_shop.POST_vsf_cart_create(None)
-            web_shop.POST_vsf_cart_update({
-                    'cartItem': {
-                        'sku': 'CODE',
-                        'qty': 1,
-                        },
-                    }, cart)
-            web_shop.POST_vsf_user_create({
-                    "customer": CUSTOMER,
-                    "password": "TopSecretPassword",
-                    })
-            token = web_shop.POST_vsf_user_login({
-                    "username": CUSTOMER['email'],
-                    "password": "TopSecretPassword",
-                    })
-            result = web_shop.POST_vsf_order_create({
-                    'products': [{
-                            'sku': 'CODE',
-                            'qty': 1,
-                            }],
-                    'addressInformation': {
-                        'shippingAddress': ADDRESS,
-                        'billingAddress': ADDRESS_COMPANY,
-                        'shipping_method_code': str(carrier.id),
-                        'shipping_carrier_code': str(carrier.id),
-                        'payment_method_code': 'cashondelivery',
-                        'payment_method_additional': {},
-                        },
-                    }, cart, token=token)
-
-            self.assertEqual(result, 'OK')
-
-            sale, = Sale.search([])
-            self.assertNotEqual(sale.party, web_shop.guest_party)
-            self.assertEqual(sale.state, 'confirmed')
-            self.assertEqual(len(sale.lines), 2)
-            self.assertEqual(sale.total_amount, Decimal(110))
-
-
-def suite():
-    suite = test_suite()
-    suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
-            WebVueStorefrontTestCase))
-    suite.addTests(doctest.DocFileSuite(
-            'scenario_web_shop_vue_storefront.rst',
-            tearDown=doctest_teardown, encoding='utf-8',
-            optionflags=doctest.REPORT_ONLY_FIRST_FAILURE,
-            checker=doctest_checker))
-    return suite
diff -r 5e40af829b45 -r a3e42f0ecef5 tox.ini
--- a/tox.ini   Sun Apr 10 19:11:40 2022 +0200
+++ b/tox.ini   Sat Apr 16 18:30:20 2022 +0200
@@ -2,8 +2,9 @@
 envlist = {py37,py38,py39,py310}-{sqlite,postgresql}
 
 [testenv]
+extras = test
 commands =
-    coverage run --include=.*/web_shop_vue_storefront/* setup.py test
+    coverage run --include=.*/web_shop_vue_storefront/* -m unittest discover 
-s tests
     coverage report --include=.*/web_shop_vue_storefront/* --omit=*/tests/*
 deps =
     coverage

Reply via email to