Example #1
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))
Example #2
0
    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)
Example #3
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))
Example #4
0
    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'))
Example #9
0
 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')
         )
Example #10
0
 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)
Example #11
0
    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)
Example #12
0
    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)
Example #13
0
 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)
Example #15
0
 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)
Example #19
0
    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_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']
Example #25
0
    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)
Example #26
0
    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)
Example #27
0
 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_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)
Example #30
0
 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)
Example #31
0
 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_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!")
Example #34
0
    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_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']
Example #37
0
    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)
Example #38
0
    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)
Example #39
0
 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)
Example #40
0
    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)
Example #41
0
    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']))
Example #44
0
    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_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']))
Example #46
0
 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!')
Example #47
0
 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!')
Example #48
0
 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})
Example #49
0
    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)
Example #50
0
 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_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 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))
Example #53
0
 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())
Example #54
0
    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)
Example #55
0
    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)
Example #56
0
 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)
Example #57
0
 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)
Example #58
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')
Example #60
0
    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))