예제 #1
0
 def setUp(self):
     self.site = Site.objects.first()
     self.root_page = self.site.root_page
     self.page_with_tags = CFGOVPage(title='Tagged',
                                     slug='tagged',
                                     live=True)
     save_new_page(self.page_with_tags, root=self.root_page)
     self.page_with_tags.tags.add('tag1')
     self.page_with_tags.authors.add('author1')
     self.page_with_tags.save()
예제 #2
0
class TestCFGOVPageContext(TestCase):
    def setUp(self):
        self.page = CFGOVPage(title='Test', slug='test')
        self.factory = RequestFactory()
        self.request = self.factory.get('/')

    def test_post_preview_cache_key_contains_page_id(self):
        save_new_page(self.page)
        key = self.page.post_preview_cache_key
        self.assertIn(str(self.page.id), key)

    @mock.patch('v1.models.base.hooks.get_hooks')
    def test_get_context_calls_get_hooks(self, mock_get_hooks):
        self.page.get_context(self.request)
        mock_get_hooks.assert_called_with('cfgovpage_context_handlers')

    def test_get_context_no_banners(self):
        test_context = self.page.get_context(self.request)
        self.assertFalse(test_context['banners'])

    def test_get_context_one_banner_not_matching(self):
        Banner.objects.create(title='Banner', url_pattern='foo', enabled=True)
        test_context = self.page.get_context(self.request)
        self.assertFalse(test_context['banners'])

    def test_get_context_one_banner_matching(self):
        Banner.objects.create(title='Banner', url_pattern='/', enabled=True)
        test_context = self.page.get_context(self.request)
        self.assertTrue(test_context['banners'])

    def test_get_context_one_banner_matching_disabled(self):
        Banner.objects.create(title='Banner', url_pattern='/', enabled=False)
        test_context = self.page.get_context(self.request)
        self.assertFalse(test_context['banners'])

    def test_get_context_multiple_banners_matching(self):
        Banner.objects.create(title='Banner', url_pattern='/', enabled=True)
        Banner.objects.create(title='Banner2', url_pattern='/', enabled=True)
        Banner.objects.create(title='Banner3', url_pattern='/', enabled=False)
        Banner.objects.create(title='Banner4', url_pattern='foo', enabled=True)
        test_context = self.page.get_context(self.request)
        self.assertEqual(test_context['banners'].count(), 2)

    def test_get_context_no_schema_json(self):
        test_context = self.page.get_context(self.request)
        self.assertNotIn('schema_json', test_context)

    def test_get_context_with_schema_json(self):
        self.page.schema_json = {
            "@type": "SpecialAnnouncement",
            "@context": "http://schema.org",
            "category": "https://www.wikidata.org/wiki/Q81068910",
            "name": "Special announcement headline",
            "text": "Special announcement details",
            "datePosted": "2020-03-17",
            "expires": "2020-03-24"
        }
        test_context = self.page.get_context(self.request)
        self.assertIn('schema_json', test_context)
예제 #3
0
    def test_page_pulls_in_child_block_media(self):
        page = CFGOVPage()
        page.sidefoot = blocks.StreamValue(page.sidefoot.stream_block, [
            {
                'type': 'email_signup',
                'value': {
                    'heading': 'Heading'
                }
            },
        ], True)

        self.assertEqual(page.media, ['email-signup.js'])
예제 #4
0
    def test_page_pulls_in_child_block_media(self):
        page = CFGOVPage()
        page.sidefoot = blocks.StreamValue(
            page.sidefoot.stream_block,
            [
                {
                    'type': 'email_signup',
                    'value': {'heading': 'Heading'}
                },
            ],
            True
        )

        self.assertEqual(page.media, ['email-signup.js'])
예제 #5
0
 def test_rich_text_links_get_expanded(self):
     page = CFGOVPage(title='foo bar', slug='foo-bar')
     publish_page(page)
     link = f'<body><a id="{page.id}" linktype="page">foo bar</a></body>'
     output = parse_links(link)
     self.assertEqual('<body><a href="/foo-bar/">foo bar</a></body>',
                      output)
