Beispiel #1
0
def test_fetch_and_replace_batch_saves_data(no_award_db, monkeypatch):
    award1 = FSRSProcurementFactory()
    award1.subawards = [FSRSSubcontractFactory() for _ in range(4)]
    award2 = FSRSProcurementFactory()
    award2.subawards = [FSRSSubcontractFactory()]
    monkeypatch.setattr(fsrs, 'retrieve_batch',
                        Mock(return_value=[award1, award2]))

    assert no_award_db.query(FSRSProcurement).count() == 0
    fsrs.fetch_and_replace_batch(no_award_db, fsrs.PROCUREMENT)
    assert no_award_db.query(FSRSProcurement).count() == 2
    assert no_award_db.query(FSRSSubcontract).count() == 5
def test_generateFRows(database, monkeypatch):
    """generateFRows should find and convert subaward data relevant to a
    specific submission id. We'll compare the resulting DUNs values for
    uniqueness"""
    sess = database.session

    mock_fn = Mock(return_value=({'fain1', 'fain2'}, {'piid1'}))
    monkeypatch.setattr(fileF, 'relevantFainsPiids', mock_fn)
    # Create some dummy data: 4 procurements, 4 grants, each with 3 subawards
    procs = [
        FSRSProcurementFactory(contract_number='piid' + str(i))
        for i in range(0, 4)
    ]
    for proc in procs:
        proc.subawards = [FSRSSubcontractFactory() for _ in range(3)]
    grants = [FSRSGrantFactory(fain='fain' + str(i)) for i in range(0, 4)]
    for grant in grants:
        grant.subawards = [FSRSSubgrantFactory() for _ in range(3)]

    sess.add_all(procs + grants)

    actual = {
        result['SubAwardeeOrRecipientUniqueIdentifier']
        for result in fileF.generateFRows(sess, 1234)
    }
    expected = set()
    for award in procs[1:3] + grants[1:2]:
        expected.update(sub.duns for sub in award.subawards)
    assert actual == expected
    # Also make sure that we filtered by the right submission
    assert mock_fn.call_args == ((sess, 1234), )
def test_generate_f_rows_naics_desc(database, monkeypatch):
    """The NAICS description should be retireved from an AwardProcurement"""
    sub = SubmissionFactory()
    database.session.add(sub)
    database.session.commit()

    award = AwardProcurementFactory(submission_id=sub.submission_id,
                                    awarding_sub_tier_agency_c='1234')
    other_aps = [
        AwardProcurementFactory(submission_id=award.submission_id,
                                awarding_sub_tier_agency_c='1234')
        for _ in range(3)
    ]
    proc = FSRSProcurementFactory(
        contract_number=award.piid,
        idv_reference_number=award.parent_award_id,
        subawards=[FSRSSubcontractFactory(naics=award.naics)],
        contracting_office_aid='1234')

    database.session.add_all([award, proc] + other_aps)
    database.session.commit()

    actual = {
        result['NAICS_Description']
        for result in fileF.generate_f_rows(award.submission_id)
    }
    assert actual == {award.naics_description}
def test_valueFromMapping_None():
    result = fileF.valueFromMapping(FSRSProcurementFactory(),
                                    FSRSSubcontractFactory(),
                                    None,
                                    None,
                                    mapping=None)
    assert '' == result
def test_copy_values_procurement():
    model_row = fileF.ModelRow(None, FSRSProcurementFactory(duns='DUNS'),
                               FSRSSubcontractFactory(duns='DUNS SUB'), None,
                               None)
    mapper = fileF.CopyValues(procurement='duns')
    assert mapper(model_row) == 'DUNS'
    mapper = fileF.CopyValues(subcontract='duns')
    assert mapper(model_row) == 'DUNS SUB'
    mapper = fileF.CopyValues(grant='duns')
    assert mapper(model_row) is None
def test_zipcode_guard():
    model_row = fileF.ModelRow(
        None, None,
        FSRSSubcontractFactory(company_address_country='USA',
                               company_address_zip='12345'), None, None)
    us_zip = fileF.mappings['LegalEntityZIP+4'](model_row)
    foreign_zip = fileF.mappings['LegalEntityForeignPostalCode'](model_row)
    assert us_zip == '12345'
    assert foreign_zip is None

    model_row.subcontract.company_address_country = 'RU'
    us_zip = fileF.mappings['LegalEntityZIP+4'](model_row)
    foreign_zip = fileF.mappings['LegalEntityForeignPostalCode'](model_row)
    assert us_zip is None
    assert foreign_zip == '12345'
