def test_post_remove_button_removes(self): """POST to remove_member view removes member""" # Make user 1 the group curator so they can remove users self.group.curators.add(self.user_1.userprofile) self.group.accepting_new_members = Group.REVIEWED self.group.save() with override_script_prefix('/en-US/'): group_url = reverse('groups:show_group', args=[self.group.url]) next_url = "%s?filtr=members" % group_url # We must request the full path, with language, or the # LanguageMiddleware will convert the request to GET. with override_script_prefix('/en-US/'): url = reverse('groups:remove_member', kwargs=dict(url=self.group.url, user_pk=self.user_2.userprofile.pk, status=GroupMembership.PENDING)) with self.login(self.user_1) as client: response = client.post(url, data={'next_url': next_url}, follow=True) self.assertTemplateNotUsed(response, 'groups/confirm_remove_member.html') # make sure filter members is active membership_filter_form = response.context['membership_filter_form'] eq_(membership_filter_form.cleaned_data['filtr'], 'members') # Status PENDING ok_(GroupMembership.objects.filter(group=self.group, userprofile=self.user_2.userprofile, status=GroupMembership.PENDING))
def test_confirm_user(self): """POST to confirm user view changes member from pending to member""" # Make user 1 the group curator so they can remove users self.group.curators.add(self.user_1.userprofile) self.group.accepting_new_members = 'by_request' self.group.save() with override_script_prefix('/en-US/'): group_url = reverse('groups:show_group', args=[self.group.url]) next_url = "%s?filtr=pending_members" % group_url # Make user 2 pending GroupMembership.objects.filter( userprofile=self.user_2.userprofile, group=self.group).update(status=GroupMembership.PENDING) ok_(self.group.has_pending_member(self.user_2.userprofile)) # We must request the full path, with language, or the # LanguageMiddleware will convert the request to GET. with override_script_prefix('/en-US/'): url = reverse('groups:confirm_member', kwargs=dict(url=self.group.url, user_pk=self.user_2.userprofile.pk)) with self.login(self.user_1) as client: response = client.post(url, data={'next_url': next_url}, follow=True) self.assertTemplateNotUsed(response, 'groups/confirm_remove_member.html') # make sure filter pending_members is active membership_filter_form = response.context['membership_filter_form'] eq_(membership_filter_form.cleaned_data['filtr'], 'pending_members') # Now a member ok_(self.group.has_member(self.user_2.userprofile)) eq_(Invite.objects.all().count(), 0)
def test_post_remove_button_removes(self): """POST to remove_member view removes member""" # Make user 1 the group curator so they can remove users self.group.curators.add(self.user_1.userprofile) self.group.accepting_new_members = Group.REVIEWED self.group.save() with override_script_prefix('/en-US/'): group_url = reverse('groups:show_group', args=[self.group.url]) next_url = "%s?filtr=members" % group_url # We must request the full path, with language, or the # LanguageMiddleware will convert the request to GET. with override_script_prefix('/en-US/'): url = reverse('groups:remove_member', kwargs=dict(url=self.group.url, user_pk=self.user_2.userprofile.pk, status=GroupMembership.PENDING)) with self.login(self.user_1) as client: response = client.post(url, data={'next_url': next_url}, follow=True) self.assertTemplateNotUsed(response, 'groups/confirm_remove_member.html') # make sure filter members is active membership_filter_form = response.context['membership_filter_form'] eq_(membership_filter_form.cleaned_data['filtr'], 'members') # Status PENDING ok_( GroupMembership.objects.filter(group=self.group, userprofile=self.user_2.userprofile, status=GroupMembership.PENDING))
def test_confirm_user_update_invite(self): """POST to confirm user view changes member from pending to member""" # Make user 1 the group curator so they can remove users old_inviter = UserFactory.create() invite = Invite.objects.create(inviter=old_inviter.userprofile, redeemer=self.user_2.userprofile, group=self.group) self.group.curators.add(self.user_1.userprofile) self.group.accepting_new_members = 'by_request' self.group.save() with override_script_prefix('/en-US/'): group_url = reverse('groups:show_group', args=[self.group.url]) next_url = "%s?filtr=pending_members" % group_url # Make user 2 pending GroupMembership.objects.filter(userprofile=self.user_2.userprofile, group=self.group).update(status=GroupMembership.PENDING) ok_(self.group.has_pending_member(self.user_2.userprofile)) # We must request the full path, with language, or the # LanguageMiddleware will convert the request to GET. with override_script_prefix('/en-US/'): url = reverse('groups:confirm_member', kwargs=dict(url=self.group.url, user_pk=self.user_2.userprofile.pk)) with self.login(self.user_1) as client: response = client.post(url, data={'next_url': next_url}, follow=True) self.assertTemplateNotUsed(response, 'groups/confirm_remove_member.html') # make sure filter pending_members is active membership_filter_form = response.context['membership_filter_form'] eq_(membership_filter_form.cleaned_data['filtr'], 'pending_members') # Now a member ok_(self.group.has_member(self.user_2.userprofile)) updated_invite = Invite.objects.get(id=invite.pk) eq_(updated_invite.inviter, self.user_1.userprofile)
def test_prefix_parenthesis(self): # Parentheses are allowed and should not cause errors or be escaped with override_script_prefix('/bogus)/'): self.assertEqual('/bogus)/includes/non_path_include/', reverse('non_path_include')) with override_script_prefix('/(bogus)/'): self.assertEqual('/(bogus)/includes/non_path_include/', reverse('non_path_include'))
def test_profile_edit_unvouched_doesnt_link_to_groups_page(self): """An unvouched user editing their profile is not shown a link to the groups page.""" user = UserFactory.create(vouched=False) with override_script_prefix("/en-US/"): url = reverse("phonebook:profile_edit") with self.login(user) as client: response = client.get(url, follow=True) eq_(response.status_code, 200) with override_script_prefix("/en-US/"): groups_url = reverse("groups:index_groups") ok_(groups_url not in str(response.content, "utf-8"))
def test_profile_edit_unvouched_doesnt_link_to_groups_page(self): """An unvouched user editing their profile is not shown a link to the groups page. """ user = UserFactory.create(vouched=False) with override_script_prefix('/en-US/'): url = reverse('phonebook:profile_edit') with self.login(user) as client: response = client.get(url, follow=True) eq_(response.status_code, 200) with override_script_prefix('/en-US/'): groups_url = reverse('groups:index_groups') ok_(groups_url not in unicode(response.content, 'utf-8'))
def test_profile_edit_vouched_links_to_groups_page(self): """A vouched user editing their profile is shown a link to the groups page. """ user = UserFactory.create() with override_script_prefix('/en-US/'): url = reverse('phonebook:profile_edit') with self.login(user) as client: response = client.get(url, follow=True) eq_(response.status_code, 200) with override_script_prefix('/en-US/'): groups_url = reverse('groups:index_groups') ok_(groups_url in unicode(response.content, 'utf-8'))
def test_prefix_parenthesis(self): # Parentheses are allowed and should not cause errors or be escaped with override_script_prefix('/bogus)/'): self.assertEqual( '/bogus)/includes/non_path_include/', reverse('non_path_include') ) with override_script_prefix('/(bogus)/'): self.assertEqual( '/(bogus)/includes/non_path_include/', reverse('non_path_include') )
def test_unvouched(self): user = UserFactory.create(vouched=False) with override_script_prefix('/en-US/'): join_url = reverse('groups:join_group', kwargs={'url': self.group.url}) with self.login(user) as client: client.post(join_url, follow=True)
def test_email_in_identity_belongs_to_other_user(self, jws_mock, request_post_mock, msg_mock): """Test adding a stronger identity and changing the primary email.""" UserFactory.create(email='*****@*****.**') user1 = UserFactory.create(email='*****@*****.**') (jws_mock.from_compact.return_value).payload = json.dumps({ 'email': '*****@*****.**', 'email_verified': True, 'https://sso.mozilla.com/claim/original_connection_user_id': 'ad|ldap' }) post_json_mock = Mock() post_json_mock.json.return_value = { 'id_token': 'id_token' } with self.login(user1) as client: session = client.session session['oidc_verify_nonce'] = 'nonce' session['oidc_verify_state'] = 'state' session.save() response = client.get(self.url, self.get_data, follow=True) msg = 'The email in this identity is used by another user.' msg_mock.error.assert_called_once_with(ANY, msg) with override_script_prefix('/en-US/'): url = reverse('phonebook:profile_edit') self.assertRedirects(response, url)
def test_identity_exists(self, jws_mock, request_post_mock, msg_mock): user = UserFactory.create(email='*****@*****.**') IdpProfile.objects.create( profile=user.userprofile, auth0_user_id='email|', email=user.email, primary=True ) (jws_mock.from_compact.return_value).payload = json.dumps({ 'email': '*****@*****.**', 'email_verified': True, 'https://sso.mozilla.com/claim/original_connection_user_id': 'email|' }) post_json_mock = Mock() post_json_mock.json.return_value = { 'id_token': 'id_token' } with self.login(user) as client: session = client.session session['oidc_verify_nonce'] = 'nonce' session['oidc_verify_state'] = 'state' session.save() response = client.get(self.url, self.get_data, follow=True) msg = 'Account verification failed: Identity already exists.' msg_mock.error.assert_called_once_with(ANY, msg) with override_script_prefix('/en-US/'): url = reverse('phonebook:profile_edit') self.assertRedirects(response, url)
def test_nonexistant_skill(self): with override_script_prefix('/en-US/'): url = reverse('groups:toggle_skill_subscription', kwargs={'url': 'invalid'}) with self.login(self.user) as client: response = client.post(url, follow=True) eq_(response.status_code, 404)
def test_wrong_section(self): """When a wrong section is given in request.POST, 404 is raised.""" user = UserFactory.create(vouched=False) with override_script_prefix("/en-US/"): url = reverse("phonebook:profile_edit") data = { "full_name": user.userprofile.full_name, "email": user.email, "username": user.username, "lat": 40.005814, "lng": -3.42071, "externalaccount_set-MAX_NUM_FORMS": "1000", "externalaccount_set-INITIAL_FORMS": "0", "externalaccount_set-TOTAL_FORMS": "0", "language_set-0-id": "", "language_set-0-userprofile": "", "language_set-0-code": "en", "language_set-1-id": "", "language_set-1-userprofile": "", "language_set-1-code": "fr", "language_set-MAX_NUM_FORMS": "1000", "language_set-INITIAL_FORMS": "0", "language_set-TOTAL_FORMS": "2", "foo_section": "", } data.update(_get_privacy_fields(MOZILLIANS)) with self.login(user) as client: response = client.post(url, data=data, follow=True) eq_(response.status_code, 404)
def test_add_new_identity_mfa(self, jws_mock, request_post_mock, msg_mock): """Test adding a new identity in a profile.""" user = UserFactory.create(email='*****@*****.**') (jws_mock.from_compact.return_value).payload = json.dumps({ 'email': '*****@*****.**', 'email_verified': True, 'https://sso.mozilla.com/claim/original_connection_user_id': 'ad|' }) post_json_mock = Mock() post_json_mock.json.return_value = { 'id_token': 'id_token' } with self.login(user) as client: session = client.session session['oidc_verify_nonce'] = 'nonce' session['oidc_verify_state'] = 'state' session.save() response = client.get(self.url, self.get_data, follow=True) new_idp_profile = IdpProfile.objects.get(email='*****@*****.**') eq_(new_idp_profile.primary, True) msg = ('Account successfully verified. You need to use this identity ' 'the next time you will login.') msg_mock.success.assert_called_once_with(ANY, msg) with override_script_prefix('/en-US/'): url = reverse('phonebook:profile_edit') self.assertRedirects(response, url)
def test_succesful_registration(self, info_mock): user = UserFactory.create(first_name="", last_name="") ok_(not UserProfile.objects.filter(full_name="foo bar").exists()) country = Country.objects.get(name="Greece") with override_script_prefix("/en-US/"): url = reverse("phonebook:profile_edit") data = { "full_name": "foo bar", "email": "*****@*****.**", "username": "******", "country": country.id, "optin": True, "registration_section": "", "g-recaptcha-response": "PASSED", } data.update(_get_privacy_fields(MOZILLIANS)) with self.login(user) as client: response = client.post(url, data, follow=True) eq_(response.status_code, 200) ok_(info_mock.called) ok_(UserProfile.objects.get(full_name="foo bar")) def tearDown(self): del os.environ["NORECAPTCHA_TESTING"]
def test_languages_get_saved(self): user = UserFactory.create(email="*****@*****.**") data = { "full_name": user.userprofile.full_name, "email": user.email, "username": user.username, "lat": 40.005814, "lng": -3.42071, "externalaccount_set-MAX_NUM_FORMS": "1000", "externalaccount_set-INITIAL_FORMS": "0", "externalaccount_set-TOTAL_FORMS": "0", "language_set-0-id": "", "language_set-0-userprofile": "", "language_set-0-code": "en", "language_set-1-id": "", "language_set-1-userprofile": "", "language_set-1-code": "fr", "language_set-MAX_NUM_FORMS": "1000", "language_set-INITIAL_FORMS": "0", "language_set-TOTAL_FORMS": "2", "languages_section": "", } data.update(_get_privacy_fields(MOZILLIANS)) with override_script_prefix("/en-US/"): url = reverse("phonebook:profile_edit") with self.login(user) as client: response = client.post(url, data=data, follow=True) eq_(response.status_code, 200) profile = UserProfile.objects.get(pk=user.userprofile.pk) eq_(set(profile.language_set.values_list("code", flat=True)), set(["en", "fr"]))
def test_delete_valid_identity(self, mocked_message): user = UserFactory.create() idp_primary = IdpProfile.objects.create( profile=user.userprofile, auth0_user_id='github|1', email=user.email, primary=True ) idp = IdpProfile.objects.create( profile=user.userprofile, auth0_user_id='email|2', email=user.email, primary=False ) with self.login(user) as client: url = reverse('phonebook:delete_identity', kwargs={'identity_pk': idp.pk}) response = client.get(url, follow=True) ok_(not IdpProfile.objects.filter(pk=idp.pk).exists()) ok_(IdpProfile.objects.filter(pk=idp_primary.pk).exists()) with override_script_prefix('/en-US/'): url = reverse('phonebook:profile_edit') self.assertRedirects(response, url, status_code=301) msg = 'Identity {0} successfully deleted.'.format(idp.get_type_display()) mocked_message.success.assert_called_once_with(ANY, msg)
def test_save_profile_with_existing_photo(self): """Test profiles saves when keep the existing photo. Related bug 925256. """ # Set a user with a photo user = UserFactory.create() file_path = os.path.join(os.path.dirname(__file__), 'normal_photo.jpg') self._upload_photo(user, file_path) # Re-save profile without uploading a new photo. data = { 'full_name': user.userprofile.full_name, 'email': user.email, 'username': user.username, 'lat': 40.005814, 'lng': -3.42071, 'externalaccount_set-MAX_NUM_FORMS': '1000', 'externalaccount_set-INITIAL_FORMS': '0', 'externalaccount_set-TOTAL_FORMS': '0', 'language_set-MAX_NUM_FORMS': '1000', 'language_set-INITIAL_FORMS': '0', 'language_set-TOTAL_FORMS': '0', 'basic_section': '' } for field in UserProfilePrivacyModel._meta.fields: data[field.name] = MOZILLIANS data['privacy_tshirt'] = PRIVATE with override_script_prefix('/en-US/'): url = reverse('phonebook:profile_edit') with self.login(user) as client: response = client.post(url, data=data, follow=True) eq_(response.status_code, 200)
def test_save_profile_with_existing_photo(self): """Test profiles saves when keep the existing photo. Related bug 925256. """ # Set a user with a photo user = UserFactory.create() file_path = os.path.join(os.path.dirname(__file__), "normal_photo.jpg") self._upload_photo(user, file_path) # Re-save profile without uploading a new photo. data = { "full_name": user.userprofile.full_name, "email": user.email, "username": user.username, "lat": 40.005814, "lng": -3.42071, "externalaccount_set-MAX_NUM_FORMS": "1000", "externalaccount_set-INITIAL_FORMS": "0", "externalaccount_set-TOTAL_FORMS": "0", "language_set-MAX_NUM_FORMS": "1000", "language_set-INITIAL_FORMS": "0", "language_set-TOTAL_FORMS": "0", "basic_section": "", } for field in UserProfilePrivacyModel._meta.fields: data[field.name] = MOZILLIANS data["privacy_tshirt"] = PRIVATE with override_script_prefix("/en-US/"): url = reverse("phonebook:profile_edit") with self.login(user) as client: response = client.post(url, data=data, follow=True) eq_(response.status_code, 200)
def test_date_mozillian_validates_in_different_locales(self): """Tests if date_mozillian validates when profile language is e.g. 'es'. Related bug 914448. """ user = UserFactory.create(email="*****@*****.**") data = { "full_name": user.userprofile.full_name, "email": user.email, "username": user.username, "lat": 40.005814, "lng": -3.42071, "date_mozillian_year": "2013", "date_mozillian_month": "1", "externalaccount_set-MAX_NUM_FORMS": "1000", "externalaccount_set-INITIAL_FORMS": "0", "externalaccount_set-TOTAL_FORMS": "0", "language_set-MAX_NUM_FORMS": "1000", "language_set-INITIAL_FORMS": "0", "language_set-TOTAL_FORMS": "0", "contribution_section": "", } data.update(_get_privacy_fields(MOZILLIANS)) with override_script_prefix("/es/"): url = reverse("phonebook:profile_edit") with self.login(user) as client: response = client.post(url, data=data, follow=True) eq_(response.status_code, 200)
def test_wrong_section(self): """When a wrong section is given in request.POST, 404 is raised.""" user = UserFactory.create(vouched=False) with override_script_prefix('/en-US/'): url = reverse('phonebook:profile_edit') data = { 'full_name': user.userprofile.full_name, 'email': user.email, 'username': user.username, 'lat': 40.005814, 'lng': -3.42071, 'externalaccount_set-MAX_NUM_FORMS': '1000', 'externalaccount_set-INITIAL_FORMS': '0', 'externalaccount_set-TOTAL_FORMS': '0', 'language_set-0-id': '', 'language_set-0-userprofile': '', 'language_set-0-code': 'en', 'language_set-1-id': '', 'language_set-1-userprofile': '', 'language_set-1-code': 'fr', 'language_set-MAX_NUM_FORMS': '1000', 'language_set-INITIAL_FORMS': '0', 'language_set-TOTAL_FORMS': '2', 'foo_section': '', } data.update(_get_privacy_fields(MOZILLIANS)) with self.login(user) as client: response = client.post(url, data=data, follow=True) eq_(response.status_code, 404)
def test_succesful_registration(self, info_mock): user = UserFactory.create(first_name='', last_name='') ok_(not UserProfile.objects.filter(full_name='foo bar').exists()) country = Country.objects.get(name='Greece') with override_script_prefix('/en-US/'): url = reverse('phonebook:profile_edit') data = { 'full_name': 'foo bar', 'email': '*****@*****.**', 'username': '******', 'country': country.id, 'optin': True, 'registration_section': '', 'g-recaptcha-response': 'PASSED' } data.update(_get_privacy_fields(MOZILLIANS)) with self.login(user) as client: response = client.post(url, data, follow=True) eq_(response.status_code, 200) ok_(info_mock.called) ok_(UserProfile.objects.get(full_name='foo bar')) def tearDown(self): del os.environ['NORECAPTCHA_TESTING']
def test_date_mozillian_validates_in_different_locales(self): """Tests if date_mozillian validates when profile language is e.g. 'es'. Related bug 914448. """ user = UserFactory.create(email='*****@*****.**') data = { 'full_name': user.userprofile.full_name, 'email': user.email, 'username': user.username, 'lat': 40.005814, 'lng': -3.42071, 'date_mozillian_year': '2013', 'date_mozillian_month': '1', 'externalaccount_set-MAX_NUM_FORMS': '1000', 'externalaccount_set-INITIAL_FORMS': '0', 'externalaccount_set-TOTAL_FORMS': '0', 'language_set-MAX_NUM_FORMS': '1000', 'language_set-INITIAL_FORMS': '0', 'language_set-TOTAL_FORMS': '0', 'contribution_section': '' } data.update(_get_privacy_fields(MOZILLIANS)) with override_script_prefix('/es/'): url = reverse('phonebook:profile_edit') with self.login(user) as client: response = client.post(url, data=data, follow=True) eq_(response.status_code, 200)
def test_remove_from_nda_group(self, unsubscribe_mock): """Test to remove a member from a closed group.""" self.group.accepting_new_members = Group.CLOSED self.group.url = 'nda' self.group.name = 'nda' self.group.save() curator = UserFactory() user = UserFactory() self.group.add_member(user.userprofile) self.group.curators.add(curator.userprofile) with override_script_prefix('/fr/'): url = reverse('groups:remove_member', args=[ self.group.url, user.userprofile.pk, GroupMembership.PENDING ]) with patch('mozillians.groups.models.email_membership_change', autospec=True) as mock_email: with self.login(curator) as client: response = client.post(url, follow=False) eq_(302, response.status_code) membership = GroupMembership.objects.get(group=self.group, userprofile=user.userprofile) group_pk, user_pk, old_status, new_status = mock_email.delay.call_args[ 0] ok_(mock_email.delay.called) eq_(membership.status, GroupMembership.PENDING) eq_(self.group.pk, group_pk) eq_(user.pk, user_pk) eq_(old_status, GroupMembership.MEMBER) eq_(new_status, GroupMembership.PENDING) ok_(unsubscribe_mock.delay.called)
def test_identity_exists(self, jws_mock, request_post_mock, msg_mock): user = UserFactory.create(email="*****@*****.**") IdpProfile.objects.create( profile=user.userprofile, auth0_user_id="email|", email=user.email, primary=True, ) (jws_mock.from_compact.return_value).payload = json.dumps({ "email": "*****@*****.**", "email_verified": True, "https://sso.mozilla.com/claim/original_connection_user_id": "email|", }) post_json_mock = Mock() post_json_mock.json.return_value = {"id_token": "id_token"} with self.login(user) as client: session = client.session session["oidc_verify_nonce"] = "nonce" session["oidc_verify_state"] = "state" session.save() response = client.get(self.url, self.get_data, follow=True) msg = "Account verification failed: Identity already exists." msg_mock.error.assert_called_once_with(ANY, msg) with override_script_prefix("/en-US/"): url = reverse("phonebook:profile_edit") self.assertRedirects(response, url)
def test_email_in_identity_belongs_to_other_user(self, jws_mock, request_post_mock, msg_mock): """Test adding a stronger identity and changing the primary email.""" UserFactory.create(email="*****@*****.**") user1 = UserFactory.create(email="*****@*****.**") (jws_mock.from_compact.return_value).payload = json.dumps({ "email": "*****@*****.**", "email_verified": True, "https://sso.mozilla.com/claim/original_connection_user_id": "ad|ldap", }) post_json_mock = Mock() post_json_mock.json.return_value = {"id_token": "id_token"} with self.login(user1) as client: session = client.session session["oidc_verify_nonce"] = "nonce" session["oidc_verify_state"] = "state" session.save() response = client.get(self.url, self.get_data, follow=True) msg = "The email in this identity is used by another user." msg_mock.error.assert_called_once_with(ANY, msg) with override_script_prefix("/en-US/"): url = reverse("phonebook:profile_edit") self.assertRedirects(response, url)
def test_rejecting_sends_email(self): # when curator rejects someone, they are sent an email curator = UserFactory() self.group.curators.add(curator.userprofile) user = UserFactory() self.group.add_member(user.userprofile, GroupMembership.PENDING) # no email when someone makes request eq_(0, len(mail.outbox)) # Using French for curator page to make sure that doesn't affect the language # that is used to email the member. with override_script_prefix('/fr/'): url = reverse('groups:remove_member', args=[self.group.url, user.userprofile.pk]) with patch('mozillians.groups.models.email_membership_change', autospec=True) as mock_email: with self.login(curator) as client: response = client.post(url, follow=False) eq_(302, response.status_code) # email sent for curated group ok_(mock_email.delay.called) group_pk, user_pk, old_status, new_status = mock_email.delay.call_args[ 0] eq_(self.group.pk, group_pk) eq_(user.pk, user_pk) eq_(GroupMembership.PENDING, old_status) ok_(new_status is None)
def test_delete_valid_identity(self, mocked_message): user = UserFactory.create() idp_primary = IdpProfile.objects.create( profile=user.userprofile, auth0_user_id="github|1", email=user.email, primary=True, ) idp = IdpProfile.objects.create( profile=user.userprofile, auth0_user_id="email|2", email=user.email, primary=False, ) with self.login(user) as client: url = reverse("phonebook:delete_identity", kwargs={"identity_pk": idp.pk}) response = client.get(url, follow=True) ok_(not IdpProfile.objects.filter(pk=idp.pk).exists()) ok_(IdpProfile.objects.filter(pk=idp_primary.pk).exists()) with override_script_prefix("/en-US/"): url = reverse("phonebook:profile_edit") self.assertRedirects(response, url, status_code=301) msg = "Identity {0} successfully deleted.".format( idp.get_type_display()) mocked_message.success.assert_called_once_with(ANY, msg)
def test_anonymous_user_excepted_view(self): with override_script_prefix("/en-US/"): url = reverse("excepted") client = Client() response = client.get(url, follow=True) eq_(response.status_code, 200) eq_(response.content, "Hi!")
def test_change_valid_identity(self, mocked_message): user = UserFactory.create() idp_primary = IdpProfile.objects.create( profile=user.userprofile, auth0_user_id='github|1', email=user.email, primary=True ) idp = IdpProfile.objects.create( profile=user.userprofile, auth0_user_id='email|2', email=user.email, primary=False ) ok_(IdpProfile.objects.filter(pk=idp_primary.pk, primary_contact_identity=True).exists()) with self.login(user) as client: url = reverse('phonebook:change_primary_contact_identity', kwargs={'identity_pk': idp.pk}) response = client.get(url, follow=True) with override_script_prefix('/en-US/'): url = reverse('phonebook:profile_edit') self.assertRedirects(response, url, status_code=301) ok_(IdpProfile.objects.filter(pk=idp_primary.pk, primary_contact_identity=False).exists()) ok_(IdpProfile.objects.filter(pk=idp.pk, primary_contact_identity=True).exists()) msg = 'Primary Contact Identity successfully updated.' mocked_message.success.assert_called_once_with(ANY, msg)
def test_add_new_identity_mfa(self, jws_mock, request_post_mock, msg_mock): """Test adding a new identity in a profile.""" user = UserFactory.create(email="*****@*****.**") (jws_mock.from_compact.return_value).payload = json.dumps({ "email": "*****@*****.**", "email_verified": True, "https://sso.mozilla.com/claim/original_connection_user_id": "ad|", }) post_json_mock = Mock() post_json_mock.json.return_value = {"id_token": "id_token"} with self.login(user) as client: session = client.session session["oidc_verify_nonce"] = "nonce" session["oidc_verify_state"] = "state" session.save() response = client.get(self.url, self.get_data, follow=True) new_idp_profile = IdpProfile.objects.get(email="*****@*****.**") eq_(new_idp_profile.primary, True) msg = ( "Account successfully verified. You need to use this identity " "the next time you will login.") msg_mock.success.assert_called_once_with(ANY, msg) with override_script_prefix("/en-US/"): url = reverse("phonebook:profile_edit") self.assertRedirects(response, url)
def test_email_in_identity_belongs_to_other_user(self, jws_mock, request_post_mock, msg_mock): """Test adding a stronger identity and changing the primary email.""" UserFactory.create(email='*****@*****.**') user1 = UserFactory.create(email='*****@*****.**') (jws_mock.from_compact.return_value).payload = json.dumps({ 'email': '*****@*****.**', 'email_verified': True, 'sub': 'ad|ldap' }) post_json_mock = Mock() post_json_mock.json.return_value = { 'id_token': 'id_token' } with self.login(user1) as client: session = client.session session['oidc_verify_nonce'] = 'nonce' session['oidc_verify_state'] = 'state' session.save() response = client.get(self.url, self.get_data, follow=True) msg = 'The email in this identity is used by another user.' msg_mock.error.assert_called_once_with(ANY, msg) with override_script_prefix('/en-US/'): url = reverse('phonebook:profile_edit') self.assertRedirects(response, url)
def test_add_new_identity_mfa(self, jws_mock, request_post_mock, msg_mock): """Test adding a new identity in a profile.""" user = UserFactory.create(email='*****@*****.**') (jws_mock.from_compact.return_value).payload = json.dumps({ 'email': '*****@*****.**', 'email_verified': True, 'sub': 'ad|' }) post_json_mock = Mock() post_json_mock.json.return_value = { 'id_token': 'id_token' } with self.login(user) as client: session = client.session session['oidc_verify_nonce'] = 'nonce' session['oidc_verify_state'] = 'state' session.save() response = client.get(self.url, self.get_data, follow=True) new_idp_profile = IdpProfile.objects.get(email='*****@*****.**') eq_(new_idp_profile.primary, True) msg = ('Account successfully verified. You need to use this identity ' 'the next time you will login.') msg_mock.success.assert_called_once_with(ANY, msg) with override_script_prefix('/en-US/'): url = reverse('phonebook:profile_edit') self.assertRedirects(response, url)
def test_remove_from_nda_group(self, unsubscribe_mock): """Test to remove a member from a closed group.""" self.group.accepting_new_members = Group.CLOSED self.group.url = 'nda' self.group.name = 'nda' self.group.save() curator = UserFactory() user = UserFactory() self.group.add_member(user.userprofile) self.group.curators.add(curator.userprofile) with override_script_prefix('/fr/'): url = reverse('groups:remove_member', args=[ self.group.url, user.userprofile.pk, GroupMembership.PENDING ]) with patch('mozillians.groups.models.email_membership_change', autospec=True) as mock_email: with self.login(curator) as client: response = client.post(url, follow=False) eq_(302, response.status_code) membership = GroupMembership.objects.get(group=self.group, userprofile=user.userprofile) group_pk, user_pk, old_status, new_status = mock_email.delay.call_args[0] ok_(mock_email.delay.called) eq_(membership.status, GroupMembership.PENDING) eq_(self.group.pk, group_pk) eq_(user.pk, user_pk) eq_(old_status, GroupMembership.MEMBER) eq_(new_status, GroupMembership.PENDING) ok_(unsubscribe_mock.delay.called)
def test_identity_exists(self, jws_mock, request_post_mock, msg_mock): user = UserFactory.create(email='*****@*****.**') IdpProfile.objects.create( profile=user.userprofile, auth0_user_id='email|', email=user.email, primary=True ) (jws_mock.from_compact.return_value).payload = json.dumps({ 'email': '*****@*****.**', 'email_verified': True, 'sub': 'email|' }) post_json_mock = Mock() post_json_mock.json.return_value = { 'id_token': 'id_token' } with self.login(user) as client: session = client.session session['oidc_verify_nonce'] = 'nonce' session['oidc_verify_state'] = 'state' session.save() response = client.get(self.url, self.get_data, follow=True) msg = 'Account verification failed: Identity already exists.' msg_mock.error.assert_called_once_with(ANY, msg) with override_script_prefix('/en-US/'): url = reverse('phonebook:profile_edit') self.assertRedirects(response, url)
def test_anonymous_user_public_view(self): with override_script_prefix('/en-US/'): url = reverse('public') client = Client() response = client.get(url, follow=True) eq_(response.status_code, 200) eq_(response.content, 'Hi!')
def test_languages_get_saved(self): user = UserFactory.create(email='*****@*****.**') data = { 'full_name': user.userprofile.full_name, 'email': user.email, 'username': user.username, 'lat': 40.005814, 'lng': -3.42071, 'externalaccount_set-MAX_NUM_FORMS': '1000', 'externalaccount_set-INITIAL_FORMS': '0', 'externalaccount_set-TOTAL_FORMS': '0', 'language_set-0-id': '', 'language_set-0-userprofile': '', 'language_set-0-code': 'en', 'language_set-1-id': '', 'language_set-1-userprofile': '', 'language_set-1-code': 'fr', 'language_set-MAX_NUM_FORMS': '1000', 'language_set-INITIAL_FORMS': '0', 'language_set-TOTAL_FORMS': '2', 'languages_section': '' } data.update(_get_privacy_fields(MOZILLIANS)) with override_script_prefix('/en-US/'): url = reverse('phonebook:profile_edit') with self.login(user) as client: response = client.post(url, data=data, follow=True) eq_(response.status_code, 200) profile = UserProfile.objects.get(pk=user.userprofile.pk) eq_(set(profile.language_set.values_list('code', flat=True)), set(['en', 'fr']))
def test_unvouched_user_excepted_view(self): user = UserFactory.create(vouched=False) with override_script_prefix('/en-US/'): url = reverse('excepted') with self.login(user) as client: response = client.get(url, follow=True) eq_(response.status_code, 200) eq_(response.content, 'Hi!')
def setUp(self): self.group = GroupFactory() self.member = UserFactory() self.group.add_member(self.member.userprofile) with override_script_prefix('/en-US/'): self.url = reverse('groups:remove_member', kwargs={'url': self.group.url, 'user_pk': self.member.userprofile.pk})
def test_invite_delete_invalid_invite(self): user = UserFactory.create(userprofile={'is_vouched': True}) with override_script_prefix('/en-US/'): url = reverse('phonebook:delete_invite', kwargs={'invite_pk': '1'}) with self.login(user) as client: response = client.post(url) eq_(response.status_code, 404)
def setUp(self): self.skill = SkillFactory.create() # We must request the full path, with language, or the # LanguageMiddleware will convert the request to GET. with override_script_prefix('/en-US/'): self.url = reverse('groups:toggle_skill_subscription', kwargs={'url': self.skill.url}) self.user = UserFactory.create()
def test_delete_get_method(self): user = UserFactory.create() with override_script_prefix('/en-US'): url = reverse('phonebook:profile_delete') with self.login(user) as client: response = client.get(url, follow=True) ok_(isinstance(response, HttpResponseNotAllowed))
def test_unjoinable_group(self): group = GroupFactory.create(accepting_new_members='no') with override_script_prefix('/en-US/'): join_url = reverse('groups:join_group', kwargs={'url': group.url}) with self.login(self.user) as client: client.post(join_url, follow=True) group = Group.objects.get(id=group.id) ok_(not group.members.filter(pk=self.user.pk).exists())
def test_group_subscription_terms_by_request(self): group = GroupFactory.create(accepting_new_members='by_request', terms='Example terms') with override_script_prefix('/en-US/'): join_url = reverse('groups:join_group', kwargs={'url': group.url}) with self.login(self.user) as client: client.post(join_url, follow=True) membership = group.groupmembership_set.get(userprofile=self.user.userprofile) eq_(membership.status, GroupMembership.PENDING)
def test_invite_delete(self): user = UserFactory.create(userprofile={'is_vouched': True}) invite = InviteFactory.create(inviter=user.userprofile) with override_script_prefix('/en-US/'): url = reverse('phonebook:delete_invite', kwargs={'invite_pk': invite.pk}) with self.login(user) as client: response = client.post(url, follow=True) eq_(Invite.objects.all().count(), 0) eq_(response.status_code, 200)
def test_vouch_no_description(self): user = UserFactory.create(vouched=False) voucher = UserFactory.create() with override_script_prefix('/en-US/'): url = reverse('phonebook:profile_view', args=[user.username]) data = {'vouchee': user.userprofile.id, 'description': ''} with self.login(voucher) as client: client.post(url, data) unvouched_user = User.objects.get(id=user.id) ok_(not unvouched_user.userprofile.is_vouched)
def test_invite_already_vouched(self): vouched_user = UserFactory.create() user = UserFactory.create() with override_script_prefix('/en-US/'): url = reverse('phonebook:invite') data = {'recipient': vouched_user.email} with self.login(user) as client: response = client.post(url, data, follow=True) self.assertTemplateUsed(response, 'phonebook/invite.html') ok_('recipient' in response.context['invite_form'].errors) eq_(Invite.objects.all().count(), 0)
def setUp(self): self.group = GroupFactory.create() self.user = UserFactory.create() # We must request the full path, with language, or the # LanguageMiddleware will convert the request to GET. with override_script_prefix('/en-US/'): self.join_url = reverse('groups:join_group', kwargs={'url': self.group.url}) self.leave_url = reverse('groups:remove_member', kwargs={'url': self.group.url, 'user_pk': self.user.userprofile.pk})
def test_delete_auto_vouch_domain(self): user = UserFactory.create(email='*****@*****.**') description = 'Autovouch reason' vouch = user.userprofile.vouches_received.filter(autovouch=True, description=description) ok_(vouch.exists()) with override_script_prefix('/en-US/'): url = reverse('phonebook:profile_delete') with self.login(user) as client: response = client.post(url, follow=True) eq_(response.status_code, 200) self.assertTemplateUsed(response, 'phonebook/home.html')
def test_remove_button_confirms(self): """GET to remove_member view displays confirmation""" # Make user 1 the group curator so they can remove users self.group.curators.add(self.user_1.userprofile) self.group.save() with override_script_prefix('/en-US/'): group_url = reverse('groups:show_group', args=[self.group.url]) next_url = "%s?filtr=members" % group_url # We must request the full path, with language, or the # LanguageMiddleware will convert the request to GET. with override_script_prefix('/en-US/'): url = reverse('groups:remove_member', kwargs=dict(url=self.group.url, user_pk=self.user_2.userprofile.pk)) with self.login(self.user_1) as client: response = client.get(url, data={'next_url': next_url}, follow=True) self.assertTemplateUsed(response, 'groups/confirm_remove_member.html') # make sure context variable next_url was populated properly eq_(response.context['next_url'], next_url) # Still a member ok_(self.group.has_member(self.user_2.userprofile))