186 lines
6.1 KiB
Python
186 lines
6.1 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
|
||
|
from contextlib import nullcontext
|
||
|
from unittest.mock import patch
|
||
|
|
||
|
from odoo.fields import Command
|
||
|
|
||
|
from odoo.addons.base.tests.common import BaseCommon
|
||
|
from odoo.addons.uom.tests.common import UomCommon
|
||
|
|
||
|
|
||
|
class ProductCommon(
|
||
|
BaseCommon, # enforce constant test currency (USD)
|
||
|
UomCommon,
|
||
|
):
|
||
|
|
||
|
@classmethod
|
||
|
def setUpClass(cls):
|
||
|
super().setUpClass()
|
||
|
|
||
|
cls.env.company.currency_id = cls.env.ref('base.USD')
|
||
|
cls.currency = cls.env.ref('base.USD')
|
||
|
|
||
|
# Ideally, this logic should be moved into sthg like a NoAccountCommon in account :D
|
||
|
# Since tax fields are specified in account module, cannot be given as create values
|
||
|
NO_TAXES_CONTEXT = {
|
||
|
'default_taxes_id': False
|
||
|
}
|
||
|
|
||
|
cls.product_category = cls.env['product.category'].create({
|
||
|
'name': 'Test Category',
|
||
|
})
|
||
|
cls.product = cls.env['product.product'].with_context(**NO_TAXES_CONTEXT).create({
|
||
|
'name': 'Test Product',
|
||
|
'detailed_type': 'consu',
|
||
|
'list_price': 20.0,
|
||
|
'categ_id': cls.product_category.id,
|
||
|
})
|
||
|
cls.service_product = cls.env['product.product'].with_context(**NO_TAXES_CONTEXT).create({
|
||
|
'name': 'Test Service Product',
|
||
|
'detailed_type': 'service',
|
||
|
'list_price': 50.0,
|
||
|
'categ_id': cls.product_category.id,
|
||
|
})
|
||
|
cls.consumable_product = cls.product
|
||
|
cls.pricelist = cls.env['product.pricelist'].create({
|
||
|
'name': 'Test Pricelist',
|
||
|
})
|
||
|
cls._archive_other_pricelists()
|
||
|
|
||
|
@classmethod
|
||
|
def _archive_other_pricelists(cls):
|
||
|
cls.env['product.pricelist'].search([
|
||
|
('id', '!=', cls.pricelist.id),
|
||
|
]).action_archive()
|
||
|
|
||
|
|
||
|
class ProductAttributesCommon(ProductCommon):
|
||
|
|
||
|
@classmethod
|
||
|
def setUpClass(cls):
|
||
|
super().setUpClass()
|
||
|
|
||
|
cls.size_attribute = cls.env['product.attribute'].create({
|
||
|
'name': 'Size',
|
||
|
'value_ids': [
|
||
|
Command.create({'name': 'S'}),
|
||
|
Command.create({'name': 'M'}),
|
||
|
Command.create({'name': 'L'}),
|
||
|
]
|
||
|
})
|
||
|
(
|
||
|
cls.size_attribute_s,
|
||
|
cls.size_attribute_m,
|
||
|
cls.size_attribute_l,
|
||
|
) = cls.size_attribute.value_ids
|
||
|
|
||
|
cls.color_attribute = cls.env['product.attribute'].create({
|
||
|
'name': 'Color',
|
||
|
'value_ids': [
|
||
|
Command.create({'name': 'red', 'sequence': 1}),
|
||
|
Command.create({'name': 'blue', 'sequence': 2}),
|
||
|
Command.create({'name': 'green', 'sequence': 3}),
|
||
|
],
|
||
|
})
|
||
|
(
|
||
|
cls.color_attribute_red,
|
||
|
cls.color_attribute_blue,
|
||
|
cls.color_attribute_green,
|
||
|
) = cls.color_attribute.value_ids
|
||
|
|
||
|
cls.no_variant_attribute = cls.env['product.attribute'].create({
|
||
|
'name': 'No variant',
|
||
|
'create_variant': 'no_variant',
|
||
|
'value_ids': [
|
||
|
Command.create({'name': 'extra'}),
|
||
|
Command.create({'name': 'second'}),
|
||
|
]
|
||
|
})
|
||
|
(
|
||
|
cls.no_variant_attribute_extra,
|
||
|
cls.no_variant_attribute_second,
|
||
|
) = cls.no_variant_attribute.value_ids
|
||
|
|
||
|
|
||
|
class ProductVariantsCommon(ProductAttributesCommon):
|
||
|
|
||
|
@classmethod
|
||
|
def setUpClass(cls):
|
||
|
super().setUpClass()
|
||
|
|
||
|
cls.product_template_sofa = cls.env['product.template'].create({
|
||
|
'name': 'Sofa',
|
||
|
'uom_id': cls.uom_unit.id,
|
||
|
'uom_po_id': cls.uom_unit.id,
|
||
|
'categ_id': cls.product_category.id,
|
||
|
'attribute_line_ids': [Command.create({
|
||
|
'attribute_id': cls.color_attribute.id,
|
||
|
'value_ids': [Command.set([
|
||
|
cls.color_attribute_red.id,
|
||
|
cls.color_attribute_blue.id,
|
||
|
cls.color_attribute_green.id
|
||
|
])],
|
||
|
})]
|
||
|
})
|
||
|
|
||
|
cls.product_template_shirt = cls.env['product.template'].create({
|
||
|
'name': 'Shirt',
|
||
|
'categ_id': cls.product_category.id,
|
||
|
'attribute_line_ids': [
|
||
|
Command.create({
|
||
|
'attribute_id': cls.size_attribute.id,
|
||
|
'value_ids': [Command.set([cls.size_attribute_l.id])],
|
||
|
}),
|
||
|
],
|
||
|
})
|
||
|
|
||
|
|
||
|
class TestProductCommon(ProductVariantsCommon):
|
||
|
|
||
|
@classmethod
|
||
|
def setUpClass(cls):
|
||
|
super().setUpClass()
|
||
|
|
||
|
# Product environment related data
|
||
|
cls.uom_dunit = cls.env['uom.uom'].create({
|
||
|
'name': 'DeciUnit',
|
||
|
'category_id': cls.uom_unit.category_id.id,
|
||
|
'factor_inv': 0.1,
|
||
|
'factor': 10.0,
|
||
|
'uom_type': 'smaller',
|
||
|
'rounding': 0.001,
|
||
|
})
|
||
|
|
||
|
cls.product_1, cls.product_2 = cls.env['product.product'].create([{
|
||
|
'name': 'Courage', # product_1
|
||
|
'type': 'consu',
|
||
|
'default_code': 'PROD-1',
|
||
|
'uom_id': cls.uom_dunit.id,
|
||
|
'uom_po_id': cls.uom_dunit.id,
|
||
|
}, {
|
||
|
'name': 'Wood', # product_2
|
||
|
}])
|
||
|
|
||
|
# Kept for reduced diff in other modules (mainly stock & mrp)
|
||
|
cls.prod_att_1 = cls.color_attribute
|
||
|
cls.prod_attr1_v1 = cls.color_attribute_red
|
||
|
cls.prod_attr1_v2 = cls.color_attribute_blue
|
||
|
cls.prod_attr1_v3 = cls.color_attribute_green
|
||
|
|
||
|
cls.product_7_template = cls.product_template_sofa
|
||
|
|
||
|
cls.product_7_attr1_v1 = cls.product_7_template.attribute_line_ids[
|
||
|
0].product_template_value_ids[0]
|
||
|
cls.product_7_attr1_v2 = cls.product_7_template.attribute_line_ids[
|
||
|
0].product_template_value_ids[1]
|
||
|
cls.product_7_attr1_v3 = cls.product_7_template.attribute_line_ids[
|
||
|
0].product_template_value_ids[2]
|
||
|
|
||
|
cls.product_7_1 = cls.product_7_template._get_variant_for_combination(
|
||
|
cls.product_7_attr1_v1)
|
||
|
cls.product_7_2 = cls.product_7_template._get_variant_for_combination(
|
||
|
cls.product_7_attr1_v2)
|
||
|
cls.product_7_3 = cls.product_7_template._get_variant_for_combination(
|
||
|
cls.product_7_attr1_v3)
|