diff --git a/app/controllers/main_routes/laborStatusForm.py b/app/controllers/main_routes/laborStatusForm.py index dc794952d..720e3d057 100755 --- a/app/controllers/main_routes/laborStatusForm.py +++ b/app/controllers/main_routes/laborStatusForm.py @@ -3,6 +3,7 @@ from app.controllers.main_routes import * from app.login_manager import require_login from app.models.user import * +from app.models import mainDB from app.models.status import * from app.models.laborStatusForm import * from app.models.overloadForm import * @@ -73,7 +74,6 @@ def userInsert(): rspFunctional = json.loads(rsp) all_forms = [] for i in range(len(rspFunctional)): - # Get a student record for the given bnumber try: student = getOrCreateStudentRecord(bnumber=rspFunctional[i]['stuBNumber']) @@ -81,23 +81,27 @@ def userInsert(): except InvalidUserException as e: print(e) return "", 500 - department, created = Department.get_or_create(DEPT_NAME = rspFunctional[i]['stuDepartment']) term, created = Term.get_or_create(termCode = rspFunctional[i]['stuTermCode']) + errorMessage = None try: - lsf = createLaborStatusForm(student, supervisor.ID, department.departmentID, term, rspFunctional[i]) - createOverloadFormAndFormHistory(rspFunctional[i], lsf, currentUser, host=request.host) - try: - emailDuringBreak(checkForSecondLSFBreak(term.termCode, student.ID), term) - except Exception as e: - print("Error when sending emails during break: " + str(e)) - + with mainDB.atomic(): + lsf = createLaborStatusForm(student, supervisor.ID, department.departmentID, term, rspFunctional[i]) + try: + createOverloadFormAndFormHistory(rspFunctional[i], lsf, currentUser, host=request.host) + emailDuringBreak(checkForSecondLSFBreak(term.termCode, student.ID), term) + except Exception as e: + errorMessage = "Email(s) delivery failed! Contact support for assistance." + print("ERROR on sending email " + str(e)) + raise all_forms.append(True) except Exception as e: all_forms.append(False) - print("ERROR on creating Labor Status Form/Overload Form" + str(e)) - - flash("Form(s) submitted successfully! They will be eligible for approval in one business day.", "success") + flash(errorMessage, "danger") if errorMessage else None + flash("Form(s) submission failed! Contact support for assistance.", "danger") + print("ERROR on creating Labor Status Form/Overload Form " + str(e)) + if all(all_forms): + flash("Form(s) submitted successfully! They will be eligible for approval in one business day.", "success") return jsonify(all_forms) @main_bp.route("/laborstatusform/getDate/", methods=['GET']) diff --git a/app/logic/statusFormFunctions.py b/app/logic/statusFormFunctions.py index 4694bad63..9960a111f 100644 --- a/app/logic/statusFormFunctions.py +++ b/app/logic/statusFormFunctions.py @@ -57,41 +57,43 @@ def createOverloadFormAndFormHistory(rspFunctional, lsf, creatorID, host=None): """ # We create a 'Labor Status Form' first, then we check to see if a 'Labor Overload Form' # needs to be created - isOverload = rspFunctional.get("isItOverloadForm") == "True" - if isOverload: - newLaborOverloadForm = OverloadForm.create( studentOverloadReason = None, - financialAidApproved = None, - financialAidApprover = None, - financialAidReviewDate = None, - SAASApproved = None, - SAASApprover = None, - SAASReviewDate = None, - laborApproved = None, - laborApprover = None, - laborReviewDate = None) - formOverload = FormHistory.create( formID = lsf.laborStatusFormID, - historyType = "Labor Overload Form", - overloadForm = newLaborOverloadForm.overloadFormID, - createdBy = creatorID, - createdDate = date.today(), - status = "Pre-Student Approval") - email = emailHandler(formOverload.formHistoryID) - link = makeThirdPartyLink("student", host, formOverload.formHistoryID) - email.LaborOverLoadFormSubmitted(link) - - formHistory = FormHistory.create( formID = lsf.laborStatusFormID, - historyType = "Labor Status Form", - overloadForm = None, - createdBy = creatorID, - createdDate = date.today(), - status = "Pre-Student Approval") - - if not formHistory.formID.termCode.isBreak and not isOverload: - email = emailHandler(formHistory.formHistoryID) - email.laborStatusFormSubmitted() + try: + isOverload = rspFunctional.get("isItOverloadForm") == "True" + if isOverload: + newLaborOverloadForm = OverloadForm.create( studentOverloadReason = None, + financialAidApproved = None, + financialAidApprover = None, + financialAidReviewDate = None, + SAASApproved = None, + SAASApprover = None, + SAASReviewDate = None, + laborApproved = None, + laborApprover = None, + laborReviewDate = None) + formOverload = FormHistory.create( formID = lsf.laborStatusFormID, + historyType = "Labor Overload Form", + overloadForm = newLaborOverloadForm.overloadFormID, + createdBy = creatorID, + createdDate = date.today(), + status = "Pre-Student Approval") + email = emailHandler(formOverload.formHistoryID) + link = makeThirdPartyLink("student", host, formOverload.formHistoryID) + email.LaborOverLoadFormSubmitted(link) - return formHistory + formHistory = FormHistory.create( formID = lsf.laborStatusFormID, + historyType = "Labor Status Form", + overloadForm = None, + createdBy = creatorID, + createdDate = date.today(), + status = "Pre-Student Approval") + if not formHistory.formID.termCode.isBreak and not isOverload: + email = emailHandler(formHistory.formHistoryID) + email.laborStatusFormSubmitted() + return formHistory + except Exception as e: + print("Error creating overload form:", e) + raise def checkForSecondLSFBreak(termCode, student): @@ -223,13 +225,18 @@ def emailDuringBreak(secondLSFBreak, term): """ Sending emails during break period """ - if term.isBreak: - isOneLSF = json.loads(secondLSFBreak) - formHistory = FormHistory.get(FormHistory.formHistoryID == isOneLSF['formHistoryID']) - email = emailHandler(formHistory.formHistoryID) - email.laborStatusFormSubmitted() - if(len(isOneLSF["previousSupervisorNames"]) > 1): #Student has more than one lsf. Send email to both supervisors and student - email.notifyAdditionalLaborStatusFormSubmittedForBreak() + try: + if term.isBreak: + isOneLSF = json.loads(secondLSFBreak) + formHistory = FormHistory.get(FormHistory.formHistoryID == isOneLSF['formHistoryID']) + email = emailHandler(formHistory.formHistoryID) + email.laborStatusFormSubmitted() + if(len(isOneLSF["previousSupervisorNames"]) > 1): #Student has more than one lsf. Send email to both supervisors and student + email.notifyAdditionalLaborStatusFormSubmittedForBreak() + except Exception as e: + print("Error sending email during break:", e) + raise + def createOverloadForm(newWeeklyHours, lsf, currentUser, adjustedForm=None, formHistories=None, host=None): diff --git a/app/static/css/base.css b/app/static/css/base.css index 916fb4db9..2417de8f6 100755 --- a/app/static/css/base.css +++ b/app/static/css/base.css @@ -63,14 +63,29 @@ html, body { } #flash_container { + position: fixed; + left: 280px; + right: 10px; + z-index: 3; min-height: 55px; } +.flash, #flasher { - margin-bottom: 5px; - position: fixed; - width: 80%; - z-index: 3; + position: relative; + left: 20px; + width: calc(100vw - 320px);; + margin-bottom: 10px; +} + +/* When sidebar collapses at the same breakpoint */ +@media (max-width: 991px) { + .flash, + #flasher { + left: calc(-280px + 10px); + width: calc(100vw - 20px); + top: 60px; + } } .panel { diff --git a/app/static/js/base.js b/app/static/js/base.js index 03b0d0b6c..5c21ada0f 100755 --- a/app/static/js/base.js +++ b/app/static/js/base.js @@ -1,5 +1,5 @@ function msgFlash(flash_message, status){ var category = (status === "success") ? "success" : ((status === "fail") ? "danger" : "warning"); - $("#flash_container").prepend(''); + $("#flash_container").prepend(''); $("#flasher").delay(5000).fadeOut(); } diff --git a/app/static/js/laborStatusForm.js b/app/static/js/laborStatusForm.js index ff9b252a9..ac68b1e2c 100755 --- a/app/static/js/laborStatusForm.js +++ b/app/static/js/laborStatusForm.js @@ -767,79 +767,56 @@ function userInsert(){ url: "/laborstatusform/userInsert", data: JSON.stringify(globalArrayOfStudents), contentType: "application/json", - success: function(response) { - setTimeout(() => { - location.reload();}, 3000); - - var isBreak = $('#selectedTerm').find('option:selected').data('termbreak'); - modalList = []; - for(var key = 0; key < globalArrayOfStudents.length; key++){ - var studentName = globalArrayOfStudents[key].stuName; - var position = globalArrayOfStudents[key].stuPosition; - var selectedContractHours = globalArrayOfStudents[key].stuContractHours; - var jobType = globalArrayOfStudents[key].stuJobType; - var hours = globalArrayOfStudents[key].stuWeeklyHours; - - if (response.includes(false)){ // if there is even one false value in response - // var selectedContractHours = globalArrayOfStudents[key].stuWeeklyHours; - if (response[key] === false){ // Finds the form that has failed. - if (isBreak){ - display_failed.push(key); - var bigString = "
  • " +" " + studentName + " | " + position + " | " + selectedContractHours + " hours"; - } - else { - display_failed.push(key); - var bigString = "
  • "+" " + studentName + " | " + position + " | " + jobType + " | " + hours + " hours"; - } - } - else{ - if (isBreak){ - var bigString = "
  • " +" " + studentName + " | " + position + " | " + selectedContractHours + " hours"; - } - else { - var bigString = "
  • "+" " + studentName + " | " + position + " | " + jobType + " | " + hours + " hours"; - } - } - modalList.push(bigString); - $("#SubmitModalText").html("Some of your submitted Labor Status Form(s) did not succeed:

    " + - ""+"" - ); - $("#closeBtn").hide(); - $("#SubmitModal").modal("show"); - } - else{ - if (isBreak){ - var bigString = "
  • " +" " + studentName + " | " + position + " | " + selectedContractHours + " hours"; - } - else{ - var bigString = "
  • "+" " + studentName + " | " + position + " | " + jobType + " | " + hours + " hours"; - } - modalList.push(bigString); - $("#SubmitModalText").html("Labor Status Form(s) succeeded:

    " + - ""+"" - ); - $("#closeBtn").hide(); - $("#SubmitModal").modal("show"); - $("#reviewButton0").prop('disabled',true); - $("#addMoreStudent").prop('disabled',true); - $("a").attr("onclick", "").unbind("click"); - $(".glyphicon-edit").css("color", "grey"); - $(".glyphicon-remove").css("color", "grey"); - parsedArrayOfStudentCookies = document.cookie; - document.cookie = parsedArrayOfStudentCookies +";max-age=0"; - window.location.replace("/laborstatusform"); - } - } + success: function (response) { + var isBreak = $('#selectedTerm').find('option:selected').data('termbreak'); + var hasFailure = response.includes(false); + var hasSuccess = response.includes(true); + modalList = []; + for (var key = 0; key < globalArrayOfStudents.length; key++) { + var studentName = globalArrayOfStudents[key].stuName; + var position = globalArrayOfStudents[key].stuPosition; + var selectedContractHours = globalArrayOfStudents[key].stuContractHours; + var jobType = globalArrayOfStudents[key].stuJobType; + var hours = globalArrayOfStudents[key].stuWeeklyHours; + // build each row + var icon = response[key] === false + ? "" + : ""; + var bigString; + if (isBreak) { + bigString = `
  • ${icon} ${studentName} | ${position} | ${selectedContractHours} hours`; + } else { + bigString = `
  • ${icon} ${studentName} | ${position} | ${jobType} | ${hours} hours`; + } + modalList.push(bigString); + } + let message = ""; + if (!hasFailure) { + message = "Labor Status Form(s) succeeded:

    "; + } else if (hasFailure && hasSuccess) { + message = "Some of your submitted Labor Status Form(s) did not succeed:

    "; + } else { + message = "All Labor Status Form(s) failed:

    "; + } + $("#SubmitModalText").html( + message + + "" + ); + $("#SubmitModal").modal("show"); + window.location.replace("/laborstatusform"); + }, + error: function() { + $('#error_modal').empty(); + $('#error_modal').append( + '

    ERROR: The request failed. Please try again or contact Systems Support if the issue continues

    ' + ); + msgFlash("Unable to submit the form(s) due to a server or network error.", "fail"); + $("#SubmitModal").modal("hide"); $("#submitmodalid").prop("disabled", false); $("#closeBtn").prop("disabled", false); $("#submitmodalid").text("Submit"); - $("#SubmitModal").data("bs.modal").options.backdrop = true; - $("#SubmitModal").data("bs.modal").options.keyboard = true; - - $("#submitmodalid").hide(); - $("#doneBtn").show(); } }); // ajax closing tag diff --git a/app/templates/base.html b/app/templates/base.html index 4d6c2a79f..1adc1fa6e 100755 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -42,7 +42,7 @@ {% with messages = get_flashed_messages(with_categories=true) %} {% if messages %} {% for category, message in messages %} - + {% endfor %} {% endif %} {% endwith %} diff --git a/database/demo_data.py b/database/demo_data.py index 0557c9361..853d96116 100644 --- a/database/demo_data.py +++ b/database/demo_data.py @@ -85,6 +85,21 @@ "LAST_POSN":"TA", "LAST_SUP_PIDM":"7" }, + { + "ID":"B00791326", + "PIDM":"10", + "FIRST_NAME":"Kafui", + "LAST_NAME":"Gle", + "CLASS_LEVEL":"Junior", + "ACADEMIC_FOCUS":"Computer Science", + "MAJOR":"Computer Science", + "PROBATION":"0", + "ADVISOR":"Jan Pearce", + "STU_EMAIL":"glek@berea.edu", + "STU_CPO":"200", + "LAST_POSN":"TA", + "LAST_SUP_PIDM":"7" + }, ] localStudents = [ { diff --git a/tests/code/test_CreateLSF.py b/tests/code/test_CreateLSF.py index b25929550..3de8cc19a 100644 --- a/tests/code/test_CreateLSF.py +++ b/tests/code/test_CreateLSF.py @@ -21,9 +21,9 @@ def testCreateLaborStatusForm(): 'stuEndDate': "09/01/2020" } - newlsf = createLaborStatusForm(Student.get_by_id("B00730361"), "B12365892", 1, 202000, lsfDict ) + newlsf = createLaborStatusForm(Student.get_by_id("B00730361"), "B12365892", 1, 202500, lsfDict ) lsf = LaborStatusForm.get(LaborStatusForm.laborStatusFormID == newlsf.laborStatusFormID) - assert lsf.termCode_id == 202000 + assert lsf.termCode_id == 202500 assert lsf.studentSupervisee_id == "B00730361" assert lsf.supervisor_id == "B12365892" assert lsf.department_id == 1 diff --git a/tests/code/test_adminManagement.py b/tests/code/test_adminManagement.py index d6d0ac639..7eedda64f 100644 --- a/tests/code/test_adminManagement.py +++ b/tests/code/test_adminManagement.py @@ -1,46 +1,58 @@ import pytest from app.controllers.admin_routes.adminManagement import addAdmin, removeAdmin +from app.models import mainDB from app.models.user import User from peewee import DoesNotExist @pytest.mark.integration def test_addAdmin(): newAdmin = "pearcej" - user = User.get(User.username == newAdmin) + with mainDB.atomic() as transaction: + + user = User.get(User.username == newAdmin) + # Before adding user as admin + assert not user.isLaborAdmin + # Test adding labor admin + addAdmin(user, 'Labor') + user = User.get(User.username == newAdmin) + assert user.isLaborAdmin + + assert not user.isFinancialAidAdmin + + # Test adding financial aid admin + addAdmin(user, 'FinancialAid') + + assert user.isFinancialAidAdmin + + assert not user.isSaasAdmin + # Test adding saas admin + addAdmin(user, 'Saas') + assert user.isSaasAdmin + + transaction.rollback() # rollback changes to database after test - # Before adding user as admin - assert not user.isLaborAdmin - # Test adding labor admin - addAdmin(user, 'labor') - assert user.isLaborAdmin - - assert not user.isFinancialAidAdmin - # Test adding financial aid admin - addAdmin(user, 'finAid') - assert user.isFinancialAidAdmin - - assert not user.isSaasAdmin - # Test adding saas admin - addAdmin(user, 'saas') - assert user.isSaasAdmin @pytest.mark.integration def test_removeAdmin(): oldAdmin = "pearcej" user = User.get(User.username == oldAdmin) - + addAdmin(user, 'Labor') # Before removing user as admin assert user.isLaborAdmin # Test removing labor admin - removeAdmin(user, 'labor') + removeAdmin(user, 'Labor') assert not user.isLaborAdmin + addAdmin(user, 'FinancialAid') assert user.isFinancialAidAdmin # Test removing financial aid admin - removeAdmin(user, 'finAid') + removeAdmin(user, 'FinancialAid') assert not user.isFinancialAidAdmin + addAdmin(user, 'Saas') assert user.isSaasAdmin # Test removing saas admin - removeAdmin(user, 'saas') + removeAdmin(user, 'Saas') assert not user.isSaasAdmin + + diff --git a/tests/code/test_apiEndpoint.py b/tests/code/test_apiEndpoint.py index 4cc41aa6e..956244100 100644 --- a/tests/code/test_apiEndpoint.py +++ b/tests/code/test_apiEndpoint.py @@ -36,7 +36,7 @@ def test_getLaborInformation(): responseData = response.get_json() assert responseData['B00841417'][0]['jobType'] == "Primary" - assert responseData['B00841417'][0]['termName'] == "AY 2020-2021" + assert responseData['B00841417'][0]['termName'] == "AY 2025-2026" Term.create(termCode = 202100, termName = "AY 2021-2022", @@ -87,11 +87,11 @@ def test_getLaborInformation(): responseData = response.get_json() assert len(responseData['B00841417']) == 2 assert responseData['B00841417'][0]['jobType'] == "Primary" - assert responseData['B00841417'][0]['termName'] == "AY 2020-2021" - assert responseData['B00841417'][0]['laborStart'] == "2020-04-01" + assert responseData['B00841417'][0]['termName'] == "AY 2021-2022" + assert responseData['B00841417'][0]['laborStart'] == "2021-08-01" assert responseData['B00841417'][1]['jobType'] == "Primary" - assert responseData['B00841417'][1]['termName'] == "AY 2021-2022" - assert responseData['B00841417'][1]['laborStart'] == "2021-08-01" + assert responseData['B00841417'][1]['termName'] == "AY 2025-2026" + assert responseData['B00841417'][1]['laborStart'] == "2025-04-01" LaborStatusForm.update(department_id = 4).where(LaborStatusForm.laborStatusFormID == testLaborForm.laborStatusFormID).execute() @@ -102,8 +102,8 @@ def test_getLaborInformation(): responseData = response.get_json() assert responseData['B00841417'][0]['jobType'] == "Primary" - assert responseData['B00841417'][0]['termName'] == "AY 2020-2021" - assert responseData['B00841417'][0]['laborStart'] == "2020-04-01" + assert responseData['B00841417'][0]['termName'] == "AY 2025-2026" + assert responseData['B00841417'][0]['laborStart'] == "2025-04-01" assert len(responseData['B00841417']) == 1 transaction.rollback() diff --git a/tests/code/test_models.py b/tests/code/test_models.py index 6939eab10..0cf1a0ab8 100644 --- a/tests/code/test_models.py +++ b/tests/code/test_models.py @@ -105,7 +105,7 @@ def test_user_model(): lsf1 = LaborStatusForm.create( studentSupervisee=student1, department=dept, - termCode_id="202000", + termCode_id="202500", supervisor_id="B12361006", jobType="Primary", WLS=1, @@ -118,7 +118,7 @@ def test_user_model(): lsf2 = LaborStatusForm.create( studentSupervisee=student2, department=inactive_dept, - termCode_id="202000", + termCode_id="202500", supervisor_id="B12361006", jobType="Primary", WLS=1, @@ -131,7 +131,7 @@ def test_user_model(): lsf3 = LaborStatusForm.create( studentSupervisee=student3, department=non_active_lab_dep, - termCode_id="202000", + termCode_id="202500", supervisor_id="B12361006", jobType="Primary", WLS=1, @@ -144,7 +144,7 @@ def test_user_model(): lsf4 = LaborStatusForm.create( studentSupervisee=student4, department=active_dept, - termCode_id="202000", + termCode_id="202500", supervisor_id="B12361006", jobType="Primary", WLS=1, @@ -157,7 +157,7 @@ def test_user_model(): lsf5 = LaborStatusForm.create( studentSupervisee=student5, department=dept, - termCode_id="202000", + termCode_id="202500", supervisor_id="B12361006", jobType="Primary", WLS=1, @@ -170,7 +170,7 @@ def test_user_model(): lsf6 = LaborStatusForm.create( studentSupervisee=student6, department=dept, - termCode_id="202000", + termCode_id="202500", supervisor_id="B12361006", jobType="Primary", WLS=1, @@ -183,7 +183,7 @@ def test_user_model(): lsf7 = LaborStatusForm.create( studentSupervisee=student7, department=case_sensive_name , - termCode_id="202000", + termCode_id="202500", supervisor_id="B12361006", jobType="Primary", WLS=1, @@ -196,7 +196,7 @@ def test_user_model(): lsf8 = LaborStatusForm.create( studentSupervisee=student8, department=case_sensive_name2 , - termCode_id="202000", + termCode_id="202500", supervisor_id="B12361006", jobType="Primary", WLS=1, @@ -209,7 +209,7 @@ def test_user_model(): lsf9 = LaborStatusForm.create( studentSupervisee=student9, department=dept, - termCode_id="202000", + termCode_id="202500", supervisor_id="B12361006", jobType="Primary", WLS=1, @@ -222,7 +222,7 @@ def test_user_model(): lsf10 = LaborStatusForm.create( studentSupervisee=student10, department=dept, - termCode_id="202000", + termCode_id="202500", supervisor_id="B12361006", jobType="Primary", WLS=1, @@ -235,7 +235,7 @@ def test_user_model(): lsf11 = LaborStatusForm.create( studentSupervisee=student11, department=dept, - termCode_id="202000", + termCode_id="202500", supervisor_id="B12361006", jobType="Primary", WLS=1, @@ -373,7 +373,7 @@ def test_user_model(): release_form10 = LaborReleaseForm.create( studentSupervisee=student10, department=dept, - termCode_id="202000", + termCode_id="202500", supervisor_id="B12361006", jobType="Primary", WLS=1, @@ -388,7 +388,7 @@ def test_user_model(): release_form11 = LaborReleaseForm.create( studentSupervisee=student11, department=dept, - termCode_id="202000", + termCode_id="202500", supervisor_id="B12361006", jobType="Primary", WLS=1, diff --git a/tests/code/test_search.py b/tests/code/test_search.py index cbe6f5466..ec24e3743 100644 --- a/tests/code/test_search.py +++ b/tests/code/test_search.py @@ -50,7 +50,7 @@ def test_limitSearchByUserDepartment(): # intialize labor status forms inDeptForm = LaborStatusForm.create(StudentName = "Tyler Parton", - termCode = 202000, + termCode = 202500, studentSupervisee = "B10701360", supervisor = "B00763721", department = 1, @@ -60,7 +60,7 @@ def test_limitSearchByUserDepartment(): POSN_CODE = "S61407") outDeptForm = LaborStatusForm.create(StudentName = "Not Tyler", - termCode = 202000, + termCode = 202500, studentSupervisee = "B00000000", supervisor = "B00000001", department = 4, @@ -152,7 +152,7 @@ def test_getDepartmentsForSupervisors(): # Form in which our superUser is the supervisor and not the creator. lsf1 = LaborStatusForm.create(StudentName = "Tyler Parton", - termCode = 202000, + termCode = 202500, studentSupervisee = "B99999999", supervisor = supervisor.ID, department = supervisorDept.departmentID, @@ -163,7 +163,7 @@ def test_getDepartmentsForSupervisors(): #Form in which our superUser is the creator and not the supervisor. lsf2 = LaborStatusForm.create(StudentName = "Tyler Parton", - termCode = 202000, + termCode = 202500, studentSupervisee = "B99999999", supervisor = "B00000002", department = nonSupervisorDept.departmentID, diff --git a/tests/code/test_tracy.py b/tests/code/test_tracy.py index cd86359ec..e69d2a3a7 100644 --- a/tests/code/test_tracy.py +++ b/tests/code/test_tracy.py @@ -16,8 +16,8 @@ def test_init(self, tracy): @pytest.mark.integration def test_getStudents(self, tracy): students = tracy.getStudents() - assert ['Elaheh','Guillermo','Jeremiah','Kat', 'Oluwagbayi', 'Test', 'Tyler'] == [s.FIRST_NAME for s in students] - assert ['718','300','420','420', '883', '700', '420'] == [s.STU_CPO for s in students] + assert ['Elaheh','Guillermo','Jeremiah', 'Kafui', 'Kat', 'Oluwagbayi', 'Test', 'Tyler'] == [s.FIRST_NAME for s in students] + assert ['718','300','420', '200', '420', '883', '700', '420'] == [s.STU_CPO for s in students] @pytest.mark.integration def test_getStudentFromBNumber(self, tracy):