Esempio n. 1
0
class ProjectDetailViewTests(TestCase):

    def setUp(self):
        self.test_instance = ProjectFactory()
        self.fields = ['title', 'description']
        self.templates = ['base.html', 'projects/project.html']

        # Add some users
        self.admin_user = UserFactory()
        self.test_instance.administrators.add(self.admin_user)
        self.outside_user = UserFactory()
        self.nominator = UserFactory()
        self.test_instance.nominators.add(self.nominator)
        self.blacklisted_user = UserFactory()
        self.test_instance.nominator_blacklist.add(self.blacklisted_user)

        # Add some nominations
        self.user_nominations = {
            'facebook.com': ('user1', 'user3'),
            'linkedin.com': ('user2', 'user3'),
            'myspace.com': ('user3'),
            'twitter.com': ('user1', 'user2', 'user3'),
            'ucla.edu': ('user1', 'user3'),
        }
        for url, users in self.user_nominations.items():
            nom = NominationFactory(
                project=self.test_instance,
                resource=ResourceFactory(url=url),
            )
            for username in users:
                nom.endorsements.add(UserFactory(username=username))

        self.client.logout()
        self.test_response = self.client.get(
            self.test_instance.get_absolute_url()
        )

    @pytest.mark.xfail(strict=True)
    def test_absolute_url_method(self):
        self.assertTrue(callable(self.test_instance.get_absolute_url))

    @pytest.mark.xfail(strict=True)
    def test_included_fields(self):
        for field in self.fields:
            self.assertContains(
                self.test_response,
                getattr(self.test_instance, field),
                html=True
            )

    @pytest.mark.xfail(strict=True)
    def test_update_link(self):
        url = self.test_instance.get_absolute_url()
        edit_link = f'<a href="{self.test_instance.get_edit_url()}">'

        # admin user -> link
        self.client.force_login(self.admin_user)
        self.assertContains(self.client.get(url), edit_link)

        # nominator -> no link
        self.client.force_login(self.nominator)
        self.assertNotContains(self.client.get(url), edit_link, html=True)

        # other user -> no link
        self.client.force_login(self.outside_user)
        self.assertNotContains(self.client.get(url), edit_link, html=True)

        # anonymous user -> no link
        self.client.logout()
        self.assertNotContains(self.client.get(url), edit_link, html=True)


    @pytest.mark.xfail(strict=True)
    def test_edit_project_link(self):
        """An 'edit project' link should be shown if logged-in user is
        authorized, otherwise hidden."""

        pass

    @pytest.mark.xfail(strict=True)
    def test_new_nomination_link(self):
        """A 'nominate' link should be shown if logged-in user is authorized,
        otherwise hidden."""

        # OPEN NOMINATION POLICY

        self.test_instance.nomination_policy = 'Cobweb Users'
        self.test_instance.save()

        # Anonymous User
        self.client.logout()
        response = self.client.get(self.test_instance.get_absolute_url())
        self.assertNotContains(response, 'Add a nomination')
        self.assertNotContains(
            response,
            reverse('nominate', kwargs={'project_id': self.test_instance.pk})
        )

        self.client.force_login(self.outside_user)
        response = self.client.get(self.test_instance.get_absolute_url())
        self.assertContains(response, 'Add a nomination')
        self.assertContains(
            response,
            reverse('nominate', kwargs={'project_id': self.test_instance.pk})
        )

        self.client.force_login(self.admin_user)
        response = self.client.get(self.test_instance.get_absolute_url())
        self.assertContains(response, 'Add a nomination')
        self.assertContains(
            response,
            reverse('nominate', kwargs={'project_id': self.test_instance.pk})
        )

        self.client.force_login(self.nominator)
        response = self.client.get(self.test_instance.get_absolute_url())
        self.assertContains(response, 'Add a nomination')
        self.assertContains(
            response,
            reverse('nominate', kwargs={'project_id': self.test_instance.pk})
        )

        self.client.force_login(self.blacklisted_user)
        response = self.client.get(self.test_instance.get_absolute_url())
        self.assertNotContains(response, 'Add a nomination')
        self.assertNotContains(
            response,
            reverse('nominate', kwargs={'project_id': self.test_instance.pk})
        )

        # RESTRICTED NOMINATION POLICY

        self.test_instance.nomination_policy = 'Restricted'
        self.test_instance.save()

        # Anonymous User
        self.client.logout()
        response = self.client.get(self.test_instance.get_absolute_url())
        self.assertNotContains(response, 'Add a nomination')
        self.assertNotContains(
            response,
            reverse('nominate', kwargs={'project_id': self.test_instance.pk})
        )

        self.client.force_login(self.outside_user)
        response = self.client.get(self.test_instance.get_absolute_url())
        self.assertNotContains(response, 'Add a nomination')
        self.assertNotContains(
            response,
            reverse('nominate',  kwargs={'project_id': self.test_instance.pk})
        )

        self.client.force_login(self.admin_user)
        response = self.client.get(self.test_instance.get_absolute_url())
        self.assertContains(response, 'Add a nomination')
        self.assertContains(
            response,
            reverse('nominate', kwargs={'project_id': self.test_instance.pk})
        )

        self.client.force_login(self.nominator)
        response = self.client.get(self.test_instance.get_absolute_url())
        self.assertContains(response, 'Add a nomination')
        self.assertContains(
            response,
            reverse('nominate', kwargs={'project_id': self.test_instance.pk})
        )

        self.client.force_login(self.blacklisted_user)
        response = self.client.get(self.test_instance.get_absolute_url())
        self.assertNotContains(response, 'Add a nomination')
        self.assertNotContains(
            response,
            reverse('nominate', kwargs={'project_id': self.test_instance.pk})
        )
