diff options
Diffstat (limited to 'pydis_site/apps')
-rw-r--r-- | pydis_site/apps/home/__init__.py (renamed from pydis_site/apps/main/__init__.py) | 0 | ||||
-rw-r--r-- | pydis_site/apps/home/apps.py (renamed from pydis_site/apps/main/apps.py) | 0 | ||||
-rw-r--r-- | pydis_site/apps/home/migrations/0001_initial.py (renamed from pydis_site/apps/main/migrations/0001_initial.py) | 0 | ||||
-rw-r--r-- | pydis_site/apps/home/migrations/__init__.py (renamed from pydis_site/apps/main/migrations/__init__.py) | 0 | ||||
-rw-r--r-- | pydis_site/apps/home/models/__init__.py (renamed from pydis_site/apps/main/models/__init__.py) | 0 | ||||
-rw-r--r-- | pydis_site/apps/home/models/repo_data.py (renamed from pydis_site/apps/main/models/repo_data.py) | 0 | ||||
-rw-r--r-- | pydis_site/apps/home/templatetags/__init__.py (renamed from pydis_site/apps/main/templatetags/__init__.py) | 0 | ||||
-rw-r--r-- | pydis_site/apps/home/templatetags/extra_filters.py (renamed from pydis_site/apps/main/templatetags/extra_filters.py) | 0 | ||||
-rw-r--r-- | pydis_site/apps/home/tests/__init__.py (renamed from pydis_site/apps/main/tests/__init__.py) | 0 | ||||
-rw-r--r-- | pydis_site/apps/home/tests/mock_github_api_response.json | 44 | ||||
-rw-r--r-- | pydis_site/apps/home/tests/test_repodata_helpers.py | 92 | ||||
-rw-r--r-- | pydis_site/apps/home/tests/test_templatetags.py (renamed from pydis_site/apps/main/tests/test_templatetags.py) | 2 | ||||
-rw-r--r-- | pydis_site/apps/home/tests/test_views.py (renamed from pydis_site/apps/main/tests/test_views.py) | 0 | ||||
-rw-r--r-- | pydis_site/apps/home/urls.py (renamed from pydis_site/apps/main/urls.py) | 3 | ||||
-rw-r--r-- | pydis_site/apps/home/views/__init__.py (renamed from pydis_site/apps/main/views/__init__.py) | 0 | ||||
-rw-r--r-- | pydis_site/apps/home/views/home.py (renamed from pydis_site/apps/main/views/home.py) | 49 | ||||
-rw-r--r-- | pydis_site/apps/main/tests/test_repodata_helpers.py | 66 |
17 files changed, 167 insertions, 89 deletions
diff --git a/pydis_site/apps/main/__init__.py b/pydis_site/apps/home/__init__.py index e69de29b..e69de29b 100644 --- a/pydis_site/apps/main/__init__.py +++ b/pydis_site/apps/home/__init__.py diff --git a/pydis_site/apps/main/apps.py b/pydis_site/apps/home/apps.py index 90dc7137..90dc7137 100644 --- a/pydis_site/apps/main/apps.py +++ b/pydis_site/apps/home/apps.py diff --git a/pydis_site/apps/main/migrations/0001_initial.py b/pydis_site/apps/home/migrations/0001_initial.py index a2bf9f3e..a2bf9f3e 100644 --- a/pydis_site/apps/main/migrations/0001_initial.py +++ b/pydis_site/apps/home/migrations/0001_initial.py diff --git a/pydis_site/apps/main/migrations/__init__.py b/pydis_site/apps/home/migrations/__init__.py index e69de29b..e69de29b 100644 --- a/pydis_site/apps/main/migrations/__init__.py +++ b/pydis_site/apps/home/migrations/__init__.py diff --git a/pydis_site/apps/main/models/__init__.py b/pydis_site/apps/home/models/__init__.py index f327795a..f327795a 100644 --- a/pydis_site/apps/main/models/__init__.py +++ b/pydis_site/apps/home/models/__init__.py diff --git a/pydis_site/apps/main/models/repo_data.py b/pydis_site/apps/home/models/repo_data.py index c975c904..c975c904 100644 --- a/pydis_site/apps/main/models/repo_data.py +++ b/pydis_site/apps/home/models/repo_data.py diff --git a/pydis_site/apps/main/templatetags/__init__.py b/pydis_site/apps/home/templatetags/__init__.py index 70aca169..70aca169 100644 --- a/pydis_site/apps/main/templatetags/__init__.py +++ b/pydis_site/apps/home/templatetags/__init__.py diff --git a/pydis_site/apps/main/templatetags/extra_filters.py b/pydis_site/apps/home/templatetags/extra_filters.py index edffe9ac..edffe9ac 100644 --- a/pydis_site/apps/main/templatetags/extra_filters.py +++ b/pydis_site/apps/home/templatetags/extra_filters.py diff --git a/pydis_site/apps/main/tests/__init__.py b/pydis_site/apps/home/tests/__init__.py index e69de29b..e69de29b 100644 --- a/pydis_site/apps/main/tests/__init__.py +++ b/pydis_site/apps/home/tests/__init__.py 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/main/tests/test_templatetags.py b/pydis_site/apps/home/tests/test_templatetags.py index 44a5c491..813588c8 100644 --- a/pydis_site/apps/main/tests/test_templatetags.py +++ b/pydis_site/apps/home/tests/test_templatetags.py @@ -1,6 +1,6 @@ from django.test import TestCase -from pydis_site.apps.main.templatetags import starts_with +from pydis_site.apps.home.templatetags import starts_with class TestTemplateTags(TestCase): diff --git a/pydis_site/apps/main/tests/test_views.py b/pydis_site/apps/home/tests/test_views.py index 73678b0a..73678b0a 100644 --- a/pydis_site/apps/main/tests/test_views.py +++ b/pydis_site/apps/home/tests/test_views.py diff --git a/pydis_site/apps/main/urls.py b/pydis_site/apps/home/urls.py index edef9873..d8dba2f6 100644 --- a/pydis_site/apps/main/urls.py +++ b/pydis_site/apps/home/urls.py @@ -3,8 +3,7 @@ from django.urls import path from .views import HomeView - -app_name = 'main' +app_name = 'home' urlpatterns = [ path('', HomeView.as_view(), name='home'), path('admin/', admin.site.urls) diff --git a/pydis_site/apps/main/views/__init__.py b/pydis_site/apps/home/views/__init__.py index 971d73a3..971d73a3 100644 --- a/pydis_site/apps/main/views/__init__.py +++ b/pydis_site/apps/home/views/__init__.py diff --git a/pydis_site/apps/main/views/home.py b/pydis_site/apps/home/views/home.py index d9255ed2..c91d13e2 100644 --- a/pydis_site/apps/main/views/home.py +++ b/pydis_site/apps/home/views/home.py @@ -1,31 +1,40 @@ import requests -from django.conf import settings from django.shortcuts import render from django.utils import timezone from django.views import View -from pydis_site.apps.main.models import RepositoryMetadata - -GITHUB_API = "https://api.github.com/users/python-discord/repos" +from pydis_site.apps.home.models import RepositoryMetadata class HomeView(View): + """The view""" + + github_api = "https://api.github.com/users/python-discord/repos" + + # Which of our GitHub repos should be displayed on the front page, and in which order? + repos = [ + "python-discord/site", + "python-discord/bot", + "python-discord/snekbox", + "python-discord/seasonalbot", + "python-discord/django-simple-bulma", + "python-discord/django-crispy-bulma", + ] - @staticmethod - def _get_api_data(): + def _get_api_data(self): """Call the GitHub API and get information about our repos.""" - repo_dict = {repo_name: {} for repo_name in settings.HOMEPAGE_REPOS} + repo_dict = {repo_name: {} for repo_name in self.repos} # Fetch the data from the GitHub API - api_data = requests.get(GITHUB_API) + api_data = requests.get(self.github_api) api_data = api_data.json() # Process the API data into our dict for repo in api_data: full_name = repo["full_name"] - if full_name in settings.HOMEPAGE_REPOS: + if full_name in self.repos: repo_dict[full_name] = { "full_name": repo["full_name"], "description": repo["description"], @@ -46,11 +55,11 @@ class HomeView(View): if (timezone.now() - repo_data.last_updated).seconds > 120: # Get new data from API - api_data_container = self._get_api_data() - repo_data_container = [] + api_repositories = self._get_api_data() + database_repositories = [] - # Update or create all RepoData objects in settings.HOMEPAGE_REPOS - for repo_name, api_data in api_data_container.items(): + # Update or create all RepoData objects in self.repos + for repo_name, api_data in api_repositories.items(): try: repo_data = RepositoryMetadata.objects.get(repo_name=repo_name) repo_data.description = api_data["description"] @@ -66,8 +75,8 @@ class HomeView(View): language=api_data["language"], ) repo_data.save() - repo_data_container.append(repo_data) - return repo_data_container + database_repositories.append(repo_data) + return database_repositories # Otherwise, if the data is fresher than 2 minutes old, we should just return it. else: @@ -77,11 +86,11 @@ class HomeView(View): except RepositoryMetadata.DoesNotExist: # Get new data from API - api_data_container = self._get_api_data() - repo_data_container = [] + api_repositories = self._get_api_data() + database_repositories = [] # Create all the repodata records in the database. - for api_data in api_data_container.values(): + for api_data in api_repositories.values(): repo_data = RepositoryMetadata( repo_name=api_data["full_name"], description=api_data["description"], @@ -90,9 +99,9 @@ class HomeView(View): language=api_data["language"], ) repo_data.save() - repo_data_container.append(repo_data) + database_repositories.append(repo_data) - return repo_data_container + return database_repositories def get(self, request): """Collect repo data and render the homepage view""" diff --git a/pydis_site/apps/main/tests/test_repodata_helpers.py b/pydis_site/apps/main/tests/test_repodata_helpers.py deleted file mode 100644 index 040acb21..00000000 --- a/pydis_site/apps/main/tests/test_repodata_helpers.py +++ /dev/null @@ -1,66 +0,0 @@ -from datetime import timedelta - -from django.conf import settings -from django.test import TestCase -from django.utils import timezone - -from pydis_site.apps.main.models import RepositoryMetadata -from pydis_site.apps.main.views import HomeView - - -class TestRepositoryMetadataHelpers(TestCase): - - def test_returns_metadata(self): - """Test if the _get_repo_data helper actually returns what it should.""" - - home_view = HomeView() - metadata = home_view._get_repo_data() - - self.assertIsInstance(metadata[0], RepositoryMetadata) - self.assertEquals(len(metadata), len(settings.HOMEPAGE_REPOS)) - - def test_returns_cached_metadata(self): - """Test if the _get_repo_data helper returns cached data when available.""" - - home_view = HomeView() - repo_data = RepositoryMetadata( - repo_name="python-discord/site", - description="testrepo", - forks=42, - stargazers=42, - language="English", - ) - repo_data.save() - metadata = home_view._get_repo_data() - - self.assertIsInstance(metadata[0], RepositoryMetadata) - print(metadata[0]) # Tests the __str__ in the model - - def test_refresh_stale_metadata(self): - """Test if the _get_repo_data helper will refresh when the data is stale""" - - home_view = HomeView() - 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 = home_view._get_repo_data() - - self.assertIsInstance(metadata[0], RepositoryMetadata) - - def test_returns_api_data(self): - """Tests if the _get_api_data helper returns what it should.""" - - home_view = HomeView() - api_data = home_view._get_api_data() - repo = settings.HOMEPAGE_REPOS[0] - - self.assertIsInstance(api_data, dict) - self.assertEquals(len(api_data), len(settings.HOMEPAGE_REPOS)) - self.assertIn(repo, api_data.keys()) - self.assertIn("stargazers_count", api_data[repo]) |