class TestApiReviewed(TestApi): widgy_site = ReviewedWidgySite()
class ReviewQueueViewsTest(SwitchUserTestCase, RootNodeTestCase): widgy_site = ReviewedWidgySite() @cached_property def urls(self): urls = imp.new_module('urls') urls.urlpatterns = self.widgy_site.get_urls() return urls def test_commit_view(self): tracker, first_commit = make_commit(self.widgy_site) url = self.widgy_site.reverse(self.widgy_site.commit_view, kwargs={ 'pk': tracker.pk, }) with self.as_staffuser() as user: with self.with_permission(user, 'add', ReviewedVersionCommit): self.client.post(url, { 'approve_it': 1, 'publish_radio': 'now' }) self.assertNotEqual( refetch(tracker).head.reviewedversioncommit, first_commit) self.assertFalse( refetch(tracker).head.reviewedversioncommit.is_approved) with self.as_staffuser() as user: with self.with_permission(user, 'change', ReviewedVersionCommit): with self.with_permission(user, 'add', ReviewedVersionCommit): self.client.post(url, { 'approve_it': 1, 'publish_radio': 'now' }) self.assertTrue( refetch( tracker).head.reviewedversioncommit.is_approved) def test_approve_view(self): tracker, commit = make_commit(self.widgy_site) url = self.widgy_site.reverse(self.widgy_site.approve_view, kwargs={ 'pk': tracker.pk, 'commit_pk': commit.pk, }) commit.message = u'\N{SNOWMAN}' commit.save() with self.as_staffuser() as user: resp = self.client.post(url) self.assertEqual(resp.status_code, 403) self.assertFalse(refetch(commit).is_approved) with self.as_staffuser() as user: with self.with_permission(user, 'change', ReviewedVersionCommit): resp = self.client.post(url) self.assertEqual(resp.status_code, 302) self.assertTrue(refetch(commit).is_approved) def test_unapprove_view(self): tracker, commit = make_commit(self.widgy_site) url = self.widgy_site.reverse(self.widgy_site.unapprove_view, kwargs={ 'pk': tracker.pk, 'commit_pk': commit.pk, }) commit.approve(self.user) with self.as_staffuser() as user: resp = self.client.post(url) self.assertEqual(resp.status_code, 403) self.assertTrue(refetch(commit).is_approved) with self.as_staffuser() as user: with self.with_permission(user, 'change', ReviewedVersionCommit): resp = self.client.post(url) self.assertEqual(resp.status_code, 302) self.assertFalse(refetch(commit).is_approved) def test_undo_approvals_view(self): tracker, commit = make_commit(self.widgy_site) tracker2, commit2 = make_commit(self.widgy_site) url = self.widgy_site.reverse(self.widgy_site.undo_approvals_view) commit.approve(self.user) commit2.approve(self.user) def doit(): return self.client.post(url, { 'actions': json.dumps([commit.pk]), 'referer': '/referer/', }) with self.as_staffuser() as user: resp = doit() self.assertEqual(resp.status_code, 403) self.assertTrue(refetch(commit).is_approved) self.assertTrue(refetch(commit2).is_approved) with self.as_staffuser() as user: with self.with_permission(user, 'change', ReviewedVersionCommit): resp = doit() self.assertEqual(resp.status_code, 302) self.assertEqual(resp['Location'], 'http://testserver/referer/') self.assertFalse(refetch(commit).is_approved) self.assertTrue(refetch(commit2).is_approved) def test_undo_approvals_view_safe_redirect(self): tracker, commit = make_commit(self.widgy_site) url = self.widgy_site.reverse(self.widgy_site.undo_approvals_view) with self.as_staffuser() as user: with self.with_permission(user, 'change', ReviewedVersionCommit): for bad_url in ('http://example.com', 'https://example.com', 'ftp://exampel.com', '//example.com'): response = self.client.post( url, { 'actions': json.dumps([commit.pk]), 'referer': bad_url, }) self.assertEqual(response.status_code, 302) self.assertFalse(bad_url in response['Location'], "%s should be blocked" % bad_url) for good_url in ('/view/?param=http://example.com', '/view/?param=https://example.com', '/view?param=ftp://exampel.com', 'view/?param=//example.com', '//testserver/', '/url%20with%20spaces/'): response = self.client.post( url, { 'actions': json.dumps([commit.pk]), 'referer': good_url, }) self.assertEqual(response.status_code, 302) self.assertTrue(good_url in response['Location'], "%s should be allowed" % good_url) def test_published_versiontrackers(self): vt_class = self.widgy_site.get_version_tracker_model() tracker = make_tracker(self.widgy_site, vt_class) self.assertNotIn(tracker, vt_class.objects.published()) commit = tracker.commit(publish_at=timezone.now()) self.assertNotIn(tracker, vt_class.objects.published()) commit.approve(self.user) self.assertIn(tracker, vt_class.objects.published()) tracker2 = make_tracker(self.widgy_site, vt_class) self.assertIn(tracker, vt_class.objects.published()) self.assertNotIn(tracker2, vt_class.objects.published()) commit2 = tracker2.commit(publish_at=timezone.now()) self.assertIn(tracker, vt_class.objects.published()) self.assertNotIn(tracker2, vt_class.objects.published()) other_commit = tracker.commit(publish_at=timezone.now()) other_commit.approve(self.user) self.assertIn(tracker, vt_class.objects.published()) self.assertNotIn(tracker2, vt_class.objects.published()) commit2.approve(self.user) self.assertIn(tracker, vt_class.objects.published()) self.assertIn(tracker2, vt_class.objects.published()) def test_published_stickiness(self): vt_class = self.widgy_site.get_version_tracker_model() tracker = make_tracker(self.widgy_site, vt_class) # One commit is published, the other is approved. Since the same commit # is not both published and approved, the tracker is not published. c1 = tracker.commit(publish_at=timezone.now() + datetime.timedelta(days=1)) c1.approve(self.user) tracker.commit(publish_at=timezone.now()) self.assertNotIn(tracker, vt_class.objects.published())
def make_tracker(site, vt_class=ReviewedVersionTracker): root_node = RawTextWidget.add_root(site, text='first').node tracker = vt_class.objects.create(working_copy=root_node) return tracker def make_commit(site, delta=datetime.timedelta(0), vt_class=ReviewedVersionTracker): tracker = make_tracker(site, vt_class) commit = tracker.commit(publish_at=timezone.now() + delta) return (tracker, commit) urls = imp.new_module('urls') reviewed_widgy_site = ReviewedWidgySite() urls.urlpatterns = reviewed_widgy_site.get_urls() @override_settings(ROOT_URLCONF=urls) class TestApiReviewed(TestApi): widgy_site = reviewed_widgy_site class ReviewQueueTest(RootNodeTestCase): widgy_site = widgy_site def test_review_queue(self): tracker, commit1 = make_commit(self.widgy_site, vt_class=ReviewedVersionTracker) p = Permission.objects.get(codename='change_versioncommit') user = User.objects.create()
if FORM_BUILDER_INSTALLED: from widgy.contrib.form_builder.models import Form, FormInput from widgy.contrib.widgy_mezzanine.views import handle_form PAGE_BUILDER_INSTALLED = 'widgy.contrib.page_builder' in settings.INSTALLED_APPS if PAGE_BUILDER_INSTALLED: from widgy.contrib.page_builder.models import Button, DefaultLayout from widgy.contrib.widgy_mezzanine.views import PreviewView REVIEW_QUEUE_INSTALLED = 'widgy.contrib.review_queue' in settings.INSTALLED_APPS if REVIEW_QUEUE_INSTALLED: from widgy.contrib.review_queue.site import ReviewedWidgySite reviewed_widgy_site = ReviewedWidgySite() urlpatterns += [ url('^reviewed_widgy_site/', include(reviewed_widgy_site.urls)) ] def make_reviewed(fn): """ Just setting the WIDGY_MEZZANINE_SITE is not enough during tests, because WidgyPage.root_node has been set to point to VersionTracker. We have to manually point it to ReviewedVersionTracker. We do this only in tests because on a normal run, you are never going to be changing what models a ForeignKey points to (I would hope). """ from widgy.contrib.widgy_mezzanine.admin import publish_page_on_approve
from widgy.contrib.review_queue.site import ReviewedWidgySite site = ReviewedWidgySite()