Пример #1
0
class AnswerPageTest(TestCase):

    fixtures = ["ask_tests", "portal_topics"]

    def create_answer_page(self, **kwargs):
        kwargs.setdefault(
            "path", get_free_path(apps, self.english_parent_page)
        )
        kwargs.setdefault("depth", self.english_parent_page.depth + 1)
        kwargs.setdefault("slug", "mock-answer-page-en-1234")
        kwargs.setdefault("title", "Mock answer page title")
        page = baker.prepare(AnswerPage, **kwargs)
        page.save()
        return page

    def setUp(self):
        self.test_user = User.objects.get(pk=1)
        self.ROOT_PAGE = HomePage.objects.get(slug="cfgov")
        self.category = baker.make(
            Category, name="stub_cat", name_es="que", slug="stub-cat"
        )
        self.category.save()
        self.test_image = baker.make(CFGOVImage)
        self.test_image2 = baker.make(CFGOVImage)
        self.next_step = baker.make(NextStep, title="stub_step")
        self.portal_topic = baker.make(
            PortalTopic, heading="test topic", heading_es="prueba tema"
        )
        page_clean = mock.patch("ask_cfpb.models.pages.CFGOVPage.clean")
        page_clean.start()
        self.addCleanup(page_clean.stop)
        self.portal_page = SublandingPage(
            title="test portal page",
            slug="test-portal-page",
            portal_topic=self.portal_topic,
            language="en",
        )
        self.ROOT_PAGE.add_child(instance=self.portal_page)
        self.portal_page.save()
        self.portal_page.save_revision().publish()
        self.portal_page_es = SublandingPage(
            title="test portal page",
            slug="test-portal-page-es",
            portal_topic=self.portal_topic,
            language="es",
        )
        self.ROOT_PAGE.add_child(instance=self.portal_page_es)
        self.portal_page_es.save()
        self.portal_page_es.save_revision().publish()
        self.english_parent_page = get_or_create_page(
            apps,
            "ask_cfpb",
            "AnswerLandingPage",
            "Ask CFPB",
            ENGLISH_PARENT_SLUG,
            self.ROOT_PAGE,
            language="en",
            live=True,
        )
        self.spanish_parent_page = get_or_create_page(
            apps,
            "ask_cfpb",
            "AnswerLandingPage",
            "Obtener respuestas",
            SPANISH_PARENT_SLUG,
            self.ROOT_PAGE,
            language="es",
            live=True,
        )
        self.tag_results_page_en = get_or_create_page(
            apps,
            "ask_cfpb",
            "TagResultsPage",
            "Tag results page",
            "search-by-tag",
            self.ROOT_PAGE,
            language="en",
            live=True,
        )
        self.tag_results_page_es = get_or_create_page(
            apps,
            "ask_cfpb",
            "TagResultsPage",
            "Tag results page",
            "buscar-por-etiqueta",
            self.ROOT_PAGE,
            language="es",
            live=True,
        )
        self.answer1234 = Answer(id=1234)
        self.answer1234.save()
        self.page1 = AnswerPage(
            language="en",
            answer_base=self.answer1234,
            slug="mock-question-en-1234",
            title="Mock question1",
            answer_content="Mock answer 1",
            question="Mock question1",
            search_tags="hippodrome",
        )
        self.english_parent_page.add_child(instance=self.page1)
        self.page1.save_revision().publish()
        self.page1_es = AnswerPage(
            language="es",
            slug="mock-spanish-question1-es-1234",
            title="Mock Spanish question1",
            answer_base=self.answer1234,
            answer_content="Mock Spanish answer",
            question="Mock Spanish question1",
            search_tags="hipotecas",
        )
        self.spanish_parent_page.add_child(instance=self.page1_es)
        self.page1_es.save_revision().publish()
        self.answer5678 = Answer(id=5678)
        self.answer5678.save()
        self.page2 = AnswerPage(
            language="en",
            slug="mock-question2-en-5678",
            title="Mock question2",
            answer_base=self.answer5678,
            answer_content="Mock answer 2",
            question="Mock question2",
            search_tags="hippodrome",
        )
        self.english_parent_page.add_child(instance=self.page2)
        self.page2.save_revision().publish()

    def test_tag_results_page_templates(self):
        self.assertEqual(
            self.tag_results_page_es.get_template(HttpRequest()),
            self.tag_results_page_en.get_template(HttpRequest()),
        )

    def test_tag_results_page_context_language(self):
        context = self.tag_results_page_es.get_context(HttpRequest())
        self.assertEqual(
            context.get("breadcrumb_items")[0]["title"], "Obtener respuestas"
        )

    def test_answer_content_preview_word(self):
        """answer_content_preview returns truncated text by word count

        And without HTML tags.
        """

        page = self.page1
        stream_data = [
            {
                "type": "video_player",
                "id": "402b933b",
                "value": {
                    "video_url": "https://www.youtube.com/embed/wcQ1a_Gg8tI"
                },
            },
            {
                "type": "text",
                "id": "402b933c",
                "value": {
                    "content": (
                        "<p><span>"
                        "This is more than forty words: "
                        "word word word word word word word word word word "
                        "word word word word word word word word word word "
                        "word word word word word word word word word word "
                        "word word word word word word too-many."
                        "</span></p>"
                    )
                },
            },
        ]
        set_stream_data(page, "answer_content", stream_data)
        self.assertTrue(
            page.answer_content_preview().endswith("word word ...")
        )

    def test_answer_content_preview_char(self):
        """answer_content_preview returns truncated text by character count

        And without HTML tags.
        """

        page = self.page1
        stream_data = [
            {
                "type": "video_player",
                "id": "402b933b",
                "value": {
                    "video_url": "https://www.youtube.com/embed/wcQ1a_Gg8tI"
                },
            },
            {
                "type": "text",
                "id": "402b933c",
                "value": {
                    "content": (
                        "<p><span>"
                        "This a word with more than 255 characters: "
                        "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
                        "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
                        "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
                        "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
                        "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
                        "char char char char char char char char char char "
                        "char char char char char char char char char char "
                        "char char char char char char char char char char "
                        "char char char char char char too-many."
                        "</span></p>"
                    )
                },
            },
        ]
        set_stream_data(page, "answer_content", stream_data)
        self.assertTrue(page.answer_content_preview().endswith(" ..."))

    def test_english_page_context(self):
        from ask_cfpb.models.pages import get_reusable_text_snippet
        from v1.models.snippets import ReusableText

        rt = ReusableText(title="About us (For consumers)")
        rt.save()
        page = self.page1
        page.language = "en"
        page.save()
        test_context = page.get_context(HttpRequest())
        self.assertEqual(
            test_context["about_us"],
            get_reusable_text_snippet("About us (For consumers)"),
        )

    def test_get_meta_description(self):
        page = self.page1
        # Defaults to empty string
        self.assertEqual(
            page.get_meta_description(),
            ""
        )

        # Second fallback is truncated answer_content text block
        stream_data = [
            {
                "type": "video_player",
                "id": "402b933b",
                "value": {
                    "video_url": "https://www.youtube.com/embed/wcQ1a_Gg8tI"
                },
            },
            {
                "type": "text",
                "id": "402b933c",
                "value": {
                    "content": (
                        "<p><span>"
                        "This is more than forty words: "
                        "word word word word word word word word word word "
                        "word word word word word word word word word word "
                        "word word word word word word word word word word "
                        "word word word word word word too-many."
                        "</span></p>"
                    )
                },
            },
        ]
        set_stream_data(page, "answer_content", stream_data)
        self.assertTrue(page.get_meta_description().endswith("word word ..."))

        # First fallback is the short_answer
        page.short_answer = "Test short answer"
        self.assertEqual(page.get_meta_description(), page.short_answer)

        # First choice is the search_description
        page.search_description = "Test search description"
        self.assertEqual(page.get_meta_description(), page.search_description)

    def test_english_page_sibling_url(self):
        self.assertEqual(self.page1.get_sibling_url(), self.page1_es.url)

    def test_spanish_page_sibling_url(self):
        self.assertEqual(self.page1_es.get_sibling_url(), self.page1.url)

    def test_no_sibling_url_returned_for_redirected_page(self):
        self.page1_es.redirect_to_page = self.page2
        self.page1_es.save()
        self.page1_es.save_revision(user=self.test_user).publish()
        self.assertEqual(self.page1.get_sibling_url(), None)

    def test_no_sibling_url_returned_for_draft_page(self):
        self.page1.unpublish()
        self.assertEqual(self.page1_es.get_sibling_url(), None)

    def test_routable_tag_page_base_returns_404(self):
        page = self.tag_results_page_en
        response = self.client.get(page.url + page.reverse_subpage("tag_base"))
        self.assertEqual(response.status_code, 404)

    def test_routable_tag_page_handles_bad_tag(self):
        page = self.tag_results_page_en
        response = self.client.get(
            page.url
            + page.reverse_subpage(
                "tag_search", kwargs={"tag": "hippopotamus"}
            )
        )
        self.assertEqual(response.status_code, 200)

    def test_routable_tag_page_handles_bad_pagination(self):
        page = self.tag_results_page_en
        response = self.client.get(
            page.url
            + page.reverse_subpage("tag_search", kwargs={"tag": "hippodrome"}),
            {"page": "100"},
        )
        self.assertEqual(response.status_code, 200)

    def test_routable_tag_page_valid_tag_returns_200(self):
        page = self.tag_results_page_en
        response = self.client.get(
            page.url
            + page.reverse_subpage("tag_search", kwargs={"tag": "hippodrome"})
        )
        self.assertEqual(response.status_code, 200)

    def test_routable_tag_page_returns_url_suffix(self):
        page = self.tag_results_page_en
        response = page.reverse_subpage(
            "tag_search", kwargs={"tag": "hippodrome"}
        )
        self.assertEqual(response, "hippodrome/")

    def test_view_answer_exact_slug(self):
        page = self.page1
        page.slug = "mock-answer-en-1234"
        page.save()
        revision = page.save_revision()
        revision.publish()
        response = self.client.get(
            reverse("ask-english-answer", args=["mock-answer", "en", 1234])
        )
        self.assertEqual(response.status_code, 200)

    def test_view_answer_301_for_healed_slug(self):
        page = self.page1
        revision = page.save_revision()
        revision.publish()
        response = self.client.get(
            reverse("ask-english-answer", args=["mock-slug", "en", 1234])
        )
        self.assertEqual(response.status_code, 301)

    def test_view_answer_redirected(self):
        page = self.page1
        page.redirect_to = self.page2.answer_base
        page.save()
        revision = page.save_revision()
        revision.publish()
        response_302 = self.client.get(
            reverse(
                "ask-english-answer", args=["mocking-answer-page", "en", 1234]
            )
        )
        self.assertTrue(isinstance(response_302, HttpResponse))
        self.assertEqual(response_302.status_code, 301)

    def test_spanish_answer_page_handles_referrer_with_unicode_accents(self):
        referrer_unicode = (
            "https://www.consumerfinance.gov/es/obtener-respuestas/"
            "buscar-por-etiqueta/empresas_de_informes_de_cr\xe9dito/"
        )
        spanish_page = self.page1_es
        request = HttpRequest()
        request.POST["referrer"] = referrer_unicode
        response = spanish_page.serve(request)
        self.assertEqual(response.status_code, 200)

    def test_page_string_no_base(self):
        test_page = self.create_answer_page()
        result = test_page.__str__()
        self.assertEqual(result, test_page.title)

    def test_page_string_with_base(self):
        page = self.page1
        self.assertTrue(page.answer_base)
        result = page.__str__()
        self.assertEqual(
            result, "{}: {}".format(page.answer_base.pk, page.title)
        )

    def test_search_tags(self):
        """Test the list produced by page.clean_search_tags()."""
        page = self.page1
        page.search_tags = "Chutes, Ladders"
        page.save_revision().publish()
        taglist = page.clean_search_tags
        for name in ["Chutes", "Ladders"]:
            self.assertIn(name, taglist)

    def test_english_header_and_footer(self):
        english_answer_page_response = self.client.get(
            reverse("ask-english-answer", args=["mock-question", "en", 1234])
        )
        self.assertContains(
            english_answer_page_response,
            "An official website of the United States government",
        )
        self.assertNotContains(
            english_answer_page_response,
            "Un sitio web oficial del gobierno federal de los Estados Unidos",
        )
        self.assertContains(english_answer_page_response, "https://usa.gov/")
        self.assertNotContains(
            english_answer_page_response, "https://gobiernousa.gov/"
        )

    def test_spanish_header_and_footer(self):
        spanish_answer_page_response = self.client.get(
            reverse(
                "ask-spanish-answer",
                args=["mock-spanish-question1", "es", 1234],
            )
        )
        self.assertContains(
            spanish_answer_page_response,
            "Un sitio web oficial del gobierno federal de los Estados Unidos",
        )
        self.assertNotContains(
            spanish_answer_page_response,
            "An official website of the United States government",
        )
        self.assertContains(
            spanish_answer_page_response, "https://gobiernousa.gov/"
        )
        self.assertNotContains(
            spanish_answer_page_response, "https://usa.gov/"
        )

    def test_category_str(self):
        category = self.category
        self.assertEqual(category.__str__(), category.name)

    def test_portal_topic_featured_answers(self):
        page = self.page1
        page.portal_topic.add(self.portal_topic)
        page.featured = True
        page.save_revision().publish()
        self.assertIn(page, self.portal_topic.featured_answers("en"))

    def test_nextstep_str(self):
        next_step = self.next_step
        self.assertEqual(next_step.__str__(), next_step.title)

    def test_status_string(self):
        with translation.override("en"):
            page1 = self.page1
            self.assertEqual(page1.status_string, "live + draft")

    def test_status_string_redirected(self):
        with translation.override("en"):
            page1 = self.page1
            page1.redirect_to_page = self.page2
            page1.save()
            page1.get_latest_revision().publish()
            self.assertEqual(page1.status_string, "redirected")
            page1.unpublish()
            self.assertEqual(page1.status_string, "redirected but not live")

    def test_get_ask_breadcrumbs(self):
        from ask_cfpb.models import get_ask_breadcrumbs

        breadcrumbs = get_ask_breadcrumbs()
        self.assertEqual(len(breadcrumbs), 1)
        self.assertEqual(breadcrumbs[0]["title"], "Ask CFPB")

    def test_landing_page_context_no_featured_answer(self):
        page = self.page1
        page.portal_topic.add(self.portal_topic)
        page.featured = False
        page.save_revision().publish()
        mock_site = mock.Mock()
        mock_site.hostname = "localhost"
        mock_request = HttpRequest()
        landing_page = self.english_parent_page
        test_context = landing_page.get_context(mock_request)
        self.assertEqual(len(test_context["portal_cards"]), 0)

    def test_landing_page_context(self):
        page = self.page1
        page.portal_topic.add(self.portal_topic)
        page.featured = True
        page.save_revision().publish()
        mock_site = mock.Mock()
        mock_site.hostname = "localhost"
        mock_request = HttpRequest()
        landing_page = self.english_parent_page
        test_context = landing_page.get_context(mock_request)
        self.assertEqual(len(test_context["portal_cards"]), 1)
        self.assertEqual(
            test_context["portal_cards"][0]["title"], "test topic"
        )

    def test_spanish_landing_page_context(self):
        page = self.page1_es
        page.portal_topic.add(self.portal_topic)
        page.featured = True
        page.save_revision().publish()
        mock_site = mock.Mock()
        mock_site.hostname = "localhost"
        mock_request = HttpRequest()
        landing_page = self.spanish_parent_page
        test_context = landing_page.get_context(mock_request)
        self.assertEqual(len(test_context["portal_cards"]), 1)
        self.assertEqual(
            test_context["portal_cards"][0]["title"], "prueba tema"
        )

    def test_landing_page_context_draft_portal_page(self):
        page = self.page1
        page.portal_topic.add(self.portal_topic)
        page.featured = True
        page.save_revision().publish()
        self.portal_page.unpublish()
        mock_site = mock.Mock()
        mock_site.hostname = "localhost"
        mock_request = HttpRequest()
        landing_page = self.english_parent_page
        test_context = landing_page.get_context(mock_request)
        self.assertEqual(len(test_context["portal_cards"]), 0)

    def test_answer_language_page_exists(self):
        self.assertEqual(self.answer5678.english_page, self.page2)

    def test_answer_language_page_nonexistent(self):
        self.assertEqual(self.answer5678.spanish_page, None)

    def test_get_reusable_text_snippet(self):
        from ask_cfpb.models import get_reusable_text_snippet
        from v1.models.snippets import ReusableText

        test_snippet = ReusableText.objects.create(title="Test Snippet")
        self.assertEqual(
            get_reusable_text_snippet("Test Snippet"), test_snippet
        )

    def test_get_nonexistent_reusable_text_snippet(self):
        from ask_cfpb.models import get_reusable_text_snippet

        self.assertEqual(
            get_reusable_text_snippet("Nonexistent Snippet"), None
        )

    def test_get_about_us_english_standard_text(self):
        from ask_cfpb.models import get_standard_text
        from v1.models.snippets import ReusableText

        snippet_title = REUSABLE_TEXT_TITLES["about_us"]["en"]
        test_snippet = ReusableText.objects.create(title=snippet_title)
        self.assertEqual(get_standard_text("en", "about_us"), test_snippet)

    def test_social_sharing_image_used(self):
        from v1.models.images import CFGOVImage

        image = CFGOVImage.objects.last()
        page = self.page1
        page.social_sharing_image = image
        page.save_revision(user=self.test_user).publish()
        self.assertEqual(page.meta_image, image)

    def test_answer_meta_image_undefined(self):
        """ Answer page's meta image is undefined if social image is
        not provided
        """
        answer = Answer()
        answer.save()
        page = self.create_answer_page(answer_base=answer)
        self.assertIsNone(page.meta_image)

    def test_answer_meta_image_uses_category_image_if_no_social_image(self):
        """ Answer page's meta image is its category's image """
        category = baker.make(Category, category_image=self.test_image)
        page = self.page1
        page.category.add(category)
        page.save_revision()
        self.assertEqual(page.meta_image, self.test_image)

    def test_answer_split_testing_id(self):
        """Confirm AnswerPage's split_testing_id is set to its answer_base.id,
        which is checked by the core.feature_flags.in_split_testing_cluster
        flag condition when doing split testing on Ask CFPB answer pages."""
        answer = self.answer1234
        page = answer.english_page
        self.assertEqual(page.split_test_id, answer.id)

    def test_validate_pagination_number(self):
        paginator = Paginator([{"fake": "results"}] * 30, 25)
        request = HttpRequest()
        self.assertEqual(validate_page_number(request, paginator), 1)
        request.GET.update({"page": "2"})
        self.assertEqual(validate_page_number(request, paginator), 2)
        request = HttpRequest()
        request.GET.update({"page": "1000"})
        self.assertEqual(validate_page_number(request, paginator), 1)
        request = HttpRequest()
        request.GET.update({"page": "<script>Boo</script>"})
        self.assertEqual(validate_page_number(request, paginator), 1)
