diff --git a/lms/lms/doctype/lms_course/test_lms_course.py b/lms/lms/doctype/lms_course/test_lms_course.py index 936fb0e9..f1225bf4 100644 --- a/lms/lms/doctype/lms_course/test_lms_course.py +++ b/lms/lms/doctype/lms_course/test_lms_course.py @@ -5,58 +5,63 @@ import unittest import frappe -from .lms_course import LMSCourse +from lms.lms.api import delete_course class TestLMSCourse(unittest.TestCase): - def test_new_course(self): - course = new_course("Test Course") - assert course.title == "Test Course" + def setUp(self): + self.cleanup_items = [] def tearDown(self): - if frappe.db.exists("User", "tester@example.com"): - frappe.delete_doc("User", "tester@example.com") + for item_type, item_name in reversed(self.cleanup_items): + if frappe.db.exists(item_type, item_name): + try: + frappe.delete_doc(item_type, item_name, force=True) + except Exception as e: + frappe.log_error(f"Failed to delete {item_type} {item_name}: {e}") - if frappe.db.exists("LMS Course", "test-course"): - frappe.db.delete("Batch Course", {"course": "test-course"}) - frappe.db.delete("LMS Enrollment", {"course": "test-course"}) - frappe.db.delete("Course Lesson", {"course": "test-course"}) - frappe.db.delete("Course Chapter", {"course": "test-course"}) - frappe.db.delete("LMS Course Mentor Mapping", {"course": "test-course"}) - frappe.db.delete("Course Instructor", {"parent": "test-course"}) - frappe.db.sql("delete from `tabCourse Instructor`") - frappe.delete_doc("LMS Course", "test-course") + def test_new_course(self): + course_name = f"Test Course {frappe.generate_hash()}" + course = self._create_course(course_name) -def new_user(name, email): - user = frappe.db.exists("User", email) - if user: - return frappe.get_doc("User", user) - else: - filters = { - "email": email, - "first_name": name, - "send_welcome_email": False, - } + self.assertEqual(course.title, course_name) + self.assertTrue(frappe.db.exists("LMS Course", course.name)) - doc = frappe.new_doc("User") - doc.update(filters) - doc.save() - return doc + def test_delete_course(self): + course = self._create_course(f"Test Course {frappe.generate_hash()}") + chapter = self._create_chapter(f"Test Chapter {frappe.generate_hash()}", course.name) + lesson = self._create_lesson(f"Test Lesson {frappe.generate_hash()}", chapter.name) + self._create_lesson_reference(chapter.name, lesson.name) + self._create_chapter_reference(course.name, chapter.name) -def new_course(title, additional_filters=None): - course = frappe.db.exists("LMS Course", {"title": title}) - if course: - return frappe.get_doc("LMS Course", course) - else: - create_evaluator() + user_email = f"test_{frappe.generate_hash()}@example.com" + self._create_user("Test Member", user_email) + enrollment = self._create_enrollment(user_email, course.name) + self._create_progress(user_email, course.name, lesson.name) + + delete_course(course.name) + + self.assertFalse(frappe.db.exists("LMS Course", course.name)) + self.assertFalse(frappe.db.exists("Course Chapter", chapter.name)) + self.assertFalse(frappe.db.exists("Course Lesson", lesson.name)) + self.assertFalse(frappe.db.exists("LMS Enrollment", enrollment.name)) + self.assertFalse(frappe.db.exists("LMS Course Progress", {"course": course.name})) + self.assertFalse(frappe.db.exists("Chapter Reference", {"parent": course.name})) + self.assertFalse(frappe.db.exists("Lesson Reference", {"parent": chapter.name})) + + def _ensure_test_user(self): + self._create_evaluator() user = frappe.db.get_value( "User", - { - "user_type": "System User", - }, + {"user_type": "System User"}, ) + return user + + def _create_course(self, title, additional_filters=None): + user = self._ensure_test_user() + filters = { "title": title, "short_introduction": title, @@ -70,15 +75,111 @@ def new_course(title, additional_filters=None): if additional_filters: filters.update(additional_filters) - doc = frappe.new_doc("LMS Course") - doc.update(filters) + course = frappe.new_doc("LMS Course") + course.update(filters) + course.save() + self.cleanup_items.append(("LMS Course", course.name)) + return course + + def _create_chapter(self, title, course): + chapter = frappe.new_doc("Course Chapter") + chapter.update( + { + "title": title, + "course": course, + } + ) + chapter.save() + self.cleanup_items.append(("Course Chapter", chapter.name)) + return chapter + + def _create_lesson(self, title, chapter): + lesson = frappe.new_doc("Course Lesson") + lesson.update( + { + "title": title, + "chapter": chapter, + } + ) + lesson.save() + self.cleanup_items.append(("Course Lesson", lesson.name)) + return lesson + + def _create_lesson_reference(self, chapter, lesson): + lesson_ref = frappe.get_doc( + { + "doctype": "Lesson Reference", + "lesson": lesson, + "parent": chapter, + "parenttype": "Course Chapter", + "parentfield": "lessons", + "idx": 1, + } + ) + lesson_ref.insert() + self.cleanup_items.append(("Lesson Reference", lesson_ref.name)) + return lesson_ref + + def _create_chapter_reference(self, course, chapter): + chapter_ref = frappe.get_doc( + { + "doctype": "Chapter Reference", + "chapter": chapter, + "parent": course, + "parenttype": "LMS Course", + "parentfield": "chapters", + "idx": 1, + } + ) + chapter_ref.insert() + self.cleanup_items.append(("Chapter Reference", chapter_ref.name)) + return chapter_ref + + def _create_user(self, name, email): + user = frappe.db.exists("User", email) + if user: + return frappe.get_doc("User", user) + + doc = frappe.new_doc("User") + doc.update( + { + "email": email, + "first_name": name, + "send_welcome_email": False, + } + ) doc.save() + self.cleanup_items.append(("User", doc.name)) return doc - -def create_evaluator(): - if not frappe.db.exists("Course Evaluator", "evaluator@example.com"): - new_user("Evaluator", "evaluator@example.com") - frappe.get_doc({"doctype": "Course Evaluator", "evaluator": "evaluator@example.com"}).save( - ignore_permissions=True + def _create_enrollment(self, member, course): + enrollment = frappe.new_doc("LMS Enrollment") + enrollment.update( + { + "member": member, + "course": course, + } ) + enrollment.insert() + self.cleanup_items.append(("LMS Enrollment", enrollment.name)) + return enrollment + + def _create_progress(self, member, course, lesson): + progress = frappe.new_doc("LMS Course Progress") + progress.update( + { + "member": member, + "course": course, + "lesson": lesson, + } + ) + progress.insert() + self.cleanup_items.append(("LMS Course Progress", progress.name)) + return progress + + def _create_evaluator(self): + if not frappe.db.exists("Course Evaluator", "evaluator@example.com"): + self._create_user("Evaluator", "evaluator@example.com") + evaluator = frappe.get_doc({"doctype": "Course Evaluator", "evaluator": "evaluator@example.com"}) + evaluator.save(ignore_permissions=True) + self.cleanup_items.append(("Course Evaluator", evaluator.name))