19.0 vanilla

This commit is contained in:
Ernad Husremovic 2026-03-09 09:32:12 +01:00
parent 79f83631d5
commit 73afc09215
6267 changed files with 1534193 additions and 1130106 deletions

View file

@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import common
from . import test_frontend_buy_tickets
from . import test_website_event_sale_cart
from . import test_website_event_sale_pricelist
from . import test_website_event_sale

View file

@ -1,17 +1,17 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from datetime import timedelta
from odoo.fields import Datetime
from odoo.tests.common import TransactionCase
from odoo.fields import Command, Datetime
from odoo.addons.website_sale.tests.common import WebsiteSaleCommon
class TestWebsiteEventSaleCommon(TransactionCase):
class TestWebsiteEventSaleCommon(WebsiteSaleCommon):
@classmethod
def setUpClass(cls):
super(TestWebsiteEventSaleCommon, cls).setUpClass()
super().setUpClass()
cls.env.company.country_id = cls.env.ref('base.us')
cls.currency_test = cls.env['res.currency'].create({
@ -19,7 +19,6 @@ class TestWebsiteEventSaleCommon(TransactionCase):
'rounding': 0.01,
'symbol': 'EX',
})
cls.partner = cls.env['res.partner'].create({'name': 'test'})
cls.env['res.currency.rate'].search([]).unlink()
cls.rate = cls.env['res.currency.rate'].create({
'company_id': cls.env.company.id,
@ -30,51 +29,63 @@ class TestWebsiteEventSaleCommon(TransactionCase):
cls.zero_tax = cls.env['account.tax'].sudo().create({
'name': 'Tax 0',
'amount': 0,
'tax_group_id': cls.env['account.tax.group'].create({
'name': 'Text Tax Group',
'company_id': cls.env.company.id,
}).id
})
cls.product_event = cls.env['product.product'].create({
'detailed_type': 'event',
'type': 'service',
'service_tracking': 'event',
'list_price': 100,
'name': 'Event Registration No Company Assigned',
'taxes_id': [(6, 0, cls.zero_tax.ids)],
'taxes_id': [Command.set(cls.zero_tax.ids)],
})
cls.event = cls.env['event.event'].create({
'date_begin': (Datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d 07:00:00'),
'date_end': (Datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d 16:30:00'),
'name': 'Pycon',
'user_id': cls.env.ref('base.user_admin').id,
'website_published': True,
})
cls.ticket = cls.env['event.event.ticket'].create([{
'event_id': cls.event.id,
'name': 'Standard',
'product_id': cls.product_event.id,
'price': 100,
}])
cls.event, cls.event_2 = cls.env['event.event'].create([
{
'date_begin': (Datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d 07:00:00'),
'date_end': (Datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d 16:30:00'),
'name': 'Pycon',
'user_id': cls.env.ref('base.user_admin').id,
'website_published': True,
},
{
'date_begin': (Datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d 07:00:00'),
'date_end': (Datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d 16:30:00'),
'name': 'Conference for Architects TEST',
'user_id': cls.env.ref('base.user_admin').id,
'website_published': True,
}
])
cls.ticket, cls.ticket_2 = cls.env['event.event.ticket'].create([
{
'event_id': cls.event.id,
'name': 'Standard',
'product_id': cls.product_event.id,
'price': 100,
},
{
'event_id': cls.event_2.id,
'name': 'Standard',
'product_id': cls.product_event.id,
'price': 1000,
}
])
cls.current_website = cls.env['website'].get_current_website()
cls.pricelist = cls.current_website.get_current_pricelist()
cls.so = cls.env['sale.order'].create({
'company_id': cls.env.company.id,
'partner_id': cls.partner.id,
'pricelist_id': cls.pricelist.id,
})
def create_pricelist(currency, name, policy):
def create_pricelist(currency, name):
return cls.env['product.pricelist'].create({
'currency_id': currency.id,
'discount_policy': policy,
'item_ids': [(5, 0, 0), (0, 0, {
'applied_on': '3_global',
'compute_price': 'percentage',
'percent_price': 10,
})],
'item_ids': [
Command.create({
'applied_on': '3_global',
'compute_price': 'percentage',
'percent_price': 10,
}),
],
'name': name,
'selectable': True,
})
cls.pricelist_with_discount = create_pricelist(currency=cls.env.company.currency_id, name='EUR With Discount Included', policy='with_discount')
cls.pricelist_without_discount = create_pricelist(currency=cls.env.company.currency_id, name='EUR Without Discount Included', policy='without_discount')
cls.ex_pricelist_with_discount = create_pricelist(currency=cls.currency_test, name='EX With Discount Included', policy='with_discount')
cls.ex_pricelist_without_discount = create_pricelist(currency=cls.currency_test, name='EX Without Discount Included', policy='without_discount')
cls.pricelist_without_discount = create_pricelist(currency=cls.env.company.currency_id, name='EUR Without Discount Included')
cls.ex_pricelist_without_discount = create_pricelist(currency=cls.currency_test, name='EX Without Discount Included')

View file

@ -1,94 +1,86 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import odoo.tests
from datetime import timedelta
from odoo.addons.base.tests.common import HttpCaseWithUserDemo
from odoo.addons.website_event_sale.tests.common import TestWebsiteEventSaleCommon
from odoo import Command
from odoo.exceptions import ValidationError
from odoo.fields import Datetime
from odoo.tests import JsonRpcException, tagged
from odoo.tools import mute_logger
from odoo.addons.base.tests.common import HttpCaseWithUserDemo
from odoo.addons.payment.tests.http_common import PaymentHttpCommon
from .common import TestWebsiteEventSaleCommon
@odoo.tests.common.tagged('post_install', '-at_install')
@tagged('post_install', '-at_install')
class TestUi(HttpCaseWithUserDemo, TestWebsiteEventSaleCommon):
def setUp(self):
super().setUp()
if self.env['ir.module.module']._get('payment_custom').state != 'installed':
self.skipTest("Transfer provider is not installed")
self.env.ref('payment.payment_provider_transfer').write({
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.env.ref('payment.payment_provider_transfer').write({
'state': 'enabled',
'is_published': True,
})
self.event_2 = self.env['event.event'].create({
'name': 'Conference for Architects TEST',
'user_id': self.env.ref('base.user_admin').id,
'date_begin': (Datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d 07:00:00'),
'date_end': (Datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d 16:30:00'),
'website_published': True,
})
self.env['event.event.ticket'].create([{
'name': 'Standard',
'event_id': self.event_2.id,
'product_id': self.env.ref('event_sale.product_product_event').id,
'start_sale_datetime': (Datetime.today() - timedelta(days=5)).strftime('%Y-%m-%d 07:00:00'),
'end_sale_datetime': (Datetime.today() + timedelta(90)).strftime('%Y-%m-%d'),
'price': 1000.0,
}, {
cls.env['event.event.ticket'].create({
'name': 'VIP',
'event_id': self.event_2.id,
'product_id': self.env.ref('event_sale.product_product_event').id,
'event_id': cls.event_2.id,
'product_id': cls.env.ref('event_product.product_product_event').id,
'end_sale_datetime': (Datetime.today() + timedelta(90)).strftime('%Y-%m-%d'),
'price': 1500.0,
}])
'seats_max': 12,
'limit_max_per_order': 11,
})
self.event_3 = self.env['event.event'].create({
cls.event_3 = cls.env['event.event'].create({
'name': 'Last ticket test',
'user_id': self.env.ref('base.user_admin').id,
'user_id': cls.env.ref('base.user_admin').id,
'date_begin': (Datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d 07:00:00'),
'date_end': (Datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d 16:30:00'),
'website_published': True,
})
self.env['event.event.ticket'].create([{
cls.env['event.event.ticket'].create([{
'name': 'VIP',
'event_id': self.event_3.id,
'product_id': self.env.ref('event_sale.product_product_event').id,
'event_id': cls.event_3.id,
'product_id': cls.env.ref('event_product.product_product_event').id,
'end_sale_datetime': (Datetime.today() + timedelta(90)).strftime('%Y-%m-%d'),
'price': 1500.0,
'seats_max': 2,
}])
# flush event to ensure having tickets available in the tests
self.env.flush_all()
cls.env.flush_all()
(self.env.ref('base.partner_admin') + self.partner_demo).write({
(cls.env.ref('base.partner_admin') + cls.partner_demo).write({
'street': '215 Vine St',
'city': 'Scranton',
'zip': '18503',
'country_id': self.env.ref('base.us').id,
'state_id': self.env.ref('base.state_us_39').id,
'country_id': cls.env.ref('base.us').id,
'state_id': cls.env.ref('base.state_us_39').id,
'phone': '+1 555-555-5555',
'email': 'admin@yourcompany.example.com',
})
self.env['account.journal'].create({'name': 'Cash - Test', 'type': 'cash', 'code': 'CASH - Test'})
cls.env['account.journal'].create({'name': 'Cash - Test', 'type': 'cash', 'code': 'CASH - Test'})
def test_admin(self):
if self.env['ir.module.module']._get('payment_custom').state != 'installed':
self.skipTest("Transfer provider is not installed")
self.env['product.pricelist'].with_context(active_test=False).search([]).unlink()
# Seen that:
# - this test relies on demo data that are entirely in USD (pricelists)
# - that main demo company is gelocated in US
# - that this test awaits for hardcoded USDs amount
# we have to force company currency as USDs only for this test
self.cr.execute("UPDATE res_company SET currency_id = %s WHERE id = %s", [self.env.ref('base.USD').id, self.env.ref('base.main_company').id])
self.env['product.pricelist'].create({'name': "Public Pricelist"})
transfer_provider = self.env.ref('payment.payment_provider_transfer')
transfer_provider.write({
@ -100,9 +92,7 @@ class TestUi(HttpCaseWithUserDemo, TestWebsiteEventSaleCommon):
self.start_tour("/", 'event_buy_tickets', login="admin")
def test_demo(self):
if self.env['ir.module.module']._get('payment_custom').state != 'installed':
self.skipTest("Transfer provider is not installed")
self.env['product.pricelist'].with_context(active_test=False).search([]).unlink()
transfer_provider = self.env.ref('payment.payment_provider_transfer')
transfer_provider.write({
'state': 'enabled',
@ -110,12 +100,12 @@ class TestUi(HttpCaseWithUserDemo, TestWebsiteEventSaleCommon):
})
transfer_provider._transfer_ensure_pending_msg_is_set()
# Ensure the use of USD (company currency)
self.env['product.pricelist'].create({'name': "Public Pricelist"})
self.start_tour("/", 'event_buy_tickets', login="demo")
def test_buy_last_ticket(self):
if self.env['ir.module.module']._get('payment_custom').state != 'installed':
self.skipTest("Transfer provider is not installed")
transfer_provider = self.env.ref('payment.payment_provider_transfer')
transfer_provider.write({
'state': 'enabled',
@ -126,5 +116,125 @@ class TestUi(HttpCaseWithUserDemo, TestWebsiteEventSaleCommon):
self.start_tour("/", 'event_buy_last_ticket')
def test_pricelists_different_currencies(self):
self.env.user.group_ids += self.env.ref('product.group_product_pricelist')
self.start_tour("/", 'event_sale_pricelists_different_currencies', login='admin')
# TO DO - add public test with new address when convert to web.tour format.
@tagged('post_install', '-at_install')
class TestRoutes(HttpCaseWithUserDemo, TestWebsiteEventSaleCommon, PaymentHttpCommon):
@mute_logger('odoo.http')
def test_check_seats_avail_before_purchase(self):
"""Check that payments fails when there aren't enough seats available.
- First check payment fails due to exceeding the ticket's limit
- Then change to 2 unlimited tickets, which fails due to exceeding event limit
- Finally do a successful purchase of a single ticket without limit
"""
self.authenticate(None, None)
sale_order = self.empty_cart
self.ticket_2.write({
'name': "VIP",
'event_id': self.event.id,
'seats_max': 1,
'seats_limited': True,
})
self.event.write({
'seats_max': 3,
'seats_limited': True,
})
self.assertFalse(self.ticket.seats_limited)
self.assertEqual(self.ticket_2.seats_available, 1)
self.assertEqual(self.event.seats_available, 3)
# Add VIP ticket to cart & create draft registration
sale_order.order_line = [Command.create({
'product_id': self.ticket.product_id.id,
'event_id': self.event.id,
'event_ticket_id': self.ticket_2.id,
})]
registration = self.env['event.registration'].create({
'state': 'draft',
'partner_id': sale_order.partner_id.id,
'event_id': self.event.id,
'event_ticket_id': self.ticket_2.id,
'sale_order_id': sale_order.id,
})
self.assertEqual(self.event.seats_taken, 0)
self.assertEqual(self.event.event_ticket_ids.mapped('seats_taken'), [0, 0])
# Sneaky Mitchell beats us to the punch
self.event.registration_ids = [Command.create({
'partner_id': self.partner_admin.id,
'event_ticket_id': self.ticket_2.id,
'state': 'done',
})]
self.assertEqual(self.event.seats_taken, 1)
self.assertEqual(self.event.seats_available, 2)
# Set up transaction values
url = self._build_url(f'/shop/payment/transaction/{sale_order.id}')
route_kwargs = {
'provider_id': self.provider.id,
'payment_method_id': self.payment_method.id,
'token_id': None,
'flow': 'direct',
'tokenization_requested': False,
'landing_route': '/shop/payment/validate',
'access_token': sale_order._portal_ensure_token(),
}
# Payment should fail due to exceeding the VIP ticket limit
with self.assertRaisesRegex(JsonRpcException, r'odoo\.exceptions\.ValidationError'):
self.make_jsonrpc_request(url, route_kwargs)
# Double check that we hit the correct limit for ticket
with self.assertRaises(ValidationError):
self.event._verify_seats_availability([
(slot, ticket, 1)
for slot, ticket in self.env['event.registration']._read_group(
[('id', 'in', self.event.registration_ids.ids)],
['event_slot_id', 'event_ticket_id']
)
])
# Replace VIP ticket with 2 regular tickets
sale_order.order_line.write({
'product_id': self.ticket.product_id.id,
'product_uom_qty': 2,
'event_id': self.event.id,
'event_ticket_id': self.ticket.id,
})
registration.event_ticket_id = self.ticket.id
registration += registration.copy({'state': 'draft', 'sale_order_id': sale_order.id})
# Sneaky Mitchell beats us to the punch again
self.event.registration_ids = [Command.create({
'partner_id': self.partner_admin.id,
'event_ticket_id': self.ticket.id,
'state': 'done',
})]
self.assertEqual(self.event.seats_taken, 2)
self.assertEqual(self.event.seats_available, 1)
# Payment should fail due to exceeding the event seat limit
with self.assertRaisesRegex(JsonRpcException, r'odoo\.exceptions\.ValidationError'):
self.make_jsonrpc_request(url, route_kwargs)
# Double check that we hit the correct limit for event
with self.assertRaises(ValidationError):
self.event._verify_seats_availability([
(slot, ticket, 2)
for slot, ticket in self.env['event.registration']._read_group(
[('id', 'in', self.event.registration_ids.ids)],
['event_slot_id', 'event_ticket_id']
)
])
# Payment should succeed when buying only one ticket
sale_order.order_line.product_uom_qty = 1
registration[1].unlink()
self.make_jsonrpc_request(url, route_kwargs)
registration.exists().write({'state': 'open'})
self.assertEqual(self.ticket.seats_taken, 2)
self.assertEqual(self.event.seats_taken, 3)

View file

@ -0,0 +1,63 @@
from odoo import http
from odoo.addons.base.tests.common import HttpCaseWithUserPortal
from odoo.addons.website_event_sale.tests.common import TestWebsiteEventSaleCommon
class TestWebsiteEventSale(HttpCaseWithUserPortal, TestWebsiteEventSaleCommon):
def test_website_event_sale_free_tickets(self):
""" Test saleorder is not created for tickets free tickets """
self.authenticate(None, None)
free_ticket = self.env['event.event.ticket'].create({
'event_id': self.event.id,
'name': 'Free',
'product_id': self.product_event.id,
'price': 0,
})
event_questions = self.event.question_ids
event_registration_count = len(self.event.registration_ids)
name_question = event_questions.filtered(lambda q: q.question_type == 'name')
email_question = event_questions.filtered(lambda q: q.question_type == 'email')
phone_question = event_questions.filtered(lambda q: q.question_type == 'phone')
existing_so = self.env['sale.order'].search([])
self.url_open(f'/event/{self.event.id}/registration/confirm', data={
f'1-name-{name_question.id}': 'Bob',
f'1-email-{email_question.id}': 'bob@test.lan',
f'1-phone-{phone_question.id}': '8989898989',
'1-event_ticket_id': free_ticket.id,
'csrf_token': http.Request.csrf_token(self),
})
self.assertEqual(self.env['sale.order'].search([]), existing_so, "Sale order should not be created for the free tickets")
self.assertEqual(len(self.event.registration_ids), event_registration_count + 1)
def test_website_event_sale_free_paid_mix(self):
""" Test saleorder is created if paid ticket selected """
self.authenticate(None, None)
free_ticket = self.env['event.event.ticket'].create({
'event_id': self.event.id,
'name': 'Free',
'product_id': self.product_event.id,
'price': 0,
})
event_questions = self.event.question_ids
event_registration_count = len(self.event.registration_ids)
name_question = event_questions.filtered(lambda q: q.question_type == 'name')
email_question = event_questions.filtered(lambda q: q.question_type == 'email')
phone_question = event_questions.filtered(lambda q: q.question_type == 'phone')
self.url_open(f'/event/{self.event.id}/registration/confirm', data={
f'1-name-{name_question.id}': 'Bob',
f'1-email-{email_question.id}': 'bob@test.lan',
f'1-phone-{phone_question.id}': '8989898989',
'1-event_ticket_id': self.ticket.id,
f'2-name-{name_question.id}': 'joe',
f'2-email-{email_question.id}': 'joe@test.lan',
f'2-phone-{phone_question.id}': '8989898988',
'2-event_ticket_id': free_ticket.id,
'csrf_token': http.Request.csrf_token(self),
})
self.assertEqual(len(self.event.registration_ids), event_registration_count + 2)
self.assertTrue(self.env['sale.order'].search([
('order_line.event_ticket_id', '=', self.ticket.id),
('order_line.event_ticket_id', '=', free_ticket.id)
]), "Sale order should be created for the free/paid tickets mix")

View file

@ -1,5 +1,7 @@
from datetime import datetime, timedelta
from odoo import Command
from odoo.tests import tagged
from odoo.tests import tagged, Form
from odoo.addons.website_event_sale.tests.common import TestWebsiteEventSaleCommon
from odoo.addons.website_sale.tests.test_website_sale_cart_abandoned import (
@ -9,13 +11,29 @@ from odoo.addons.website_sale.tests.test_website_sale_cart_abandoned import (
@tagged('post_install', '-at_install')
class TestWebsiteEventSaleCart(TestWebsiteEventSaleCommon, TestWebsiteSaleCartAbandonedCommon):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.website.write({
'send_abandoned_cart_email': True,
'cart_abandoned_delay': 1.0, # 1 hour
})
cls.website.send_abandoned_cart_email_activation_time -= timedelta(weeks=1)
cls.partner_admin = cls.env.ref('base.partner_admin')
if not cls.partner_admin.email:
cls.partner_admin.email = 'base@partner.admin'
def test_sold_out_event_cart_reminder(self):
"""Check that abandoned cart emails aren't sent for sold out tickets."""
cart1, cart2 = carts = self.so1before + self.so2before
carts.order_line.unlink()
carts.website_id.send_abandoned_cart_email = True
cart1, cart2 = self.env['sale.order'].create([{
'partner_id': partner.id,
'website_id': self.website.id,
'date_order': datetime.now() - timedelta(hours=2),
} for partner in (self.partner_admin, self.partner_portal)])
self.event.auto_confirm = True
self.ticket.write({
'seats_limited': True,
'seats_max': 1,
@ -34,9 +52,11 @@ class TestWebsiteEventSaleCart(TestWebsiteEventSaleCommon, TestWebsiteSaleCartAb
)
# Create registrations & confirm first order
editor = self.env['registration.editor'].new()
editor.with_context(default_sale_order_id=cart1.id).action_make_registration()
editor = Form(self.env['registration.editor'].with_context(default_sale_order_id=cart1.id))
editor.save().action_make_registration()
cart1.action_confirm()
# command-created records won't trigger a recompute until flush
self.env.flush_all()
self.assertEqual(self.ticket.seats_available, 0)
self.assertFalse(
self.send_mail_patched(cart2.id),

View file

@ -1,69 +1,51 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo.addons.website_sale.controllers.main import WebsiteSale
from odoo.addons.website.tools import MockRequest
from odoo.addons.website_event_sale.tests.common import TestWebsiteEventSaleCommon
from odoo.fields import Command
from odoo.tests import tagged
from odoo.addons.website_event_sale.tests.common import TestWebsiteEventSaleCommon
from odoo.addons.website_sale.controllers.main import WebsiteSale
from odoo.addons.website_sale.tests.common import MockRequest
@tagged('post_install', '-at_install')
class TestWebsiteEventPriceList(TestWebsiteEventSaleCommon):
@classmethod
def setUpClass(cls):
super(TestWebsiteEventPriceList, cls).setUpClass()
super().setUpClass()
cls.WebsiteSaleController = WebsiteSale()
def test_pricelist_different_currency(self):
self.env['product.pricelist'].search([('id', '!=', self.pricelist.id)]).action_archive()
self.pricelist.write({
'currency_id': self.env.company.currency_id.id,
'item_ids': [Command.clear()],
'name': 'No discount',
})
so_line = self.env['sale.order.line'].create({
'event_id': self.event.id,
'event_ticket_id': self.ticket.id,
'name': self.event.name,
'order_id': self.so.id,
'order_id': self.empty_cart.id,
'product_id': self.ticket.product_id.id,
'product_uom_qty': 1,
})
# set pricelist to 0 - currency: company
self.pricelist.write({
'currency_id': self.env.company.currency_id.id,
'discount_policy': 'with_discount',
'item_ids': [(5, 0, 0), (0, 0, {
'applied_on': '3_global',
'compute_price': 'percentage',
'percent_price': 0,
})],
'name': 'With Discount Included',
})
with MockRequest(self.env, sale_order_id=self.so.id, website=self.current_website):
self.WebsiteSaleController.pricelist(promo=None)
self.so._cart_update(line_id=so_line.id, product_id=self.ticket.product_id.id, set_qty=1)
self.assertEqual(so_line.price_reduce, 100)
self.assertEqual(so_line.price_reduce_taxexcl, 100)
# set pricelist to 10% - without discount
self.pricelist.write({
pl2 = self.pricelist.copy({
'currency_id': self.currency_test.id,
'discount_policy': 'without_discount',
'item_ids': [(5, 0, 0), (0, 0, {
'applied_on': '3_global',
'compute_price': 'percentage',
'percent_price': 10,
})],
'name': 'Without Discount Included',
'name': 'Percentage Discount',
'selectable': True,
})
with MockRequest(self.env, sale_order_id=self.so.id, website=self.current_website):
self.WebsiteSaleController.pricelist(promo=None)
self.so._cart_update(line_id=so_line.id, product_id=self.ticket.product_id.id, set_qty=1)
self.assertEqual(so_line.price_reduce, 900, 'Incorrect amount based on the pricelist and its currency.')
# set pricelist to 10% - with discount
self.pricelist.write({
'discount_policy': 'with_discount',
'name': 'With Discount Included',
})
with MockRequest(self.env, sale_order_id=self.so.id, website=self.current_website):
self.WebsiteSaleController.pricelist(promo=None)
self.so._cart_update(line_id=so_line.id, product_id=self.ticket.product_id.id, set_qty=1)
self.assertEqual(so_line.price_reduce, 900, 'Incorrect amount based on the pricelist and its currency.')
with MockRequest(self.env, website=self.website, sale_order_id=self.empty_cart.id) as req:
self.assertEqual(req.pricelist, self.pricelist)
self.WebsiteSaleController.pricelist_change(pl2)
self.assertEqual(so_line.price_reduce_taxexcl, 900, 'Incorrect amount based on the pricelist and its currency.')