def test_valueFromMapping_tuple():
    proc = FSRSProcurementFactory()
    subc = FSRSSubcontractFactory(duns='subcontract DUNS')
    grant = FSRSGrantFactory()
    subg = FSRSSubgrantFactory(parent_duns='subgrant DUNS')

    mapping = ('duns', 'parent_duns')
    assert 'subcontract DUNS' == fileF.valueFromMapping(
        proc, subc, None, None, mapping)
    assert 'subgrant DUNS' == fileF.valueFromMapping(None, None, grant, subg,
                                                     mapping)

    # None indicates that no result should be provided
    mapping = ('duns', None)
    assert 'subcontract DUNS' == fileF.valueFromMapping(
        proc, subc, None, None, mapping)
    assert '' == fileF.valueFromMapping(None, None, grant, subg, mapping)
def test_generate_f_rows_false(database, monkeypatch):
    """Make sure we're converting False to a string"""
    sub = SubmissionFactory()
    database.session.add(sub)
    database.session.commit()

    award = AwardProcurementFactory(submission_id=sub.submission_id,
                                    awarding_sub_tier_agency_c='1234')
    proc = FSRSProcurementFactory(contract_number=award.piid,
                                  idv_reference_number=award.parent_award_id,
                                  subawards=[
                                      FSRSSubcontractFactory(
                                          recovery_model_q1=False,
                                          recovery_model_q2=None)
                                  ],
                                  contracting_office_aid='1234')

    database.session.add_all([award, proc])
    database.session.commit()

    results = list(fileF.generate_f_rows(award.submission_id))
    assert results[0]['RecModelQuestion1'] == 'False'
    assert results[0]['RecModelQuestion2'] == ''
