def test_success_scenario2(database): tas1 = TASFactory() tas2 = TASFactory() database.session.add_all([tas1, tas2]) database.session.flush() ap = AppropriationFactory(account_num=tas1.account_num, deobligations_recoveries_r_cpe=8) # Contributes 4 op_1 = ObjectClassProgramActivityFactory(account_num=tas1.account_num, ussgl487100_downward_adjus_cpe=1, ussgl497100_downward_adjus_cpe=1, ussgl487200_downward_adjus_cpe=1, ussgl497200_downward_adjus_cpe=1) # Contributes another 4 op_2 = ObjectClassProgramActivityFactory(account_num=tas1.account_num, ussgl487100_downward_adjus_cpe=1, ussgl497100_downward_adjus_cpe=1, ussgl487200_downward_adjus_cpe=1, ussgl497200_downward_adjus_cpe=1) # Doesn't contribute, different TAS op_3 = ObjectClassProgramActivityFactory(account_num=tas2.account_num, ussgl487100_downward_adjus_cpe=1, ussgl497100_downward_adjus_cpe=1, ussgl487200_downward_adjus_cpe=1, ussgl497200_downward_adjus_cpe=1) assert number_of_errors(_FILE, database, models=[ap, op_1, op_2, op_3]) == 0
def test_success(database): """ Tests that, for entries with the matching TAS, Appropriations deobligations_recoveries_r_cpe equals the sum of all corresponding entries for Object Class Program Acitivity fields ussgl487100_downward_adjus_cpe, ussgl497100_downward_adjus_cpe, ussgl487200_downward_adjus_cpe, ussgl497200_downward_adjus_cpe""" tas = TASFactory() database.session.add(tas) database.session.flush() ap = AppropriationFactory(account_num=tas.account_num, deobligations_recoveries_r_cpe=8) # Contributes 4 op_1 = ObjectClassProgramActivityFactory(account_num=tas.account_num, ussgl487100_downward_adjus_cpe=1, ussgl497100_downward_adjus_cpe=1, ussgl487200_downward_adjus_cpe=1, ussgl497200_downward_adjus_cpe=1) # Contributes another 4 op_2 = ObjectClassProgramActivityFactory(account_num=tas.account_num, ussgl487100_downward_adjus_cpe=1, ussgl497100_downward_adjus_cpe=1, ussgl487200_downward_adjus_cpe=1, ussgl497200_downward_adjus_cpe=1) assert number_of_errors(_FILE, database, models=[ap, op_1, op_2]) == 0
def test_success(database): """ Test that agency codes are matched against cgac correctly """ ocpa = ObjectClassProgramActivityFactory() ocpa_null = ObjectClassProgramActivityFactory(allocation_transfer_agency = None) cgac = CGACFactory(cgac_code = ocpa.allocation_transfer_agency) errors = number_of_errors(_FILE, database, models=[ocpa, ocpa_null, cgac]) assert errors == 0
def test_success(database): """ Test for USSGL 48XX & 49XX (except 487X & 497X) if any one is provided then by_direct_reimbursable_fun is not empty """ op = ObjectClassProgramActivityFactory() assert number_of_errors(_FILE, database, models=[op]) == 0 op = ObjectClassProgramActivityFactory(object_class=1234, by_direct_reimbursable_fun=None) assert number_of_errors(_FILE, database, models=[op]) == 0
def test_sum_matches(database): tas = TASFactory() database.session.add(tas) database.session.flush() op1 = ObjectClassProgramActivityFactory(tas_id=tas.tas_id) op2 = ObjectClassProgramActivityFactory(tas_id=tas.tas_id) approp_val = -sum(op.obligations_incurred_by_pr_cpe for op in (op1, op2)) approp = AppropriationFactory(tas_id=tas.tas_id, obligations_incurred_total_cpe=approp_val) assert number_of_errors(_FILE, database, models=[approp, op1, op2]) == 0
def test_success(database): """ Test that calculation passes with equal values and with a null """ value = Decimal('100.23') ocpa = ObjectClassProgramActivityFactory(obligations_undelivered_or_fyb = value, ussgl480100_undelivered_or_fyb = value) ocpa_null = ObjectClassProgramActivityFactory(obligations_undelivered_or_fyb = 0, ussgl480100_undelivered_or_fyb = None) assert number_of_errors(_FILE, database, models=[ocpa, ocpa_null]) == 0
def test_failure(database): """ Test invalid 4 digit object class code and corresponding reimbursable funding source """ op = ObjectClassProgramActivityFactory(object_class='1234', by_direct_reimbursable_fun='x') assert number_of_errors(_FILE, database, models=[op]) == 1 op = ObjectClassProgramActivityFactory(object_class='2234', by_direct_reimbursable_fun='Y') assert number_of_errors(_FILE, database, models=[op]) == 1
def test_success(database): """ Test that availability type code is either x or absent """ ocpa = ObjectClassProgramActivityFactory(availability_type_code='X') ocpa_lower = ObjectClassProgramActivityFactory(availability_type_code='x') ocpa_null = ObjectClassProgramActivityFactory(availability_type_code=None) errors = number_of_errors(_FILE, database, models=[ocpa, ocpa_null, ocpa_lower]) assert errors == 0
def test_sum_matches(database): tas = TASFactory() database.session.add(tas) database.session.flush() op1 = ObjectClassProgramActivityFactory(tas_id=tas.tas_id) op2 = ObjectClassProgramActivityFactory(tas_id=tas.tas_id) approp_val = sum(op.gross_outlay_amount_by_pro_cpe for op in (op1, op2)) approp = AppropriationFactory(tas_id=tas.tas_id, gross_outlay_amount_by_tas_cpe=approp_val) assert number_of_errors(_FILE, database, models=[approp, op1, op2]) == 0
def test_failure(database): """ Test fail DEFC values must be A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, or T (plus future codes as determined by OMB). DEFC cannot be blank. """ op1 = ObjectClassProgramActivityFactory(disaster_emergency_fund_code='z') op2 = ObjectClassProgramActivityFactory(disaster_emergency_fund_code='3') op3 = ObjectClassProgramActivityFactory(disaster_emergency_fund_code='AA') op4 = ObjectClassProgramActivityFactory(disaster_emergency_fund_code='') errors = number_of_errors(_FILE, database, models=[op1, op2, op3, op4]) assert errors == 4
def test_success(database): """ Test that a four digit object class with no flag is a success, and a three digit object class with a flag is a success""" not_req_ocpa = ObjectClassProgramActivityFactory( object_class=randint(1000, 9999), by_direct_reimbursable_fun="") req_present_ocpa = ObjectClassProgramActivityFactory( object_class=str(randint(0, 999)).zfill(3), by_direct_reimbursable_fun="d") errors = number_of_errors(_FILE, database, models=[not_req_ocpa, req_present_ocpa]) assert errors == 0
def test_sum_does_not_match(database): tas = TASFactory() database.session.add(tas) database.session.flush() op1 = ObjectClassProgramActivityFactory(account_num=tas.account_num) op2 = ObjectClassProgramActivityFactory(account_num=tas.account_num) approp_val = -sum(op.obligations_incurred_by_pr_cpe for op in (op1, op2)) approp_val += randint(1, 9999) # different value now approp = AppropriationFactory(account_num=tas.account_num, obligations_incurred_total_cpe=approp_val) assert number_of_errors(_FILE, database, models=[approp, op1, op2]) == 1
def test_success(database): """ Test that calculation passes with equal values and with a null """ value_one = Decimal('100.00') value_two = Decimal('200.00') ocpa = ObjectClassProgramActivityFactory(obligations_delivered_orde_cpe = value_one+value_two, ussgl490100_delivered_orde_cpe = value_one, ussgl498100_upward_adjustm_cpe = value_two) ocpa_null = ObjectClassProgramActivityFactory(obligations_delivered_orde_cpe = value_one, ussgl490100_delivered_orde_cpe = None, ussgl498100_upward_adjustm_cpe = value_one) assert number_of_errors(_FILE, database, models=[ocpa, ocpa_null]) == 0
def test_success(database): """ Tests that Beginning Period of Availability and Ending Period of Availability are blank if Availability Type Code = X """ tas = "".join([_TAS, "_success"]) op1 = ObjectClassProgramActivityFactory(availability_type_code='x', beginning_period_of_availa=None, ending_period_of_availabil=None) op2 = ObjectClassProgramActivityFactory(availability_type_code='X', beginning_period_of_availa=None, ending_period_of_availabil=None) assert number_of_errors(_FILE, database, models=[op1, op2]) == 0
def test_failure(database): """ Test invalid object class code (3 digits) """ # This should return because if it's '0000' '000', '00', '0' a warning should be returned op = ObjectClassProgramActivityFactory(object_class='0000') assert number_of_errors(_FILE, database, models=[op]) == 1 op = ObjectClassProgramActivityFactory(object_class='000') assert number_of_errors(_FILE, database, models=[op]) == 1 op = ObjectClassProgramActivityFactory(object_class='00') assert number_of_errors(_FILE, database, models=[op]) == 1 op = ObjectClassProgramActivityFactory(object_class='0') assert number_of_errors(_FILE, database, models=[op]) == 1
def test_success(database): """ Test DEFC values must be A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, or T (plus future codes as determined by OMB). DEFC cannot be blank. """ op1 = ObjectClassProgramActivityFactory(disaster_emergency_fund_code='a') op2 = ObjectClassProgramActivityFactory(disaster_emergency_fund_code='Q') op3 = ObjectClassProgramActivityFactory(disaster_emergency_fund_code='o') defc1 = DEFCFactory(code='A') defc2 = DEFCFactory(code='Q') defc3 = DEFCFactory(code='O') errors = number_of_errors(_FILE, database, models=[op1, op2, op3, defc1, defc2, defc3]) assert errors == 0
def test_failure(database): """ Test that calculation fails for unequal values """ ocpa = ObjectClassProgramActivityFactory( obligations_delivered_orde_fyb=Decimal('101.23'), ussgl490100_delivered_orde_fyb=Decimal('102.34')) assert number_of_errors(_FILE, database, models=[ocpa]) == 1
def test_success_null_ata(database): """ Tests that TAS/DEFC for SF-133 are present in File B (null ATA) """ submission_id = randint(1000, 10000) tas, period, year, code = 'some-tas', 2, 2002, 'some-code' sf1 = SF133Factory(tas=tas, period=period, fiscal_year=year, allocation_transfer_agency=None, agency_identifier=code, disaster_emergency_fund_code='N', line=2190, amount=4) submission = SubmissionFactory(submission_id=submission_id, reporting_fiscal_period=period, reporting_fiscal_year=year, cgac_code=code, is_quarter_format=False) op = ObjectClassProgramActivityFactory(tas=tas, disaster_emergency_fund_code='n', submission_id=submission_id) errors = number_of_errors(_FILE, database, models=[sf1, op], submission=submission) assert errors == 0
def test_non_matching_defc(database): """ Tests that even if TAS matches, if DEFC doesn't it throws an error """ submission_id = randint(1000, 10000) tas, period, year, code = 'some-tas', 2, 2002, 'some-code' sf1 = SF133Factory(tas=tas, period=period, fiscal_year=year, allocation_transfer_agency=code, agency_identifier='some-other-code', disaster_emergency_fund_code='N', line=3020, amount=4) submission = SubmissionFactory(submission_id=submission_id, reporting_fiscal_period=period, reporting_fiscal_year=year, cgac_code=code, is_quarter_format=False) op = ObjectClassProgramActivityFactory(tas=tas, disaster_emergency_fund_code='m', submission_id=submission_id) errors = number_of_errors(_FILE, database, models=[sf1, op], submission=submission) assert errors == 1
def test_ignore_quarterly_submissions(database): """ Tests that rule doesn't apply to quarterly submissions """ submission_id = randint(1000, 10000) tas, period, year, code = 'some-tas', 2, 2002, 'some-code' sf1 = SF133Factory(tas=tas, period=period, fiscal_year=year, allocation_transfer_agency=code, agency_identifier=code, disaster_emergency_fund_code='N', line=3020, amount=4) submission = SubmissionFactory(submission_id=submission_id, reporting_fiscal_period=period, reporting_fiscal_year=year, cgac_code=code, is_quarter_format=True) op = ObjectClassProgramActivityFactory(tas='a-different-tas', submission_id=submission_id, disaster_emergency_fund_code='n') errors = number_of_errors(_FILE, database, models=[sf1, op], submission=submission) assert errors == 0
def test_success_fiscal_year(database): """ Testing valid name for FY that matches with budget_year""" op = ObjectClassProgramActivityFactory(row_number=1, submission_id='1', agency_identifier='test', main_account_code='test', program_activity_name='test', program_activity_code='test') pa_1 = ProgramActivityFactory(budget_year=2016, agency_id='test', allocation_transfer_id='test', account_number='test', program_activity_name='test', program_activity_code='test') pa_2 = ProgramActivityFactory(budget_year=2017, agency_id='test2', allocation_transfer_id='test2', account_number='test2', program_activity_name='test2', program_activity_code='test2') submission = SubmissionFactory(submission_id='1', reporting_fiscal_year='2017') assert number_of_errors(_FILE, database, models=[op, pa_1, pa_2], submission=submission) == 0
def test_success_ignore_case(database): """ Testing program activity validation to ignore case """ populate_publish_status(database) op = ObjectClassProgramActivityFactory(row_number=1, submission_id=1, beginning_period_of_availa=2016, agency_identifier='test', main_account_code='test', program_activity_name='TEST', program_activity_code='test') pa = ProgramActivityFactory(fiscal_year_quarter='FY17Q4', agency_id='test', allocation_transfer_id='test', account_number='test', program_activity_name='test', program_activity_code='test') submission = SubmissionFactory( submission_id=1, reporting_fiscal_year='2017', reporting_fiscal_period=12, publish_status_id=PUBLISH_STATUS_DICT['unpublished']) assert number_of_errors(_FILE, database, models=[op, pa], submission=submission) == 0
def test_failure_fiscal_year_quarter(database): """ Testing invalid program activity, does not match with fiscal_year_quarter """ populate_publish_status(database) op = ObjectClassProgramActivityFactory(row_number=1, submission_id=1, agency_identifier='test2', main_account_code='test2', program_activity_name='test2', program_activity_code='test2') pa = ProgramActivityFactory(fiscal_year_quarter='FY15Q1', agency_id='test', allocation_transfer_id='test', account_number='test', program_activity_name='test', program_activity_code='test') submission = SubmissionFactory( submission_id=1, reporting_fiscal_year='2018', reporting_fiscal_period=9, publish_status_id=PUBLISH_STATUS_DICT['unpublished']) assert number_of_errors(_FILE, database, models=[op, pa], submission=submission) == 1
def test_failure(database): """ Tests that all combinations of TAS, program activity code, and object class in File C do not exist in File B """ tas1 = TASFactory() tas2 = TASFactory() database.session.add_all([tas1, tas2]) database.session.flush() op = ObjectClassProgramActivityFactory(tas_id=tas1.tas_id, program_activity_code='1', object_class='1') af1 = AwardFinancialFactory(tas_id=tas1.tas_id, program_activity_code='1', object_class='1') af2 = AwardFinancialFactory(tas_id=tas2.tas_id, program_activity_code='1', object_class='1') af3 = AwardFinancialFactory(tas_id=tas1.tas_id, program_activity_code='2', object_class='1') af4 = AwardFinancialFactory(tas_id=tas1.tas_id, program_activity_code='1', object_class='2') assert number_of_errors(_FILE, database, models=[op, af1, af2, af3, af4]) == 3
def test_sum_matches(database): """ Test the GrossOutlayAmountByTAS_CPE amount in the appropriation file (A) does not equal the sum of the corresponding GrossOutlayAmountByProgramObjectClass_CPE values in the award financial file (B). {This value is the sum of all Gross Outlay Amounts reported in file B, to indicate year-to-date activity by TAS/Subaccount.} """ tas = TASFactory() database.session.add(tas) database.session.flush() op1 = ObjectClassProgramActivityFactory(account_num=tas.account_num) op2 = ObjectClassProgramActivityFactory(account_num=tas.account_num) approp_val = sum(op.gross_outlay_amount_by_pro_cpe for op in (op1, op2)) approp = AppropriationFactory(account_num=tas.account_num, gross_outlay_amount_by_tas_cpe=approp_val) assert number_of_errors(_FILE, database, models=[approp, op1, op2]) == 0
def test_success_ignore_optional_before_2021(database): """ Ignore AwardFinancial entries that are prior to year 2021 and are indicated by the proper PAC and PAN. """ tas = TASFactory() database.session.add(tas) database.session.flush() op = ObjectClassProgramActivityFactory(account_num=tas.account_num, program_activity_code='1', program_activity_name='PA1', object_class='1', disaster_emergency_fund_code='s') af = AwardFinancialFactory(account_num=tas.account_num, program_activity_code='1', program_activity_name='PA1', object_class='1', disaster_emergency_fund_code='s') af2 = AwardFinancialFactory( account_num=tas.account_num, program_activity_code='OPTN', program_activity_name='FIELD IS optional PRIOR TO FY21', object_class='1', disaster_emergency_fund_code='s') sub = SubmissionFactory(reporting_fiscal_year=2020) assert number_of_errors(_FILE, database, models=[op, af, af2], submission=sub) == 0
def test_success(database): """ Test valid object class code (3 digits) """ op = ObjectClassProgramActivityFactory(object_class='object_class') oc = ObjectClassFactory(object_class_code='object_class') assert number_of_errors(_FILE, database, models=[op, oc]) == 0
def test_fail_ignore_blank_program_activity_name(database): """ Testing program activity name validation to not ignore blanks """ op = ObjectClassProgramActivityFactory(row_number=1, beginning_period_of_availa=2016, agency_identifier='test', main_account_code='test', program_activity_name='', program_activity_code='test', deobligations_recov_by_pro_cpe=0, gross_outlay_amount_by_pro_cpe=0, gross_outlay_amount_by_pro_fyb=0, gross_outlays_delivered_or_cpe=0, gross_outlays_delivered_or_fyb=0, gross_outlays_undelivered_cpe=0, gross_outlays_undelivered_fyb=0, obligations_delivered_orde_cpe=0, obligations_delivered_orde_fyb=0, obligations_incurred_by_pr_cpe=0, obligations_undelivered_or_cpe=0, obligations_undelivered_or_fyb=0, ussgl480100_undelivered_or_cpe=0, ussgl480100_undelivered_or_fyb=0, ussgl480200_undelivered_or_cpe=0, ussgl480200_undelivered_or_fyb=0, ussgl483100_undelivered_or_cpe=0, ussgl483200_undelivered_or_cpe=0, ussgl487100_downward_adjus_cpe=0, ussgl487200_downward_adjus_cpe=0, ussgl488100_upward_adjustm_cpe=0, ussgl488200_upward_adjustm_cpe=0, ussgl490100_delivered_orde_cpe=0, ussgl490100_delivered_orde_fyb=0, ussgl490200_delivered_orde_cpe=0, ussgl490800_authority_outl_cpe=0, ussgl490800_authority_outl_fyb=0, ussgl493100_delivered_orde_cpe=0, ussgl497100_downward_adjus_cpe=0, ussgl497200_downward_adjus_cpe=0, ussgl498100_upward_adjustm_cpe=0, ussgl498200_upward_adjustm_cpe=0) pa = ProgramActivityFactory(fiscal_year_period='FYP', agency_id='test', allocation_transfer_id='test', account_number='test', program_activity_name='test', program_activity_code='test') assert number_of_errors(_FILE, database, models=[op, pa]) == 1
def test_failure_success_ignore_recertification(database): """ Testing invalid program activity, ingored since FY2017 Q2 or Q3 """ populate_publish_status(database) populate_publish_status(database) op = ObjectClassProgramActivityFactory(row_number=1, submission_id=1, agency_identifier='test2', main_account_code='test2', program_activity_name='test2', program_activity_code='test2') pa = ProgramActivityFactory(fiscal_year_period='FY14P03', agency_id='test', allocation_transfer_id='test', account_number='test', program_activity_name='test', program_activity_code='test') # Test with published submission submission = SubmissionFactory(submission_id=1, reporting_fiscal_year='2017', reporting_fiscal_period=6, publish_status_id=PUBLISH_STATUS_DICT['updated']) assert number_of_errors(_FILE, database, models=[op, pa], submission=submission) == 0 # Test with unpublished submission submission = SubmissionFactory(submission_id=2, reporting_fiscal_year='2017', reporting_fiscal_period=6, publish_status_id=PUBLISH_STATUS_DICT['unpublished']) assert number_of_errors(_FILE, database, models=[op, pa], submission=submission) == 0
def test_success(database): """ Test Object Class Program Activity gross_outlays_delivered_or_fyb equals ussgl490800_authority_outl_fyb """ op = ObjectClassProgramActivityFactory(gross_outlays_delivered_or_fyb=1, ussgl490800_authority_outl_fyb=1) assert number_of_errors(_FILE, database, models=[op]) == 0