예제 #6
0
    def test_nav_does_not_include_non_browse_type_sibling_pages(self):
        non_browse_page = CFGOVPage(title='Non-browse page')
        helpers.publish_page(child=non_browse_page)

        nav, has_children = util.get_secondary_nav_items(
            self.request, self.browse_page1)

        self.assertEqual(len(nav), 2)
예제 #7
0
class TestCFGOVPageCopy(TestCase):
    def setUp(self):
        self.site = Site.objects.first()
        self.root_page = self.site.root_page
        self.page_with_tags = CFGOVPage(title='Tagged',
                                        slug='tagged',
                                        live=True)
        save_new_page(self.page_with_tags, root=self.root_page)
        self.page_with_tags.tags.add('tag1')
        self.page_with_tags.authors.add('author1')
        self.page_with_tags.save()

    def check_tagged_page_copies_without_error(self):
        test_page = self.page_with_tags
        new_page = test_page.copy(update_attrs={
            "slug": f"{test_page.slug}-copy",
            "title": f"{test_page.title} COPY"
        })
        self.assertEqual(new_page.title, "Tagged COPY")
예제 #8
0
    def test_has_children_is_false_for_browse_page_with_only_non_browse_children(self):
        browse_page3 = BrowsePage(title='Browse page 3')
        helpers.publish_page(child=browse_page3)
        child_of_browse_page3 = CFGOVPage(title='Non-browse child of browse page')
        helpers.save_new_page(child_of_browse_page3, browse_page3)

        nav, has_children = util.get_secondary_nav_items(
            self.request, browse_page3
        )

        self.assertEqual(has_children, False)
예제 #9
0
    def setUp(self):
        self.page = mock.Mock()
        self.request = mock.Mock()
        self.page_versions = [
            mock.Mock(**{'content_json': {'live': False, 'shared': False}}), # draft
            mock.Mock(**{'content_json': {'live': False, 'shared': True}}), # shared
            mock.Mock(**{'content_json': {'live': True, 'shared': False}}), # live
            mock.Mock(**{'content_json': {'live': True, 'shared': True}}), # live and shared
        ]
        self.page.revisions.all().order_by.return_value = self.page_versions

        self.new_page = CFGOVPage(title='a cfgov page')
        self.new_page.live = False
        self.new_page.shared = False

        helpers.save_new_page(self.new_page)
        content_json = json.loads(self.new_page.to_json())
        # create the various page revisions
        # revision 1
        content_json['title'] = 'revision 1'
        content_json['live'] = True
        content_json['shared'] = True
        self.revision_1 = self.new_page.revisions.create(content_json=json.dumps(content_json))

        # rev 2
        content_json['title'] = 'revision 2'
        content_json['live'] = True
        content_json['shared'] = False
        self.revision_2 = self.new_page.revisions.create(content_json=json.dumps(content_json))

        # rev 3
        content_json['title'] = 'revision 3'
        content_json['live'] = False
        content_json['shared'] = True
        self.revision_3 = self.new_page.revisions.create(content_json=json.dumps(content_json))

        # rev 4
        content_json['title'] = 'revision 4'
        content_json['live'] = False
        content_json['shared'] = False
        self.revision_4 = self.new_page.revisions.create(content_json=json.dumps(content_json))
예제 #10
0
class TestCFGOVPageBreadcrumbs(TestCase):
    def setUp(self):
        self.factory = RequestFactory()

        self.site = Site.objects.first()
        self.root_page = self.site.root_page

        self.top_level_page = CFGOVPage(title='top', slug='top', live=True)
        save_new_page(self.top_level_page, root=self.root_page)

        self.second_level_page = CFGOVPage(title='second',
                                           slug='second',
                                           live=True)
        save_new_page(self.second_level_page, root=self.top_level_page)

        self.third_level_page = CFGOVPage(title='third',
                                          slug='third',
                                          live=True)
        save_new_page(self.third_level_page, root=self.second_level_page)

    def test_get_breadcrumbs_forced_homepage_descendant(self):
        request = self.factory.get('/top/second')
        request.site = self.site
        self.top_level_page.force_breadcrumbs = True
        self.top_level_page.save()
        self.assertIn(
            'top',
            [p.slug for p in self.second_level_page.get_breadcrumbs(request)])

    def test_get_breadcrumbs_no_homepage_descendant(self):
        request = self.factory.get('/top/second')
        request.site = self.site
        self.assertNotIn(
            'top',
            [p.slug for p in self.second_level_page.get_breadcrumbs(request)])

    def test_get_breadcrumbs_two_levels_deep(self):
        request = self.factory.get('/top/second/third')
        request.site = self.site

        self.assertNotIn(
            'top',
            [p.slug for p in self.third_level_page.get_breadcrumbs(request)])
        self.assertIn(
            'second',
            [p.slug for p in self.third_level_page.get_breadcrumbs(request)])
