def test_falls_back_to_email_field(self, api_request_factory,
                                       requests_mock):
        """
        Test that advisers are looked up using the email field when a match using
        sso_email_user_id is not found, and the adviser's sso_email_user_id is updated.
        """
        adviser = AdviserFactory(email='*****@*****.**',
                                 sso_email_user_id=None)

        requests_mock.post(
            STAFF_SSO_INTROSPECT_URL,
            json=_make_introspection_data(username='******'),
        )

        request = api_request_factory.get('/test-path',
                                          HTTP_AUTHORIZATION='Bearer token')
        response = view(request)

        assert request.user == adviser
        assert response.status_code == status.HTTP_200_OK
        assert response.data == {'content': 'introspection-test-view'}

        # Check that the sso_email_user_id was set on the user
        adviser.refresh_from_db()
        assert adviser.sso_email_user_id == '*****@*****.**'
def test_audit_log(s3_stubber):
    """Test that the audit log is being created."""
    adviser = AdviserFactory()

    bucket = 'test_bucket'
    object_key = 'test_key'
    csv_content = f"""id,telephone_number
{adviser.id},111222333
"""
    s3_stubber.add_response(
        'get_object',
        {
            'Body': BytesIO(bytes(csv_content, encoding='utf-8')),
        },
        expected_params={
            'Bucket': bucket,
            'Key': object_key,
        },
    )

    call_command('update_adviser_telephone_number', bucket, object_key)

    adviser.refresh_from_db()

    assert adviser.telephone_number == '111222333'

    versions = Version.objects.get_for_object(adviser)
    assert len(versions) == 1
    assert versions[0].revision.get_comment() == 'Telephone number migration.'
    def test_400_doesnt_commit_changes(self):
        """
        Test that in case of errors, changes are not saved.
        Given an order with the following assignees:
            [
                {
                    "adviser": {
                        "id": 1,
                        "first_name": "Joe",
                        "last_name": "Doe"
                    },
                    "estimated_time": 100,
                    "is_lead": true
                },
                {
                    "adviser": {
                        "id": 2,
                        "first_name": "Rebecca",
                        "last_name": "Bah"
                    },
                    "estimated_time": 250,
                    "is_lead": false
                },
            ]

        if I pass the following data:
            [
                {
                    "adviser": {"id": 1},
                    "estimated_time": 200
                },
                {
                    "adviser": {"id": 3},
                    "estimated_time": 250
                },
                {
                    "adviser": {"id": non-existent},
                    "estimated_time": 250
                },
            ]

        then:
            1. the response returns a validation error as the new adviser doesn't exist
            2. adviser 1 doesn't get updated
            3. adviser 3 doesn't get added
        """
        order = OrderFactory(assignees=[])
        adviser1 = AdviserFactory()
        adviser2 = AdviserFactory()
        adviser3 = AdviserFactory()

        OrderAssigneeFactory(order=order,
                             adviser=adviser1,
                             estimated_time=100,
                             is_lead=True)
        OrderAssigneeFactory(order=order,
                             adviser=adviser2,
                             estimated_time=250,
                             is_lead=False)

        url = reverse(
            'api-v3:omis:order:assignee',
            kwargs={'order_pk': order.id},
        )
        response = self.api_client.patch(
            url,
            [
                {
                    'adviser': {
                        'id': adviser1.id
                    },
                    'estimated_time': 200,
                    'is_lead': False,
                },
                {
                    'adviser': {
                        'id': adviser3.id
                    },
                    'estimated_time': 250,
                    'is_lead': True,
                },
                {
                    'adviser': {
                        'id': '00000000-0000-0000-0000-000000000000'
                    },
                    'estimated_time': 300,
                },
            ],
        )

        assert response.status_code == status.HTTP_400_BAD_REQUEST
        assert response.json() == [
            {},
            {},
            {
                'adviser': [
                    'Invalid pk "00000000-0000-0000-0000-000000000000" - object does not exist.',
                ],
            },
        ]

        # check db consistency
        adviser1.refresh_from_db()
        adviser2.refresh_from_db()

        qs = order.assignees
        ad_ids = set(qs.values_list('adviser_id', flat=True))
        assert ad_ids == {adviser1.id, adviser2.id}

        assignee1 = qs.get(adviser_id=adviser1.id)
        assert assignee1.estimated_time == 100
        assert assignee1.is_lead