144 lines
5.5 KiB
Python
144 lines
5.5 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from freezegun import freeze_time
|
|
|
|
from odoo.exceptions import UserError, ValidationError
|
|
from odoo.fields import Command
|
|
from odoo.tools import mute_logger
|
|
|
|
from odoo.addons.product.tests.common import ProductCommon
|
|
|
|
|
|
class TestProductCombo(ProductCommon):
|
|
|
|
def test_combo_item_count(self):
|
|
combo = self.env['product.combo'].create({
|
|
'name': "Test combo",
|
|
'combo_item_ids': [
|
|
Command.create({'product_id': self._create_product().id}),
|
|
Command.create({'product_id': self._create_product().id}),
|
|
Command.create({'product_id': self._create_product().id}),
|
|
],
|
|
})
|
|
|
|
self.assertEqual(combo.combo_item_count, 3)
|
|
|
|
def test_currency_without_company_set(self):
|
|
self.setup_main_company(currency_code='GBP')
|
|
|
|
combo = self.env['product.combo'].create({
|
|
'name': "Test combo",
|
|
'combo_item_ids': [Command.create({'product_id': self.product.id})],
|
|
})
|
|
|
|
self.assertEqual(combo.currency_id.name, 'GBP')
|
|
|
|
def test_currency_with_company_set(self):
|
|
company_eur = self._create_company(
|
|
name="Company EUR", currency_id=self._enable_currency('EUR').id
|
|
)
|
|
company_isk = self._create_company(
|
|
name="Company ISK", currency_id=self._enable_currency('ISK').id
|
|
)
|
|
|
|
combo = self.env['product.combo'].create({
|
|
'name': "Test combo",
|
|
'company_id': company_eur.id,
|
|
'combo_item_ids': [Command.create({'product_id': self.product.id})],
|
|
})
|
|
|
|
self.assertEqual(combo.currency_id.name, 'EUR')
|
|
|
|
combo.company_id = company_isk
|
|
|
|
self.assertEqual(combo.currency_id.name, 'ISK')
|
|
|
|
@freeze_time('2000-01-01')
|
|
def test_base_price_multiple_currencies(self):
|
|
self.setup_main_company(currency_code='GBP')
|
|
currency_eur = self._enable_currency('EUR')
|
|
company = self._create_company(currency_id=currency_eur.id)
|
|
# For the sake of this test, we consider that 1 EUR is equivalent to 0.5 GBP.
|
|
currency_eur.rate_ids = [Command.create({
|
|
'name': '2000-01-01', 'rate': 2, 'company_id': company.id
|
|
})]
|
|
product_gbp = self._create_product(list_price=50)
|
|
product_eur_a = self._create_product(company_id=company.id, list_price=90)
|
|
product_eur_b = self._create_product(company_id=company.id, list_price=110)
|
|
|
|
combo = self.env['product.combo'].create({
|
|
'name': "Test combo",
|
|
'company_id': company.id,
|
|
'combo_item_ids': [
|
|
Command.create({'product_id': product_gbp.id}),
|
|
Command.create({'product_id': product_eur_a.id}),
|
|
Command.create({'product_id': product_eur_b.id}),
|
|
],
|
|
})
|
|
|
|
self.assertEqual(combo.base_price, 90)
|
|
|
|
def test_empty_combo_items_raises(self):
|
|
with self.assertRaises(ValidationError):
|
|
self.env['product.combo'].create({
|
|
'name': "Test combo",
|
|
'combo_item_ids': [],
|
|
})
|
|
|
|
def test_duplicate_combo_items_raises(self):
|
|
with self.assertRaises(ValidationError):
|
|
self.env['product.combo'].create({
|
|
'name': "Test combo",
|
|
'combo_item_ids': [
|
|
Command.create({'product_id': self.product.id}),
|
|
Command.create({'product_id': self.product.id}),
|
|
],
|
|
})
|
|
|
|
@mute_logger('odoo.sql_db')
|
|
def test_nested_combos_raises(self):
|
|
combo = self.env['product.combo'].create({
|
|
'name': "Test combo",
|
|
'combo_item_ids': [Command.create({'product_id': self.product.id})],
|
|
})
|
|
combo_product = self._create_product(type='combo', combo_ids=[Command.link(combo.id)])
|
|
|
|
with self.assertRaises(ValidationError):
|
|
self.env['product.combo'].create({
|
|
'name': "Test combo",
|
|
'combo_item_ids': [Command.create({'product_id': combo_product.id})],
|
|
})
|
|
|
|
def test_multi_company_consistency(self):
|
|
company_a = self._create_company(name="Company A")
|
|
company_b = self._create_company(name="Company B")
|
|
product_in_company_a = self._create_product(company_id=company_a.id)
|
|
|
|
# Raise if we try to create a combo in company B with a product in company A.
|
|
with self.assertRaises(UserError):
|
|
self.env['product.combo'].create({
|
|
'name': "Test combo",
|
|
'company_id': company_b.id,
|
|
'combo_item_ids': [Command.create({'product_id': product_in_company_a.id})],
|
|
})
|
|
# Don't raise if we try to create a combo in company A with a product in company A.
|
|
combo_in_company_a = self.env['product.combo'].create({
|
|
'name': "Test combo",
|
|
'company_id': company_a.id,
|
|
'combo_item_ids': [Command.create({'product_id': product_in_company_a.id})],
|
|
})
|
|
|
|
# Raise if we try to create a combo product in company B with a combo in company A.
|
|
with self.assertRaises(UserError):
|
|
self._create_product(
|
|
company_id=company_b.id,
|
|
type='combo',
|
|
combo_ids=[Command.link(combo_in_company_a.id)],
|
|
)
|
|
# Don't raise if we try to create a combo product in company A with a combo in company A.
|
|
self._create_product(
|
|
company_id=company_a.id,
|
|
type='combo',
|
|
combo_ids=[Command.link(combo_in_company_a.id)],
|
|
)
|