Esempio n. 1
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)
Esempio n. 2
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())