Beispiel #9
0
def test_fix_broken_links(database, monkeypatch):
    """ Ensure that fix_broken_links works as intended """

    # Setup - create awards, procurements/grants, subawards
    sess = database.session
    sess.query(Subaward).delete(synchronize_session=False)
    sess.commit()

    parent_duns, duns, dom_country, int_country = reference_data(sess)
    min_date = '2019-06-06'
    award_updated_at = '2019-06-07'

    # Setup - Grants
    sub = SubmissionFactory(submission_id=1)
    d2_non = PublishedAwardFinancialAssistanceFactory(
        submission_id=sub.submission_id,
        record_type='2',
        unique_award_key='NON',
        is_active=True,
        updated_at=award_updated_at)
    grant_non = FSRSGrantFactory(
        fain=d2_non.fain,
        awardee_address_country=int_country.country_code,
        principle_place_country=dom_country.country_code,
        parent_duns=parent_duns.awardee_or_recipient_uniqu,
        cfda_numbers='00.001 CFDA 1; 00.002 CFDA 2',
        obligation_date=datetime.now(),
        date_submitted=datetime(2019, 5, 30, 16, 25, 12, 34))
    sub_grant_non = FSRSSubgrantFactory(
        parent=grant_non,
        awardee_address_country=dom_country.country_code,
        principle_place_country=int_country.country_code,
        parent_duns=parent_duns.awardee_or_recipient_uniqu,
        duns=duns.awardee_or_recipient_uniqu,
        subaward_date=datetime.now())
    d2_agg = PublishedAwardFinancialAssistanceFactory(
        submission_id=sub.submission_id,
        record_type='1',
        unique_award_key='AGG',
        is_active=True,
        updated_at=award_updated_at)
    grant_agg = FSRSGrantFactory(
        fain=d2_agg.fain,
        awardee_address_country=int_country.country_code,
        principle_place_country=dom_country.country_code,
        parent_duns=parent_duns.awardee_or_recipient_uniqu,
        cfda_numbers='00.003 CFDA 3',
        obligation_date=datetime.now(),
        date_submitted=datetime(2019, 5, 30, 16, 25, 12, 34))
    sub_grant_agg = FSRSSubgrantFactory(
        parent=grant_agg,
        awardee_address_country=dom_country.country_code,
        principle_place_country=int_country.country_code,
        parent_duns=parent_duns.awardee_or_recipient_uniqu,
        duns=duns.awardee_or_recipient_uniqu,
        subaward_date=datetime.now())

    # Setup - Contracts
    d1_awd = DetachedAwardProcurementFactory(submission_id=sub.submission_id,
                                             idv_type=None,
                                             unique_award_key='AWD',
                                             updated_at=award_updated_at)
    contract_awd = FSRSProcurementFactory(
        contract_number=d1_awd.piid,
        idv_reference_number=d1_awd.parent_award_id,
        contracting_office_aid=d1_awd.awarding_sub_tier_agency_c,
        company_address_country=dom_country.country_code,
        principle_place_country=int_country.country_code,
        duns=duns.awardee_or_recipient_uniqu,
        date_signed=datetime.now(),
        date_submitted=datetime(2019, 5, 30, 16, 25, 12, 34))
    sub_contract_awd = FSRSSubcontractFactory(
        parent=contract_awd,
        company_address_country=int_country.country_code,
        principle_place_country=dom_country.country_code,
        subcontract_date=datetime.now())
    d1_idv = DetachedAwardProcurementFactory(submission_id=sub.submission_id,
                                             idv_type='C',
                                             unique_award_key='IDV',
                                             updated_at=award_updated_at)
    contract_idv = FSRSProcurementFactory(
        contract_number=d1_idv.piid,
        idv_reference_number=d1_idv.parent_award_id,
        contracting_office_aid=d1_idv.awarding_sub_tier_agency_c,
        company_address_country=dom_country.country_code,
        principle_place_country=int_country.country_code,
        duns=duns.awardee_or_recipient_uniqu,
        date_signed=datetime.now(),
        date_submitted=datetime(2019, 5, 30, 16, 25, 12, 34))
    sub_contract_idv = FSRSSubcontractFactory(
        parent=contract_idv,
        company_address_country=int_country.country_code,
        principle_place_country=dom_country.country_code,
        subcontract_date=datetime.now())

    # Note: not including d1/d2 data
    sess.add_all(
        [sub, contract_awd, sub_contract_awd, contract_idv, sub_contract_idv])
    sess.add_all([sub, grant_non, sub_grant_non, grant_agg, sub_grant_agg])
    sess.commit()

    populate_subaward_table(sess,
                            'procurement_service',
                            ids=[contract_awd.id, contract_idv.id])
    populate_subaward_table(sess,
                            'grant_service',
                            ids=[grant_agg.id, grant_non.id])

    contracts_results = sess.query(Subaward).order_by(Subaward.unique_award_key).\
        filter(Subaward.subaward_type == 'sub-contract').all()
    grants_results = sess.query(Subaward).order_by(Subaward.unique_award_key).\
        filter(Subaward.subaward_type == 'sub-grant').all()
    original_ids = [result.id for result in contracts_results + grants_results]

    grant_created_at = grant_updated_at = grants_results[0].created_at
    contract_created_at = contract_updated_at = contracts_results[0].created_at

    # Expected Results - should be False as the award isn't provided
    assert compare_contract_results(
        contracts_results[0], d1_awd, contract_awd, sub_contract_awd,
        parent_duns, duns, dom_country, int_country, contract_created_at,
        contract_updated_at) is False
    assert compare_contract_results(
        contracts_results[1], d1_idv, contract_idv, sub_contract_idv,
        parent_duns, duns, dom_country, int_country, contract_created_at,
        contract_updated_at) is False
    assert compare_grant_results(
        grants_results[0], d2_agg, grant_agg, sub_grant_agg, parent_duns, duns,
        dom_country, int_country, grant_created_at, grant_updated_at) is False
    assert compare_grant_results(
        grants_results[1], d2_non, grant_non, sub_grant_non, parent_duns, duns,
        dom_country, int_country, grant_created_at, grant_updated_at) is False

    # now add the awards and fix the broken links
    sess.add_all([d1_awd, d2_non, d1_idv, d2_agg])
    sess.commit()

    updated_proc_count = fix_broken_links(sess,
                                          'procurement_service',
                                          min_date=min_date)
    updated_grant_count = fix_broken_links(sess,
                                           'grant_service',
                                           min_date=min_date)

    assert updated_proc_count == updated_grant_count == 2

    contracts_results = sess.query(Subaward).order_by(Subaward.unique_award_key).\
        filter(Subaward.subaward_type == 'sub-contract').all()
    grants_results = sess.query(Subaward).order_by(Subaward.unique_award_key).\
        filter(Subaward.subaward_type == 'sub-grant').all()
    updated_ids = [result.id for result in contracts_results + grants_results]

    contract_created_at = contracts_results[0].created_at
    contract_updated_at = contracts_results[0].updated_at
    grant_created_at = grants_results[0].created_at
    grant_updated_at = grants_results[0].updated_at

    # Expected Results - should now be True as the award is now available
    assert compare_contract_results(
        contracts_results[0], d1_awd, contract_awd, sub_contract_awd,
        parent_duns, duns, dom_country, int_country, contract_created_at,
        contract_updated_at) is True
    assert compare_contract_results(
        contracts_results[1], d1_idv, contract_idv, sub_contract_idv,
        parent_duns, duns, dom_country, int_country, contract_created_at,
        contract_updated_at) is True
    assert compare_grant_results(
        grants_results[0], d2_agg, grant_agg, sub_grant_agg, parent_duns, duns,
        dom_country, int_country, grant_created_at, grant_updated_at) is True
    assert compare_grant_results(
        grants_results[1], d2_non, grant_non, sub_grant_non, parent_duns, duns,
        dom_country, int_country, grant_created_at, grant_updated_at) is True

    # Ensuring only updates occurred, no deletes/inserts
    assert set(original_ids) == set(updated_ids)