Пример #2
0
class AnswerPageTestCase(TestCase):

    fixtures = ['ask_tests', 'portal_topics']

    def create_answer_page(self, **kwargs):
        kwargs.setdefault('path', get_free_path(apps,
                                                self.english_parent_page))
        kwargs.setdefault('depth', self.english_parent_page.depth + 1)
        kwargs.setdefault('slug', 'mock-answer-page-en-1234')
        kwargs.setdefault('title', 'Mock answer page title')
        page = mommy.prepare(AnswerPage, **kwargs)
        page.save()
        return page

    def setUp(self):
        self.test_user = User.objects.get(pk=1)
        ROOT_PAGE = HomePage.objects.get(slug='cfgov')
        self.category = mommy.make(Category,
                                   name='stub_cat',
                                   name_es='que',
                                   slug='stub-cat')
        self.category.save()
        self.test_image = mommy.make(CFGOVImage)
        self.test_image2 = mommy.make(CFGOVImage)
        self.next_step = mommy.make(NextStep, title='stub_step')
        self.portal_topic = mommy.make(PortalTopic,
                                       heading='test topic',
                                       heading_es='prueba tema')
        page_clean = mock.patch('ask_cfpb.models.pages.CFGOVPage.clean')
        page_clean.start()
        self.addCleanup(page_clean.stop)
        self.portal_page = SublandingPage(title='test portal page',
                                          slug='test-portal-page',
                                          portal_topic=self.portal_topic,
                                          language='en')
        ROOT_PAGE.add_child(instance=self.portal_page)
        self.portal_page.save()
        self.portal_page.save_revision().publish()
        self.portal_page_es = SublandingPage(title='test portal page',
                                             slug='test-portal-page-es',
                                             portal_topic=self.portal_topic,
                                             language='es')
        ROOT_PAGE.add_child(instance=self.portal_page_es)
        self.portal_page_es.save()
        self.portal_page_es.save_revision().publish()
        self.english_parent_page = get_or_create_page(apps,
                                                      'ask_cfpb',
                                                      'AnswerLandingPage',
                                                      'Ask CFPB',
                                                      ENGLISH_PARENT_SLUG,
                                                      ROOT_PAGE,
                                                      language='en',
                                                      live=True)
        self.spanish_parent_page = get_or_create_page(apps,
                                                      'ask_cfpb',
                                                      'AnswerLandingPage',
                                                      'Obtener respuestas',
                                                      SPANISH_PARENT_SLUG,
                                                      ROOT_PAGE,
                                                      language='es',
                                                      live=True)
        self.tag_results_page_en = get_or_create_page(apps,
                                                      'ask_cfpb',
                                                      'TagResultsPage',
                                                      'Tag results page',
                                                      'search-by-tag',
                                                      ROOT_PAGE,
                                                      language='en',
                                                      live=True)
        self.tag_results_page_es = get_or_create_page(apps,
                                                      'ask_cfpb',
                                                      'TagResultsPage',
                                                      'Tag results page',
                                                      'buscar-por-etiqueta',
                                                      ROOT_PAGE,
                                                      language='es',
                                                      live=True)
        self.answer1234 = Answer(id=1234)
        self.answer1234.save()
        self.page1 = AnswerPage(language='en',
                                answer_base=self.answer1234,
                                slug='mock-question-en-1234',
                                title='Mock question1',
                                answer_content='Mock answer 1',
                                question='Mock question1',
                                search_tags='hippodrome')
        self.english_parent_page.add_child(instance=self.page1)
        self.page1.save_revision().publish()
        self.page1_es = AnswerPage(language='es',
                                   slug='mock-spanish-question1-es-1234',
                                   title='Mock Spanish question1',
                                   answer_base=self.answer1234,
                                   answer_content='Mock Spanish answer',
                                   question='Mock Spanish question1',
                                   search_tags='hipotecas')
        self.spanish_parent_page.add_child(instance=self.page1_es)
        self.page1_es.save_revision().publish()
        self.answer5678 = Answer(id=5678)
        self.answer5678.save()
        self.page2 = AnswerPage(language='en',
                                slug='mock-question2-en-5678',
                                title='Mock question2',
                                answer_base=self.answer5678,
                                answer_content='Mock answer 2',
                                question='Mock question2',
                                search_tags='hippodrome')
        self.english_parent_page.add_child(instance=self.page2)
        self.page2.save_revision().publish()

    def test_tag_results_page_templates(self):
        self.assertEqual(self.tag_results_page_es.get_template(HttpRequest()),
                         self.tag_results_page_en.get_template(HttpRequest()))

    def test_tag_results_page_context_language(self):
        context = self.tag_results_page_es.get_context(HttpRequest())
        self.assertEqual(
            context.get('breadcrumb_items')[0]['title'], 'Obtener respuestas')

    def test_get_answer_preview(self):
        """Check that get_answer_preview returns truncated text, no tags."""
        page = self.page1
        stream_data = [{
            'type': 'video_player',
            'id': '402b933b',
            'value': {
                'video_url': 'https://www.youtube.com/embed/wcQ1a_Gg8tI'
            }
        }, {
            'type': 'text',
            'id': '402b933c',
            'value': {
                'content':
                ('<p><span>'
                 'This is more than forty words: '
                 'word word word word word word word word word word '
                 'word word word word word word word word word word '
                 'word word word word word word word word word word '
                 'word word word word word word too-many.'
                 '</span></p>')
            }
        }]
        set_stream_data(page, 'answer_content', stream_data)
        self.assertTrue(get_answer_preview(page).endswith('word word ...'))

    def test_english_page_context(self):
        from v1.models.snippets import ReusableText
        from ask_cfpb.models.pages import get_reusable_text_snippet
        rt = ReusableText(title='About us (For consumers)')
        rt.save()
        page = self.page1
        page.language = 'en'
        page.save()
        test_context = page.get_context(HttpRequest())
        self.assertEqual(test_context['about_us'],
                         get_reusable_text_snippet('About us (For consumers)'))

    def test_english_page_sibling_url(self):
        self.assertEqual(self.page1.get_sibling_url(), self.page1_es.url)

    def test_spanish_page_sibling_url(self):
        self.assertEqual(self.page1_es.get_sibling_url(), self.page1.url)

    def test_no_sibling_url_returned_for_redirected_page(self):
        self.page1_es.redirect_to_page = self.page2
        self.page1_es.save()
        self.page1_es.save_revision(user=self.test_user).publish()
        self.assertEqual(self.page1.get_sibling_url(), None)

    def test_no_sibling_url_returned_for_draft_page(self):
        self.page1.unpublish()
        self.assertEqual(self.page1_es.get_sibling_url(), None)

    def test_routable_tag_page_base_returns_404(self):
        page = self.tag_results_page_en
        response = self.client.get(page.url + page.reverse_subpage('tag_base'))
        self.assertEqual(response.status_code, 404)

    def test_routable_tag_page_handles_bad_tag(self):
        page = self.tag_results_page_en
        response = self.client.get(
            page.url +
            page.reverse_subpage('tag_search', kwargs={'tag': 'hippopotamus'}))
        self.assertEqual(response.status_code, 200)

    def test_routable_tag_page_handles_bad_pagination(self):
        page = self.tag_results_page_en
        response = self.client.get(
            page.url +
            page.reverse_subpage('tag_search', kwargs={'tag': 'hippodrome'}),
            {'page': '100'})
        self.assertEqual(response.status_code, 200)

    def test_routable_tag_page_valid_tag_returns_200(self):
        page = self.tag_results_page_en
        response = self.client.get(
            page.url +
            page.reverse_subpage('tag_search', kwargs={'tag': 'hippodrome'}))
        self.assertEqual(response.status_code, 200)

    def test_routable_tag_page_returns_url_suffix(self):
        page = self.tag_results_page_en
        response = page.reverse_subpage('tag_search',
                                        kwargs={'tag': 'hippodrome'})
        self.assertEqual(response, 'hippodrome/')

    def test_view_answer_exact_slug(self):
        page = self.page1
        page.slug = 'mock-answer-en-1234'
        page.save()
        revision = page.save_revision()
        revision.publish()
        response = self.client.get(
            reverse('ask-english-answer', args=['mock-answer', 'en', 1234]))
        self.assertEqual(response.status_code, 200)

    def test_view_answer_301_for_healed_slug(self):
        page = self.page1
        revision = page.save_revision()
        revision.publish()
        response = self.client.get(
            reverse('ask-english-answer', args=['mock-slug', 'en', 1234]))
        self.assertEqual(response.status_code, 301)

    def test_view_answer_redirected(self):
        page = self.page1
        page.redirect_to = self.page2.answer_base
        page.save()
        revision = page.save_revision()
        revision.publish()
        response_302 = self.client.get(
            reverse('ask-english-answer',
                    args=['mocking-answer-page', 'en', 1234]))
        self.assertTrue(isinstance(response_302, HttpResponse))
        self.assertEqual(response_302.status_code, 301)

    def test_spanish_answer_page_handles_referrer_with_unicode_accents(self):
        referrer_unicode = (
            'https://www.consumerfinance.gov/es/obtener-respuestas/'
            'buscar-por-etiqueta/empresas_de_informes_de_cr\xe9dito/')
        spanish_page = self.page1_es
        request = HttpRequest()
        request.POST['referrer'] = referrer_unicode
        response = spanish_page.serve(request)
        self.assertEqual(response.status_code, 200)

    def test_page_string_no_base(self):
        test_page = self.create_answer_page()
        result = test_page.__str__()
        self.assertEqual(result, test_page.title)

    def test_page_string_with_base(self):
        page = self.page1
        self.assertTrue(page.answer_base)
        result = page.__str__()
        self.assertEqual(result, "{}: {}".format(page.answer_base.pk,
                                                 page.title))

    def test_search_tags(self):
        """Test the list produced by page.clean_search_tags()"""
        page = self.page1
        page.search_tags = 'Chutes, Ladders'
        page.save_revision().publish()
        taglist = page.clean_search_tags
        for name in ['Chutes', 'Ladders']:
            self.assertIn(name, taglist)

    def test_english_header_and_footer(self):
        english_answer_page_response = self.client.get(
            reverse('ask-english-answer', args=['mock-question', 'en', 1234]))
        self.assertContains(
            english_answer_page_response,
            'An official website of the United States government')
        self.assertNotContains(
            english_answer_page_response,
            'Un sitio web oficial del gobierno federal de los Estados Unidos')
        self.assertContains(english_answer_page_response, 'https://usa.gov/')
        self.assertNotContains(english_answer_page_response,
                               'https://gobiernousa.gov/')

    def test_spanish_header_and_footer(self):
        spanish_answer_page_response = self.client.get(
            reverse('ask-spanish-answer',
                    args=['mock-spanish-question1', 'es', 1234]))
        self.assertContains(
            spanish_answer_page_response,
            'Un sitio web oficial del gobierno federal de los Estados Unidos')
        self.assertNotContains(
            spanish_answer_page_response,
            'An official website of the United States government')
        self.assertContains(spanish_answer_page_response,
                            'https://gobiernousa.gov/')
        self.assertNotContains(spanish_answer_page_response,
                               'https://usa.gov/')

    def test_category_str(self):
        category = self.category
        self.assertEqual(category.__str__(), category.name)

    def test_portal_topic_featured_answers(self):
        page = self.page1
        page.portal_topic.add(self.portal_topic)
        page.featured = True
        page.save_revision().publish()
        self.assertIn(page, self.portal_topic.featured_answers('en'))

    def test_nextstep_str(self):
        next_step = self.next_step
        self.assertEqual(next_step.__str__(), next_step.title)

    def test_status_string(self):
        with translation.override('en'):
            page1 = self.page1
            self.assertEqual((page1.status_string), 'live + draft')

    def test_status_string_redirected(self):
        with translation.override('en'):
            page1 = self.page1
            page1.redirect_to_page = self.page2
            page1.save()
            page1.get_latest_revision().publish()
            self.assertEqual((page1.status_string), "redirected")
            page1.unpublish()
            self.assertEqual(page1.status_string, ("redirected but not live"))

    def test_get_ask_breadcrumbs(self):
        from ask_cfpb.models import get_ask_breadcrumbs
        breadcrumbs = get_ask_breadcrumbs()
        self.assertEqual(len(breadcrumbs), 1)
        self.assertEqual(breadcrumbs[0]['title'], 'Ask CFPB')

    def test_landing_page_context_no_featured_answer(self):
        page = self.page1
        page.portal_topic.add(self.portal_topic)
        page.featured = False
        page.save_revision().publish()
        mock_site = mock.Mock()
        mock_site.hostname = 'localhost'
        mock_request = HttpRequest()
        mock_request.site = mock_site
        landing_page = self.english_parent_page
        test_context = landing_page.get_context(mock_request)
        self.assertEqual(len(test_context['portal_cards']), 0)

    def test_landing_page_context(self):
        page = self.page1
        page.portal_topic.add(self.portal_topic)
        page.featured = True
        page.save_revision().publish()
        mock_site = mock.Mock()
        mock_site.hostname = 'localhost'
        mock_request = HttpRequest()
        mock_request.site = mock_site
        landing_page = self.english_parent_page
        test_context = landing_page.get_context(mock_request)
        self.assertEqual(len(test_context['portal_cards']), 1)
        self.assertEqual(test_context['portal_cards'][0]['title'],
                         'test topic')

    def test_spanish_landing_page_context(self):
        page = self.page1_es
        page.portal_topic.add(self.portal_topic)
        page.featured = True
        page.save_revision().publish()
        mock_site = mock.Mock()
        mock_site.hostname = 'localhost'
        mock_request = HttpRequest()
        mock_request.site = mock_site
        landing_page = self.spanish_parent_page
        test_context = landing_page.get_context(mock_request)
        self.assertEqual(len(test_context['portal_cards']), 1)
        self.assertEqual(test_context['portal_cards'][0]['title'],
                         'prueba tema')

    def test_landing_page_context_draft_portal_page(self):
        page = self.page1
        page.portal_topic.add(self.portal_topic)
        page.featured = True
        page.save_revision().publish()
        self.portal_page.unpublish()
        mock_site = mock.Mock()
        mock_site.hostname = 'localhost'
        mock_request = HttpRequest()
        mock_request.site = mock_site
        landing_page = self.english_parent_page
        test_context = landing_page.get_context(mock_request)
        self.assertEqual(len(test_context['portal_cards']), 0)

    def test_answer_language_page_exists(self):
        self.assertEqual(self.answer5678.english_page, self.page2)

    def test_answer_language_page_nonexistent(self):
        self.assertEqual(self.answer5678.spanish_page, None)

    def test_get_reusable_text_snippet(self):
        from ask_cfpb.models import get_reusable_text_snippet
        from v1.models.snippets import ReusableText
        test_snippet = ReusableText.objects.create(title='Test Snippet')
        self.assertEqual(get_reusable_text_snippet('Test Snippet'),
                         test_snippet)

    def test_get_nonexistent_reusable_text_snippet(self):
        from ask_cfpb.models import get_reusable_text_snippet
        self.assertEqual(get_reusable_text_snippet('Nonexistent Snippet'),
                         None)

    def test_get_about_us_english_standard_text(self):
        from ask_cfpb.models import get_standard_text
        from v1.models.snippets import ReusableText
        snippet_title = REUSABLE_TEXT_TITLES['about_us']['en']
        test_snippet = ReusableText.objects.create(title=snippet_title)
        self.assertEqual(get_standard_text('en', 'about_us'), test_snippet)

    def test_social_sharing_image_used(self):
        from v1.models.images import CFGOVImage
        image = CFGOVImage.objects.last()
        page = self.page1
        page.social_sharing_image = image
        page.save_revision(user=self.test_user).publish()
        self.assertEqual(page.meta_image, image)

    def test_answer_meta_image_undefined(self):
        """ Answer page's meta image is undefined if social image is
        not provided
        """
        answer = Answer()
        answer.save()
        page = self.create_answer_page(answer_base=answer)
        self.assertIsNone(page.meta_image)

    def test_answer_meta_image_uses_category_image_if_no_social_image(self):
        """ Answer page's meta image is its category's image """
        category = mommy.make(Category, category_image=self.test_image)
        page = self.page1
        page.category.add(category)
        page.save_revision()
        self.assertEqual(page.meta_image, self.test_image)

    def test_answer_split_testing_id(self):
        """Confirm AnswerPage's split_testing_id is set to its answer_base.id,
        which is checked by the core.feature_flags.in_split_testing_cluster
        flag condition when doing split testing on Ask CFPB answer pages."""
        answer = self.answer1234
        page = answer.english_page
        self.assertEqual(page.split_test_id, answer.id)

    def test_validate_pagination_number(self):
        paginator = Paginator([{'fake': 'results'}] * 30, 25)
        request = HttpRequest()
        self.assertEqual(validate_page_number(request, paginator), 1)
        request.GET.update({'page': '2'})
        self.assertEqual(validate_page_number(request, paginator), 2)
        request = HttpRequest()
        request.GET.update({'page': '1000'})
        self.assertEqual(validate_page_number(request, paginator), 1)
        request = HttpRequest()
        request.GET.update({'page': '<script>Boo</script>'})
        self.assertEqual(validate_page_number(request, paginator), 1)

    def test_schema_html_does_not_appear_when_flag_is_off(self):
        with override_settings(FLAGS={'HOW_TO_SCHEMA': [('boolean', False)]}):
            response = self.client.get(self.page1.url)
            self.assertNotContains(response,
                                   'itemtype="http://schema.org/HowTo"')

    def test_schema_html_appears_when_flag_is_on(self):
        with override_settings(FLAGS={'HOW_TO_SCHEMA': [('boolean', True)]}):
            response = self.client.get(self.page1.url)
            self.assertContains(response, 'itemtype="http://schema.org/HowTo"')