예제 #11
0
    def setUp(self):
        self.factory = RequestFactory()

        self.site = Site.objects.first()
        self.root_page = self.site.root_page

        self.top_level_page = CFGOVPage(title='top', slug='top', live=True)
        save_new_page(self.top_level_page, root=self.root_page)

        self.second_level_page = CFGOVPage(title='second',
                                           slug='second',
                                           live=True)
        save_new_page(self.second_level_page, root=self.top_level_page)

        self.third_level_page = CFGOVPage(title='third',
                                          slug='third',
                                          live=True)
        save_new_page(self.third_level_page, root=self.second_level_page)
예제 #12
0
class TestCFGOVPage(TestCase):
    def setUp(self):
        self.page = CFGOVPage(title='Test', slug='test')
        self.factory = RequestFactory()
        self.request = self.factory.get('/')

    def test_post_preview_cache_key_contains_page_id(self):
        save_new_page(self.page)
        key = self.page.post_preview_cache_key
        self.assertIn(str(self.page.id), key)

    @mock.patch('six.moves.builtins.super')
    @mock.patch('v1.models.base.hooks')
    def test_get_context_calls_get_context(self, mock_hooks, mock_super):
        self.page.get_context(self.request)
        mock_super.assert_called_with(CFGOVPage, self.page)
        mock_super().get_context.assert_called_with(self.request)

    @mock.patch('six.moves.builtins.super')
    @mock.patch('v1.models.base.hooks')
    def test_get_context_calls_get_hooks(self, mock_hooks, mock_super):
        self.page.get_context(self.request)
        mock_hooks.get_hooks.assert_called_with('cfgovpage_context_handlers')

    @mock.patch('six.moves.builtins.super')
    @mock.patch('v1.models.base.hooks')
    def test_get_context_calls_hook_functions(self, mock_hooks, mock_super):
        fn = mock.Mock()
        mock_hooks.get_hooks.return_value = [fn]
        self.page.get_context(self.request)
        fn.assert_called_with(
            self.page, self.request, mock_super().get_context()
        )

    @mock.patch('six.moves.builtins.super')
    @mock.patch('v1.models.base.hooks')
    def test_get_context_returns_context(self, mock_hooks, mock_super):
        result = self.page.get_context(self.request)
        self.assertEqual(result, mock_super().get_context())

    @mock.patch('six.moves.builtins.super')
    def test_serve_calls_super_on_non_ajax_request(self, mock_super):
        self.page.serve(self.request)
        mock_super.assert_called_with(CFGOVPage, self.page)
        mock_super().serve.assert_called_with(self.request)

    @mock.patch('six.moves.builtins.super')
    @mock.patch('v1.models.base.CFGOVPage.serve_post')
    def test_serve_calls_serve_post_on_post_request(
            self, mock_serve_post, mock_super):
        self.request = self.factory.post('/')
        self.page.serve(self.request)
        mock_serve_post.assert_called_with(self.request)

    def test_serve_post_returns_400_for_no_form_id(self):
        request = self.factory.post('/')
        response = self.page.serve_post(request)
        self.assertIsInstance(response, HttpResponseBadRequest)

    def test_serve_post_returns_json_400_for_no_form_id(self):
        request = self.factory.post(
            '/',
            HTTP_X_REQUESTED_WITH='XMLHttpRequest'
        )
        response = self.page.serve_post(request)
        self.assertEqual(response.content, b'{"result": "error"}')
        self.assertEqual(response.status_code, 400)

    def test_serve_post_returns_400_for_invalid_form_id_wrong_parts(self):
        request = self.factory.post('/', {'form_id': 'foo'})
        response = self.page.serve_post(request)
        self.assertIsInstance(response, HttpResponseBadRequest)

    def test_serve_post_returns_400_for_invalid_form_id_invalid_field(self):
        request = self.factory.post('/', {'form_id': 'form-foo-2'})
        response = self.page.serve_post(request)
        self.assertIsInstance(response, HttpResponseBadRequest)

    def test_serve_post_returns_400_for_invalid_form_id_invalid_index(self):
        page = BrowsePage(title='test', slug='test')
        request = self.factory.post('/', {'form_id': 'form-content-99'})
        response = page.serve_post(request)
        self.assertIsInstance(response, HttpResponseBadRequest)

    def test_serve_post_valid_calls_feedback_block_handler(self):
        """A valid post should call the feedback block handler.

        This returns a redirect to the calling page and also uses the
        Django messages framework to set a message.
        """
        page = BrowsePage(title='test', slug='test')
        page.content = blocks.StreamValue(
            page.content.stream_block,
            [{'type': 'feedback', 'value': 'something'}],
            True
        )
        save_new_page(page)

        request = self.factory.post('/', {'form_id': 'form-content-0'})
        SessionMiddleware().process_request(request)
        MessageMiddleware().process_request(request)

        response = page.serve_post(request)

        self.assertEqual(
            (response.status_code, response['Location']),
            (302, request.path)
        )

    @mock.patch('v1.models.base.TemplateResponse')
    @mock.patch('v1.models.base.CFGOVPage.get_template')
    @mock.patch('v1.models.base.CFGOVPage.get_context')
    @mock.patch('v1.models.base.getattr')
    def test_serve_post_gets_streamfield_from_page_using_form_id(
            self,
            mock_getattr,
            mock_get_context,
            mock_get_template,
            mock_response):
        mock_getattr.return_value = mock.MagicMock()
        mock_get_context.return_value = mock.MagicMock()
        self.request = self.factory.post(
            '/',
            {'form_id': 'form-content-0'},
            HTTP_X_REQUESTED_WITH='XMLHttpRequest'
        )
        self.page.serve_post(self.request)
        mock_getattr.assert_called_with(self.page, 'content', None)

    @mock.patch('v1.models.base.TemplateResponse')
    @mock.patch('v1.models.base.CFGOVPage.get_template')
    @mock.patch('v1.models.base.CFGOVPage.get_context')
    @mock.patch('v1.models.base.getattr')
    def test_serve_post_calls_module_get_result(
            self,
            mock_getattr,
            mock_get_context,
            mock_get_template,
            mock_response):
        self.request = self.factory.post(
            '/',
            {'form_id': 'form-content-0'},
            HTTP_X_REQUESTED_WITH='XMLHttpRequest'
        )
        self.page.serve_post(self.request)
        module = mock_getattr()[0]
        module.block.get_result.assert_called_with(
            self.page,
            self.request,
            module.value,
            True
        )

    @mock.patch('v1.models.base.isinstance')
    @mock.patch('v1.models.base.TemplateResponse')
    @mock.patch('v1.models.base.CFGOVPage.get_template')
    @mock.patch('v1.models.base.CFGOVPage.get_context')
    @mock.patch('v1.models.base.getattr')
    def test_serve_post_returns_result_if_response(
            self, mock_getattr,
            mock_get_context,
            mock_get_template,
            mock_response,
            mock_isinstance):
        mock_getattr.return_value = mock.MagicMock()
        mock_get_context.return_value = mock.MagicMock()
        self.request = self.factory.post(
            '/',
            {'form_id': 'form-content-0'},
            HTTP_X_REQUESTED_WITH='XMLHttpRequest'
        )
        result = self.page.serve_post(self.request)
        module = mock_getattr()[0]
        self.assertEqual(result, module.block.get_result())

    @mock.patch('v1.models.base.TemplateResponse')
    @mock.patch('v1.models.base.CFGOVPage.get_template')
    @mock.patch('v1.models.base.CFGOVPage.get_context')
    @mock.patch('v1.models.base.getattr')
    def test_serve_post_calls_get_context(
            self,
            mock_getattr,
            mock_get_context,
            mock_get_template,
            mock_response):
        mock_getattr.return_value = mock.MagicMock()
        mock_get_context.return_value = mock.MagicMock()
        self.request = self.factory.post(
            '/',
            {'form_id': 'form-content-0'},
            HTTP_X_REQUESTED_WITH='XMLHttpRequest'
        )
        self.page.serve_post(self.request)
        self.assertTrue(mock_get_context.called)

    @mock.patch('v1.models.base.TemplateResponse')
    @mock.patch('v1.models.base.CFGOVPage.get_template')
    @mock.patch('v1.models.base.CFGOVPage.get_context')
    @mock.patch('v1.models.base.getattr')
    def test_serve_post_sets_context(
            self,
            mock_getattr,
            mock_get_context,
            mock_get_template,
            mock_response):
        context = {'form_modules': {'content': {}}}
        mock_getattr.return_value = mock.MagicMock()
        mock_get_context.return_value = context
        self.request = self.factory.post(
            '/',
            {'form_id': 'form-content-0'},
            HTTP_X_REQUESTED_WITH='XMLHttpRequest'
        )
        self.page.serve_post(self.request)
        module = mock_getattr()[0]
        self.assertIn(0, context['form_modules']['content'])
        self.assertEqual(
            module.block.get_result(), context['form_modules']['content'][0]
        )

    @mock.patch('v1.models.base.TemplateResponse')
    @mock.patch('v1.models.base.CFGOVPage.get_template')
    @mock.patch('v1.models.base.CFGOVPage.get_context')
    @mock.patch('v1.models.base.getattr')
    def test_serve_post_returns_template_response_if_result_not_response(
            self,
            mock_getattr,
            mock_get_context,
            mock_get_template,
            mock_response):
        mock_getattr.return_value = mock.MagicMock()
        mock_get_context.return_value = mock.MagicMock()
        self.request = self.factory.post(
            '/',
            {'form_id': 'form-content-0'},
            HTTP_X_REQUESTED_WITH='XMLHttpRequest'
        )
        result = self.page.serve_post(self.request)
        mock_response.assert_called_with(
            self.request, mock_get_template(), mock_get_context()
        )
        self.assertEqual(result, mock_response())
