Files
pms/pms_housekeeping/tests/test_pms_housekeeping_task.py
2024-04-02 13:09:00 +02:00

522 lines
19 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from datetime import datetime, timedelta
from freezegun import freeze_time
from odoo.exceptions import ValidationError
from .common import TestPms
class TestPmsHousekeepingTask(TestPms):
def setUp(self):
super().setUp()
def test_task_max_inheritance(self):
# ARRANGE
task_type = self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type Parent",
"is_checkout": True,
}
)
parent_task = self.env["pms.housekeeping.task"].create(
{
"name": "Parent task",
"room_id": self.room1.id,
"task_type_id": task_type.id,
"task_date": datetime.today(),
}
)
child_task = self.env["pms.housekeeping.task"].create(
{
"name": "Child task",
"room_id": self.room1.id,
"task_type_id": task_type.id,
"parent_id": parent_task.id,
"task_date": datetime.today(),
}
)
# ACT & ASSERT
with self.assertRaises(
ValidationError,
msg="The maximum level of inheritance between tasks should be 2",
):
self.env["pms.housekeeping.task"].create(
{
"name": "Grandchild task",
"room_id": self.room1.id,
"task_type_id": task_type.id,
"parent_id": child_task.id,
"task_date": datetime.today(),
}
)
def test_task_with_non_housekeeper_employee(self):
# ARRANGE
self.job_id = self.env["hr.job"].create(
{
"name": "Non housekeeper job",
}
)
self.employee = self.env["hr.employee"].create(
{
"name": "Test Employee",
"company_id": self.company1.id,
"job_id": self.job_id.id,
}
)
self.task_type = self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type 1",
}
)
# ACT & ASSERT
with self.assertRaises(
ValidationError, msg="Task should be assigned to a housekeeper role"
):
self.env["pms.housekeeping.task"].create(
{
"name": "Task",
"room_id": self.room1.id,
"task_type_id": self.task_type.id,
"task_date": datetime.today(),
"housekeeper_ids": [(6, 0, [self.employee.id])],
}
)
def test_task_with_housekeeper_employee(self):
# ARRANGE
self.employee = self.env["hr.employee"].create(
{
"name": "Test Employee",
"company_id": self.company1.id,
"job_id": self.env.ref("pms_housekeeping.housekeeping_job_id").id,
}
)
self.task_type = self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type 1",
}
)
# ACT
self.task = self.env["pms.housekeeping.task"].create(
{
"name": "Task",
"room_id": self.room1.id,
"task_type_id": self.task_type.id,
"task_date": datetime.today(),
"housekeeper_ids": [(6, 0, [self.employee.id])],
}
)
# ASSERT
self.assertTrue(self.task, "Housekeeping task should be created")
def test_task_inconsistency_between_room_id_and_housekeeper_properties(self):
# ARRANGE
self.pms_property2 = self.env["pms.property"].create(
{
"name": "Property 2",
"company_id": self.company1.id,
"default_pricelist_id": self.pricelist1.id,
}
)
self.room2 = self.env["pms.room"].create(
{
"name": "Room 202",
"pms_property_id": self.pms_property2.id,
"room_type_id": self.room_type1.id,
}
)
self.employee = self.env["hr.employee"].create(
{
"name": "Test Employee",
"company_id": self.company1.id,
"job_id": self.env.ref("pms_housekeeping.housekeeping_job_id").id,
"property_ids": [(6, 0, [self.pms_property1.id])],
}
)
self.task_type = self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type 1",
}
)
# ACT & ASSERT
with self.assertRaises(
ValidationError,
msg="Task with inconsistency between room_id and "
"housekeeper properties should not be created",
):
self.env["pms.housekeeping.task"].create(
{
"name": "Task",
"room_id": self.room2.id,
"task_type_id": self.task_type.id,
"task_date": datetime.today(),
"housekeeper_ids": [(6, 0, [self.employee.id])],
}
)
def test_task_consistency_between_room_id_and_housekeeper_properties(self):
# ARRANGE
self.employee = self.env["hr.employee"].create(
{
"name": "Test Employee",
"company_id": self.company1.id,
"job_id": self.env.ref("pms_housekeeping.housekeeping_job_id").id,
"property_ids": [(6, 0, [self.pms_property1.id])],
}
)
self.task_type = self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type 1",
}
)
# ACT
task = self.env["pms.housekeeping.task"].create(
{
"name": "Task",
"room_id": self.room1.id,
"task_type_id": self.task_type.id,
"task_date": datetime.today(),
"housekeeper_ids": [(6, 0, [self.employee.id])],
}
)
# ASSERT
self.assertTrue(
task,
"Task with consistency between room_id and "
"housekeeper properties should be created",
)
# Tests generate_tasks method
@freeze_time("2000-01-10")
def test_task_generate_tasks_create_overnight(self):
# ARRANGE
self.env["pms.reservation"].create(
{
"checkin": datetime.today(),
"checkout": datetime.today() + timedelta(days=7),
"room_type_id": self.room_type1.id,
"partner_id": self.partner1.id,
"pms_property_id": self.pms_property1.id,
"pricelist_id": self.pricelist1.id,
"sale_channel_origin_id": self.sale_channel1.id,
}
)
self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type 1",
"is_overnight": True,
"days_after_clean_overnight": 2,
}
)
test_dates = ["2000-01-12", "2000-01-14", "2000-01-16"]
for test_date in test_dates:
with self.subTest(test_date=test_date):
with freeze_time(test_date):
# ACT
self.env["pms.housekeeping.task"].generate_tasks(self.pms_property1)
# ASSERT
housekeeping_task = self.env["pms.housekeeping.task"].search(
[("room_id", "=", self.room1.id), ("task_date", "=", test_date)]
)
self.assertTrue(
housekeeping_task, "Overnight tasks should be created"
)
@freeze_time("2000-01-10")
def test_task_generate_tasks_no_create_overnight_tasks(self):
# ARRANGE
self.env["pms.reservation"].create(
{
"checkin": datetime.today(),
"checkout": datetime.today() + timedelta(days=7),
"room_type_id": self.room_type1.id,
"partner_id": self.partner1.id,
"pms_property_id": self.pms_property1.id,
"pricelist_id": self.pricelist1.id,
"sale_channel_origin_id": self.sale_channel1.id,
}
)
self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type 1",
"is_overnight": True,
"days_after_clean_overnight": 2,
}
)
test_dates = ["2000-01-11", "2000-01-13", "2000-01-15"]
for test_date in test_dates:
with self.subTest(test_date=test_date):
with freeze_time(test_date):
# ACT
self.env["pms.housekeeping.task"].generate_tasks(self.pms_property1)
# ASSERT
housekeeping_task = self.env["pms.housekeeping.task"].search(
[("room_id", "=", self.room1.id), ("task_date", "=", test_date)]
)
self.assertFalse(
housekeeping_task, "Overnight tasks shouldn't be created"
)
@freeze_time("2000-01-04")
def test_task_generate_tasks_no_create_overnight_task_no_overnight_reservations(
self,
):
# ARRANGE
self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type 1",
"is_overnight": True,
"days_after_clean_overnight": 2,
}
)
# ACT
self.env["pms.housekeeping.task"].generate_tasks(self.pms_property1)
# ASSERT
housekeeping_task = self.env["pms.housekeeping.task"].search(
[("room_id", "=", self.room1.id)]
)
self.assertFalse(housekeeping_task, "Empty tasks shouldn't be created")
@freeze_time("2000-02-11")
def test_task_generate_tasks_create_empty_tasks(self):
# ARRANGE
self.env["pms.reservation"].create(
{
"checkin": datetime.today() + timedelta(days=-20),
"checkout": datetime.today() + timedelta(days=-10),
"room_type_id": self.room_type1.id,
"partner_id": self.partner1.id,
"pms_property_id": self.pms_property1.id,
"pricelist_id": self.pricelist1.id,
"sale_channel_origin_id": self.sale_channel1.id,
}
)
self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type 1",
"is_empty": True,
"days_after_clean_empty": 2,
}
)
test_dates = ["2000-02-03", "2000-02-05", "2000-02-07"]
for test_date in test_dates:
with self.subTest(test_date=test_date):
with freeze_time(test_date):
# ACT
self.env["pms.housekeeping.task"].generate_tasks(self.pms_property1)
# ASSERT
housekeeping_task = self.env["pms.housekeeping.task"].search(
[("room_id", "=", self.room1.id), ("task_date", "=", test_date)]
)
self.assertTrue(housekeeping_task, "Empty tasks should be created")
@freeze_time("2000-02-11")
def test_task_generate_tasks_no_create_empty_tasks(self):
# ARRANGE
self.env["pms.reservation"].create(
{
"checkin": datetime.today() + timedelta(days=-20),
"checkout": datetime.today() + timedelta(days=-10),
"room_type_id": self.room_type1.id,
"partner_id": self.partner1.id,
"pms_property_id": self.pms_property1.id,
"pricelist_id": self.pricelist1.id,
"sale_channel_origin_id": self.sale_channel1.id,
}
)
self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type 1",
"is_empty": True,
"days_after_clean_empty": 2,
}
)
test_dates = ["2000-02-02", "2000-02-04", "2000-02-06"]
for test_date in test_dates:
with self.subTest(test_date=test_date):
with freeze_time(test_date):
# ACT
self.env["pms.housekeeping.task"].generate_tasks(self.pms_property1)
# ASSERT
housekeeping_task = self.env["pms.housekeeping.task"].search(
[("room_id", "=", self.room1.id), ("task_date", "=", test_date)]
)
self.assertFalse(
housekeeping_task, "Empty tasks should not be created"
)
@freeze_time("2000-01-04")
def test_task_generate_tasks_no_create_empty_task_no_previous_checkouts(self):
# ARRANGE
self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type 1",
"is_empty": True,
"days_after_clean_empty": 2,
}
)
# ACT
self.env["pms.housekeeping.task"].generate_tasks(self.pms_property1)
# ASSERT
housekeeping_task = self.env["pms.housekeeping.task"].search(
[("room_id", "=", self.room1.id)]
)
self.assertFalse(housekeeping_task, "Empty tasks shouldn't be created")
@freeze_time("2000-01-04")
def test_task_generate_tasks_create_checkin_task(self):
# ARRANGE
self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type 1",
"is_checkin": True,
}
)
self.env["pms.reservation"].create(
{
"checkin": datetime.today(),
"checkout": datetime.today() + timedelta(days=3),
"room_type_id": self.room_type1.id,
"partner_id": self.partner1.id,
"pms_property_id": self.pms_property1.id,
"pricelist_id": self.pricelist1.id,
"sale_channel_origin_id": self.sale_channel1.id,
}
)
# ACT
self.env["pms.housekeeping.task"].generate_tasks(self.pms_property1)
# ASSERT
housekeeping_task = self.env["pms.housekeeping.task"].search(
[("room_id", "=", self.room1.id)]
)
self.assertTrue(housekeeping_task, "Checkin tasks should be created")
@freeze_time("2000-01-04")
def test_task_generate_tasks_no_create_checkin_task(self):
# ARRANGE
self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type 1",
"is_checkin": True,
}
)
# ACT
self.env["pms.housekeeping.task"].generate_tasks(self.pms_property1)
# ASSERT
housekeeping_task = self.env["pms.housekeeping.task"].search(
[("room_id", "=", self.room1.id)]
)
self.assertFalse(housekeeping_task, "Checkin task shouldn't be created")
@freeze_time("2000-01-04")
def test_task_generate_tasks_create_checkout_task(self):
# ARRANGE
self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type 1",
"is_checkout": True,
}
)
self.env["pms.reservation"].create(
{
"checkin": datetime.today() + timedelta(days=-3),
"checkout": datetime.today(),
"room_type_id": self.room_type1.id,
"partner_id": self.partner1.id,
"pms_property_id": self.pms_property1.id,
"pricelist_id": self.pricelist1.id,
"sale_channel_origin_id": self.sale_channel1.id,
}
)
# ACT
self.env["pms.housekeeping.task"].generate_tasks(self.pms_property1)
# ASSERT
housekeeping_task = self.env["pms.housekeeping.task"].search(
[("room_id", "=", self.room1.id)]
)
self.assertTrue(housekeeping_task, "Checkout task should be created")
@freeze_time("2000-01-04")
def test_task_generate_tasks_no_create_checkout_task(self):
# ARRANGE
self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type 1",
"is_checkout": True,
}
)
# ACT
self.env["pms.housekeeping.task"].generate_tasks(self.pms_property1)
# ASSERT
housekeeping_task = self.env["pms.housekeeping.task"].search(
[("room_id", "=", self.room1.id)]
)
self.assertFalse(housekeeping_task, "Checkout task shouldn't be created")
@freeze_time("2000-01-04")
def test_task_generate_tasks_create_child_task(self):
# ARRANGE
parent_task_type = self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type Parent",
"is_checkout": True,
}
)
child_task_type = self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type Child",
"is_checkout": True,
"parent_id": parent_task_type.id,
}
)
self.env["pms.reservation"].create(
{
"checkin": datetime.today() + timedelta(days=-3),
"checkout": datetime.today(),
"room_type_id": self.room_type1.id,
"partner_id": self.partner1.id,
"pms_property_id": self.pms_property1.id,
"pricelist_id": self.pricelist1.id,
"sale_channel_origin_id": self.sale_channel1.id,
}
)
# ACT
self.env["pms.housekeeping.task"].generate_tasks(self.pms_property1)
# ASSERT
housekeeping_task = self.env["pms.housekeeping.task"].search(
[
("room_id", "=", self.room1.id),
("task_type_id", "=", child_task_type.id),
]
)
self.assertTrue(housekeeping_task, "Child task should be created")
def test_task_generate_tasks_no_create_child_task(self):
# ARRANGE
self.env["pms.housekeeping.task.type"].create(
{
"name": "Task Type Parent",
"is_checkout": True,
}
)
self.env["pms.reservation"].create(
{
"checkin": datetime.today() + timedelta(days=-3),
"checkout": datetime.today(),
"room_type_id": self.room_type1.id,
"partner_id": self.partner1.id,
"pms_property_id": self.pms_property1.id,
"pricelist_id": self.pricelist1.id,
"sale_channel_origin_id": self.sale_channel1.id,
}
)
# ACT
self.env["pms.housekeeping.task"].generate_tasks(self.pms_property1)
# ASSERT
housekeeping_task = self.env["pms.housekeeping.task"].search(
[("room_id", "=", self.room1.id)]
)
self.assertFalse(housekeeping_task.child_ids, "Child task shouldn´t be created")