def test_preclude_CRD(self): ''' Tests creating, reading and deleting of preclusions. ''' if not self.preclude_CRD_tested: model.add_module(self.test_preclude_code, self.test_module_name, self.test_module_desc, self.test_module_mc, self.test_module_status) outcome = model.add_preclusion(self.test_module_code, self.test_preclude_code) assert_true(outcome) # Module should not preclude itself check outcome = model.add_preclusion(self.test_preclude_code, self.test_preclude_code) assert_false(outcome) # Modules should mutually preclude each other preclude_info = model.get_preclusion(self.test_module_code) assert_true(preclude_info is not None) assert_equal(self.test_preclude_code, preclude_info[0][0]) preclude_info = model.get_preclusion(self.test_preclude_code) assert_true(preclude_info is not None) assert_equal(self.test_module_code, preclude_info[0][0]) model.delete_preclusion(self.test_module_code, self.test_preclude_code) model.delete_module(self.test_preclude_code) # After deleting preclusion, it should not exist preclude_info = model.get_preclusion(self.test_module_code) assert_true(len(preclude_info) == 0) return
def test_query_module_taken_together_specified_mod_specified_aysem(self): ''' Tests querying the list of modules taken together with specified module in the specified semester ''' # Add some dummy students and modules model.add_student('dummyYr1A', 1) model.add_module('AAA1111', 'Dummy 1', 'Description', 4, 'Active') model.add_module('AAA1112', 'Dummy 2', 'Description', 4, 'Active') model.add_student_plan('dummyYr1A', True, 'AAA1111', 'AY 17/18 Sem 2') model.add_student_plan('dummyYr1A', True, 'AAA1112', 'AY 17/18 Sem 2') list_of_mod_taken_together = \ model.get_mod_taken_together_with_mod_and_aysem('AAA1111', 'AY 17/18 Sem 2') required_list = [('AAA1111', 'Dummy 1', 'AAA1112', 'Dummy 2', 1)] assert_equal(len(list_of_mod_taken_together), len(required_list)) assert_equal(sorted(list_of_mod_taken_together), sorted(required_list)) assert_true( self.is_count_in_non_ascending_order(list_of_mod_taken_together)) # Clean up database model.delete_all_plans_of_student('dummyYr1A') model.delete_module('AAA1111') model.delete_module('AAA1112') model.delete_student('dummyYr1A')
def test_preclude_delete_all(self): ''' Tests deleting all preclusions of specific module. ''' if not self.preclude_delete_all_tested: model.add_module(self.test_preclude_code, self.test_module_name, self.test_module_desc, self.test_module_mc, self.test_module_status) model.add_module(self.test_preclude_code2, self.test_module_name, self.test_module_desc, self.test_module_mc, self.test_module_status) model.add_preclusion(self.test_module_code, self.test_preclude_code) model.add_preclusion(self.test_module_code, self.test_preclude_code2) outcome = model.delete_all_preclusions(self.test_module_code) assert_true(outcome) preclude_info_1 = model.get_preclusion(self.test_preclude_code) preclude_info_2 = model.get_preclusion(self.test_preclude_code2) preclude_info_3 = model.get_preclusion(self.test_module_code) model.delete_module(self.test_preclude_code) model.delete_module(self.test_preclude_code2) assert_true(len(preclude_info_1) == 0) assert_true(len(preclude_info_2) == 0) assert_true(len(preclude_info_3) == 0) return
def test_prereq_delete_all(self): ''' Tests deleting all prerequisites of specific module. ''' if not self.prereq_delete_all_tested: model.add_module(self.test_prereq_code, self.test_module_name, self.test_module_desc, self.test_module_mc, self.test_module_status) model.add_module(self.test_prereq2_code, self.test_module_name, self.test_module_desc, self.test_module_mc, self.test_module_status) model.add_prerequisite(self.test_module_code, self.test_prereq_code, self.test_prereq_index) model.add_prerequisite(self.test_module_code, self.test_prereq2_code, self.test_prereq2_index) outcome = model.delete_all_prerequisite(self.test_module_code) assert_true(outcome) model.delete_module(self.test_prereq_code) model.delete_module(self.test_prereq2_code) prereq_info = model.get_prerequisite(self.test_module_code) assert_true(len(prereq_info) == 0) return
def tearDown(self): ''' Tears down 'app.py' fixture and logs out ''' session.tear_down(self.test_app) model.delete_module(self.DUMMY_MODULE_CODE)
def test_query_module_before_internship(self): ''' Tests querying the list of modules taken before internship, in AY/Sem with people doing internship in. ''' # Add some modules and dummy students required_dummy = ('AAA1111', 'Dummy for Intern', 1) model.add_student('dummyYr1A', 1) model.add_module('AAA1111', 'Dummy for Intern', 'Description', 4, 'Active') model.add_student_plan('dummyYr1A', True, 'AAA1111', 'AY 16/17 Sem 2') model.add_student_plan('dummyYr1A', True, self.INTERN_MOD, self.INTERN_SEM) # Get list of modules taken before internship list_of_modules_before_internship = model.get_mod_before_intern( self.INTERN_SEM) assert required_dummy in list_of_modules_before_internship # Clean up database model.delete_all_plans_of_student('dummyYr1A') model.delete_module('AAA1111') model.delete_student('dummyYr1A') # Test that required dummy no longer in list list_of_modules_before_internship = model.get_mod_before_intern( self.INTERN_SEM) assert required_dummy not in list_of_modules_before_internship
def test_query_module_before_internship_with_mod_after_internship(self): ''' Tests querying the list of modules taken before internship, in AY/Sem with people doing internship in, and with some modules taken after or during aysem of internship ''' # Get list of modules before internship list_of_modules_before_internship = model.get_mod_before_intern( self.INTERN_SEM) # Add some dummy students and plans. They should not affect the list model.add_student('dummyYr1A', 1) model.add_module('AAA1111', 'Dummy with Intern', 'Description', 4, 'Active') model.add_module('AAA1112', 'Dummy after Intern', 'Description', 4, 'Active') model.add_student_plan('dummyYr1A', True, 'AAA1111', self.INTERN_SEM) model.add_student_plan('dummyYr1A', True, self.INTERN_MOD, self.INTERN_SEM) model.add_student_plan('dummyYr1A', True, 'AAA1112', 'AY 17/18 Sem 2') # Get new list of modules before internship. It should remain unchanged. new_list_of_modules_before_internship = model.get_mod_before_intern( self.INTERN_SEM) assert_equal(len(list_of_modules_before_internship), len(new_list_of_modules_before_internship)) assert_equal(sorted(list_of_modules_before_internship), sorted(new_list_of_modules_before_internship)) # Clean up database model.delete_all_plans_of_student('dummyYr1A') model.delete_module('AAA1111') model.delete_module('AAA1112') model.delete_student('dummyYr1A')
def tearDown(self): ''' Clean up the database after all test cases are ran ''' model.delete_prerequisite(self.test_module_code, self.test_prereq_code) model.delete_tenta_mounting(self.test_module_code, self.test_module_tenta_mounting_s1) model.delete_module(self.test_module_code)
def test_is_existing_module(self): ''' Tests if is_existing_module() function is working correctly. ''' current_test_module_code = "ZZ7654" assert_false(model.is_existing_module(current_test_module_code)) model.add_module(current_test_module_code, "Exist Module", "I describe myself", 4, "New") assert_true(model.is_existing_module(current_test_module_code)) model.delete_module(current_test_module_code)
def tearDown(self): ''' Clean up the database after all test cases are ran ''' model.delete_module(self.test_module_code) model.delete_module(self.test_prereq_code) model.delete_module(self.test_prereq2_code) model.delete_module(self.test_prereq3_code)
def POST(self): ''' Handles the deletion of a module ''' # Verify that module exists input_data = model.validate_input(web.input(), ["code"], show_404=False) try: module_code = input_data.code except AttributeError: return Outcome().POST("delete_module", False, None) # Verify that module's status is 'New' module_infos = model.get_new_modules() new_modules = [module_info[0] for module_info in module_infos] if module_code not in new_modules: return Outcome().POST("delete_module", False, None) else: outcome = model.delete_module(module_code) if outcome is False: tenta_mounted_modules = model.get_all_tenta_mounted_modules() tenta_mounted_module_codes = [ module[0] for module in tenta_mounted_modules ] if module_code in tenta_mounted_module_codes: return Outcome().POST("delete_module", "has_mounting", module_code) else: return Outcome().POST("delete_module", "is_starred", module_code) else: return Outcome().POST("delete_module", True, module_code)
def test_add_mod_with_repeat_code(self): ''' Tests that adding of module with duplicated code will fail. ''' # Not duplicate code --> success outcome = model.add_module("AA2222", "Dummy Module", "Dummy Description", 1, "New") assert_true(outcome) # Duplicate code --> fail outcome = model.add_module(self.test_module_code, self.test_module_name, self.test_module_desc, self.test_module_mc, "New") assert_false(outcome) model.delete_module("AA2222")
def test_delete_module_with_mounting(self): ''' Tests deleting of modules with tentative mounting. ''' outcome = model.delete_module(self.test_module_code) assert_false(outcome) module_info = model.get_module(self.test_module_code) assert_true(module_info is not None) return
def test_list_students_take_module_empty(self): ''' Tests querying the list of students who plan to take a certain mod in a specified semester, where these are no students planning to take the module. ''' model.add_module('AAA1111', 'Dummy Module', 'Description', 4, 'Active') list_of_students_take_mod = \ model.get_list_students_take_module('AAA1111', 'AY 17/18 Sem 1') required_list = [] # Clean up database model.delete_module('AAA1111') assert_equal(len(list_of_students_take_mod), len(required_list)) assert_equal(sorted(list_of_students_take_mod), sorted(required_list))
def tearDown(self): ''' Clean up the database after all test cases are ran ''' model.delete_fixed_mounting('BB1001', self.current_ay+' Sem 1') model.delete_fixed_mounting('BB1001', self.current_ay+' Sem 2') model.delete_fixed_mounting('BB1002', self.current_ay+' Sem 1') model.delete_fixed_mounting('BB1003', self.current_ay+' Sem 2') model.delete_tenta_mounting('BB1001', self.next_ay+' Sem 1') model.delete_tenta_mounting('BB1001', self.next_ay+' Sem 2') model.delete_tenta_mounting('BB1002', self.next_ay+' Sem 1') model.delete_tenta_mounting('BB1003', self.next_ay+' Sem 2') model.delete_tenta_mounting('BB9999', 'AY 36/37 Sem 1') model.delete_module('BB1001') model.delete_module('BB1002') model.delete_module('BB1003') model.delete_module('BB1004') model.delete_module('BB9999')
def test_query_oversubscribed_modules(self): ''' Tests querying the list of oversubscribed modules. ''' # To simulate an oversubscribed module, add a module with 0 quota, # then add a student who wants to take the module. model.add_student('dummyYr1A', 1) model.add_module('AAA1111', 'Test Module', 'Description', 4, 'Active') model.add_student_plan('dummyYr1A', False, 'AAA1111', 'AY 17/18 Sem 1') list_of_oversub_mod = model.get_oversub_mod() oversubscribed_module = ('AAA1111', 'Test Module', 'AY 17/18 Sem 1', '?', 1) # Clean up the database model.delete_all_plans_of_student('dummyYr1A') model.delete_module("AAA1111") model.delete_student('dummyYr1A') # Test for presence of oversubscribed module assert oversubscribed_module in list_of_oversub_mod
def test_query_module_taken_together_entire_list(self): ''' Tests querying the list of modules taken together in the same semester ''' # Add some dummy students and modules model.add_student('dummyYr1A', 1) model.add_module('AAA1111', 'Dummy 1', 'Description', 4, 'Active') model.add_module('AAA1112', 'Dummy 2', 'Description', 4, 'Active') model.add_module('AAA1113', 'Dummy 3', 'Description', 4, 'Active') model.add_student_plan('dummyYr1A', True, 'AAA1111', 'AY 17/18 Sem 1') model.add_student_plan('dummyYr1A', True, 'AAA1112', 'AY 17/18 Sem 1') model.add_student_plan('dummyYr1A', True, 'AAA1112', 'AY 17/18 Sem 2') model.add_student_plan('dummyYr1A', True, 'AAA1113', 'AY 17/18 Sem 2') list_of_mod_taken_together = \ model.get_all_mods_taken_together() assert_true( self.is_count_in_non_ascending_order(list_of_mod_taken_together)) assert ('AAA1111', 'Dummy 1', 'AAA1112', 'Dummy 2', 'AY 17/18 Sem 1', 1) in list_of_mod_taken_together assert ('AAA1112', 'Dummy 2', 'AAA1113', 'Dummy 3', 'AY 17/18 Sem 2', 1) in list_of_mod_taken_together # Clean up database model.delete_all_plans_of_student('dummyYr1A') model.delete_module('AAA1111') model.delete_module('AAA1112') model.delete_module('AAA1113') model.delete_student('dummyYr1A')
def test_add_module_with_valid_form_inputs(self): ''' Tests that adding a module with all valid inputs should be successful. ''' root = self.test_app.get(self.URL_NORMAL) addModuleForm = root.forms__get()['addModForm'] addModuleForm.__setitem__('code', self.TEST_ADD_MODULE_CODE) addModuleForm.__setitem__('name', self.TEST_ADD_MODULE_NAME) addModuleForm.__setitem__('description', self.TEST_ADD_MODULE_DESCRIPTION) addModuleForm.__setitem__('mc', self.TEST_ADD_MODULE_MC) response = addModuleForm.submit() response.mustcontain( (self.OUTCOME_SUCCESS_MESSAGE % self.TEST_ADD_MODULE_CODE)) response.mustcontain(self.OUTCOME_SUCCESS_REDIRECT % self.TEST_ADD_MODULE_CODE) # For reusing data, delete it after it is successfully added. model.delete_module(self.TEST_ADD_MODULE_CODE)
def test_module_CRD(self): ''' Tests creating, reading and deleting of modules. ''' if not self.module_CRD_tested: model.add_module(self.test_module_code, self.test_module_name, self.test_module_desc, self.test_module_mc, self.test_module_status) module_info = model.get_module(self.test_module_code) assert_true(module_info is not None) assert_equal(self.test_module_code, module_info[0]) assert_equal(self.test_module_name, module_info[1]) assert_equal(self.test_module_desc, module_info[2]) assert_equal(self.test_module_mc, module_info[3]) assert_equal(self.test_module_status, module_info[4].rstrip()) model.delete_module(self.test_module_code) module_info = model.get_module(self.test_module_code) assert_true(module_info is None) return
def test_query_module_taken_together_specified_mod(self): ''' Tests querying the list of modules taken together with specified module in the same semester ''' # Add some dummy students and modules model.add_student('dummyYr1A', 1) model.add_module('AAA1111', 'Dummy 1', 'Description', 4, 'Active') model.add_module('AAA1112', 'Dummy 2', 'Description', 4, 'Active') model.add_student_plan('dummyYr1A', True, 'AAA1111', 'AY 17/18 Sem 2') model.add_student_plan('dummyYr1A', True, 'AAA1112', 'AY 17/18 Sem 2') list_of_mod_taken_together = \ model.get_mod_taken_together_with('AAA1111') # Clean up database model.delete_all_plans_of_student('dummyYr1A') model.delete_module('AAA1111') model.delete_module('AAA1112') model.delete_student('dummyYr1A') assert ('AAA1111', 'Dummy 1', 'AAA1112', 'Dummy 2', 'AY 17/18 Sem 2', 1) in list_of_mod_taken_together
def test_prereq_CRD(self): ''' Tests creating, reading and deleting of prerequisites. ''' if not self.prereq_CRD_tested: model.add_module(self.test_prereq_code, self.test_module_name, self.test_module_desc, self.test_module_mc, self.test_module_status) model.add_prerequisite(self.test_module_code, self.test_prereq_code, self.test_prereq_index) prereq_info = model.get_prerequisite(self.test_module_code) assert_true(prereq_info is not None) assert_equal(self.test_prereq_index, prereq_info[0][0]) assert_equal(self.test_prereq_code, prereq_info[0][1]) model.delete_prerequisite(self.test_module_code, self.test_prereq_code) model.delete_module(self.test_prereq_code) prereq_info = model.get_prerequisite(self.test_module_code) assert_true(len(prereq_info) == 0) return
def test_query_oversubscribed_modules_reworked(self): ''' Tests querying the list of oversubscribed modules. (This test uses the reworked function) ''' # To simulate an oversubscribed module, add a module with 0 quota, # then add a student who wants to take the module. oversub_handler = OversubModule() model.add_student('dummyYr1A', 1) model.add_module('AAA1111', 'Test Module', 'Description', 4, 'Active') model.add_student_plan('dummyYr1A', False, 'AAA1111', 'AY 17/18 Sem 1') list_of_oversub_mod = oversub_handler.GET("AY 17/18 Sem 1") oversubscribed_module = ('AAA1111', 'Test Module', 'AY 17/18 Sem 1', '-', 1, 1) # Clean up the database model.delete_all_plans_of_student('dummyYr1A') model.delete_module("AAA1111") model.delete_student('dummyYr1A') # Test for presence of oversubscribed module assert oversubscribed_module in list_of_oversub_mod
def tearDown(self): ''' Clean up the database after all test cases are ran ''' model.delete_student_plan('D1000000A', 'PT1001', self.current_ay+' Sem 1') model.delete_student_plan('D1000000A', 'PT1002', self.current_ay+' Sem 2') model.delete_student_plan('D2000000A', 'PT1001', self.current_ay+' Sem 1') model.delete_student_plan('D2000000A', 'PT1002', self.current_ay+' Sem 2') model.delete_student_plan('D1000000A', 'PT1003', self.next_ay+' Sem 1') model.delete_student_plan('D3000000A', 'PT1001', self.current_ay+' Sem 1') model.delete_student_plan('D3000000A', 'PT1004', self.next_ay+' Sem 2') model.delete_student_plan('D5000000A', 'PT1001', self.current_ay+' Sem 1') model.delete_student_plan('D5000001A', 'PT1001', self.current_ay+' Sem 1') model.delete_student_plan('D5000002A', 'PT1001', self.current_ay+' Sem 2') model.delete_student_plan('D5000000A', 'PT1005', self.next_ay+' Sem 1') model.delete_student_plan('D5000001A', 'PT1005', self.next_ay+' Sem 1') model.delete_student_plan('D5000002A', 'PT1005', self.next_ay+' Sem 1') model.delete_student_plan('D5000003A', 'PT1005', self.next_ay+' Sem 1') model.delete_student_plan('D5000004A', 'PT1005', self.next_ay+' Sem 1') model.delete_tenta_mounting('PT1001', self.next_ay+' Sem 1') model.delete_tenta_mounting('PT1002', self.next_ay+' Sem 2') model.delete_tenta_mounting('PT1003', self.next_ay+' Sem 1') model.delete_tenta_mounting('PT1003', self.next_ay+' Sem 2') model.delete_tenta_mounting('PT1004', self.next_ay+' Sem 2') model.delete_tenta_mounting('PT1005', self.next_ay+' Sem 1') model.delete_fixed_mounting('PT1001', self.current_ay+' Sem 1') model.delete_fixed_mounting('PT1001', self.current_ay+' Sem 2') model.delete_fixed_mounting('PT1002', self.current_ay+' Sem 2') model.delete_module('PT1001') model.delete_module('PT1002') model.delete_module('PT1003') model.delete_module('PT1004') model.delete_module('PT1005')
def tearDown(self): ''' Tears down 'app.py' fixture and logs out ''' # These 3 lines delete any remaining traces of the modules model.delete_module(self.TEST_ADD_MODULE_CODE) model.delete_module(self.TEST_ADD_MODULE_CODE_RELAXED.upper()) model.delete_module(self.TEST_ADD_INVALID_MODULE_CODE) session.tear_down(self.test_app)
def setUp(self): ''' Sets up the 'app.py' fixture ''' self.middleware = [] self.test_app = TestApp(APP.wsgifunc(*self.middleware)) session.set_up(self.test_app) # These 3 lines delete any traces of other dummy module # data conflicting with the ones used in this test. model.delete_module(self.TEST_ADD_MODULE_CODE) model.delete_module(self.TEST_ADD_MODULE_CODE_RELAXED.upper()) model.delete_module(self.TEST_ADD_INVALID_MODULE_CODE)
def tearDown(self): ''' Clean up the database after all test cases are ran ''' model.delete_all_fixed_mountings(self.DUMMY_MODULE_CODE_1) model.delete_all_tenta_mountings(self.DUMMY_MODULE_CODE_1) model.delete_all_fixed_mountings(self.DUMMY_MODULE_CODE_2) model.delete_all_tenta_mountings(self.DUMMY_MODULE_CODE_2) model.delete_all_fixed_mountings(self.DUMMY_MODULE_CODE_3) model.delete_all_tenta_mountings(self.DUMMY_MODULE_CODE_3) model.delete_module(self.DUMMY_MODULE_CODE_1) model.delete_module(self.DUMMY_MODULE_CODE_2) model.delete_module(self.DUMMY_MODULE_CODE_3)
def tearDown(self): ''' Clean up the database after all test cases are ran ''' model.NUMBER_OF_AY_SEMS_IN_SYSTEM = 2 model.delete_fixed_mounting('BB1001', self.current_ay+' Sem 1') model.delete_fixed_mounting('BB1001', self.current_ay+' Sem 2') model.delete_fixed_mounting('BB1002', self.current_ay+' Sem 1') model.delete_fixed_mounting('BB1002', self.current_ay+' Sem 2') model.delete_fixed_mounting('BB1003', self.current_ay+' Sem 1') model.delete_fixed_mounting('BB1003', self.current_ay+' Sem 2') model.delete_fixed_mounting('BB1004', self.current_ay+' Sem 1') model.delete_fixed_mounting('BB1004', self.current_ay+' Sem 2') model.delete_fixed_mounting('BB1005', self.current_ay+' Sem 1') model.delete_fixed_mounting('BB1005', self.current_ay+' Sem 2') model.delete_fixed_mounting('BB1006', self.current_ay+' Sem 1') model.delete_fixed_mounting('BB1006', self.current_ay+' Sem 2') model.delete_fixed_mounting('BB2001', self.current_ay+' Sem 1') model.delete_fixed_mounting('BB2001', self.current_ay+' Sem 2') model.delete_fixed_mounting('BB2002', self.current_ay+' Sem 1') model.delete_fixed_mounting('BB2003', self.current_ay+' Sem 1') model.delete_fixed_mounting('BB2004', self.current_ay+' Sem 1') model.delete_fixed_mounting('BB3001', self.current_ay+' Sem 1') model.delete_fixed_mounting('BB3002', self.current_ay+' Sem 1') model.delete_fixed_mounting('BB3004', self.current_ay+' Sem 2') model.delete_tenta_mounting('BB1001', self.next_ay+' Sem 1') model.delete_tenta_mounting('BB1001', self.next_ay+' Sem 2') model.delete_tenta_mounting('BB1002', self.next_ay+' Sem 1') model.delete_tenta_mounting('BB1002', self.next_ay+' Sem 2') model.delete_tenta_mounting('BB1003', self.next_ay+' Sem 1') model.delete_tenta_mounting('BB1003', self.next_ay+' Sem 2') model.delete_tenta_mounting('BB1004', self.next_ay+' Sem 1') model.delete_tenta_mounting('BB1004', self.next_ay+' Sem 2') model.delete_tenta_mounting('BB1005', self.next_ay+' Sem 1') model.delete_tenta_mounting('BB1005', self.next_ay+' Sem 2') model.delete_tenta_mounting('BB1006', self.next_ay+' Sem 1') model.delete_tenta_mounting('BB1006', self.next_ay+' Sem 2') model.delete_tenta_mounting('BB2001', self.next_ay+' Sem 2') model.delete_tenta_mounting('BB2002', self.next_ay+' Sem 1') model.delete_tenta_mounting('BB2002', self.next_ay+' Sem 2') model.delete_tenta_mounting('BB2003', self.next_ay+' Sem 2') model.delete_tenta_mounting('BB2004', self.next_ay+' Sem 1') model.delete_tenta_mounting('BB2004', self.next_ay+' Sem 2') model.delete_tenta_mounting('BB3001', self.next_ay+' Sem 1') model.delete_tenta_mounting('BB3002', self.next_ay+' Sem 1') model.delete_tenta_mounting('BB3003', self.next_ay+' Sem 2') model.delete_tenta_mounting('BB3004', self.next_ay+' Sem 2') model.delete_module('BB1001') model.delete_module('BB1002') model.delete_module('BB1003') model.delete_module('BB1004') model.delete_module('BB1005') model.delete_module('BB1006') model.delete_module('BB2001') model.delete_module('BB2002') model.delete_module('BB2003') model.delete_module('BB2004') model.delete_module('BB3001') model.delete_module('BB3002') model.delete_module('BB3003') model.delete_module('BB3004') model.delete_module('BB3005') model.delete_module('BB3006')