Beispiel #10
0
def test_generate_f_file_queries_contracts(database, monkeypatch):
    """ generate_f_file_queries should provide queries representing halves of F file data related to a submission
        This will cover contracts records.
    """
    sess = database.session
    sess.query(Subaward).delete(synchronize_session=False)
    sess.commit()

    parent_duns, duns, dom_country, int_country = reference_data(sess)

    # Setup - create awards, procurements, subcontract
    sub = SubmissionFactory(submission_id=1)
    d1_awd = DetachedAwardProcurementFactory(submission_id=sub.submission_id,
                                             idv_type=None,
                                             unique_award_key='AWD')
    contract_awd = FSRSProcurementFactory(
        contract_number=d1_awd.piid,
        idv_reference_number=d1_awd.parent_award_id,
        contracting_office_aid=d1_awd.awarding_sub_tier_agency_c,
        company_address_country=dom_country.country_code,
        principle_place_country=int_country.country_code,
        duns=duns.awardee_or_recipient_uniqu,
        date_signed=datetime.now(),
        date_submitted=datetime(2019, 5, 30, 16, 25, 12, 34))
    sub_contract_awd = FSRSSubcontractFactory(
        parent=contract_awd,
        company_address_country=int_country.country_code,
        principle_place_country=dom_country.country_code,
        subcontract_date=datetime.now())
    d1_idv = DetachedAwardProcurementFactory(submission_id=sub.submission_id,
                                             idv_type='C',
                                             unique_award_key='IDV')
    contract_idv = FSRSProcurementFactory(
        contract_number=d1_idv.piid,
        idv_reference_number=d1_idv.parent_award_id,
        contracting_office_aid=d1_idv.awarding_sub_tier_agency_c,
        company_address_country=dom_country.country_code,
        principle_place_country=int_country.country_code,
        duns=duns.awardee_or_recipient_uniqu,
        date_signed=datetime.now(),
        date_submitted=datetime(2019, 5, 30, 16, 25, 12, 34))
    sub_contract_idv = FSRSSubcontractFactory(
        parent=contract_idv,
        company_address_country=int_country.country_code,
        principle_place_country=dom_country.country_code,
        subcontract_date=datetime.now())

    sess.add_all([
        sub, d1_awd, contract_awd, sub_contract_awd, d1_idv, contract_idv,
        sub_contract_idv
    ])
    sess.commit()

    # Gather the sql
    populate_subaward_table(sess,
                            'procurement_service',
                            ids=[contract_awd.id, contract_idv.id])

    # Get the records
    contracts_results = sess.query(Subaward).order_by(
        Subaward.unique_award_key).all()

    created_at = updated_at = contracts_results[0].created_at

    # Expected Results
    assert compare_contract_results(contracts_results[0], d1_awd, contract_awd,
                                    sub_contract_awd, parent_duns, duns,
                                    dom_country, int_country, created_at,
                                    updated_at) is True
    assert compare_contract_results(contracts_results[1], d1_idv, contract_idv,
                                    sub_contract_idv, parent_duns, duns,
                                    dom_country, int_country, created_at,
                                    updated_at) is True
def test_generate_f_rows(database, monkeypatch):
    """generate_f_rows should find and convert subaward data relevant to a
    specific submission id. We'll compare the resulting DUNs values for
    uniqueness"""
    # Setup - create awards, procurements/grants, subawards
    sess = database.session
    sub_1 = SubmissionFactory()
    sub_2 = SubmissionFactory()
    sess.add_all([sub_1, sub_2])
    sess.commit()

    awards = [
        AwardProcurementFactory(submission_id=sub_1.submission_id,
                                piid='PIID1',
                                parent_award_id='PIID1',
                                awarding_sub_tier_agency_c='1234'),
        AwardProcurementFactory(submission_id=sub_1.submission_id,
                                piid='PIID2',
                                parent_award_id='PIID2',
                                awarding_sub_tier_agency_c='1234'),
        AwardFinancialAssistanceFactory(submission_id=sub_1.submission_id,
                                        fain='FAIN1'),
        AwardFinancialAssistanceFactory(submission_id=sub_1.submission_id,
                                        fain='FAIN2'),
        AwardProcurementFactory(submission_id=sub_2.submission_id,
                                piid='PIID1',
                                parent_award_id='PIID1',
                                awarding_sub_tier_agency_c='1234'),
        AwardFinancialAssistanceFactory(submission_id=sub_2.submission_id,
                                        fain='FAIN1')
    ]
    sess.add_all(awards)
    procurements = {}
    for piid in ('PIID1', 'PIID2', 'PIID3'):
        procurements[piid] = [
            FSRSProcurementFactory(
                contract_number=piid,
                idv_reference_number=piid,
                subawards=[FSRSSubcontractFactory() for _ in range(3)],
                contracting_office_aid='1234'),
            FSRSProcurementFactory(contract_number=piid,
                                   idv_reference_number=piid,
                                   subawards=[],
                                   contracting_office_aid='1234'),
            FSRSProcurementFactory(
                contract_number=piid,
                idv_reference_number=piid,
                subawards=[FSRSSubcontractFactory() for _ in range(2)],
                contracting_office_aid='1234')
        ]
        sess.add_all(procurements[piid])
    grants = {}
    for fain in ('FAIN0', 'FAIN1'):
        grants[fain] = [
            FSRSGrantFactory(fain=fain,
                             subawards=[
                                 FSRSSubgrantFactory() for _ in range(3)
                             ]),
            FSRSGrantFactory(fain=fain, subawards=[]),
            FSRSGrantFactory(
                fain=fain, subawards=[FSRSSubgrantFactory() for _ in range(2)])
        ]
        sess.add_all(grants[fain])
    sess.commit()

    actual = {
        result['SubAwardeeOrRecipientUniqueIdentifier']
        for result in fileF.generate_f_rows(sub_1.submission_id)
    }
    expected = set()
    expected.update(sub.duns for proc in procurements['PIID1']
                    for sub in proc.subawards)
    expected.update(sub.duns for proc in procurements['PIID2']
                    for sub in proc.subawards)
    expected.update(sub.duns for grant in grants['FAIN1']
                    for sub in grant.subawards)
    assert actual == expected
