|
@@ -0,0 +1,134 @@
|
|
|
|
+# -*- coding: utf-8 -*-
|
|
|
|
+# © 2015 Antiun Ingenieria S.L. - Javier Iniesta
|
|
|
|
+# © 2015 Pedro M. Baeza - Serv. Tecnol. Avanzados
|
|
|
|
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
|
|
|
+
|
|
|
|
+from openerp.tests.common import TransactionCase
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+class TestProductProduct(TransactionCase):
|
|
|
|
+
|
|
|
|
+ def setUp(self):
|
|
|
|
+ super(TestProductProduct, self).setUp()
|
|
|
|
+ self.template_model = self.env['product.template']
|
|
|
|
+ self.product_model = self.env['product.product']
|
|
|
|
+ self.attribute = self.env['product.attribute'].create(
|
|
|
|
+ {'name': 'Test attribute'})
|
|
|
|
+ self.value1 = self.env['product.attribute.value'].create(
|
|
|
|
+ {'name': 'Test value 1',
|
|
|
|
+ 'attribute_id': self.attribute.id})
|
|
|
|
+ self.value2 = self.env['product.attribute.value'].create(
|
|
|
|
+ {'name': 'Test value 2',
|
|
|
|
+ 'attribute_id': self.attribute.id})
|
|
|
|
+ self.product = self.product_model.create(
|
|
|
|
+ {'name': 'Product',
|
|
|
|
+ 'standard_price': 15})
|
|
|
|
+ self.template_single = self.template_model.create(
|
|
|
|
+ {'name': 'Template',
|
|
|
|
+ 'attribute_line_ids': [
|
|
|
|
+ [0, 0, {'attribute_id': self.attribute.id,
|
|
|
|
+ 'value_ids': [[6, 0, [self.value1.id]]]}]]})
|
|
|
|
+ self.product_single = self.template_single.product_variant_ids[0]
|
|
|
|
+ self.template_multi = self.template_model.create(
|
|
|
|
+ {'name': 'Template multi',
|
|
|
|
+ 'standard_price': 5})
|
|
|
|
+ self.product_multi_1 = self.product_model.create(
|
|
|
|
+ {'name': 'Product 01',
|
|
|
|
+ 'product_tmpl_id': self.template_multi.id,
|
|
|
|
+ 'standard_price': 10})
|
|
|
|
+ self.product_multi_2 = self.product_model.create(
|
|
|
|
+ {'name': 'Product 02',
|
|
|
|
+ 'product_tmpl_id': self.template_multi.id,
|
|
|
|
+ 'standard_price': 20})
|
|
|
|
+ self.product_multi_3 = self.product_model.create(
|
|
|
|
+ {'name': 'Product 03',
|
|
|
|
+ 'product_tmpl_id': self.template_multi.id,
|
|
|
|
+ 'standard_price': 30})
|
|
|
|
+
|
|
|
|
+ def test_default_cost_method(self):
|
|
|
|
+ self.assertEqual(
|
|
|
|
+ self.product.cost_method, self.template_single.cost_method)
|
|
|
|
+
|
|
|
|
+ def test_propagate_cost(self):
|
|
|
|
+ # From product to template
|
|
|
|
+ self.product_single.standard_price = 100
|
|
|
|
+ self.assertEqual(self.template_single.standard_price, 100)
|
|
|
|
+ prev_price = self.template_multi.standard_price
|
|
|
|
+ self.product_multi_1.standard_price = 100
|
|
|
|
+ self.assertEqual(self.template_multi.standard_price, prev_price)
|
|
|
|
+ # From template to product
|
|
|
|
+ self.template_multi.standard_price = 100
|
|
|
|
+
|
|
|
|
+ def test_product_price_history(self):
|
|
|
|
+ price_history_obj = self.env['product.price.history.product']
|
|
|
|
+ history = price_history_obj.search(
|
|
|
|
+ [('product_id', '=', self.product.id)])
|
|
|
|
+ self.assertEqual(self.product.standard_price, history.cost)
|
|
|
|
+ self.product.standard_price = 25.00
|
|
|
|
+ history = price_history_obj.search(
|
|
|
|
+ [('product_id', '=', self.product.id)])
|
|
|
|
+ self.assertEqual(len(history), 2)
|
|
|
|
+
|
|
|
|
+ def test_product_template_price_history(self):
|
|
|
|
+ price_history_obj = self.env['product.price.history']
|
|
|
|
+ variant_history_obj = self.env['product.price.history.product']
|
|
|
|
+ history = price_history_obj.search(
|
|
|
|
+ [('product_template_id', '=', self.template_single.id)])
|
|
|
|
+ variant_history = variant_history_obj.search(
|
|
|
|
+ [('product_id', '=', self.product_single.id)])
|
|
|
|
+ self.assertEqual(len(history), 1)
|
|
|
|
+ self.assertEqual(len(variant_history), 1)
|
|
|
|
+ self.assertEqual(self.template_single.standard_price, history.cost)
|
|
|
|
+ self.template_single.standard_price = 20.00
|
|
|
|
+ history = price_history_obj.search(
|
|
|
|
+ [('product_template_id', '=', self.template_single.id)])
|
|
|
|
+ variant_history = variant_history_obj.search(
|
|
|
|
+ [('product_id', '=', self.product_single.id)])
|
|
|
|
+ self.assertEqual(self.product_single.standard_price,
|
|
|
|
+ self.template_single.standard_price)
|
|
|
|
+ self.assertEqual(len(history), 2)
|
|
|
|
+ self.assertEqual(len(variant_history), 2)
|
|
|
|
+
|
|
|
|
+ def test_product_variant_cost_prices(self):
|
|
|
|
+ self.assertEqual(self.template_multi.standard_price, 5)
|
|
|
|
+ self.assertEqual(self.product_multi_1.standard_price, 10)
|
|
|
|
+ self.assertEqual(self.product_multi_2.standard_price, 20)
|
|
|
|
+ self.assertEqual(self.product_multi_3.standard_price, 30)
|
|
|
|
+
|
|
|
|
+ def test_new_variant_creation_prices(self):
|
|
|
|
+ price_history_obj = self.env['product.price.history']
|
|
|
|
+ variant_history_obj = self.env['product.price.history.product']
|
|
|
|
+ self.template_single.write(
|
|
|
|
+ {'attribute_line_ids': [
|
|
|
|
+ [1, self.template_single.attribute_line_ids[:1].id,
|
|
|
|
+ {'value_ids': [[6, 0, [self.value1.id, self.value2.id]]]}]]})
|
|
|
|
+ history = price_history_obj.search(
|
|
|
|
+ [('product_template_id', '=', self.template_single.id)])
|
|
|
|
+ self.assertEqual(len(history), 1)
|
|
|
|
+ for product in self.template_single.product_variant_ids:
|
|
|
|
+ variant_history = variant_history_obj.search(
|
|
|
|
+ [('product_id', '=', product.id)])
|
|
|
|
+ self.assertEqual(len(variant_history), 1)
|
|
|
|
+ self.assertEqual(self.template_single.standard_price,
|
|
|
|
+ product.standard_price)
|
|
|
|
+
|
|
|
|
+ def test_synchro_cost_method_single(self):
|
|
|
|
+ self.template_single.cost_method = 'real'
|
|
|
|
+ self.assertEqual(
|
|
|
|
+ self.product_single.cost_method, self.template_single.cost_method,
|
|
|
|
+ 'Not synchronized from template.')
|
|
|
|
+ self.product_single.cost_method = 'average'
|
|
|
|
+ self.assertEqual(
|
|
|
|
+ self.template_single.cost_method, self.product_single.cost_method,
|
|
|
|
+ 'Not synchronized from variant')
|
|
|
|
+
|
|
|
|
+ def test_synchro_cost_method_multi(self):
|
|
|
|
+ self.template_multi.cost_method = 'average'
|
|
|
|
+ self.product_multi_1.cost_method = 'real'
|
|
|
|
+ self.assertEqual(
|
|
|
|
+ self.template_multi.cost_method, 'average',
|
|
|
|
+ 'Bad synchronize when multiple variants for template.')
|
|
|
|
+ self.template_multi.cost_method = 'standard'
|
|
|
|
+ self.assertEqual(
|
|
|
|
+ self.product_multi_1.cost_method, 'real',
|
|
|
|
+ 'Bad synchronize when multiple variants for template.')
|