From 5d9d6eec3159a9c87ca45dc5b294534daf8495fa Mon Sep 17 00:00:00 2001 From: Leon Sandøy Date: Fri, 19 Apr 2019 15:29:27 +0200 Subject: Addressing all comments in volcyy's second review. The tests now mock the API calls so we don't have to actually call the API every time we run tests. --- pydis_site/apps/home/tests/__init__.py | 0 .../apps/home/tests/mock_github_api_response.json | 44 +++++++++++ .../apps/home/tests/test_repodata_helpers.py | 92 ++++++++++++++++++++++ pydis_site/apps/home/tests/test_templatetags.py | 8 ++ pydis_site/apps/home/tests/test_views.py | 9 +++ 5 files changed, 153 insertions(+) create mode 100644 pydis_site/apps/home/tests/__init__.py create mode 100644 pydis_site/apps/home/tests/mock_github_api_response.json create mode 100644 pydis_site/apps/home/tests/test_repodata_helpers.py create mode 100644 pydis_site/apps/home/tests/test_templatetags.py create mode 100644 pydis_site/apps/home/tests/test_views.py (limited to 'pydis_site/apps/home/tests') diff --git a/pydis_site/apps/home/tests/__init__.py b/pydis_site/apps/home/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pydis_site/apps/home/tests/mock_github_api_response.json b/pydis_site/apps/home/tests/mock_github_api_response.json new file mode 100644 index 00000000..37dc672e --- /dev/null +++ b/pydis_site/apps/home/tests/mock_github_api_response.json @@ -0,0 +1,44 @@ +[ + { + "full_name": "python-discord/bot", + "description": "test", + "stargazers_count": 97, + "language": "Python", + "forks_count": 31 + }, + { + "full_name": "python-discord/site", + "description": "test", + "stargazers_count": 97, + "language": "Python", + "forks_count": 31 + }, + { + "full_name": "python-discord/snekbox", + "description": "test", + "stargazers_count": 97, + "language": "Python", + "forks_count": 31 + }, + { + "full_name": "python-discord/django-simple-bulma", + "description": "test", + "stargazers_count": 97, + "language": "Python", + "forks_count": 31 + }, + { + "full_name": "python-discord/django-crispy-bulma", + "description": "test", + "stargazers_count": 97, + "language": "Python", + "forks_count": 31 + }, + { + "full_name": "python-discord/seasonalbot", + "description": "test", + "stargazers_count": 97, + "language": "Python", + "forks_count": 31 + } +] diff --git a/pydis_site/apps/home/tests/test_repodata_helpers.py b/pydis_site/apps/home/tests/test_repodata_helpers.py new file mode 100644 index 00000000..8ab2a467 --- /dev/null +++ b/pydis_site/apps/home/tests/test_repodata_helpers.py @@ -0,0 +1,92 @@ +import json +from datetime import timedelta +from pathlib import Path +from unittest import mock + +from django.test import TestCase +from django.utils import timezone + +from pydis_site.apps.home.models import RepositoryMetadata +from pydis_site.apps.home.views import HomeView + + +def mocked_requests_get(*args, **kwargs): + """A mock version of requests.get, so we don't need to call the API every time we run a test""" + class MockResponse: + def __init__(self, json_data, status_code): + self.json_data = json_data + self.status_code = status_code + + def json(self): + return self.json_data + + if args[0] == HomeView.github_api: + json_path = Path(__file__).resolve().parent / "mock_github_api_response.json" + with open(json_path, 'r') as json_file: + mock_data = json.load(json_file) + + return MockResponse(mock_data, 200) + + return MockResponse(None, 404) + + +class TestRepositoryMetadataHelpers(TestCase): + + def setUp(self): + """Executed before each test method.""" + + self.home_view = HomeView() + + @mock.patch('requests.get', side_effect=mocked_requests_get) + def test_returns_metadata(self, _): + """Test if the _get_repo_data helper actually returns what it should.""" + + metadata = self.home_view._get_repo_data() + + self.assertIsInstance(metadata[0], RepositoryMetadata) + self.assertEquals(len(metadata), len(self.home_view.repos)) + + def test_returns_cached_metadata(self): + """Test if the _get_repo_data helper returns cached data when available.""" + + repo_data = RepositoryMetadata( + repo_name="python-discord/site", + description="testrepo", + forks=42, + stargazers=42, + language="English", + ) + repo_data.save() + metadata = self.home_view._get_repo_data() + + self.assertIsInstance(metadata[0], RepositoryMetadata) + self.assertIsInstance(str(metadata[0]), str) + + @mock.patch('requests.get', side_effect=mocked_requests_get) + def test_refresh_stale_metadata(self, _): + """Test if the _get_repo_data helper will refresh when the data is stale""" + + repo_data = RepositoryMetadata( + repo_name="python-discord/site", + description="testrepo", + forks=42, + stargazers=42, + language="English", + last_updated=timezone.now() - timedelta(seconds=121), # Make the data 2 minutes old. + ) + repo_data.save() + metadata = self.home_view._get_repo_data() + + self.assertIsInstance(metadata[0], RepositoryMetadata) + + @mock.patch('requests.get', side_effect=mocked_requests_get) + def test_returns_api_data(self, _): + """Tests if the _get_api_data helper returns what it should.""" + + api_data = self.home_view._get_api_data() + repo = self.home_view.repos[0] + + self.assertIsInstance(api_data, dict) + self.assertEquals(len(api_data), len(self.home_view.repos)) + self.assertIn(repo, api_data.keys()) + self.assertIn("stargazers_count", api_data[repo]) diff --git a/pydis_site/apps/home/tests/test_templatetags.py b/pydis_site/apps/home/tests/test_templatetags.py new file mode 100644 index 00000000..813588c8 --- /dev/null +++ b/pydis_site/apps/home/tests/test_templatetags.py @@ -0,0 +1,8 @@ +from django.test import TestCase + +from pydis_site.apps.home.templatetags import starts_with + + +class TestTemplateTags(TestCase): + def test_starts_with(self): + self.assertTrue(starts_with('foo', 'f')) diff --git a/pydis_site/apps/home/tests/test_views.py b/pydis_site/apps/home/tests/test_views.py new file mode 100644 index 00000000..73678b0a --- /dev/null +++ b/pydis_site/apps/home/tests/test_views.py @@ -0,0 +1,9 @@ +from django.test import TestCase +from django_hosts.resolvers import reverse + + +class TestIndexReturns200(TestCase): + def test_index_returns_200(self): + url = reverse('home') + resp = self.client.get(url) + self.assertEqual(resp.status_code, 200) -- cgit v1.2.3 From a27b3a313c64a264e0b52043f41fd28b684cc654 Mon Sep 17 00:00:00 2001 From: Leon Sandøy Date: Sat, 20 Apr 2019 01:16:13 +0200 Subject: Adding a Discord menu item to the hamburger, and upping test coverage back to 100% --- pydis_site/apps/home/models/__init__.py | 2 +- pydis_site/apps/home/tests/test_repodata_helpers.py | 15 ++++++++++++++- pydis_site/templates/base/navbar.html | 9 ++++++++- 3 files changed, 23 insertions(+), 3 deletions(-) (limited to 'pydis_site/apps/home/tests') diff --git a/pydis_site/apps/home/models/__init__.py b/pydis_site/apps/home/models/__init__.py index f327795a..6c68df9c 100644 --- a/pydis_site/apps/home/models/__init__.py +++ b/pydis_site/apps/home/models/__init__.py @@ -1,3 +1,3 @@ -from .repo_data import RepositoryMetadata +from .repository_metadata import RepositoryMetadata __all__ = ["RepositoryMetadata"] diff --git a/pydis_site/apps/home/tests/test_repodata_helpers.py b/pydis_site/apps/home/tests/test_repodata_helpers.py index 8ab2a467..be51dce4 100644 --- a/pydis_site/apps/home/tests/test_repodata_helpers.py +++ b/pydis_site/apps/home/tests/test_repodata_helpers.py @@ -72,7 +72,7 @@ class TestRepositoryMetadataHelpers(TestCase): forks=42, stargazers=42, language="English", - last_updated=timezone.now() - timedelta(seconds=121), # Make the data 2 minutes old. + last_updated=timezone.now() - timedelta(seconds=HomeView.repository_cache_ttl + 1), ) repo_data.save() metadata = self.home_view._get_repo_data() @@ -90,3 +90,16 @@ class TestRepositoryMetadataHelpers(TestCase): self.assertEquals(len(api_data), len(self.home_view.repos)) self.assertIn(repo, api_data.keys()) self.assertIn("stargazers_count", api_data[repo]) + + @mock.patch('requests.get', side_effect=mocked_requests_get) + def test_mocked_requests_get(self, mock_get): + """Tests if our mocked_requests_get is returning what it should.""" + + success_data = mock_get(HomeView.github_api) + fail_data = mock_get("failtest") + + self.assertEqual(success_data.status_code, 200) + self.assertEqual(fail_data.status_code, 404) + + self.assertIsNotNone(success_data.json_data) + self.assertIsNone(fail_data.json_data) diff --git a/pydis_site/templates/base/navbar.html b/pydis_site/templates/base/navbar.html index ed6ae118..5e76b3a6 100644 --- a/pydis_site/templates/base/navbar.html +++ b/pydis_site/templates/base/navbar.html @@ -19,6 +19,13 @@ {# Content on the right side of the navbar #}