aboutsummaryrefslogtreecommitdiffstats
path: root/pydis_site/apps/content/tests
diff options
context:
space:
mode:
authorGravatar Hassan Abouelela <[email protected]>2022-08-16 23:45:25 +0400
committerGravatar Hassan Abouelela <[email protected]>2022-08-16 23:45:25 +0400
commit92a42694b6ad1a29e5a21e0b3e57639528837113 (patch)
treee5feabe3e9336b286ba7b0add1987b938320639e /pydis_site/apps/content/tests
parentFix Tag Metadata For Static Builds (diff)
Fix Tests For Tag Metadata
Signed-off-by: Hassan Abouelela <[email protected]>
Diffstat (limited to 'pydis_site/apps/content/tests')
-rw-r--r--pydis_site/apps/content/tests/test_utils.py132
-rw-r--r--pydis_site/apps/content/tests/test_views.py36
2 files changed, 143 insertions, 25 deletions
diff --git a/pydis_site/apps/content/tests/test_utils.py b/pydis_site/apps/content/tests/test_utils.py
index 556f633c..2ef033e4 100644
--- a/pydis_site/apps/content/tests/test_utils.py
+++ b/pydis_site/apps/content/tests/test_utils.py
@@ -1,3 +1,5 @@
+import datetime
+import json
import tarfile
import tempfile
import textwrap
@@ -15,6 +17,18 @@ from pydis_site.apps.content.tests.helpers import (
BASE_PATH, MockPagesTestCase, PARSED_CATEGORY_INFO, PARSED_HTML, PARSED_METADATA
)
+_time = datetime.datetime(2022, 10, 10, 10, 10, 10, tzinfo=datetime.timezone.utc)
+_time_str = _time.strftime(settings.GITHUB_TIMESTAMP_FORMAT)
+TEST_COMMIT_KWARGS = {
+ "sha": "123",
+ "message": "Hello world\n\nThis is a commit message",
+ "date": _time,
+ "author": json.dumps([
+ {"name": "Author 1", "email": "[email protected]", "date": _time_str},
+ {"name": "Author 2", "email": "[email protected]", "date": _time_str},
+ ]),
+}
+
class GetCategoryTests(MockPagesTestCase):
"""Tests for the get_category function."""
@@ -109,6 +123,10 @@ class GetPageTests(MockPagesTestCase):
class TagUtilsTests(TestCase):
"""Tests for the tag-related utilities."""
+ def setUp(self) -> None:
+ super().setUp()
+ self.commit = models.Commit.objects.create(**TEST_COMMIT_KWARGS)
+
@mock.patch.object(utils, "fetch_tags")
def test_static_fetch(self, fetch_mock: mock.Mock):
"""Test that the static fetch function is only called at most once during static builds."""
@@ -121,9 +139,27 @@ class TagUtilsTests(TestCase):
self.assertEqual(tags, result)
self.assertEqual(tags, second_result)
- @mock.patch("httpx.get")
+ @mock.patch("httpx.Client.get")
def test_mocked_fetch(self, get_mock: mock.Mock):
"""Test that proper data is returned from fetch, but with a mocked API response."""
+ fake_request = httpx.Request("GET", "https://google.com")
+
+ # Metadata requests
+ returns = [httpx.Response(
+ request=fake_request,
+ status_code=200,
+ json=[
+ {"type": "file", "name": "first_tag.md", "sha": "123"},
+ {"type": "file", "name": "second_tag.md", "sha": "456"},
+ {"type": "dir", "name": "some_group", "sha": "789", "url": "/some_group"},
+ ]
+ ), httpx.Response(
+ request=fake_request,
+ status_code=200,
+ json=[{"type": "file", "name": "grouped_tag.md", "sha": "789123"}]
+ )]
+
+ # Main content request
bodies = (
"This is the first tag!",
textwrap.dedent("""
@@ -156,33 +192,36 @@ class TagUtilsTests(TestCase):
body = (tar_folder / "temp.tar").read_bytes()
- get_mock.return_value = httpx.Response(
+ returns.append(httpx.Response(
status_code=200,
content=body,
- request=httpx.Request("GET", "https://google.com"),
- )
+ request=fake_request,
+ ))
+ get_mock.side_effect = returns
result = utils.fetch_tags()
def sort(_tag: models.Tag) -> str:
return _tag.name
self.assertEqual(sorted([
- models.Tag(name="first_tag", body=bodies[0]),
- models.Tag(name="second_tag", body=bodies[1]),
- models.Tag(name="grouped_tag", body=bodies[2], group=group_folder.name),
+ models.Tag(name="first_tag", body=bodies[0], sha="123"),
+ models.Tag(name="second_tag", body=bodies[1], sha="245"),
+ models.Tag(name="grouped_tag", body=bodies[2], group=group_folder.name, sha="789123"),
], key=sort), sorted(result, key=sort))
def test_get_real_tag(self):
"""Test that a single tag is returned if it exists."""
- tag = models.Tag.objects.create(name="real-tag")
+ tag = models.Tag.objects.create(name="real-tag", last_commit=self.commit)
result = utils.get_tag("real-tag")
self.assertEqual(tag, result)
def test_get_grouped_tag(self):
"""Test fetching a tag from a group."""
- tag = models.Tag.objects.create(name="real-tag", group="real-group")
+ tag = models.Tag.objects.create(
+ name="real-tag", group="real-group", last_commit=self.commit
+ )
result = utils.get_tag("real-group/real-tag")
self.assertEqual(tag, result)
@@ -269,3 +308,78 @@ class TagUtilsTests(TestCase):
tag = models.Tag(**options)
with self.subTest(tag=tag):
self.assertEqual(url, tag.url)
+
+ @mock.patch("httpx.Client.get")
+ def test_get_tag_commit(self, get_mock: mock.Mock):
+ """Test the get commit function with a normal tag."""
+ tag = models.Tag.objects.create(name="example")
+
+ authors = json.loads(self.commit.author)
+
+ get_mock.return_value = httpx.Response(
+ request=httpx.Request("GET", "https://google.com"),
+ status_code=200,
+ json=[{
+ "sha": self.commit.sha,
+ "commit": {
+ "message": self.commit.message,
+ "author": authors[0],
+ "committer": authors[1],
+ }
+ }]
+ )
+
+ result = utils.get_tag(tag.name)
+ self.assertEqual(tag, result)
+
+ get_mock.assert_called_once()
+ call_params = get_mock.call_args[1]["params"]
+
+ self.assertEqual({"path": "/bot/resources/tags/example.md"}, call_params)
+ self.assertEqual(self.commit, models.Tag.objects.get(name=tag.name).last_commit)
+
+ @mock.patch("httpx.Client.get")
+ def test_get_group_tag_commit(self, get_mock: mock.Mock):
+ """Test the get commit function with a group tag."""
+ tag = models.Tag.objects.create(name="example", group="group-name")
+
+ authors = json.loads(self.commit.author)
+ authors.pop()
+ self.commit.author = json.dumps(authors)
+ self.commit.save()
+
+ get_mock.return_value = httpx.Response(
+ request=httpx.Request("GET", "https://google.com"),
+ status_code=200,
+ json=[{
+ "sha": self.commit.sha,
+ "commit": {
+ "message": self.commit.message,
+ "author": authors[0],
+ "committer": authors[0],
+ }
+ }]
+ )
+
+ utils.set_tag_commit(tag)
+
+ get_mock.assert_called_once()
+ call_params = get_mock.call_args[1]["params"]
+
+ self.assertEqual({"path": "/bot/resources/tags/group-name/example.md"}, call_params)
+ self.assertEqual(self.commit, models.Tag.objects.get(name=tag.name).last_commit)
+
+ @mock.patch.object(utils, "set_tag_commit")
+ def test_exiting_commit(self, set_commit_mock: mock.Mock):
+ """Test that a commit is saved when the data has not changed."""
+ tag = models.Tag.objects.create(name="tag-name", body="old body", last_commit=self.commit)
+
+ # This is only applied to the object, not to the database
+ tag.last_commit = None
+
+ utils.record_tags([tag])
+ self.assertEqual(self.commit, tag.last_commit)
+
+ result = utils.get_tag("tag-name")
+ self.assertEqual(tag, result)
+ set_commit_mock.assert_not_called()
diff --git a/pydis_site/apps/content/tests/test_views.py b/pydis_site/apps/content/tests/test_views.py
index c5c25be4..658ac2cc 100644
--- a/pydis_site/apps/content/tests/test_views.py
+++ b/pydis_site/apps/content/tests/test_views.py
@@ -8,10 +8,11 @@ from django.http import Http404
from django.test import RequestFactory, SimpleTestCase, override_settings
from django.urls import reverse
-from pydis_site.apps.content.models import Tag
+from pydis_site.apps.content.models import Commit, Tag
from pydis_site.apps.content.tests.helpers import (
BASE_PATH, MockPagesTestCase, PARSED_CATEGORY_INFO, PARSED_HTML, PARSED_METADATA
)
+from pydis_site.apps.content.tests.test_utils import TEST_COMMIT_KWARGS
from pydis_site.apps.content.views import PageOrCategoryView
@@ -193,11 +194,12 @@ class TagViewTests(django.test.TestCase):
def setUp(self):
"""Set test helpers, then set up fake filesystem."""
super().setUp()
+ self.commit = Commit.objects.create(**TEST_COMMIT_KWARGS)
def test_routing(self):
"""Test that the correct template is returned for each route."""
- Tag.objects.create(name="example")
- Tag.objects.create(name="grouped-tag", group="group-name")
+ Tag.objects.create(name="example", last_commit=self.commit)
+ Tag.objects.create(name="grouped-tag", group="group-name", last_commit=self.commit)
cases = [
("/pages/tags/example/", "content/tag.html"),
@@ -213,7 +215,7 @@ class TagViewTests(django.test.TestCase):
def test_valid_tag_returns_200(self):
"""Test that a page is returned for a valid tag."""
- Tag.objects.create(name="example", body="This is the tag body.")
+ Tag.objects.create(name="example", body="This is the tag body.", last_commit=self.commit)
response = self.client.get("/pages/tags/example/")
self.assertEqual(200, response.status_code)
self.assertIn("This is the tag body", response.content.decode("utf-8"))
@@ -233,7 +235,7 @@ class TagViewTests(django.test.TestCase):
Tag content here.
""")
- tag = Tag.objects.create(name="example", body=body)
+ tag = Tag.objects.create(name="example", body=body, last_commit=self.commit)
response = self.client.get("/pages/tags/example/")
expected = {
"page_title": "example",
@@ -256,7 +258,9 @@ class TagViewTests(django.test.TestCase):
The only difference between this and a regular tag are the breadcrumbs,
so only those are checked.
"""
- Tag.objects.create(name="example", body="Body text", group="group-name")
+ Tag.objects.create(
+ name="example", body="Body text", group="group-name", last_commit=self.commit
+ )
response = self.client.get("/pages/tags/group-name/example/")
self.assertListEqual([
{"name": "Pages", "path": "."},
@@ -266,9 +270,9 @@ class TagViewTests(django.test.TestCase):
def test_group_page(self):
"""Test rendering of a group's root page."""
- Tag.objects.create(name="tag-1", body="Body 1", group="group-name")
- Tag.objects.create(name="tag-2", body="Body 2", group="group-name")
- Tag.objects.create(name="not-included")
+ Tag.objects.create(name="tag-1", body="Body 1", group="group-name", last_commit=self.commit)
+ Tag.objects.create(name="tag-2", body="Body 2", group="group-name", last_commit=self.commit)
+ Tag.objects.create(name="not-included", last_commit=self.commit)
response = self.client.get("/pages/tags/group-name/")
content = response.content.decode("utf-8")
@@ -298,7 +302,7 @@ class TagViewTests(django.test.TestCase):
**This text is in bold**
""")
- Tag.objects.create(name="example", body=body)
+ Tag.objects.create(name="example", body=body, last_commit=self.commit)
response = self.client.get("/pages/tags/example/")
content = response.content.decode("utf-8")
@@ -317,7 +321,7 @@ class TagViewTests(django.test.TestCase):
Tag body.
""")
- Tag.objects.create(name="example", body=body)
+ Tag.objects.create(name="example", body=body, last_commit=self.commit)
response = self.client.get("/pages/tags/example/")
content = response.content.decode("utf-8")
@@ -333,7 +337,7 @@ class TagViewTests(django.test.TestCase):
---
""")
- Tag.objects.create(name="example", body=body)
+ Tag.objects.create(name="example", body=body, last_commit=self.commit)
response = self.client.get("/pages/tags/example/")
self.assertEqual(
"Embed title",
@@ -345,7 +349,7 @@ class TagViewTests(django.test.TestCase):
"""Test hyperlinking of tags works as intended."""
filler_before, filler_after = "empty filler text\n\n", "more\nfiller"
body = filler_before + "`!tags return`" + filler_after
- Tag.objects.create(name="example", body=body)
+ Tag.objects.create(name="example", body=body, last_commit=self.commit)
other_url = reverse("content:tag", kwargs={"location": "return"})
response = self.client.get("/pages/tags/example/")
@@ -356,9 +360,9 @@ class TagViewTests(django.test.TestCase):
def test_tag_root_page(self):
"""Test the root tag page which lists all tags."""
- Tag.objects.create(name="tag-1")
- Tag.objects.create(name="tag-2")
- Tag.objects.create(name="tag-3")
+ Tag.objects.create(name="tag-1", last_commit=self.commit)
+ Tag.objects.create(name="tag-2", last_commit=self.commit)
+ Tag.objects.create(name="tag-3", last_commit=self.commit)
response = self.client.get("/pages/tags/")
content = response.content.decode("utf-8")