From 010a931a1c050a1aa1a183e22613f52759c68061 Mon Sep 17 00:00:00 2001 From: Kyle-McIntosh Date: Mon, 23 Oct 2023 22:17:42 -0400 Subject: [PATCH] Courses and CoursesOffered unit and int test --- App/tests/__init__.py | 4 +- App/tests/coursePlan.py | 170 ++++++++++++++++++++++++++++++ App/tests/coursesOfferedPerSem.py | 68 ++++++++++++ App/tests/test_app.py | 2 +- wsgi.py | 22 +++- 5 files changed, 263 insertions(+), 3 deletions(-) create mode 100644 App/tests/coursePlan.py create mode 100644 App/tests/coursesOfferedPerSem.py diff --git a/App/tests/__init__.py b/App/tests/__init__.py index c3c0114f6..84c894cbf 100644 --- a/App/tests/__init__.py +++ b/App/tests/__init__.py @@ -1,4 +1,6 @@ from .test_app import * from .courses import * from .program import * -from .staff import * \ No newline at end of file +from .staff import * +from .coursePlan import * +from .coursesOfferedPerSem import * \ No newline at end of file diff --git a/App/tests/coursePlan.py b/App/tests/coursePlan.py new file mode 100644 index 000000000..af16c631c --- /dev/null +++ b/App/tests/coursePlan.py @@ -0,0 +1,170 @@ +import pytest, unittest +from App.models import CoursePlan, CoursePlanCourses +from App.controllers import create_CoursePlan, create_student, create_program, addCourseToPlan, enroll_in_programme, addSemesterCourses, generator, createCoursesfromFile, get_program_by_name, getCoursePlan, get_all_courses_by_planid, get_student, create_programCourse, removeCourse +from App.main import create_app +from App.database import db, create_db + +class CoursePlanUnitTests(unittest.TestCase): + + def test_new_courseplan(self): + student_id = "01234" + course_plan = CoursePlan(student_id) + self.assertEqual(course_plan.studentId, student_id) + + def test_courseplan_toJSON(self): + student_id = "01234" + course_plan = CoursePlan(student_id) + course_plan_json = course_plan.get_json() + self.assertDictEqual(course_plan_json, {"planId": None, "studentId": student_id}) + + + def test_new_courseplan_courses(self): + student_id = "01234" + course_plan = CoursePlan(student_id) + course_code = "INFO2605" + courseplan_courses = CoursePlanCourses("1", course_code) + self.assertEqual(courseplan_courses.code, course_code) + + + +@pytest.fixture(autouse=True, scope="module") +def empty_db(): + app = create_app({'TESTING': True, 'SQLALCHEMY_DATABASE_URI': 'sqlite:///test.db'}) + create_db() + yield app.test_client() + db.drop_all() + + +# Integration Tests +class CoursePlanIntegrationTests(unittest.TestCase): + + def test_create_course_plan(self): + # Create a student and program. + program = create_program("Computer Science Major", 69, 15, 9) + student = create_student("1234", "johnpass", "John Doe", program.name) + + #Create courses, semester courses and program coursess + createCoursesfromFile('testData/courseData.csv') + + file_path = "testData/test.txt" + with open(file_path, 'r') as file: + for i, line in enumerate(file): + line = line.strip() + if i ==0: + programName = line + else: + course = line.split(',') + create_programCourse(programName, course[0],int(course[1])) + + file_path1='testData/test2.txt' + with open(file_path1, 'r') as file: + for i, line in enumerate(file): + line = line.strip() + addSemesterCourses(line) + + + plan = create_CoursePlan(student.id) + self.assertIsNotNone(plan) + assert getCoursePlan(student.id) != None + + course_code = "INFO1601" + added_plan = addCourseToPlan(student, course_code) + courseplan_courses = get_all_courses_by_planid("1") + + self.assertIsNotNone(added_plan) + self.assertIn('INFO1601', [course.code for course in courseplan_courses]) + + + def test_remove_course_from_plan(self): + program = get_program_by_name("Computer Science Major") + student = get_student("1234") + plan_id = enroll_in_programme("1234", program.id) + courseplan_courses = get_all_courses_by_planid(plan_id) + self.assertIn('INFO1601', [course.code for course in courseplan_courses]) + removeCourse(student, "INFO1601") + courseplan_courses = get_all_courses_by_planid(plan_id) + self.assertNotIn('INFO1601', [course.code for course in courseplan_courses]) + + + def test_create_fastGraduation_course_plan(self): + program = get_program_by_name("Computer Science Major") + student = get_student("1234") + plan_id = enroll_in_programme("1234", program.id) + + courseplan_courses = get_all_courses_by_planid(plan_id) + course_codes = [course.code for course in courseplan_courses] + for course_code in course_codes: + removeCourse(student, course_code) + + generator(student, "fastest") + courseplan_courses = get_all_courses_by_planid(plan_id) + + print("Courses in Course Plan:") + for course in courseplan_courses: + print(course.code) + + self.assertIsNotNone(courseplan_courses) + self.assertIn('COMP1601', [course.code for course in courseplan_courses]) + + + def test_create_easy_course_plan(self): + program = get_program_by_name("Computer Science Major") + student = get_student("1234") + plan_id = enroll_in_programme("1234", program.id) + + courseplan_courses = get_all_courses_by_planid(plan_id) + course_codes = [course.code for course in courseplan_courses] + for course_code in course_codes: + removeCourse(student, course_code) + + # Create a easy graduation course plan + generator(student, "easy") + courseplan_courses = get_all_courses_by_planid(plan_id) + + self.assertIsNotNone(courseplan_courses) + self.assertIn('COMP1601', [course.code for course in courseplan_courses]) + + def test_create_electives_course_plan(self): + program = get_program_by_name("Computer Science Major") + student = get_student("1234") + plan_id = enroll_in_programme("1234", program.id) + + courseplan_courses = get_all_courses_by_planid(plan_id) + course_codes = [course.code for course in courseplan_courses] + for course_code in course_codes: + removeCourse(student, course_code) + + # Create an electives graduation course plan + generator(student, "electives") + courseplan_courses = get_all_courses_by_planid(plan_id) + + self.assertIsNotNone(courseplan_courses) + self.assertIn('COMP1601', [course.code for course in courseplan_courses]) + + def test_get_course_plan_json(self): + + program = get_program_by_name("Computer Science Major") + student = get_student("1234") + plan_id = enroll_in_programme("1234", program.id) + + courseplan_courses = get_all_courses_by_planid(plan_id) + course_codes = [course.code for course in courseplan_courses] + for course_code in course_codes: + removeCourse(student, course_code) + + course_code = "INFO1601" + added_plan = addCourseToPlan(student, course_code) + courseplan_courses = get_all_courses_by_planid(plan_id) + courseplan = getCoursePlan("1234") + self.assertIsNotNone(added_plan) + self.assertIn('INFO1601', [course.code for course in courseplan_courses]) + + course_plan_json = courseplan.get_json() + + expected_json = { + 'planId': 1, + 'studentId': 1234 + } + self.assertEqual(course_plan_json, expected_json) + + diff --git a/App/tests/coursesOfferedPerSem.py b/App/tests/coursesOfferedPerSem.py new file mode 100644 index 000000000..3ed964b17 --- /dev/null +++ b/App/tests/coursesOfferedPerSem.py @@ -0,0 +1,68 @@ +import pytest, unittest +from App.models import CoursesOfferedPerSem +from App.controllers import addSemesterCourses, create_course, isCourseOffered, get_all_OfferedCodes, delete_all_records +from App.main import create_app +from App.database import db, create_db + + +class CoursesOfferedPerSemUnitTests(unittest.TestCase): + + def test_new_offered_course(self): + course_code = "INFO2605" + offered_course = CoursesOfferedPerSem(course_code) + self.assertEqual(offered_course.code, course_code) + + def test_offered_course_toJSON(self): + course_code = "INFO2605" + offered_course = CoursesOfferedPerSem(course_code) + offered_course_json = offered_course.get_json() + self.assertDictEqual(offered_course_json, {"ID:": None, "Course Code:": course_code}) + +@pytest.fixture(autouse=True, scope="module") +def empty_db(): + app = create_app({'TESTING': True, 'SQLALCHEMY_DATABASE_URI': 'sqlite:///test.db'}) + create_db() + yield app.test_client() + db.drop_all() + +class CoursesOfferedPerSemIntegrationTests(unittest.TestCase): + def test_add_offered_course(self): + prereqs=[] + course_code = "INFO2605" + create_course(course_code, "Professional Ethics and Law", 3, 4, prereqs) + addSemesterCourses(course_code) + self.assertTrue(isCourseOffered(course_code)) + + def test_get_all_offered_courses_json(self): + create_course("MATH2250", "Industrial Statistics",4,3,[]) + create_course("INFO2605", "Professional Ethics and Law", 3, 4, []) + addSemesterCourses("MATH2250") + addSemesterCourses("INFO2605") + offered_courses = get_all_OfferedCodes() + + assert "MATH2250" in offered_courses + assert "INFO2605" in offered_courses + + def test_remove_all_offered(self): + + create_course("MATH2250", "Industrial Statistics", 4, 3, []) + create_course("INFO2605", "Professional Ethics and Law", 3, 4, []) + addSemesterCourses("MATH2250") + addSemesterCourses("INFO2605") + + # Check that courses are offered + assert isCourseOffered("MATH2250") + assert isCourseOffered("INFO2605") + + # Remove all offered courses + delete_all_records() + + # Check that courses are no longer offered + assert not isCourseOffered("MATH2250") + assert not isCourseOffered("INFO2605") + + + + + + diff --git a/App/tests/test_app.py b/App/tests/test_app.py index 154d04b48..f90573b0b 100644 --- a/App/tests/test_app.py +++ b/App/tests/test_app.py @@ -7,7 +7,7 @@ from App.main import create_app from App.database import db, create_db -from App.models import User, Student, Program, StudentCourseHistory +from App.models import User, Student, Program, StudentCourseHistory, CoursePlan from App.controllers import ( create_user, get_all_users_json, diff --git a/wsgi.py b/wsgi.py index 76f5c8fac..be2229779 100644 --- a/wsgi.py +++ b/wsgi.py @@ -220,8 +220,28 @@ def courses_tests_command(type): else: sys.exit(pytest.main(["App/tests/courses.py"])) - +@test.command("coursePlan", help="Run Course Plan tests") +@click.argument("type", default="all") +def courses_tests_command(type): + if type == "unit": + sys.exit(pytest.main(["App/tests/coursePlan.py::CoursePlanUnitTests"])) + elif type == "int": + sys.exit(pytest.main(["App/tests/coursePlan.py::CoursePlanIntegrationTests"])) + else: + sys.exit(pytest.main(["App/tests/coursePlan.py"])) + +#CoursesOfferedPerSemUnitTests +@test.command("coursesOffered", help="Run Courses Offered Per Sem tests") +@click.argument("type", default="all") +def courses_tests_command(type): + if type == "unit": + sys.exit(pytest.main(["App/tests/coursesOfferedPerSem.py::CoursesOfferedPerSemUnitTests"])) + elif type == "int": + sys.exit(pytest.main(["App/tests/coursesOfferedPerSem.py::CoursesOfferedPerSemIntegrationTests"])) + else: + sys.exit(pytest.main(["App/tests/coursesOfferedPerSem.py"])) + @test.command("program", help="Run Program tests") @click.argument("type", default="all")