def test_valueFromMapping_string():
    proc = FSRSProcurementFactory()
    sub = FSRSSubcontractFactory(duns='Some DUNS')
    result = fileF.valueFromMapping(proc, sub, None, None, mapping='duns')
    assert 'Some DUNS' == result
def test_fix_broken_links(database, monkeypatch):
    """ Ensure that fix_broken_links works as intended """

    # Setup - create awards, procurements/grants, subawards
    sess = database.session
    sess.query(Subaward).delete(synchronize_session=False)
    sess.commit()

    parent_recipient, recipient, dom_country, int_country = reference_data(sess)
    min_date = '2019-06-06'
    award_updated_at = '2019-06-07'

    # Setup - Grants
    sub = SubmissionFactory(submission_id=1)
    sub2 = SubmissionFactory(submission_id=2)
    sub3 = SubmissionFactory(submission_id=3)
    fabs_non_pop_subtier = PublishedFABSFactory(
        submission_id=sub.submission_id,
        awarding_sub_tier_agency_c='1234',
        record_type=2,
        unique_award_key='NON-POP-SUB',
        fain='NON-FAIN-WITH-DASHES-POP-SUB',
        is_active=True,
        updated_at=award_updated_at,
        action_date='2020-01-01'
    )
    fabs_non_pop_subtier_2 = PublishedFABSFactory(
        submission_id=sub.submission_id,
        awarding_sub_tier_agency_c='1234',
        record_type=2,
        unique_award_key='NON-POP-SUB',
        fain='NON-FAIN-WITH-DASHES-POP-SUB',
        is_active=True,
        updated_at=award_updated_at,
        action_date='2020-01-02'
    )
    grant_non_pop_subtier = FSRSGrantFactory(
        fain=fabs_non_pop_subtier.fain.replace('-', ''),
        federal_agency_id='1234',
        awardee_address_country=int_country.country_code,
        principle_place_country=dom_country.country_code,
        parent_uei=parent_recipient.uei,
        cfda_numbers='00.001 CFDA 1; 00.002 CFDA 2',
        obligation_date=datetime.now(),
        date_submitted=datetime(2019, 5, 30, 16, 25, 12, 34)
    )
    sub_grant_non_pop_subtier = FSRSSubgrantFactory(
        parent=grant_non_pop_subtier,
        awardee_address_country=dom_country.country_code,
        principle_place_country=int_country.country_code_2_char,
        parent_uei=parent_recipient.uei,
        uei_number=recipient.uei.lower(),
        subaward_date=datetime.now()
    )
    fabs_non_null_subtier = PublishedFABSFactory(
        submission_id=sub.submission_id,
        awarding_sub_tier_agency_c='5678',
        record_type=2,
        unique_award_key='NON-NULL-SUB',
        fain='NON-FAIN-WITH-DASHES-NULL-SUB',
        is_active=True,
        updated_at=award_updated_at,
        action_date='2020-01-01'
    )

    fabs_non_null_subtier_2 = PublishedFABSFactory(
        submission_id=sub.submission_id,
        awarding_sub_tier_agency_c='5678',
        record_type=2,
        unique_award_key='NON-NULL-SUB',
        fain='NON-FAIN-WITH-DASHES-NULL-SUB',
        is_active=True,
        updated_at=award_updated_at,
        action_date='2020-01-02'
    )
    grant_non_null_subtier = FSRSGrantFactory(
        fain=fabs_non_null_subtier.fain.replace('-', ''),
        federal_agency_id=None,
        awardee_address_country=int_country.country_code_2_char,
        principle_place_country=dom_country.country_code,
        parent_uei=parent_recipient.uei,
        cfda_numbers='00.001 CFDA 1; 00.002 CFDA 2',
        obligation_date=datetime.now(),
        date_submitted=datetime(2019, 5, 30, 16, 25, 12, 34)
    )
    sub_grant_non_null_subtier = FSRSSubgrantFactory(
        parent=grant_non_null_subtier,
        awardee_address_country=dom_country.country_code,
        principle_place_country=int_country.country_code_2_char,
        parent_uei=parent_recipient.uei,
        uei_number=recipient.uei,
        subaward_date=datetime.now()
    )
    fabs_non_other = PublishedFABSFactory(
        submission_id=sub2.submission_id,
        awarding_sub_tier_agency_c='1357',
        record_type=2,
        unique_award_key='NON-OTHER',
        fain='NON-FAIN-WITH-DASHES-OTHER',
        is_active=True,
        updated_at=award_updated_at,
        action_date='2020-01-01'
    )

    fabs_non_other_2 = PublishedFABSFactory(
        submission_id=sub2.submission_id,
        awarding_sub_tier_agency_c='1357',
        record_type=2,
        unique_award_key='NON-OTHER',
        fain='NON-FAIN-WITH-DASHES-OTHER',
        is_active=True,
        updated_at=award_updated_at,
        action_date='2020-01-02'
    )
    fabs_non_other_dup = PublishedFABSFactory(
        submission_id=sub3.submission_id,
        awarding_sub_tier_agency_c='2468',
        record_type=2,
        unique_award_key='NON-OTHER',
        fain='NON-FAIN-WITH-DASHES-OTHER',
        is_active=True,
        updated_at=award_updated_at,
        action_date='2020-01-01'
    )
    fabs_non_other_dup_2 = PublishedFABSFactory(
        submission_id=sub3.submission_id,
        awarding_sub_tier_agency_c='2468',
        record_type=2,
        unique_award_key='NON-OTHER',
        fain='NON-FAIN-WITH-DASHES-OTHER',
        is_active=True,
        updated_at=award_updated_at,
        action_date='2020-01-02'
    )
    grant_non_other = FSRSGrantFactory(
        fain=fabs_non_other.fain.replace('-', ''),
        federal_agency_id=None,
        awardee_address_country=int_country.country_code,
        principle_place_country=dom_country.country_code,
        parent_uei=parent_recipient.uei,
        cfda_numbers='00.001 CFDA 1; 00.002 CFDA 2',
        obligation_date=datetime.now(),
        date_submitted=datetime(2019, 5, 30, 16, 25, 12, 34)
    )
    sub_grant_non_other = FSRSSubgrantFactory(
        parent=grant_non_other,
        awardee_address_country=dom_country.country_code,
        principle_place_country=int_country.country_code_2_char,
        parent_uei=parent_recipient.uei,
        uei_number=recipient.uei,
        subaward_date=datetime.now()
    )
    fabs_agg = PublishedFABSFactory(
        submission_id=sub.submission_id,
        awarding_sub_tier_agency_c='1234',
        record_type=1,
        unique_award_key='AGG',
        fain='AGG-FAIN-WITH-DASHES',
        is_active=True,
        updated_at=award_updated_at,
        action_date='2020-01-01'
    )
    fabs_agg_2 = PublishedFABSFactory(
        submission_id=sub.submission_id,
        awarding_sub_tier_agency_c='1234',
        record_type=1,
        unique_award_key='AGG',
        fain='AGG-FAIN-WITH-DASHES',
        is_active=True,
        updated_at=award_updated_at,
        action_date='2020-01-02'
    )
    grant_agg = FSRSGrantFactory(
        fain=fabs_agg.fain.replace('-', ''),
        federal_agency_id='1234',
        awardee_address_country=int_country.country_code_2_char,
        principle_place_country=dom_country.country_code,
        parent_uei=parent_recipient.uei,
        cfda_numbers='00.003 CFDA 3',
        obligation_date=datetime.now(),
        date_submitted=datetime(2019, 5, 30, 16, 25, 12, 34)
    )
    sub_grant_agg = FSRSSubgrantFactory(
        parent=grant_agg,
        awardee_address_country=dom_country.country_code,
        principle_place_country=int_country.country_code_2_char,
        parent_uei=parent_recipient.uei,
        uei_number=recipient.uei,
        subaward_date=datetime.now()
    )

    # Setup - Contracts
    d1_awd = DetachedAwardProcurementFactory(
        submission_id=sub.submission_id,
        idv_type=None,
        unique_award_key='AWD',
        piid='AWD-PIID-WITH-DASHES',
        parent_award_id='AWD-PARENT-AWARD-ID-WITH-DASHES',
        updated_at=award_updated_at,
        action_date='2020-01-01'
    )
    d1_awd_2 = DetachedAwardProcurementFactory(
        submission_id=sub.submission_id,
        idv_type=None,
        unique_award_key='AWD',
        piid='AWD-PIID-WITH-DASHES',
        parent_award_id='AWD-PARENT-AWARD-ID-WITH-DASHES',
        updated_at=award_updated_at,
        action_date='2020-01-02'
    )
    contract_awd = FSRSProcurementFactory(
        contract_number=d1_awd.piid.replace('-', ''),
        idv_reference_number=d1_awd.parent_award_id.replace('-', ''),
        contracting_office_aid=d1_awd.awarding_sub_tier_agency_c,
        company_address_country=dom_country.country_code,
        principle_place_country=int_country.country_code_2_char,
        uei_number=recipient.uei,
        date_signed=datetime.now(),
        date_submitted=datetime(2019, 5, 30, 16, 25, 12, 34)
    )
    sub_contract_awd = FSRSSubcontractFactory(
        parent=contract_awd,
        company_address_country=int_country.country_code_2_char,
        principle_place_country=dom_country.country_code,
        subcontract_date=datetime.now()
    )
    d1_idv = DetachedAwardProcurementFactory(
        submission_id=sub.submission_id,
        idv_type='C',
        unique_award_key='IDV',
        piid='IDV-PIID-WITH-DASHES',
        parent_award_id='IDV-PARENT-AWARD-IDV-WITH-DASHES',
        updated_at=award_updated_at,
        action_date='2020-01-01'
    )
    d1_idv_2 = DetachedAwardProcurementFactory(
        submission_id=sub.submission_id,
        idv_type='C',
        unique_award_key='IDV',
        piid='IDV-PIID-WITH-DASHES',
        parent_award_id='IDV-PARENT-AWARD-IDV-WITH-DASHES',
        updated_at=award_updated_at,
        action_date='2020-01-02'
    )
    contract_idv = FSRSProcurementFactory(
        contract_number=d1_idv.piid.replace('-', ''),
        idv_reference_number=d1_idv.parent_award_id.replace('-', ''),
        contracting_office_aid=d1_idv.awarding_sub_tier_agency_c,
        company_address_country=dom_country.country_code,
        principle_place_country=int_country.country_code,
        uei_number=recipient.uei,
        date_signed=datetime.now(),
        date_submitted=datetime(2019, 5, 30, 16, 25, 12, 34)
    )
    sub_contract_idv = FSRSSubcontractFactory(
        parent=contract_idv,
        company_address_country=int_country.country_code_2_char,
        principle_place_country=dom_country.country_code,
        subcontract_date=datetime.now()
    )

    # Note: not including d1/fabs data
    sess.add_all([sub, contract_awd, sub_contract_awd, contract_idv, sub_contract_idv])
    sess.add_all([sub, grant_non_pop_subtier, sub_grant_non_pop_subtier, grant_non_null_subtier,
                  sub_grant_non_null_subtier, grant_non_other, sub_grant_non_other, grant_agg, sub_grant_agg])
    sess.commit()

    populate_subaward_table(sess, 'procurement_service', ids=[contract_awd.id, contract_idv.id])
    populate_subaward_table(sess, 'grant_service', ids=[grant_agg.id, grant_non_pop_subtier.id,
                                                        grant_non_null_subtier.id, grant_non_other.id])

    contracts_results = sess.query(Subaward).order_by(Subaward.unique_award_key).\
        filter(Subaward.subaward_type == 'sub-contract').all()
    grants_results = sess.query(Subaward).order_by(Subaward.award_id).\
        filter(Subaward.subaward_type == 'sub-grant').all()
    original_ids = [result.id for result in contracts_results + grants_results]

    grant_created_at = grant_updated_at = grants_results[0].created_at
    contract_created_at = contract_updated_at = contracts_results[0].created_at

    # Expected Results - should be False as the award isn't provided
    assert compare_contract_results(contracts_results[0], d1_awd, contract_awd, sub_contract_awd, dom_country,
                                    int_country, contract_created_at, contract_updated_at) is False
    assert compare_contract_results(contracts_results[1], d1_idv, contract_idv, sub_contract_idv, dom_country,
                                    int_country, contract_created_at, contract_updated_at) is False

    assert compare_grant_results(grants_results[0], fabs_agg, grant_agg, sub_grant_agg, parent_recipient, recipient,
                                 dom_country, int_country, grant_created_at, grant_updated_at) is False
    assert compare_grant_results(grants_results[1], fabs_non_other, grant_non_other, sub_grant_non_other,
                                 parent_recipient, recipient, dom_country, int_country, grant_created_at,
                                 grant_updated_at) is False
    assert compare_grant_results(grants_results[2], fabs_non_null_subtier, grant_non_null_subtier,
                                 sub_grant_non_null_subtier, parent_recipient, recipient, dom_country,
                                 int_country, grant_created_at, grant_updated_at) is False
    assert compare_grant_results(grants_results[3], fabs_non_pop_subtier, grant_non_pop_subtier,
                                 sub_grant_non_pop_subtier, parent_recipient, recipient, dom_country,
                                 int_country, grant_created_at, grant_updated_at) is False

    # now add the awards and fix the broken links
    sess.add_all([d1_awd, d1_awd_2, d1_idv, d1_idv_2, fabs_non_null_subtier, fabs_non_null_subtier_2,
                  fabs_non_pop_subtier, fabs_non_pop_subtier_2, fabs_non_other, fabs_non_other_2, fabs_non_other_dup,
                  fabs_non_other_dup_2, fabs_agg, fabs_agg_2])
    sess.commit()

    updated_proc_count = fix_broken_links(sess, 'procurement_service', min_date=min_date)
    updated_grant_count = fix_broken_links(sess, 'grant_service', min_date=min_date)

    assert updated_proc_count == 2
    # Note: Aggregates and blank federal_agency_ids should still not be linked, so 1 and not 3
    assert updated_grant_count == 1

    contracts_results = sess.query(Subaward).order_by(Subaward.unique_award_key).\
        filter(Subaward.subaward_type == 'sub-contract').all()
    grants_results = sess.query(Subaward).order_by(Subaward.award_id).\
        filter(Subaward.subaward_type == 'sub-grant').all()
    updated_ids = [result.id for result in contracts_results + grants_results]

    contract_created_at = contracts_results[0].created_at
    contract_updated_at = contracts_results[0].updated_at
    grant_created_at = grants_results[0].created_at
    grant_updated_at = grants_results[0].updated_at

    # Expected Results - should now be True as the award is now available
    assert compare_contract_results(contracts_results[0], d1_awd, contract_awd, sub_contract_awd, dom_country,
                                    int_country, contract_created_at, contract_updated_at) is True
    assert compare_contract_results(contracts_results[1], d1_idv, contract_idv, sub_contract_idv, dom_country,
                                    int_country, contract_created_at, contract_updated_at) is True
    assert compare_grant_results(grants_results[0], fabs_agg, grant_agg, sub_grant_agg, parent_recipient, recipient,
                                 dom_country, int_country, grant_created_at, grant_updated_at) is False
    assert compare_grant_results(grants_results[1], fabs_non_null_subtier, grant_non_null_subtier,
                                 sub_grant_non_null_subtier, parent_recipient, recipient, dom_country,
                                 int_country, grant_created_at, grant_updated_at) is False
    assert compare_grant_results(grants_results[2], fabs_non_other, grant_non_other, sub_grant_non_other,
                                 parent_recipient, recipient, dom_country, int_country, grant_created_at,
                                 grant_updated_at) is False
    assert compare_grant_results(grants_results[3], fabs_non_pop_subtier, grant_non_pop_subtier,
                                 sub_grant_non_pop_subtier, parent_recipient, recipient, dom_country,
                                 int_country, grant_created_at, grant_updated_at) is True

    # Ensuring only updates occurred, no deletes/inserts
    assert set(original_ids) == set(updated_ids)
