diff options
author | 2020-11-28 10:03:59 +0200 | |
---|---|---|
committer | 2020-11-28 10:03:59 +0200 | |
commit | a9a2cfb30f6c80a5101c5357ff9a3f2043e546d7 (patch) | |
tree | bddd97656c4e913a49cbd2ecea0c23bd79971a84 /pydis_site/apps/content/tests | |
parent | Change views __init__.py (diff) |
Update tests to match with recent unlimited subcategories changes
Diffstat (limited to 'pydis_site/apps/content/tests')
-rw-r--r-- | pydis_site/apps/content/tests/test_utils.py | 96 | ||||
-rw-r--r-- | pydis_site/apps/content/tests/test_views.py | 135 |
2 files changed, 148 insertions, 83 deletions
diff --git a/pydis_site/apps/content/tests/test_utils.py b/pydis_site/apps/content/tests/test_utils.py index a00c293f..85f1139a 100644 --- a/pydis_site/apps/content/tests/test_utils.py +++ b/pydis_site/apps/content/tests/test_utils.py @@ -1,11 +1,10 @@ from datetime import datetime from pathlib import Path -from unittest.mock import patch, MagicMock +from unittest.mock import MagicMock, patch -from dateutil.parser import isoparse from django.conf import settings from django.http import Http404 -from django.test import TestCase +from django.test import TestCase, override_settings from markdown2 import markdown from pydis_site.apps.content import utils @@ -13,52 +12,63 @@ from pydis_site.apps.content import utils BASE_PATH = Path(settings.BASE_DIR, "pydis_site", "apps", "content", "tests", "test_content") -class TestGetBasePath(TestCase): - def test_get_base_path(self): - """Test does function return content base path.""" - self.assertEqual( - utils._get_base_path(), - Path(settings.BASE_DIR, "pydis_site", "apps", "content", "resources", "content") - ) - - class TestGetCategory(TestCase): + @override_settings(ARTICLES_PATH=BASE_PATH) def test_get_category_successfully(self): """Check does this get right data from category data file.""" - with patch("pydis_site.apps.content.utils._get_base_path", return_value=BASE_PATH): - result = utils.get_category("category") + result = utils.get_category(["category"]) self.assertEqual(result, {"name": "My Category", "description": "My Description"}) + @override_settings(ARTICLES_PATH=BASE_PATH) def test_get_category_not_exists(self): """Check does this raise 404 error when category don't exists.""" - with patch("pydis_site.apps.content.utils._get_base_path", return_value=BASE_PATH): - with self.assertRaises(Http404): - utils.get_category("invalid") + with self.assertRaises(Http404): + utils.get_category(["invalid"]) + @override_settings(ARTICLES_PATH=BASE_PATH) def test_get_category_not_directory(self): """Check does this raise 404 error when category isn't directory.""" - with patch("pydis_site.apps.content.utils._get_base_path", return_value=BASE_PATH): - with self.assertRaises(Http404): - utils.get_category("test.md") + with self.assertRaises(Http404): + utils.get_category(["test.md"]) class TestGetCategories(TestCase): - def test_get_categories(self): + @override_settings(ARTICLES_PATH=BASE_PATH) + @patch("pydis_site.apps.content.utils.get_category") + def test_get_categories(self, get_category_mock): """Check does this return test content categories.""" - with patch("pydis_site.apps.content.utils._get_base_path", return_value=BASE_PATH): - result = utils.get_categories() + get_category_mock.return_value = {"name": "My Category", "description": "My Description"} + + result = utils.get_categories() + get_category_mock.assert_called_once_with(["category"]) + + self.assertEqual( + result, {"category": {"name": "My Category", "description": "My Description"}} + ) + @override_settings(ARTICLES_PATH=BASE_PATH) + def test_get_categories_root_path(self): + """Check does this doesn't call joinpath when getting root categories.""" + result = utils.get_categories() self.assertEqual( result, {"category": {"name": "My Category", "description": "My Description"}} ) + @override_settings(ARTICLES_PATH=BASE_PATH) + def test_get_categories_in_category(self): + """Check does this call joinpath when getting subcategories.""" + result = utils.get_categories(["category"]) + self.assertEqual( + result, {"subcategory": {"name": "My Category 1", "description": "My Description 1"}} + ) + class TestGetArticles(TestCase): + @override_settings(ARTICLES_PATH=BASE_PATH) def test_get_all_root_articles(self): """Check does this return all root level testing content.""" - with patch("pydis_site.apps.content.utils._get_base_path", return_value=BASE_PATH): - result = utils.get_articles() + result = utils.get_articles() for case in ["test", "test2"]: with self.subTest(guide=case): @@ -67,10 +77,10 @@ class TestGetArticles(TestCase): self.assertIn(case, result) self.assertEqual(md.metadata, result[case]) + @override_settings(ARTICLES_PATH=BASE_PATH) def test_get_all_category_articles(self): """Check does this return all category testing content.""" - with patch("pydis_site.apps.content.utils._get_base_path", return_value=BASE_PATH): - result = utils.get_articles("category") + result = utils.get_articles(["category"]) md = markdown(BASE_PATH.joinpath("category", "test3.md").read_text(), extras=["metadata"]) @@ -79,10 +89,10 @@ class TestGetArticles(TestCase): class TestGetArticle(TestCase): + @override_settings(ARTICLES_PATH=BASE_PATH) def test_get_root_article_success(self): """Check does this return article HTML and metadata when root article exist.""" - with patch("pydis_site.apps.content.utils._get_base_path", return_value=BASE_PATH): - result = utils.get_article("test", None) + result = utils.get_article(["test"]) md = markdown( BASE_PATH.joinpath("test.md").read_text(), @@ -99,16 +109,16 @@ class TestGetArticle(TestCase): self.assertEqual(result, {"article": str(md), "metadata": md.metadata}) + @override_settings(ARTICLES_PATH=BASE_PATH) def test_get_root_article_dont_exist(self): """Check does this raise Http404 when root article don't exist.""" - with patch("pydis_site.apps.content.utils._get_base_path", return_value=BASE_PATH): - with self.assertRaises(Http404): - utils.get_article("invalid", None) + with self.assertRaises(Http404): + utils.get_article(["invalid"]) + @override_settings(ARTICLES_PATH=BASE_PATH) def test_get_category_article_success(self): """Check does this return article HTML and metadata when category guide exist.""" - with patch("pydis_site.apps.content.utils._get_base_path", return_value=BASE_PATH): - result = utils.get_article("test3", "category") + result = utils.get_article(["category", "test3"]) md = markdown( BASE_PATH.joinpath("category", "test3.md").read_text(), @@ -125,17 +135,17 @@ class TestGetArticle(TestCase): self.assertEqual(result, {"article": str(md), "metadata": md.metadata}) + @override_settings(ARTICLES_PATH=BASE_PATH) def test_get_category_article_dont_exist(self): """Check does this raise Http404 when category article don't exist.""" - with patch("pydis_site.apps.content.utils._get_base_path", return_value=BASE_PATH): - with self.assertRaises(Http404): - utils.get_article("invalid", "category") + with self.assertRaises(Http404): + utils.get_article(["category", "invalid"]) + @patch("pydis_site.settings.ARTICLES_PATH", new=BASE_PATH) def test_get_category_article_category_dont_exist(self): """Check does this raise Http404 when category don't exist.""" - with patch("pydis_site.apps.content.utils._get_base_path", return_value=BASE_PATH): - with self.assertRaises(Http404): - utils.get_article("some-guide", "invalid") + with self.assertRaises(Http404): + utils.get_article(["invalid", "some-guide"]) class GetGitHubInformationTests(TestCase): @@ -143,7 +153,7 @@ class GetGitHubInformationTests(TestCase): @patch("pydis_site.apps.content.utils.COMMITS_URL", "foobar") def test_call_get_github_information_requests_get(self, requests_get_mock): """Check does this call requests.get function with proper URL.""" - utils.get_github_information("foo", None) + utils.get_github_information(["foo"]) requests_get_mock.assert_called_once_with("foobar") @patch("pydis_site.apps.content.utils.requests.get") @@ -161,7 +171,7 @@ class GetGitHubInformationTests(TestCase): "html_url": "abc1234" } }] - result = utils.get_github_information("foo", None) + result = utils.get_github_information(["foo"]) self.assertEqual(result, { "last_modified": datetime(2020, 10, 1).strftime("%dth %B %Y"), "contributors": {"foobar": "abc1234"} @@ -171,7 +181,7 @@ class GetGitHubInformationTests(TestCase): def test_github_other_status_code_response(self, requests_get_mock): """Check does this return provided modified date and contributors.""" requests_get_mock.return_value = MagicMock(status_code=404) - result = utils.get_github_information("foo", None) + result = utils.get_github_information(["foo"]) self.assertEqual(result, { "last_modified": "N/A", "contributors": {} diff --git a/pydis_site/apps/content/tests/test_views.py b/pydis_site/apps/content/tests/test_views.py index e3aab4fd..98b99b83 100644 --- a/pydis_site/apps/content/tests/test_views.py +++ b/pydis_site/apps/content/tests/test_views.py @@ -1,9 +1,15 @@ +from pathlib import Path from unittest.mock import patch +from django.conf import settings from django.http import Http404 -from django.test import TestCase +from django.test import RequestFactory, TestCase, override_settings from django_hosts.resolvers import reverse +from pydis_site.apps.content.views import ArticleOrCategoryView + +BASE_PATH = Path(settings.BASE_DIR, "pydis_site", "apps", "content", "tests", "test_content") + class TestArticlesIndexView(TestCase): @patch("pydis_site.apps.content.views.articles.get_articles") @@ -20,87 +26,136 @@ class TestArticlesIndexView(TestCase): get_categories_mock.assert_called_once() -class TestArticleView(TestCase): - @patch("pydis_site.apps.content.views.article.get_article") - @patch("pydis_site.apps.content.views.article.get_category") - @patch("pydis_site.apps.content.views.article.get_github_information") +class TestArticleOrCategoryView(TestCase): + @override_settings(ARTICLES_PATH=BASE_PATH) + @patch("pydis_site.apps.content.views.article_category.utils.get_article") + @patch("pydis_site.apps.content.views.article_category.utils.get_category") + @patch("pydis_site.apps.content.views.article_category.utils.get_github_information") def test_article_return_code_200(self, gh_info_mock, get_category_mock, get_article_mock): get_article_mock.return_value = {"guide": "test", "metadata": {}} - url = reverse("content:article", args=["test-guide"]) + url = reverse("content:article_category", args=["test2"]) response = self.client.get(url) self.assertEqual(response.status_code, 200) get_category_mock.assert_not_called() - get_article_mock.assert_called_once_with("test-guide", None) + get_article_mock.assert_called_once() gh_info_mock.assert_called_once() - @patch("pydis_site.apps.content.views.article.get_article") - @patch("pydis_site.apps.content.views.article.get_category") + @patch("pydis_site.apps.content.views.article_category.utils.get_article") + @patch("pydis_site.apps.content.views.article_category.utils.get_category") + @override_settings(ARTICLES_PATH=BASE_PATH) def test_article_return_404(self, get_category_mock, get_article_mock): """Check that return code is 404 when invalid article provided.""" get_article_mock.side_effect = Http404("Article not found.") - url = reverse("content:article", args=["invalid-guide"]) + url = reverse("content:article_category", args=["invalid-guide"]) response = self.client.get(url) self.assertEqual(response.status_code, 404) - get_article_mock.assert_called_once_with("invalid-guide", None) + get_article_mock.assert_not_called() get_category_mock.assert_not_called() - -class TestCategoryView(TestCase): - @patch("pydis_site.apps.content.views.category.get_category") - @patch("pydis_site.apps.content.views.category.get_articles") - def test_valid_category_code_200(self, get_articles_mock, get_category_mock): + @patch("pydis_site.apps.content.views.article_category.utils.get_category") + @patch("pydis_site.apps.content.views.article_category.utils.get_articles") + @patch("pydis_site.apps.content.views.article_category.utils.get_categories") + @override_settings(ARTICLES_PATH=BASE_PATH) + def test_valid_category_code_200( + self, + get_categories_mock, + get_articles_mock, + get_category_mock + ): """Check that return code is 200 when visiting valid category.""" get_category_mock.return_value = {"name": "test", "description": "test"} get_articles_mock.return_value = {} - url = reverse("content:category", args=["category"]) + url = reverse("content:article_category", args=["category"]) response = self.client.get(url) self.assertEqual(response.status_code, 200) - get_articles_mock.assert_called_once_with("category") - get_category_mock.assert_called_once_with("category") + get_articles_mock.assert_called_once() + get_category_mock.assert_called_once() + get_categories_mock.assert_called_once() - @patch("pydis_site.apps.content.views.category.get_category") - @patch("pydis_site.apps.content.views.category.get_articles") - def test_invalid_category_code_404(self, get_articles_mock, get_category_mock): + @patch("pydis_site.apps.content.views.article_category.utils.get_category") + @patch("pydis_site.apps.content.views.article_category.utils.get_articles") + @patch("pydis_site.apps.content.views.article_category.utils.get_categories") + @override_settings(ARTICLES_PATH=BASE_PATH) + def test_invalid_category_code_404( + self, + get_categories_mock, + get_articles_mock, + get_category_mock + ): """Check that return code is 404 when trying to visit invalid category.""" get_category_mock.side_effect = Http404("Category not found.") - url = reverse("content:category", args=["invalid-category"]) + url = reverse("content:article_category", args=["invalid-category"]) response = self.client.get(url) self.assertEqual(response.status_code, 404) - get_category_mock.assert_called_once_with("invalid-category") + get_category_mock.assert_not_called() get_articles_mock.assert_not_called() - - -class TestCategoryArticlesView(TestCase): - @patch("pydis_site.apps.content.views.article.get_article") - @patch("pydis_site.apps.content.views.article.get_category") - @patch("pydis_site.apps.content.views.article.get_github_information") - def test_valid_category_article_code_200(self, gh_info_mock, get_category_mock, get_article_mock): + get_categories_mock.assert_not_called() + + @patch("pydis_site.apps.content.views.article_category.utils.get_article") + @patch("pydis_site.apps.content.views.article_category.utils.get_category") + @patch("pydis_site.apps.content.views.article_category.utils.get_github_information") + @override_settings(ARTICLES_PATH=BASE_PATH) + def test_valid_category_article_code_200( + self, + gh_info_mock, + get_category_mock, + get_article_mock + ): """Check that return code is 200 when visiting valid category article.""" get_article_mock.return_value = {"guide": "test", "metadata": {}} - url = reverse("content:category_article", args=["category", "test3"]) + url = reverse("content:article_category", args=["category/test3"]) response = self.client.get(url) self.assertEqual(response.status_code, 200) - get_article_mock.assert_called_once_with("test3", "category") - get_category_mock.assert_called_once_with("category") + get_article_mock.assert_called_once() + self.assertEqual(get_category_mock.call_count, 2) gh_info_mock.assert_called_once() - @patch("pydis_site.apps.content.views.article.get_article") - @patch("pydis_site.apps.content.views.article.get_category") - @patch("pydis_site.apps.content.views.article.get_github_information") - def test_invalid_category_article_code_404(self, gh_info_mock, get_category_mock, get_article_mock): + @patch("pydis_site.apps.content.views.article_category.utils.get_article") + @patch("pydis_site.apps.content.views.article_category.utils.get_category") + @patch("pydis_site.apps.content.views.article_category.utils.get_github_information") + @override_settings(ARTICLES_PATH=BASE_PATH) + def test_invalid_category_article_code_404( + self, + gh_info_mock, + get_category_mock, + get_article_mock + ): """Check that return code is 200 when trying to visit invalid category article.""" get_article_mock.side_effect = Http404("Article not found.") - url = reverse("content:category_article", args=["category", "invalid"]) + url = reverse("content:article_category", args=["category/invalid"]) response = self.client.get(url) self.assertEqual(response.status_code, 404) - get_article_mock.assert_called_once_with("invalid", "category") + get_article_mock.assert_not_called() get_category_mock.assert_not_called() gh_info_mock.assert_not_called() + + @override_settings(ARTICLES_PATH=BASE_PATH) + def test_article_category_template_names(self): + """Check that this return category, article template or raise Http404.""" + factory = RequestFactory() + cases = [ + {"location": "category", "output": ["content/listing.html"]}, + {"location": "test", "output": ["content/article.html"]}, + {"location": "invalid", "output": None, "raises": Http404} + ] + + for case in cases: + with self.subTest(location=case["location"], output=case["output"]): + request = factory.get(f"/articles/{case['location']}") + instance = ArticleOrCategoryView() + instance.request = request + instance.kwargs = {"location": case["location"]} + + if "raises" in case: + with self.assertRaises(case["raises"]): + instance.get_template_names() + else: + self.assertEqual(case["output"], instance.get_template_names()) |