예제 #13
0
 def test_empty_page_has_no_streamfield_js(self):
     return self.assertEqual(CFGOVPage().streamfield_js, [])
예제 #14
0
    def test_no_root_returns_correctly(self):
        page = CFGOVPage(title='Test page')
        helpers.save_new_page(page)

        self.assertEqual(util.get_page_from_path('/test-page/'), page)
예제 #15
0
 def test_empty_page_has_no_media(self):
     return self.assertEqual(CFGOVPage().media, [])
예제 #16
0
 def test_empty_page_has_no_page_js(self):
     return self.assertEqual(CFGOVPage().page_js, [])
예제 #17
0
 def setUp(self):
     self.page = CFGOVPage(title='Test', slug='test')
     self.factory = RequestFactory()
     self.request = self.factory.get('/')
예제 #18
0
 def test_live_with_another_live_page(self):
     page = CFGOVPage(title='test', slug='test', live=True)
     save_new_page(page)
     self.check_live_counts(on_live_host=2)
예제 #19
0
    def make_page_with_category(self, category):
        page = CFGOVPage(title='title', slug=get_random_string())
        publish_page(page)

        category = CFGOVPageCategory(page=page, name=category)
        category.save()
예제 #20
0
class TestCFGOVPage(TestCase):
    def setUp(self):
        self.page = CFGOVPage(title='Test', slug='test')
        self.factory = RequestFactory()
        self.request = self.factory.get('/')

    def test_post_preview_cache_key_contains_page_id(self):
        save_new_page(self.page)
        key = self.page.post_preview_cache_key
        self.assertIn(str(self.page.id), key)

    @mock.patch('builtins.super')
    def test_serve_calls_super_on_non_ajax_request(self, mock_super):
        self.page.serve(self.request)
        mock_super.assert_called_with(CFGOVPage, self.page)
        mock_super().serve.assert_called_with(self.request)

    @mock.patch('v1.models.base.CFGOVPage.serve_post')
    def test_serve_calls_serve_post_on_post_request(self, mock_serve_post):
        self.request = self.factory.post('/')
        self.page.serve(self.request)
        mock_serve_post.assert_called_with(self.request)

    def test_serve_post_returns_400_for_no_form_id(self):
        request = self.factory.post('/')
        response = self.page.serve_post(request)
        self.assertIsInstance(response, HttpResponseBadRequest)

    def test_serve_post_returns_json_400_for_no_form_id(self):
        request = self.factory.post('/',
                                    HTTP_X_REQUESTED_WITH='XMLHttpRequest')
        response = self.page.serve_post(request)
        self.assertEqual(response.content, b'{"result": "error"}')
        self.assertEqual(response.status_code, 400)

    def test_serve_post_returns_400_for_invalid_form_id_wrong_parts(self):
        request = self.factory.post('/', {'form_id': 'foo'})
        response = self.page.serve_post(request)
        self.assertIsInstance(response, HttpResponseBadRequest)

    def test_serve_post_returns_400_for_invalid_form_id_invalid_field(self):
        request = self.factory.post('/', {'form_id': 'form-foo-2'})
        response = self.page.serve_post(request)
        self.assertIsInstance(response, HttpResponseBadRequest)

    def test_serve_post_returns_400_for_invalid_form_id_invalid_index(self):
        page = BrowsePage(title='test', slug='test')
        request = self.factory.post('/', {'form_id': 'form-content-99'})
        response = page.serve_post(request)
        self.assertIsInstance(response, HttpResponseBadRequest)

    def test_serve_post_returns_400_for_invalid_form_id_non_number_index(self):
        page = BrowsePage(title='test', slug='test')
        request = self.factory.post('/', {'form_id': 'form-content-abc'})
        response = page.serve_post(request)
        self.assertIsInstance(response, HttpResponseBadRequest)

    def test_serve_post_returns_400_for_invalid_form_id_no_form_present(self):
        page = BrowsePage(title='test', slug='test')
        page.content = blocks.StreamValue(page.content.stream_block,
                                          [{
                                              'type': 'full_width_text',
                                              'value': []
                                          }], True)
        save_new_page(page)

        request = self.factory.post('/', {'form_id': 'form-content-0'})
        response = page.serve_post(request)
        self.assertIsInstance(response, HttpResponseBadRequest)

    def test_serve_post_valid_calls_feedback_block_handler(self):
        """A valid post should call the feedback block handler.

        This returns a redirect to the calling page and also uses the
        Django messages framework to set a message.
        """
        page = BrowsePage(title='test', slug='test')
        page.content = blocks.StreamValue(page.content.stream_block,
                                          [{
                                              'type': 'feedback',
                                              'value': 'something'
                                          }], True)
        save_new_page(page)

        request = self.factory.post('/', {'form_id': 'form-content-0'})
        SessionMiddleware().process_request(request)
        MessageMiddleware().process_request(request)

        response = page.serve_post(request)

        self.assertEqual((response.status_code, response['Location']),
                         (302, request.path))

    @mock.patch('v1.models.base.TemplateResponse')
    @mock.patch('v1.models.base.CFGOVPage.get_template')
    @mock.patch('v1.models.base.CFGOVPage.get_context')
    @mock.patch('v1.models.base.getattr')
    def test_serve_post_gets_streamfield_from_page_using_form_id(
            self, mock_getattr, mock_get_context, mock_get_template,
            mock_response):
        mock_getattr.return_value = mock.MagicMock()
        mock_get_context.return_value = mock.MagicMock()
        self.request = self.factory.post(
            '/', {'form_id': 'form-content-0'},
            HTTP_X_REQUESTED_WITH='XMLHttpRequest')
        self.page.serve_post(self.request)
        mock_getattr.assert_called_with(self.page, 'content', None)

    @mock.patch('v1.models.base.TemplateResponse')
    @mock.patch('v1.models.base.CFGOVPage.get_template')
    @mock.patch('v1.models.base.CFGOVPage.get_context')
    @mock.patch('v1.models.base.getattr')
    def test_serve_post_calls_module_get_result(self, mock_getattr,
                                                mock_get_context,
                                                mock_get_template,
                                                mock_response):
        self.request = self.factory.post(
            '/', {'form_id': 'form-content-0'},
            HTTP_X_REQUESTED_WITH='XMLHttpRequest')
        self.page.serve_post(self.request)
        module = mock_getattr()[0]
        module.block.get_result.assert_called_with(self.page, self.request,
                                                   module.value, True)

    @mock.patch('v1.models.base.isinstance')
    @mock.patch('v1.models.base.TemplateResponse')
    @mock.patch('v1.models.base.CFGOVPage.get_template')
    @mock.patch('v1.models.base.CFGOVPage.get_context')
    @mock.patch('v1.models.base.getattr')
    def test_serve_post_returns_result_if_response(self, mock_getattr,
                                                   mock_get_context,
                                                   mock_get_template,
                                                   mock_response,
                                                   mock_isinstance):
        mock_getattr.return_value = mock.MagicMock()
        mock_get_context.return_value = mock.MagicMock()
        self.request = self.factory.post(
            '/', {'form_id': 'form-content-0'},
            HTTP_X_REQUESTED_WITH='XMLHttpRequest')
        result = self.page.serve_post(self.request)
        module = mock_getattr()[0]
        self.assertEqual(result, module.block.get_result())

    @mock.patch('v1.models.base.TemplateResponse')
    @mock.patch('v1.models.base.CFGOVPage.get_template')
    @mock.patch('v1.models.base.CFGOVPage.get_context')
    @mock.patch('v1.models.base.getattr')
    def test_serve_post_calls_get_context(self, mock_getattr, mock_get_context,
                                          mock_get_template, mock_response):
        mock_getattr.return_value = mock.MagicMock()
        mock_get_context.return_value = mock.MagicMock()
        self.request = self.factory.post(
            '/', {'form_id': 'form-content-0'},
            HTTP_X_REQUESTED_WITH='XMLHttpRequest')
        self.page.serve_post(self.request)
        self.assertTrue(mock_get_context.called)

    @mock.patch('v1.models.base.TemplateResponse')
    @mock.patch('v1.models.base.CFGOVPage.get_template')
    @mock.patch('v1.models.base.CFGOVPage.get_context')
    @mock.patch('v1.models.base.getattr')
    def test_serve_post_sets_context(self, mock_getattr, mock_get_context,
                                     mock_get_template, mock_response):
        context = {'form_modules': {'content': {}}}
        mock_getattr.return_value = mock.MagicMock()
        mock_get_context.return_value = context
        self.request = self.factory.post(
            '/', {'form_id': 'form-content-0'},
            HTTP_X_REQUESTED_WITH='XMLHttpRequest')
        self.page.serve_post(self.request)
        module = mock_getattr()[0]
        self.assertIn(0, context['form_modules']['content'])
        self.assertEqual(module.block.get_result(),
                         context['form_modules']['content'][0])

    @mock.patch('v1.models.base.TemplateResponse')
    @mock.patch('v1.models.base.CFGOVPage.get_template')
    @mock.patch('v1.models.base.CFGOVPage.get_context')
    @mock.patch('v1.models.base.getattr')
    def test_serve_post_returns_template_response_if_result_not_response(
            self, mock_getattr, mock_get_context, mock_get_template,
            mock_response):
        mock_getattr.return_value = mock.MagicMock()
        mock_get_context.return_value = mock.MagicMock()
        self.request = self.factory.post(
            '/', {'form_id': 'form-content-0'},
            HTTP_X_REQUESTED_WITH='XMLHttpRequest')
        result = self.page.serve_post(self.request)
        mock_response.assert_called_with(self.request, mock_get_template(),
                                         mock_get_context())
        self.assertEqual(result, mock_response())

    def test_archived_property(self):
        # Test default value of is_archived results in False property
        self.assertFalse(self.page.archived)

        self.page.is_archived = 'no'
        self.assertFalse(self.page.archived)

        self.page.is_archived = 'never'
        self.assertFalse(self.page.archived)

        self.page.is_archived = 'yes'
        self.assertTrue(self.page.archived)
