oca-technical/odoo-bringout-oca-maintenance-maintenance_plan/maintenance_plan/tests/test_maintenance_plan.py
2025-08-29 15:43:03 +02:00

231 lines
9.2 KiB
Python

# Copyright 2017 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from dateutil.relativedelta import relativedelta
from odoo import _, fields
from .common import TestMaintenancePlanBase
class TestMaintenancePlan(TestMaintenancePlanBase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.today_date = fields.Date.from_string("2023-01-25")
def test_name_get(self):
self.assertEqual(
self.maintenance_plan_1.name_get()[0][1],
_(
"Unnamed %(void)s plan (%(eqpmnt)s)",
void="",
eqpmnt=self.maintenance_plan_1.equipment_id.name,
),
)
self.assertEqual(
self.maintenance_plan_2.name_get()[0][1],
_(
"Unnamed %(kind)s plan (%(eqpmnt)s)",
kind=self.maintenance_plan_2.maintenance_kind_id.name,
eqpmnt=self.maintenance_plan_2.equipment_id.name,
),
)
self.assertEqual(
self.maintenance_plan_3.name_get()[0][1], self.maintenance_plan_3.name
)
def test_next_maintenance_date_01(self):
# We set start maintenance date tomorrow and check next maintenance
# date has been correctly computed
self.maintenance_plan_1.start_maintenance_date = "2023-01-24"
# Check next maintenance date is 1 month from start date
self.assertEqual(
self.maintenance_plan_1.next_maintenance_date,
fields.Date.from_string("2023-02-24"),
)
def test_next_maintenance_date_02(self):
self.cron.method_direct_trigger()
# Check maintenance plan dates
self.assertEqual(
self.maintenance_plan_1.start_maintenance_date, self.today_date
)
self.assertEqual(self.maintenance_plan_1.next_maintenance_date, self.today_date)
# Check information from generated_requests
generated_requests = self.maintenance_request_obj.search(
[("maintenance_plan_id", "=", self.maintenance_plan_1.id)],
order="schedule_date asc",
)
self.assertEqual(len(generated_requests), 3)
maintenance_1 = generated_requests[0]
# First maintenance was planned 2023-01-25
self.assertEqual(maintenance_1.request_date, self.today_date)
# Complete request:
maintenance_1.stage_id = self.done_stage
# Check next one:
maintenance_2 = generated_requests[1]
# This should be expected 2023-02-25
self.assertEqual(
maintenance_2.request_date, fields.Date.from_string("2023-02-25")
)
# Complete request and Check next one:
maintenance_2.stage_id = self.done_stage
maintenance_3 = generated_requests[2]
# This one should be expected 2023-03-25
self.assertEqual(
maintenance_3.request_date, fields.Date.from_string("2023-03-25")
)
# Move it to a date before `start_maintenance_date` (the request should
# be ignored)
past_date = fields.Date.from_string("2022-12-25")
maintenance_3.request_date = past_date
self.assertNotEqual(self.maintenance_plan_1.next_maintenance_date, past_date)
self.assertEqual(
self.maintenance_plan_1.next_maintenance_date,
fields.Date.from_string("2023-03-25"),
)
# Move the request_date far into the future:
future_date = fields.Date.from_string("2023-05-25")
maintenance_3.request_date = future_date
self.assertEqual(self.maintenance_plan_1.next_maintenance_date, future_date)
# Complete request in that date, next expected date should be 1 month
# after latest request done.:
maintenance_3.stage_id = self.done_stage
self.assertEqual(
self.maintenance_plan_1.next_maintenance_date,
fields.Date.from_string("2023-06-25"),
)
def test_generate_requests(self):
self.cron.method_direct_trigger()
generated_requests = self.maintenance_request_obj.search(
[("maintenance_plan_id", "=", self.maintenance_plan_1.id)],
order="schedule_date asc",
)
self.assertEqual(len(generated_requests), 3)
self.assertEqual(
fields.Date.to_date(generated_requests[0].schedule_date), self.today_date
)
self.assertEqual(
fields.Date.to_date(generated_requests[1].schedule_date),
fields.Date.from_string("2023-02-25"),
)
self.assertEqual(
fields.Date.to_date(generated_requests[2].schedule_date),
fields.Date.from_string("2023-03-25"),
)
generated_request = self.maintenance_request_obj.search(
[("maintenance_plan_id", "=", self.maintenance_plan_4.id)], limit=1
)
self.assertEqual(
generated_request.name,
_(
"Preventive Maintenance (%(kind)s) - %(plan)s",
kind=self.weekly_kind.name,
plan=self.maintenance_plan_4.name,
),
)
def test_generate_requests2(self):
self.cron.method_direct_trigger()
generated_requests = self.maintenance_request_obj.search(
[("maintenance_plan_id", "=", self.maintenance_plan_1.id)],
order="schedule_date asc",
)
self.assertEqual(len(generated_requests), 3)
# We set plan start_maintenanca_date to a future one. New requests should take
# into account this new date.
new_date = fields.Date.from_string("2023-04-25")
self.maintenance_plan_1.next_maintenance_date = new_date
self.maintenance_plan_1.maintenance_plan_horizon = 3
self.cron.method_direct_trigger()
generated_requests = self.maintenance_request_obj.search(
[("maintenance_plan_id", "=", self.maintenance_plan_1.id)],
order="schedule_date asc",
)
self.assertEqual(len(generated_requests), 4)
self.assertEqual(generated_requests[-1].request_date, new_date)
def test_generate_requests_no_equipment(self):
self.cron.method_direct_trigger()
generated_requests = self.maintenance_request_obj.search(
[("maintenance_plan_id", "=", self.maintenance_plan_5.id)],
order="schedule_date asc",
)
self.assertEqual(len(generated_requests), 3)
# We set plan start_maintenanca_date to a future one. New requests should take
# into account this new date.
self.maintenance_plan_5.write(
{
"start_maintenance_date": fields.Date.to_string(
self.today_date + relativedelta(weeks=9)
),
"maintenance_plan_horizon": 3,
}
)
self.cron.method_direct_trigger()
generated_requests = self.maintenance_request_obj.search(
[("maintenance_plan_id", "=", self.maintenance_plan_5.id)],
order="schedule_date asc",
)
self.assertEqual(len(generated_requests), 4)
self.assertEqual(
generated_requests[-1].request_date,
self.today_date + relativedelta(weeks=9),
)
self.assertFalse(generated_requests.mapped("equipment_id"))
def test_get_relativedelta(self):
plan = self.maintenance_plan_1
result = plan.get_relativedelta(1, "day")
self.assertEqual(relativedelta(days=1), result)
result = plan.get_relativedelta(1, "week")
self.assertEqual(relativedelta(weeks=1), result)
result = plan.get_relativedelta(1, "month")
self.assertEqual(relativedelta(months=1), result)
result = plan.get_relativedelta(1, "year")
self.assertEqual(relativedelta(years=1), result)
def test_generate_requests_inactive_equipment(self):
self.equipment_1.active = False
self.cron.method_direct_trigger()
generated_requests = self.maintenance_request_obj.search(
[("maintenance_plan_id", "=", self.maintenance_plan_1.id)],
order="schedule_date asc",
)
self.assertEqual(len(generated_requests), 0)
self.equipment_1.active = True
self.cron.method_direct_trigger()
generated_requests = self.maintenance_request_obj.search(
[("maintenance_plan_id", "=", self.maintenance_plan_1.id)],
order="schedule_date asc",
)
self.assertEqual(len(generated_requests), 3)
def test_maintenance_request_report(self):
self.cron.method_direct_trigger()
generated_request = self.maintenance_request_obj.search(
[("maintenance_plan_id", "=", self.maintenance_plan_1.id)],
order="schedule_date asc",
limit=1,
)
generated_request.note = "TEST-INSTRUCTIONS"
res = self.report_obj._render_qweb_text(
"base_maintenance.report_maintenance_request",
generated_request.ids,
False,
)
self.assertRegex(str(res[0]), "TEST-INSTRUCTIONS")
def test_maintenance_plan_button_manual_request_generation(self):
self.assertEqual(len(self.maintenance_plan_1.maintenance_ids), 0)
self.maintenance_plan_1.button_manual_request_generation()
self.assertEqual(len(self.maintenance_plan_1.maintenance_ids), 3)