def test_upload_cr_attachment_request_to_foia_with_cpd_after_2006_has_badge_number(
            self, airtable_mock):
        airtable_mock.insert.return_value = {'id': 'some_airtable_record_id'}

        allegation = AllegationFactory(crid='123456',
                                       incident_date=datetime(2007,
                                                              12,
                                                              31,
                                                              tzinfo=pytz.utc))
        attachment_request = AttachmentRequestFactory(
            allegation=allegation, email='*****@*****.**')
        officer_1 = OfficerFactory(id=1, first_name='Marry', last_name='Jane')
        officer_2 = OfficerFactory(id=2, first_name='John', last_name='Henry')
        OfficerBadgeNumberFactory(officer=officer_1, star='12345')
        OfficerBadgeNumberFactory(officer=officer_2, star='56789')
        investigator_1 = InvestigatorFactory(officer=officer_1)
        investigator_2 = InvestigatorFactory(officer=officer_1)
        InvestigatorAllegationFactory(allegation=allegation,
                                      current_star=None,
                                      investigator=investigator_1)
        InvestigatorAllegationFactory(allegation=allegation,
                                      current_star=None,
                                      investigator=investigator_2)
        OfficerAllegationFactory(allegation=allegation, officer=officer_1)
        OfficerAllegationFactory(allegation=allegation, officer=officer_2)

        expected_airtable_data = {
            'Explanation':
            'Officers: John Henry(ID 2), Marry Jane(ID 1)',
            'Project': ['CPDP'],
            'Agency': ['CPD_AGENCY_ID'],
            'Requested For':
            'CR 123456',
            'Requestor': [{
                'id': 'usrGiZFcyZ6wHTYWd',
                'email': '*****@*****.**',
                'name': 'Rajiv Sinclair'
            }],
            'Date requested by user':
            attachment_request.created_at.strftime('%Y-%m-%d'),
            'Requester Email':
            '*****@*****.**'
        }

        CRRequestAirTableUploader.upload()
        attachment_request.refresh_from_db()

        airtable_mock.insert.assert_called_with(expected_airtable_data)
        expect(
            attachment_request.airtable_id).to.be.eq('some_airtable_record_id')
    def test_update_cr_attachment_request_to_foia_with_invalid_airtable_id(
            self, airtable_mock):
        airtable_mock.update = Mock(side_effect=[HTTPError('404')])
        airtable_mock.insert.return_value = {'id': 'airtable_id'}

        allegation = AllegationFactory(crid='123456',
                                       incident_date=datetime(2010,
                                                              1,
                                                              1,
                                                              tzinfo=pytz.utc))
        attachment_request = AttachmentRequestFactory(
            allegation=allegation,
            email='*****@*****.**',
            airtable_id='invalid_airtable_id')
        officer_1 = OfficerFactory(id=1, first_name='Marry', last_name='Jane')
        officer_2 = OfficerFactory(id=2, first_name='John', last_name='Henry')
        OfficerAllegationFactory(allegation=allegation, officer=officer_1)
        OfficerAllegationFactory(allegation=allegation, officer=officer_2)

        expected_airtable_data = {
            'Explanation':
            'Officers: John Henry(ID 2), Marry Jane(ID 1)',
            'Project': ['CPDP'],
            'Agency': ['COPA_AGENCY_ID'],
            'Requested For':
            'CR 123456',
            'Requestor': [{
                'id': 'usrGiZFcyZ6wHTYWd',
                'email': '*****@*****.**',
                'name': 'Rajiv Sinclair'
            }],
            'Date requested by user':
            attachment_request.created_at.strftime('%Y-%m-%d'),
            'Requester Email':
            '*****@*****.**'
        }

        CRRequestAirTableUploader.upload(update_all_records=True)
        attachment_request.refresh_from_db()

        airtable_mock.update.assert_called_with('invalid_airtable_id',
                                                expected_airtable_data)
        airtable_mock.insert.assert_called_with(expected_airtable_data)
        expect(attachment_request.airtable_id).to.be.eq('airtable_id')
    def test_upload_cr_attachment_request_to_foia_with_cpd_for_pre_2006_but_no_incident_date(
            self, airtable_mock):
        airtable_mock.insert.return_value = {'id': 'some_airtable_record_id'}

        allegation = AllegationFactory(crid='123456', incident_date=None)
        attachment_request = AttachmentRequestFactory(
            allegation=allegation, email='*****@*****.**')
        officer_1 = OfficerFactory(id=1, first_name='Marry', last_name='Jane')
        officer_2 = OfficerFactory(id=2, first_name='John', last_name='Henry')
        OfficerAllegationFactory(allegation=allegation, officer=officer_1)
        OfficerAllegationFactory(allegation=allegation, officer=officer_2)

        expected_airtable_data = {
            'Explanation':
            'Officers: John Henry(ID 2), Marry Jane(ID 1)',
            'Project': ['CPDP'],
            'Agency': ['COPA_AGENCY_ID'],
            'Requested For':
            'CR 123456',
            'Requestor': [{
                'id': 'usrGiZFcyZ6wHTYWd',
                'email': '*****@*****.**',
                'name': 'Rajiv Sinclair'
            }],
            'Date requested by user':
            attachment_request.created_at.strftime('%Y-%m-%d'),
            'Requester Email':
            '*****@*****.**'
        }

        expect(attachment_request.airtable_id).to.be.eq('')

        CRRequestAirTableUploader.upload()
        attachment_request.refresh_from_db()

        airtable_mock.insert.assert_called_with(expected_airtable_data)
        expect(
            attachment_request.airtable_id).to.be.eq('some_airtable_record_id')
    def test_Airtable_insert_raise_HTTPError(self, airtable_mock):
        AirTableUploader._get_foia_airtable().insert = Mock(
            side_effect=[{
                'id': 'some_airtable_record_id'
            }, HTTPError])

        allegation123 = AllegationFactory(crid='123',
                                          incident_date=datetime(
                                              2005, 1, 1, tzinfo=pytz.utc))
        officer_1 = OfficerFactory(id=1, first_name='Marry', last_name='Jane')
        officer_2 = OfficerFactory(id=2, first_name='John', last_name='Henry')
        OfficerAllegationFactory(allegation=allegation123, officer=officer_1)
        OfficerAllegationFactory(allegation=allegation123, officer=officer_2)
        investigator = InvestigatorFactory(officer=officer_1)
        InvestigatorAllegationFactory(allegation=allegation123,
                                      investigator=investigator)
        attachment_request_1 = AttachmentRequestFactory(
            allegation=allegation123, email='*****@*****.**')

        allegation456 = AllegationFactory(crid='456',
                                          incident_date=datetime(
                                              2011, 1, 1, tzinfo=pytz.utc))
        officer_3 = OfficerFactory(id=3, first_name='Marry', last_name='Jane')
        officer_4 = OfficerFactory(id=4, first_name='John', last_name='Henry')
        OfficerAllegationFactory(allegation=allegation456, officer=officer_3)
        OfficerAllegationFactory(allegation=allegation456, officer=officer_4)
        attachment_request_2 = AttachmentRequestFactory(
            allegation=allegation456, email='*****@*****.**')

        expect(attachment_request_1.airtable_id).to.eq('')
        expect(attachment_request_2.airtable_id).to.eq('')

        CRRequestAirTableUploader.upload()
        attachment_request_1.refresh_from_db()
        attachment_request_2.refresh_from_db()

        expected_calls = [
            call({
                'Explanation':
                'Officers: John Henry(ID 2), Marry Jane(ID 1)',
                'Project': ['CPDP'],
                'Agency': ['CPD_AGENCY_ID'],
                'Requested For':
                'CR 123',
                'Requestor': [{
                    'id': 'usrGiZFcyZ6wHTYWd',
                    'email': '*****@*****.**',
                    'name': 'Rajiv Sinclair'
                }],
                'Date requested by user':
                attachment_request_1.created_at.strftime('%Y-%m-%d'),
                'Requester Email':
                '*****@*****.**'
            }),
            call({
                'Explanation':
                'Officers: John Henry(ID 4), Marry Jane(ID 3)',
                'Project': ['CPDP'],
                'Agency': ['COPA_AGENCY_ID'],
                'Requested For':
                'CR 456',
                'Requestor': [{
                    'id': 'usrGiZFcyZ6wHTYWd',
                    'email': '*****@*****.**',
                    'name': 'Rajiv Sinclair'
                }],
                'Date requested by user':
                attachment_request_2.created_at.strftime('%Y-%m-%d'),
                'Requester Email':
                '*****@*****.**'
            })
        ]
        airtable_mock.insert.assert_has_calls(expected_calls, any_order=True)

        expect(
            attachment_request_1.airtable_id).to.eq('some_airtable_record_id')
        expect(attachment_request_2.airtable_id).to.eq('')