diff --git a/lms/lms/doctype/course_evaluator/test_course_evaluator.py b/lms/lms/doctype/course_evaluator/test_course_evaluator.py index e3e7f9af..7a4dc4a8 100644 --- a/lms/lms/doctype/course_evaluator/test_course_evaluator.py +++ b/lms/lms/doctype/course_evaluator/test_course_evaluator.py @@ -1,8 +1,10 @@ # Copyright (c) 2022, Frappe and Contributors # See license.txt +import frappe from frappe.utils import add_days, format_time, getdate +from lms.lms.api import save_role from lms.lms.doctype.course_evaluator.course_evaluator import get_schedule, get_schedule_range_end_date from lms.lms.test_helpers import BaseTestUtils @@ -63,3 +65,59 @@ class TestCourseEvaluator(BaseTestUtils): for row in schedule: schedule_date = getdate(row.get("date")) self.assertFalse(unavailable_from < schedule_date < unavailable_to) + + +class TestEvaluatorRoleCRUD(BaseTestUtils): + def setUp(self): + super().setUp() + self.admin = self._create_user( + "frappe@example.com", "Frappe", "Admin", ["Moderator", "Course Creator", "Batch Evaluator"] + ) + self.test_user = self._create_user("eval_test@example.com", "Eval", "Tester", ["LMS Student"]) + + def _has_batch_evaluator_role(self, user): + return frappe.db.exists("Has Role", {"parent": user, "role": "Batch Evaluator"}) + + def _has_course_evaluator(self, user): + return frappe.db.exists("Course Evaluator", {"evaluator": user}) + + def test_add_evaluator_role_creates_both(self): + """save_role with value=1 should create Has Role AND Course Evaluator.""" + frappe.set_user("frappe@example.com") + save_role(self.test_user.email, "Batch Evaluator", 1) + frappe.set_user("Administrator") + + self.assertTrue(self._has_batch_evaluator_role(self.test_user.email)) + self.assertTrue(self._has_course_evaluator(self.test_user.email)) + + self.cleanup_items.append(("Course Evaluator", self.test_user.email)) + + def test_remove_evaluator_role_removes_both(self): + """save_role with value=0 should remove Has Role AND Course Evaluator.""" + frappe.set_user("frappe@example.com") + save_role(self.test_user.email, "Batch Evaluator", 1) + save_role(self.test_user.email, "Batch Evaluator", 0) + frappe.set_user("Administrator") + + self.assertFalse(self._has_batch_evaluator_role(self.test_user.email)) + self.assertFalse(self._has_course_evaluator(self.test_user.email)) + + def test_remove_evaluator_role_no_error_when_missing(self): + """Removing role that doesn't exist should not raise an error.""" + frappe.set_user("frappe@example.com") + save_role(self.test_user.email, "Batch Evaluator", 0) + frappe.set_user("Administrator") + + self.assertFalse(self._has_batch_evaluator_role(self.test_user.email)) + + def test_reject_non_lms_role(self): + """Assigning a role outside LMS_ROLES should raise PermissionError.""" + frappe.set_user("frappe@example.com") + self.assertRaises(frappe.PermissionError, save_role, self.test_user.email, "System Manager", 1) + frappe.set_user("Administrator") + + def test_non_moderator_cannot_save_role(self): + """[A non-moderator user should not be able to assign roles.]""" + frappe.set_user(self.test_user.email) + self.assertRaises(frappe.PermissionError, save_role, self.test_user.email, "Course Creator", 1) + frappe.set_user("Administrator")