mrp_product_expiry/tests/test_mrp_product_expiry.py

115 lines
4.5 KiB
Python
Raw Normal View History

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from datetime import datetime, timedelta
from odoo.addons.stock.tests.common import TestStockCommon
from odoo.tests.common import Form
from odoo.exceptions import UserError
class TestStockLot(TestStockCommon):
@classmethod
def setUpClass(cls):
super().setUpClass()
# Creates a tracked product using expiration dates.
cls.product_apple = cls.ProductObj.create({
'name': 'Apple',
'type': 'product',
'tracking': 'lot',
'use_expiration_date': True,
'expiration_time': 10,
'use_time': 5,
'removal_time': 8,
'alert_time': 4,
})
# Creates an apple lot.
lot_form = Form(cls.LotObj)
lot_form.name = 'good-apple-lot'
lot_form.product_id = cls.product_apple
lot_form.company_id = cls.env.company
cls.lot_good_apple = lot_form.save()
# Creates an expired apple lot.
lot_form = Form(cls.LotObj)
lot_form.name = 'expired-apple-lot-01'
lot_form.product_id = cls.product_apple
lot_form.company_id = cls.env.company
cls.lot_expired_apple = lot_form.save()
lot_form = Form(cls.lot_expired_apple) # Edits the lot to make it expired.
lot_form.expiration_date = datetime.today() - timedelta(days=10)
cls.lot_expired_apple = lot_form.save()
# Creates a producible product and its BOM.
cls.product_apple_pie = cls.ProductObj.create({
'name': 'Apple Pie',
'type': 'product',
})
cls.bom_apple_pie = cls.env['mrp.bom'].create({
'product_id': cls.product_apple_pie.id,
'product_tmpl_id': cls.product_apple_pie.product_tmpl_id.id,
'product_uom_id': cls.uom_unit.id,
'product_qty': 1.0,
'consumption': 'flexible',
'type': 'normal',
'bom_line_ids': [
(0, 0, {'product_id': cls.product_apple.id, 'product_qty': 3}),
]})
cls.location_stock = cls.env['stock.location'].browse(cls.stock_location)
# Creation of a routing
cls.workcenter = cls.env['mrp.workcenter'].create({
'name': 'Bakery',
'default_capacity': 2,
'time_start': 10,
'time_stop': 5,
'time_efficiency': 80,
})
def test_01_product_produce(self):
""" Checks user doesn't get a confirmation wizard when they produces with
no expired components. """
# Creates a Manufacturing Order...
mo_form = Form(self.env['mrp.production'])
mo_form.product_id = self.product_apple_pie
mo_form.bom_id = self.bom_apple_pie
mo_form.product_qty = 1
mo = mo_form.save()
mo.action_confirm()
# ... and tries to product with a non-expired lot as component.
mo_form = Form(mo)
mo_form.qty_producing = 1
mo = mo_form.save()
details_operation_form = Form(mo.move_raw_ids[0], view=self.env.ref('stock.view_stock_move_operations'))
with details_operation_form.move_line_ids.new() as ml:
ml.quantity = 3
ml.lot_id = self.lot_good_apple
details_operation_form.save()
res = mo.button_mark_done()
# Producing must not return a wizard in this case.
self.assertEqual(res, True)
def test_02_product_produce_using_expired(self):
""" Checks user gets a confirmation wizard when they produces with
expired components. """
# Creates a Manufacturing Order...
mo_form = Form(self.env['mrp.production'])
mo_form.product_id = self.product_apple_pie
mo_form.bom_id = self.bom_apple_pie
mo_form.product_qty = 1
mo = mo_form.save()
mo.action_confirm()
# ... and tries to product with an expired lot as component.
mo_form = Form(mo)
mo_form.qty_producing = 1
mo = mo_form.save()
details_operation_form = Form(mo.move_raw_ids[0], view=self.env.ref('stock.view_stock_move_operations'))
with details_operation_form.move_line_ids.new() as ml:
ml.quantity = 3
ml.lot_id = self.lot_expired_apple
details_operation_form.save()
res = mo.button_mark_done()
# Producing must return a confirmation wizard.
self.assertNotEqual(res, None)
self.assertEqual(res['res_model'], 'expiry.picking.confirmation')