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:
Steve Jalim 2021-11-17 12:08:28 +00:00 коммит произвёл Paul McLanahan
Родитель 4b37b2a09d
Коммит 9b3353c011
2 изменённых файлов: 88 добавлений и 2 удалений

Просмотреть файл

@ -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