예제 #21
0
    def test_with_root_returns_correctly(self):
        page = CFGOVPage(title='Test page 2')
        helpers.save_new_page(page)
        root = HomePage.objects.get(title='CFGov')

        self.assertEqual(util.get_page_from_path('/test-page-2/', root), page)
예제 #22
0
 def make_page(self, path, live):
     page = CFGOVPage(slug=path, title=path)
     page.live = live
     save_new_page(page)
     return page
예제 #23
0
 def make_page(self, path, live):
     page = CFGOVPage(slug=path, title=path)
     page.live = live
     save_new_page(page)
     return page
예제 #24
0
 def make_page(self, path, live, shared):
     page = CFGOVPage(slug=path, title=path)
     page.live = live
     page.shared = shared
     save_new_page(page)
     return page
예제 #25
0
class TestUtilFunctions(TestCase):

    def setUp(self):
        self.page = mock.Mock()
        self.request = mock.Mock()
        self.page_versions = [
            mock.Mock(**{'content_json': {'live': False, 'shared': False}}), # draft
            mock.Mock(**{'content_json': {'live': False, 'shared': True}}), # shared
            mock.Mock(**{'content_json': {'live': True, 'shared': False}}), # live
            mock.Mock(**{'content_json': {'live': True, 'shared': True}}), # live and shared
        ]
        self.page.revisions.all().order_by.return_value = self.page_versions

        self.new_page = CFGOVPage(title='a cfgov page')
        self.new_page.live = False
        self.new_page.shared = False

        helpers.save_new_page(self.new_page)
        content_json = json.loads(self.new_page.to_json())
        # create the various page revisions
        # revision 1
        content_json['title'] = 'revision 1'
        content_json['live'] = True
        content_json['shared'] = True
        self.revision_1 = self.new_page.revisions.create(content_json=json.dumps(content_json))

        # rev 2
        content_json['title'] = 'revision 2'
        content_json['live'] = True
        content_json['shared'] = False
        self.revision_2 = self.new_page.revisions.create(content_json=json.dumps(content_json))

        # rev 3
        content_json['title'] = 'revision 3'
        content_json['live'] = False
        content_json['shared'] = True
        self.revision_3 = self.new_page.revisions.create(content_json=json.dumps(content_json))

        # rev 4
        content_json['title'] = 'revision 4'
        content_json['live'] = False
        content_json['shared'] = False
        self.revision_4 = self.new_page.revisions.create(content_json=json.dumps(content_json))

    def test_production_returns_first_live_page(self):
        self.request.is_staging = False
        version = self.new_page.get_appropriate_page_version(self.request)
        self.assertEqual(version.title, 'revision 2')

    def test_shared_returns_first_shared_page(self):
        self.request.is_staging = True
        version = self.new_page.get_appropriate_page_version(self.request)
        self.assertEqual(version.title, 'revision 3')

    def test_shared_returns_None_for_only_draft_versions(self):
        self.revision_1.delete()
        self.revision_2.delete()
        self.revision_3.delete()

        version = self.new_page.get_appropriate_page_version(self.request)
        self.assertIsNone(version)

    def test_shared_returns_None_if_page_not_live_when_on_production(self):
        self.revision_1.delete()
        self.revision_2.delete()
        self.request.is_staging = False
        version = self.new_page.get_appropriate_page_version(self.request)
        self.assertIsNone(version)

    @mock.patch('__builtin__.isinstance')
    @mock.patch('__builtin__.vars')
    @mock.patch('v1.util.util.StreamValue')
    def get_streamfields_returns_dict_of_streamfields(self, mock_streamvalueclass, mock_vars, mock_isinstance):
        page = mock.Mock()
        mock_vars.items.return_value = {'key': 'value'}
        mock_isinstance.return_value = True
        result = util.get_streamfields(page)
        self.assertEqual(result, {'key': 'value'})
예제 #26
0
 def setUp(self):
     self.page = CFGOVPage(title='Test', slug='test')
     self.factory = RequestFactory()
     self.request = self.factory.get('/')
예제 #27
0
 def test_rich_text_links_get_expanded(self):
     page = CFGOVPage(title='foo bar', slug='foo-bar')
     publish_page(page)
     link = b'<a id="{}" linktype="page">foo bar</a>'.format(page.id)
     output = parse_links(link)
     self.assertEqual(b'<a href="/foo-bar/">foo bar</a>', output)