def test_generate_f_file_queries_contracts(database, monkeypatch):
    """ generate_f_file_queries should provide queries representing halves of F file data related to a submission
        This will cover contracts records.
    """
    sess = database.session

    parent_duns, duns, dom_country, int_country = reference_data(sess)

    # Setup - create awards, procurements, subcontracts
    sub = SubmissionFactory(submission_id=1)
    d1_awd = AwardProcurementFactory(
        submission_id=sub.submission_id,
        idv_type=None
    )
    contract_awd = FSRSProcurementFactory(
        contract_number=d1_awd.piid,
        idv_reference_number=d1_awd.parent_award_id,
        contracting_office_aid=d1_awd.awarding_sub_tier_agency_c,
        company_address_country=dom_country.country_code,
        principle_place_country=int_country.country_code,
        duns=duns.awardee_or_recipient_uniqu
    )
    sub_contract_awd = FSRSSubcontractFactory(
        parent=contract_awd,
        company_address_country=int_country.country_code,
        principle_place_country=dom_country.country_code
    )
    d1_idv = AwardProcurementFactory(
        submission_id=sub.submission_id,
        idv_type='C'
    )
    contract_idv = FSRSProcurementFactory(
        contract_number=d1_idv.piid,
        idv_reference_number=d1_idv.parent_award_id,
        contracting_office_aid=d1_idv.awarding_sub_tier_agency_c,
        company_address_country=dom_country.country_code,
        principle_place_country=int_country.country_code,
        duns=duns.awardee_or_recipient_uniqu
    )
    sub_contract_idv = FSRSSubcontractFactory(
        parent=contract_idv,
        company_address_country=int_country.country_code,
        principle_place_country=dom_country.country_code
    )

    sess.add_all([sub, d1_awd, contract_awd, sub_contract_awd, d1_idv, contract_idv, sub_contract_idv])
    sess.commit()

    # Gather the sql
    contract_query, _ = fileF.generate_f_file_queries(sub.submission_id)

    # Get the records
    contracts_records = sess.execute(contract_query)
    contracts_cols = contracts_records.keys()
    contracts_results = contracts_records.fetchall()

    # Expected Results
    expected_contracts = [
        replicate_contract_results(sub, d1_awd, contract_awd, sub_contract_awd, parent_duns, duns, dom_country,
                                   int_country),
        replicate_contract_results(sub, d1_idv, contract_idv, sub_contract_idv, parent_duns, duns, dom_country,
                                   int_country)
    ]

    assert sorted(contracts_results, key=lambda result: result[0]) == expected_contracts
    assert contracts_cols == EXPECTED_COLS