def test(self): if not is_ci(): self.assertTrue(True) else: global username global password api = CUNYFirstAPI(username, password) api.login() self.assertTrue(api.is_logged_in())
def main(): global user global state global api global redacted_print_std global redacted_print_err global endtime args = parse() state = LoginState.determine_state(args) try: # Only initialize twilio in production # or when specifically asked if state == LoginState.PROD or args.enable_phone: initialize_twilio() username = input( "Enter username: "******"Enter password: "******"Enter phone number: ") if not args.phone else args.phone ## Monkey Patching stdout to remove any sens. data redacted_list = [username, password] redacted_print_std = RedactedPrint(STDOutOptions.STDOUT, redacted_list) redacted_print_err = RedactedPrint(STDOutOptions.ERROR, redacted_list) redacted_print_std.enable() redacted_print_err.enable() if add_new_user_instance(username): endtime = datetime.datetime.now() + datetime.timedelta(days=14) api = CUNYFirstAPI(username, password, args.school.upper()) user = User(username, password, number, args.school.upper()) atexit.register(exit_handler) create_instance() else: print(already_in_session_message()) except Exception as e: print("ERROR") traceback.print_exc()
def start_notifier(): create_connection() cursor = get_cursor() if cursor == None: return while True: global WAIT_INTERVAL cursor.execute('''SELECT * FROM Users \ WHERE lastUpdated < NOW() - INTERVAL 30 MINUTE \ ORDER BY lastUpdated DESC LIMIT 1''' ) # get top row from try: row = cursor.next() column_names = cursor.column_names query_dict = {k: v for k, v in zip(column_names, row)} phoneNumber = query_dict['phoneNumber'] last_updated = query_dict['lastUpdated'] username = query_dict['username'] school = query_dict['school'] grade_hash = query_dict['gradeHash'] encrypted_password = query_dict['password'] date_created = query_dict['dateCreated'] __id = query_dict['id'] is_welcome = last_updated.year == 1970 cursor.execute( f'UPDATE Users SET lastUpdated = NOW() WHERE id={__id};') decrypted_password = decrypt(encrypted_password, '../../private/keys/private.pem') api = CUNYFirstAPI(username, decrypted_password, school.upper()) api.login() grade_result = refresh(api) grade_hash = str(hash(frozenset(grade_result.classes))) if grade_hash != query_dict['gradeHash']: message = create_text_message(grade_result, is_welcome) send_text(message, phoneNumber) cursor.execute( f'UPDATE Users SET gradeHash = {grade_hash} WHERE id={__id};' ) api.logout() removed = remove_user_if_necessary(cursor, username, date_created) if removed: send_text(SESSION_ENDED_TEXT, phoneNumber) except StopIteration: pass except: traceback.print_exc() time.sleep(constants.WAIT_INTERVAL)
def test(self): if not is_ci(): self.assertTrue(True) else: global username global password api = CUNYFirstAPI(username, password) api.login() # test course match, days of week, start/end times loc = api.move_to(Locations.class_search).location() result1 = loc.action().submit_search( institution='QNS01', term='1192', course_number='1', course_number_match='G', days_of_week=['Monday', 'Wednesday'], meeting_start_time='12:00PM', meeting_end_time='3:00PM') test1 = len(result1['results']) > 0 # test day of week match loc = api.move_to(Locations.class_search).location() result2 = loc.action().submit_search(institution='QNS01', term='1192', course_number_match='G', course_number='1', days_of_week_match='J', days_of_week=['Tuesday']) test2 = len(result2['results']) == 0 # test mode of instruction, open classes only, requirement designation loc = api.move_to(Locations.class_search).location() result3 = loc.action().submit_search(institution='QNS01', term='1192', course_number='1', course_number_match='G', requirement_designation='FSW', meeting_start_time='12:00PM', meeting_end_time='3:00PM', open_classes_only=False, mode_of_instruction='H') test3 = len(result3['results']) > 0 # test last name match and last name loc = api.move_to(Locations.class_search).location() result4 = loc.action().submit_search( institution='QNS01', term='1192', course_number='1', course_number_match='G', instructor_last_name_match='B', instructor_last_name='Obren', open_classes_only=False) test4 = len(result4['results']) > 0 # test invalid subject value by length loc = api.move_to(Locations.class_search).location() try: result5 = loc.action().submit_search(institution='QNS01', term='1192', subject='FAKESUBJECT', course_number='111') self.assertTrue(False) except ValueError: self.assertTrue(True) # test invalid time loc = api.move_to(Locations.class_search).location() result6 = loc.action().submit_search(institution='QNS01', term='1192', course_number='111', subject='CSCI', meeting_start_time='25:00AM', parsed=True) test6 = len(result6['results']) == 0 self.assertTrue(test1) self.assertTrue(test2) self.assertTrue(test3) self.assertTrue(test4) self.assertTrue(test6)