def test_can_create_an_adviser_by_email_user_id(self, mock_get_user_by_email_user_id):
        """Test that an adviser can be created using its SSO email user ID."""
        mock_get_user_by_email_user_id.return_value = FAKE_SSO_USER_DATA

        data = {'search_email': '*****@*****.**'}
        form = AddAdviserFromSSOForm(data=data)

        assert not form.errors

        adviser = form.save()

        assert adviser.email == FAKE_SSO_USER_DATA['email']
        assert adviser.sso_email_user_id == FAKE_SSO_USER_DATA['email_user_id']
        assert adviser.contact_email == FAKE_SSO_USER_DATA['contact_email']
        assert adviser.first_name == FAKE_SSO_USER_DATA['first_name']
        assert adviser.last_name == FAKE_SSO_USER_DATA['last_name']
    def test_validation_fails_when_no_search_email_entered(self):
        """Test that validation fails if no search email is entered."""
        data = {'search_email': ''}
        form = AddAdviserFromSSOForm(data=data)

        assert form.errors == {
            'search_email': ['This field is required.'],
        }
    def test_validation_fails_when_there_is_a_request_error(self, mock_get_user_by_email_user_id):
        """
        Test that validation fails if there's an error communicating with Staff SSO.
        """
        mock_get_user_by_email_user_id.side_effect = SSORequestError('Test error')

        data = {'search_email': '*****@*****.**'}
        form = AddAdviserFromSSOForm(data=data)

        assert form.errors == {
            NON_FIELD_ERRORS: [
                'There was an error communicating with Staff SSO: Test error. Please try again.',
            ],
        }
    def test_can_create_an_adviser_by_email(
        self,
        mock_get_user_by_email_user_id,
        mock_get_user_by_email,
    ):
        """
        Test that an adviser can be created using its SSO email (when there is no match on
        email user ID).
        """
        mock_get_user_by_email_user_id.side_effect = SSOUserDoesNotExistError()
        mock_get_user_by_email.return_value = FAKE_SSO_USER_DATA

        data = {'search_email': '*****@*****.**'}
        form = AddAdviserFromSSOForm(data=data)

        assert not form.errors

        adviser = form.save()

        assert adviser.email == FAKE_SSO_USER_DATA['email']
        assert adviser.sso_email_user_id == FAKE_SSO_USER_DATA['email_user_id']
        assert adviser.contact_email == FAKE_SSO_USER_DATA['contact_email']
        assert adviser.first_name == FAKE_SSO_USER_DATA['first_name']
        assert adviser.last_name == FAKE_SSO_USER_DATA['last_name']
    def test_validation_fails_when_adviser_not_in_sso(
        self,
        mock_get_user_by_email,
        mock_get_user_by_email_user_id,
    ):
        """
        Test that validation fails if there's no matching adviser in Staff SSO.
        """
        mock_get_user_by_email.side_effect = SSOUserDoesNotExistError()
        mock_get_user_by_email_user_id.side_effect = SSOUserDoesNotExistError()

        data = {'search_email': '*****@*****.**'}
        form = AddAdviserFromSSOForm(data=data)

        assert form.errors == {
            NON_FIELD_ERRORS: [NO_MATCHING_USER_MESSAGE],
        }
    def test_validation_fails_when_adviser_already_exists(
        self,
        factory_kwargs,
        mock_get_user_by_email_user_id,
    ):
        """
        Test that validation fails if there's an existing adviser with the same SSO email user
        ID or email (username).
        """
        mock_get_user_by_email_user_id.return_value = FAKE_SSO_USER_DATA
        AdviserFactory(**factory_kwargs)

        data = {'search_email': '*****@*****.**'}
        form = AddAdviserFromSSOForm(data=data)

        assert form.errors == {
            NON_FIELD_ERRORS: [DUPLICATE_USER_MESSAGE],
        }