123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799 |
- import json
- from datetime import date, datetime, timedelta
- from io import StringIO
- from django.core import management
- from django.test import TestCase
- from django.urls import reverse
- from wagtail.admin.admin_url_finder import AdminURLFinder
- from wagtail.contrib.search_promotions.models import (
- Query,
- QueryDailyHits,
- SearchPromotion,
- )
- from wagtail.contrib.search_promotions.templatetags.wagtailsearchpromotions_tags import (
- get_search_promotions,
- )
- from wagtail.test.utils import WagtailTestUtils
- class TestSearchPromotions(TestCase):
- def test_search_pick_create(self):
- # Create a search pick to the root page
- SearchPromotion.objects.create(
- query=Query.get("root page"),
- page_id=1,
- sort_order=0,
- description="First search promotion",
- )
- # Check
- self.assertEqual(Query.get("root page").editors_picks.count(), 1)
- self.assertEqual(Query.get("root page").editors_picks.first().page_id, 1)
- def test_search_pick_link_create(self):
- # Add 3 search picks in a different order to their sort_order values
- # They should be ordered by their sort order values and not their insertion order
- SearchPromotion.objects.create(
- query=Query.get("root page"),
- external_link_url="https://wagtail.org",
- sort_order=0,
- description="First search promotion",
- )
- # Check
- self.assertEqual(Query.get("root page").editors_picks.count(), 1)
- self.assertEqual(
- Query.get("root page").editors_picks.first().external_link_url,
- "https://wagtail.org",
- )
- def test_search_pick_ordering(self):
- SearchPromotion.objects.create(
- query=Query.get("root page"),
- page_id=1,
- sort_order=0,
- description="First search pick",
- )
- SearchPromotion.objects.create(
- query=Query.get("root page"),
- page_id=1,
- sort_order=2,
- description="Last search pick",
- )
- SearchPromotion.objects.create(
- query=Query.get("root page"),
- external_link_url="https://wagtail.org",
- sort_order=1,
- description="Middle search pick",
- )
- # Check
- self.assertEqual(Query.get("root page").editors_picks.count(), 3)
- self.assertEqual(
- Query.get("root page").editors_picks.first().description,
- "First search pick",
- )
- self.assertEqual(
- Query.get("root page").editors_picks.last().description, "Last search pick"
- )
- def test_get_most_popular(self):
- popularQuery = Query.get("popular")
- for i in range(5):
- popularQuery.add_hit()
- SearchPromotion.objects.create(
- query=Query.get("popular"),
- page_id=2,
- sort_order=0,
- description="Popular search pick",
- )
- SearchPromotion.objects.create(
- query=Query.get("uninteresting"),
- page_id=1,
- sort_order=2,
- description="Uninteresting search pick",
- )
- # Check
- self.assertEqual(Query.get_most_popular().count(), 1)
- popular_picks = Query.get("popular").editors_picks.first()
- self.assertEqual(
- popular_picks.description,
- "Popular search pick",
- )
- self.assertEqual(popular_picks.query.hits, 5)
- def test_get_most_popular_since(self):
- TODAY = date.today()
- TWO_DAYS_AGO = TODAY - timedelta(days=2)
- FIVE_DAYS_AGO = TODAY - timedelta(days=5)
- popularQuery = Query.get("popular")
- for i in range(5):
- popularQuery.add_hit(date=FIVE_DAYS_AGO)
- surpriseQuery = Query.get("surprise")
- surpriseQuery.add_hit(date=TODAY)
- surpriseQuery.add_hit(date=TWO_DAYS_AGO)
- surpriseQuery.add_hit(date=FIVE_DAYS_AGO)
- SearchPromotion.objects.create(
- query=Query.get("popular"),
- page_id=2,
- sort_order=0,
- description="Popular search pick",
- )
- SearchPromotion.objects.create(
- query=Query.get("surprise"),
- page_id=2,
- sort_order=2,
- description="Surprising search pick",
- )
- # Check
- most_popular_queries = Query.get_most_popular(date_since=TWO_DAYS_AGO)
- self.assertEqual(most_popular_queries.count(), 1)
- editors_picks = Query.get("surprise").editors_picks
- surprise_picks = editors_picks.first()
- self.assertEqual(
- surprise_picks.description,
- "Surprising search pick",
- )
- self.assertEqual(surprise_picks.query.hits, 3)
- class TestGetSearchPromotionsTemplateTag(TestCase):
- def test_get_search_promotions_template_tag(self):
- # Create a search pick to the root page
- pick = SearchPromotion.objects.create(
- query=Query.get("root page"),
- page_id=1,
- sort_order=0,
- description="First search pick",
- )
- # Create another search pick against a different query
- SearchPromotion.objects.create(
- query=Query.get("root page again"),
- page_id=1,
- sort_order=0,
- description="Second search pick",
- )
- # Check
- search_picks = list(get_search_promotions("root page"))
- self.assertEqual(search_picks, [pick])
- def test_get_search_promotions_with_none_query_string(self):
- search_picks = list(get_search_promotions(None))
- self.assertEqual(search_picks, [])
- class TestSearchPromotionsIndexView(WagtailTestUtils, TestCase):
- def setUp(self):
- self.login()
- def test_simple(self):
- response = self.client.get(reverse("wagtailsearchpromotions:index"))
- self.assertEqual(response.status_code, 200)
- self.assertTemplateUsed(response, "wagtailsearchpromotions/index.html")
- def test_search(self):
- response = self.client.get(
- reverse("wagtailsearchpromotions:index"), {"q": "Hello"}
- )
- self.assertEqual(response.status_code, 200)
- self.assertEqual(response.context["query_string"], "Hello")
- self.assertContains(
- response,
- 'Sorry, no promoted results match "<em>Hello</em>"',
- )
- def test_search_with_results(self):
- SearchPromotion.objects.create(
- query=Query.get("search promotion query"),
- page_id=1,
- )
- SearchPromotion.objects.create(
- query=Query.get("search promotion query"),
- external_link_url="https://wagtail.org",
- )
- response = self.client.get(
- reverse("wagtailsearchpromotions:index"), {"q": "search promotion query"}
- )
- self.assertEqual(response.status_code, 200)
- self.assertEqual(response.context["query_string"], "search promotion query")
- self.assertContains(response, '<a href="/admin/pages/1/edit/" class="nolink">')
- self.assertContains(
- response,
- '<a href="https://wagtail.org" class="nolink" target="_blank" rel="noreferrer">',
- )
- def make_search_picks(self):
- for i in range(50):
- SearchPromotion.objects.create(
- query=Query.get("query " + str(i)),
- page_id=1,
- sort_order=0,
- description="First search pick",
- )
- def test_pagination(self):
- self.make_search_picks()
- response = self.client.get(reverse("wagtailsearchpromotions:index"), {"p": 2})
- # Check response
- self.assertEqual(response.status_code, 200)
- self.assertTemplateUsed(response, "wagtailsearchpromotions/index.html")
- # Check that we got the correct page
- self.assertEqual(response.context["queries"].number, 2)
- def test_pagination_invalid(self):
- self.make_search_picks()
- response = self.client.get(
- reverse("wagtailsearchpromotions:index"), {"p": "Hello World!"}
- )
- # Check response
- self.assertEqual(response.status_code, 404)
- def test_pagination_out_of_range(self):
- self.make_search_picks()
- response = self.client.get(
- reverse("wagtailsearchpromotions:index"), {"p": 99999}
- )
- # Check response
- self.assertEqual(response.status_code, 404)
- def test_results_are_ordered_alphabetically(self):
- self.make_search_picks()
- SearchPromotion.objects.create(
- query=Query.get("aaargh snake"),
- page_id=1,
- sort_order=0,
- description="ooh, it's a snake",
- )
- response = self.client.get(reverse("wagtailsearchpromotions:index"))
- # Check response
- self.assertEqual(response.status_code, 200)
- self.assertTemplateUsed(response, "wagtailsearchpromotions/index.html")
- # "aargh snake" should be the first result alphabetically
- self.assertEqual(response.context["queries"][0].query_string, "aaargh snake")
- def test_results_ordering(self):
- self.make_search_picks()
- url = reverse("wagtailsearchpromotions:index")
- SearchPromotion.objects.create(
- query=Query.get("zyzzyvas"),
- page_id=1,
- sort_order=0,
- description="no definition found, this is a valid scrabble word though",
- )
- SearchPromotion.objects.create(
- query=Query.get("aardwolf"),
- page_id=1,
- sort_order=22,
- description="Striped hyena of southeast Africa that feeds chiefly on insects",
- )
- popularQuery = Query.get("optimal")
- for i in range(50):
- popularQuery.add_hit()
- SearchPromotion.objects.create(
- query=popularQuery,
- page_id=1,
- sort_order=15,
- description="An oddly popular search term?",
- )
- popularQuery = Query.get("suboptimal")
- for i in range(25):
- popularQuery.add_hit()
- SearchPromotion.objects.create(
- query=popularQuery,
- page_id=1,
- sort_order=15,
- description="Not as popular",
- )
- # ordered by querystring (reversed)
- response = self.client.get(url + "?ordering=-query_string")
- self.assertEqual(response.status_code, 200)
- self.assertEqual(response.context["queries"][0].query_string, "zyzzyvas")
- # last page, still ordered by query string (reversed)
- response = self.client.get(url + "?ordering=-query_string&p=3")
- self.assertEqual(response.status_code, 200)
- self.assertEqual(response.context["queries"][-1].query_string, "aardwolf")
- # ordered by querystring (not reversed)
- response = self.client.get(url + "?ordering=query_string")
- self.assertEqual(response.status_code, 200)
- self.assertEqual(response.context["queries"][0].query_string, "aardwolf")
- # ordered by sum of daily hits (reversed)
- response = self.client.get(url + "?ordering=-views")
- self.assertEqual(response.status_code, 200)
- self.assertEqual(response.context["queries"][0].query_string, "optimal")
- self.assertEqual(response.context["queries"][1].query_string, "suboptimal")
- # ordered by sum of daily hits, last page (not reversed)
- response = self.client.get(url + "?ordering=views&p=3")
- self.assertEqual(response.status_code, 200)
- self.assertEqual(response.context["queries"][-1].query_string, "optimal")
- self.assertEqual(response.context["queries"][-2].query_string, "suboptimal")
- class TestSearchPromotionsAddView(WagtailTestUtils, TestCase):
- def setUp(self):
- self.login()
- def test_simple(self):
- response = self.client.get(reverse("wagtailsearchpromotions:add"))
- self.assertEqual(response.status_code, 200)
- self.assertTemplateUsed(response, "wagtailsearchpromotions/add.html")
- def test_post(self):
- # Submit
- post_data = {
- "query_string": "test",
- "editors_picks-TOTAL_FORMS": 1,
- "editors_picks-INITIAL_FORMS": 0,
- "editors_picks-MAX_NUM_FORMS": 1000,
- "editors_picks-0-DELETE": "",
- "editors_picks-0-ORDER": 0,
- "editors_picks-0-page": 1,
- "editors_picks-0-description": "Hello",
- }
- response = self.client.post(reverse("wagtailsearchpromotions:add"), post_data)
- # User should be redirected back to the index
- self.assertRedirects(response, reverse("wagtailsearchpromotions:index"))
- # Check that the search pick was created
- self.assertTrue(Query.get("test").editors_picks.filter(page_id=1).exists())
- def test_post_with_external_link(self):
- # Submit
- post_data = {
- "query_string": "test",
- "editors_picks-TOTAL_FORMS": 1,
- "editors_picks-INITIAL_FORMS": 0,
- "editors_picks-MAX_NUM_FORMS": 1000,
- "editors_picks-0-DELETE": "",
- "editors_picks-0-ORDER": 0,
- "editors_picks-0-external_link_url": "https://wagtail.org",
- "editors_picks-0-external_link_text": "Wagtail",
- "editors_picks-0-description": "Hello",
- }
- response = self.client.post(reverse("wagtailsearchpromotions:add"), post_data)
- # User should be redirected back to the index
- self.assertRedirects(response, reverse("wagtailsearchpromotions:index"))
- # Check that the search pick was created
- self.assertTrue(
- Query.get("test")
- .editors_picks.filter(external_link_url="https://wagtail.org")
- .exists()
- )
- def test_post_without_recommendations(self):
- # Submit
- post_data = {
- "query_string": "test",
- "editors_picks-TOTAL_FORMS": 0,
- "editors_picks-INITIAL_FORMS": 0,
- "editors_picks-MAX_NUM_FORMS": 1000,
- }
- response = self.client.post(reverse("wagtailsearchpromotions:add"), post_data)
- # User should be given an error
- self.assertEqual(response.status_code, 200)
- self.assertFormsetError(
- response,
- "searchpicks_formset",
- None,
- None,
- "Please specify at least one recommendation for this search term.",
- )
- def test_post_with_page_and_external_link(self):
- post_data = {
- "query_string": "test",
- "editors_picks-TOTAL_FORMS": 1,
- "editors_picks-INITIAL_FORMS": 0,
- "editors_picks-MAX_NUM_FORMS": 1000,
- "editors_picks-0-DELETE": "",
- "editors_picks-0-ORDER": 0,
- "editors_picks-0-page": 1,
- "editors_picks-0-external_link_url": "https://wagtail.org",
- "editors_picks-0-external_link_text": "Wagtail",
- "editors_picks-0-description": "Hello",
- }
- response = self.client.post(reverse("wagtailsearchpromotions:add"), post_data)
- # User should be given an error
- self.assertEqual(response.status_code, 200)
- self.assertFormsetError(
- response,
- "searchpicks_formset",
- None,
- None,
- "Please only select a page OR enter an external link.",
- )
- def test_post_missing_recommendation(self):
- post_data = {
- "query_string": "test",
- "editors_picks-TOTAL_FORMS": 1,
- "editors_picks-INITIAL_FORMS": 0,
- "editors_picks-MAX_NUM_FORMS": 1000,
- "editors_picks-0-DELETE": "",
- "editors_picks-0-ORDER": 0,
- "editors_picks-0-description": "Hello",
- }
- response = self.client.post(reverse("wagtailsearchpromotions:add"), post_data)
- # User should be given an error
- self.assertEqual(response.status_code, 200)
- self.assertFormsetError(
- response,
- "searchpicks_formset",
- None,
- None,
- "You must recommend a page OR an external link.",
- )
- def test_post_missing_external_text(self):
- post_data = {
- "query_string": "test",
- "editors_picks-TOTAL_FORMS": 1,
- "editors_picks-INITIAL_FORMS": 0,
- "editors_picks-MAX_NUM_FORMS": 1000,
- "editors_picks-0-DELETE": "",
- "editors_picks-0-ORDER": 0,
- "editors_picks-0-external_link_url": "https://wagtail.org",
- }
- response = self.client.post(reverse("wagtailsearchpromotions:add"), post_data)
- # User should be given an error
- self.assertEqual(response.status_code, 200)
- self.assertFormsetError(
- response,
- "searchpicks_formset",
- None,
- None,
- "You must enter an external link text if you enter an external link URL.",
- )
- class TestSearchPromotionsEditView(WagtailTestUtils, TestCase):
- def setUp(self):
- self.user = self.login()
- # Create an search pick to edit
- self.query = Query.get("Hello")
- self.search_pick = self.query.editors_picks.create(
- page_id=1, sort_order=0, description="Root page"
- )
- self.search_pick_2 = self.query.editors_picks.create(
- page_id=2, sort_order=1, description="Homepage"
- )
- def test_simple(self):
- response = self.client.get(
- reverse("wagtailsearchpromotions:edit", args=(self.query.id,))
- )
- self.assertEqual(response.status_code, 200)
- self.assertTemplateUsed(response, "wagtailsearchpromotions/edit.html")
- url_finder = AdminURLFinder(self.user)
- expected_url = "/admin/searchpicks/%d/" % self.query.id
- self.assertEqual(url_finder.get_edit_url(self.search_pick), expected_url)
- def test_post(self):
- # Submit
- post_data = {
- "query_string": "Hello",
- "editors_picks-TOTAL_FORMS": 2,
- "editors_picks-INITIAL_FORMS": 2,
- "editors_picks-MAX_NUM_FORMS": 1000,
- "editors_picks-0-id": self.search_pick.id,
- "editors_picks-0-DELETE": "",
- "editors_picks-0-ORDER": 0,
- "editors_picks-0-page": 1,
- "editors_picks-0-description": "Description has changed", # Change
- "editors_picks-1-id": self.search_pick_2.id,
- "editors_picks-1-DELETE": "",
- "editors_picks-1-ORDER": 1,
- "editors_picks-1-page": 2,
- "editors_picks-1-description": "Homepage",
- }
- response = self.client.post(
- reverse("wagtailsearchpromotions:edit", args=(self.query.id,)), post_data
- )
- # User should be redirected back to the index
- self.assertRedirects(response, reverse("wagtailsearchpromotions:index"))
- # Check that the search pick description was edited
- self.assertEqual(
- SearchPromotion.objects.get(id=self.search_pick.id).description,
- "Description has changed",
- )
- def test_post_reorder(self):
- # Check order before reordering
- self.assertEqual(Query.get("Hello").editors_picks.all()[0], self.search_pick)
- self.assertEqual(Query.get("Hello").editors_picks.all()[1], self.search_pick_2)
- # Submit
- post_data = {
- "query_string": "Hello",
- "editors_picks-TOTAL_FORMS": 2,
- "editors_picks-INITIAL_FORMS": 2,
- "editors_picks-MAX_NUM_FORMS": 1000,
- "editors_picks-0-id": self.search_pick.id,
- "editors_picks-0-DELETE": "",
- "editors_picks-0-ORDER": 1, # Change
- "editors_picks-0-page": 1,
- "editors_picks-0-description": "Root page",
- "editors_picks-1-id": self.search_pick_2.id,
- "editors_picks-1-DELETE": "",
- "editors_picks-1-ORDER": 0, # Change
- "editors_picks-1-page": 2,
- "editors_picks-1-description": "Homepage",
- }
- response = self.client.post(
- reverse("wagtailsearchpromotions:edit", args=(self.query.id,)), post_data
- )
- # User should be redirected back to the index
- self.assertRedirects(response, reverse("wagtailsearchpromotions:index"))
- # Check that the ordering has been saved correctly
- self.assertEqual(
- SearchPromotion.objects.get(id=self.search_pick.id).sort_order, 1
- )
- self.assertEqual(
- SearchPromotion.objects.get(id=self.search_pick_2.id).sort_order, 0
- )
- # Check that the recommendations were reordered
- self.assertEqual(Query.get("Hello").editors_picks.all()[0], self.search_pick_2)
- self.assertEqual(Query.get("Hello").editors_picks.all()[1], self.search_pick)
- def test_post_delete_recommendation(self):
- # Submit
- post_data = {
- "query_string": "Hello",
- "editors_picks-TOTAL_FORMS": 2,
- "editors_picks-INITIAL_FORMS": 2,
- "editors_picks-MAX_NUM_FORMS": 1000,
- "editors_picks-0-id": self.search_pick.id,
- "editors_picks-0-DELETE": "",
- "editors_picks-0-ORDER": 0,
- "editors_picks-0-page": 1,
- "editors_picks-0-description": "Root page",
- "editors_picks-1-id": self.search_pick_2.id,
- "editors_picks-1-DELETE": 1,
- "editors_picks-1-ORDER": 1,
- "editors_picks-1-page": 2,
- "editors_picks-1-description": "Homepage",
- }
- response = self.client.post(
- reverse("wagtailsearchpromotions:edit", args=(self.query.id,)), post_data
- )
- # User should be redirected back to the index
- self.assertRedirects(response, reverse("wagtailsearchpromotions:index"))
- # Check that the recommendation was deleted
- self.assertFalse(
- SearchPromotion.objects.filter(id=self.search_pick_2.id).exists()
- )
- # The other recommendation should still exist
- self.assertTrue(SearchPromotion.objects.filter(id=self.search_pick.id).exists())
- def test_post_without_recommendations(self):
- # Submit
- post_data = {
- "query_string": "Hello",
- "editors_picks-TOTAL_FORMS": 2,
- "editors_picks-INITIAL_FORMS": 2,
- "editors_picks-MAX_NUM_FORMS": 1000,
- "editors_picks-0-id": self.search_pick.id,
- "editors_picks-0-DELETE": 1,
- "editors_picks-0-ORDER": 0,
- "editors_picks-0-page": 1,
- "editors_picks-0-description": "Description has changed", # Change
- "editors_picks-1-id": self.search_pick_2.id,
- "editors_picks-1-DELETE": 1,
- "editors_picks-1-ORDER": 1,
- "editors_picks-1-page": 2,
- "editors_picks-1-description": "Homepage",
- }
- response = self.client.post(
- reverse("wagtailsearchpromotions:edit", args=(self.query.id,)), post_data
- )
- # User should be given an error
- self.assertEqual(response.status_code, 200)
- self.assertFormsetError(
- response,
- "searchpicks_formset",
- None,
- None,
- "Please specify at least one recommendation for this search term.",
- )
- class TestSearchPromotionsDeleteView(WagtailTestUtils, TestCase):
- def setUp(self):
- self.login()
- # Create an search pick to delete
- self.query = Query.get("Hello")
- self.search_pick = self.query.editors_picks.create(
- page_id=1, description="Root page"
- )
- self.search_pick_2 = self.query.editors_picks.create(
- page_id=2, description="Homepage"
- )
- def test_simple(self):
- response = self.client.get(
- reverse("wagtailsearchpromotions:delete", args=(self.query.id,))
- )
- self.assertEqual(response.status_code, 200)
- self.assertTemplateUsed(response, "wagtailsearchpromotions/confirm_delete.html")
- def test_post(self):
- # Submit
- response = self.client.post(
- reverse("wagtailsearchpromotions:delete", args=(self.query.id,))
- )
- # User should be redirected back to the index
- self.assertRedirects(response, reverse("wagtailsearchpromotions:index"))
- # Check that both recommendations were deleted
- self.assertFalse(
- SearchPromotion.objects.filter(id=self.search_pick_2.id).exists()
- )
- # The other recommendation should still exist
- self.assertFalse(
- SearchPromotion.objects.filter(id=self.search_pick.id).exists()
- )
- class TestGarbageCollectManagementCommand(TestCase):
- def test_garbage_collect_command(self):
- nowdt = datetime.now()
- old_hit_date = (nowdt - timedelta(days=14)).date()
- recent_hit_date = (nowdt - timedelta(days=1)).date()
- # Add 10 hits that are more than one week old. The related queries and the daily hits
- # should be deleted by the search_garbage_collect command.
- query_ids_to_be_deleted = []
- for i in range(10):
- q = Query.get(f"Hello {i}")
- q.add_hit(date=old_hit_date)
- query_ids_to_be_deleted.append(q.id)
- # Add 10 hits that are less than one week old. These ones should not be deleted.
- recent_query_ids = []
- for i in range(10):
- q = Query.get(f"World {i}")
- q.add_hit(date=recent_hit_date)
- recent_query_ids.append(q.id)
- # Add 10 queries that are promoted. These ones should not be deleted.
- promoted_query_ids = []
- for i in range(10):
- q = Query.get(f"Foo bar {i}")
- q.add_hit(date=old_hit_date)
- SearchPromotion.objects.create(
- query=q, page_id=1, sort_order=0, description="Test"
- )
- promoted_query_ids.append(q.id)
- management.call_command("searchpromotions_garbage_collect", stdout=StringIO())
- self.assertFalse(Query.objects.filter(id__in=query_ids_to_be_deleted).exists())
- self.assertFalse(
- QueryDailyHits.objects.filter(
- date=old_hit_date, query_id__in=query_ids_to_be_deleted
- ).exists()
- )
- self.assertEqual(Query.objects.filter(id__in=recent_query_ids).count(), 10)
- self.assertEqual(
- QueryDailyHits.objects.filter(
- date=recent_hit_date, query_id__in=recent_query_ids
- ).count(),
- 10,
- )
- self.assertEqual(Query.objects.filter(id__in=promoted_query_ids).count(), 10)
- self.assertEqual(
- QueryDailyHits.objects.filter(
- date=recent_hit_date, query_id__in=promoted_query_ids
- ).count(),
- 0,
- )
- class TestCopyDailyHitsFromWagtailSearchManagementCommand(TestCase):
- def run_command(self, **options):
- output = StringIO()
- management.call_command(
- "copy_daily_hits_from_wagtailsearch", stdout=output, **options
- )
- output.seek(0)
- return output
- def test_copy(self):
- # Create some daily hits in the wagtailsearch.{Query,QueryDailyHits} models
- from wagtail.search.models import Query as WSQuery
- query = WSQuery.get("test query")
- query.add_hit(date(2021, 8, 24))
- query.add_hit(date(2021, 8, 24))
- query.add_hit(date(2021, 7, 1))
- # Check that nothing magically got inserted into the new query model
- self.assertFalse(Query.objects.exists())
- # Run the management command
- self.run_command()
- # Check that the query now exists in the new model
- new_query = Query.objects.get()
- self.assertEqual(new_query.query_string, "test query")
- # Check daily hits
- self.assertEqual(new_query.hits, 3)
- class TestQueryChooserView(WagtailTestUtils, TestCase):
- def setUp(self):
- self.login()
- def get(self, params={}):
- return self.client.get("/admin/searchpicks/queries/chooser/", params)
- def test_simple(self):
- response = self.get()
- self.assertEqual(response.status_code, 200)
- self.assertTemplateUsed(
- response, "wagtailsearchpromotions/queries/chooser/chooser.html"
- )
- response_json = json.loads(response.content.decode())
- self.assertEqual(response_json["step"], "chooser")
- def test_search(self):
- response = self.get({"q": "Hello"})
- self.assertEqual(response.status_code, 200)
- def test_pagination(self):
- # page numbers in range should be accepted
- response = self.get({"p": 1})
- self.assertEqual(response.status_code, 200)
- # page numbers out of range should return 404
- response = self.get({"p": 9999})
- self.assertEqual(response.status_code, 404)
|