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 | |
| parent | Change views __init__.py (diff) | |
Update tests to match with recent unlimited subcategories changes
Diffstat (limited to 'pydis_site')
| -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()) | 