Esempio n. 2
0
class ProjectUpdateViewTests(TestCase):

    def setUp(self):
        self.project = ProjectFactory()
        self.project.save()

        # make some users
        self.admin_user = UserFactory()
        self.project.administrators.add(self.admin_user)

        # get a default response
        self.url = self.project.get_edit_url()
        self.client.force_login(self.admin_user)
        self.response = self.client.get(self.url)

    @pytest.mark.xfail(strict=True)
    def test_load(self):
        self.assertEqual(self.response.status_code, 200)
        for template in ['base.html', 'generic_form.html']:
            self.assertTemplateUsed(self.response, template)

    @pytest.mark.xfail(strict=True)
    def test_included_fields(self):
        for field_name in ['title', 'administrators', 'nomination_policy',
                           'nominators', 'status', 'description', 'tags']:
            try:
                self.assertContains(
                    self.response,
                    f'id="id_{field_name}"',
                    html=False
                )
            except AssertionError:
                self.assertContains(
                    self.response,
                    f'id="div_id_{field_name}"',
                    html=False
                )

    @pytest.mark.xfail(strict=True)
    def test_no_edit_if_not_admin(self):
        """Anonymous and non-admin users get redirected to login page."""
        self.client.logout()
        self.assertRedirects(self.client.get(self.url),
                             f'/accounts/login/?next={self.url}')

        project_data = {
            'title': 'Test Project for test_anonymous_cant_create_project',
            'status': 'Active',
            'nomination_policy': 'Cobweb Users',
        }
        self.assertRedirects(self.client.post(self.url, project_data),
                             f'/accounts/login/?next={self.url}')

        self.client.force_login(UserFactory())
        self.assertRedirects(self.client.get(self.url),
                             f'/accounts/login/?next={self.url}')

        project_data = {
            'title': 'Test Project for test_anonymous_cant_create_project',
            'status': 'Active',
            'nomination_policy': 'Cobweb Users',
        }
        self.assertRedirects(self.client.post(self.url, project_data),
                             f'/accounts/login/?next={self.url}')