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)
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())