зеркало из https://github.com/mozilla/bedrock.git
10744: Avoid duplicates when generating list of VRC categories based on available data
While we're not yet using/revealing any categories in the VRC, we have code that provides a list of them for filtering. This code was not avoiding duplicates, so this changeset remedies that, via TDD. There were different ways to approach this, but the separate tracking set of 'seen' categories seemed the simplest.
This commit is contained in:
Родитель
4b37b2a09d
Коммит
9b3353c011
|
@ -7,8 +7,9 @@ import json
|
|||
from django.http import HttpResponse
|
||||
from django.test import override_settings
|
||||
from django.test.client import RequestFactory
|
||||
from django.urls import reverse
|
||||
|
||||
from mock import patch
|
||||
from mock import Mock, patch
|
||||
|
||||
from bedrock.mozorg.tests import TestCase
|
||||
from bedrock.products import views
|
||||
|
@ -98,3 +99,86 @@ class TestVPNLandingPage(TestCase):
|
|||
view(req)
|
||||
ctx = render_mock.call_args[0][2]
|
||||
self.assertFalse(ctx["vpn_available"])
|
||||
|
||||
|
||||
class TestVPNResourceCenterHelpers(TestCase):
|
||||
def _build_mock_entry(self, entry_category_name):
|
||||
entry = Mock(name=entry_category_name)
|
||||
entry.category = entry_category_name
|
||||
return entry
|
||||
|
||||
def test__build_category_list(self):
|
||||
root_url = reverse("products.vpn.resource-center.landing")
|
||||
cases = [
|
||||
{
|
||||
"entry_list": [
|
||||
self._build_mock_entry("Category one"),
|
||||
self._build_mock_entry("category TWO"),
|
||||
self._build_mock_entry("Category three"),
|
||||
],
|
||||
"expected": [
|
||||
# Alphabetical based on category name
|
||||
{
|
||||
"name": "Category one",
|
||||
"url": f"{root_url}?category=Category+one",
|
||||
},
|
||||
{
|
||||
"name": "Category three",
|
||||
"url": f"{root_url}?category=Category+three",
|
||||
},
|
||||
{
|
||||
"name": "category TWO",
|
||||
"url": f"{root_url}?category=category+TWO",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"entry_list": [
|
||||
self._build_mock_entry("Category one"),
|
||||
self._build_mock_entry("category TWO"),
|
||||
self._build_mock_entry("Category three"),
|
||||
self._build_mock_entry("category TWO"),
|
||||
self._build_mock_entry("Category three"),
|
||||
],
|
||||
"expected": [
|
||||
{
|
||||
"name": "Category one",
|
||||
"url": f"{root_url}?category=Category+one",
|
||||
},
|
||||
{
|
||||
"name": "Category three",
|
||||
"url": f"{root_url}?category=Category+three",
|
||||
},
|
||||
{
|
||||
"name": "category TWO",
|
||||
"url": f"{root_url}?category=category+TWO",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"entry_list": [
|
||||
self._build_mock_entry("Category one"),
|
||||
self._build_mock_entry("Category one"),
|
||||
self._build_mock_entry("Category one"),
|
||||
self._build_mock_entry("Category one"),
|
||||
self._build_mock_entry("Category one"),
|
||||
self._build_mock_entry("Category one"),
|
||||
],
|
||||
"expected": [
|
||||
{
|
||||
"name": "Category one",
|
||||
"url": f"{root_url}?category=Category+one",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"entry_list": [],
|
||||
"expected": [],
|
||||
},
|
||||
]
|
||||
for case in cases:
|
||||
with self.subTest(case=case):
|
||||
output = views._build_category_list(
|
||||
case["entry_list"],
|
||||
)
|
||||
self.assertEqual(output, case["expected"])
|
||||
|
|
|
@ -112,17 +112,19 @@ def _build_category_list(entry_list):
|
|||
# category_list = [
|
||||
# {"name": "Cat1", "url": "/full/path/to/category"}, ...
|
||||
# ]
|
||||
categories_seen = set()
|
||||
category_list = []
|
||||
root_url = reverse("products.vpn.resource-center.landing")
|
||||
for entry in entry_list:
|
||||
category = entry.category
|
||||
if category:
|
||||
if category and category not in categories_seen:
|
||||
category_list.append(
|
||||
{
|
||||
"name": category,
|
||||
"url": f"{root_url}?{ARTICLE_CATEGORY_LABEL}={quote_plus(category)}",
|
||||
}
|
||||
)
|
||||
categories_seen.add(category)
|
||||
|
||||
category_list = sorted(category_list, key=lambda x: x["name"])
|
||||
return category_list
|
||||
|
|
Загрузка…
Ссылка в новой задаче