From 1afac48c606bc6645b895f915b6ca713bb869a25 Mon Sep 17 00:00:00 2001 From: Ben Sturmfels Date: Wed, 13 Mar 2024 14:26:01 +1100 Subject: [PATCH] Switch content tests to pytest --- README.md | 13 +++++++---- bin/deploy.sh | 6 ++--- conservancy/tests.py | 54 ++++++++++++++++++++++++-------------------- requirements.txt | 2 +- 4 files changed, 42 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index 61aec362..4c006bae 100644 --- a/README.md +++ b/README.md @@ -42,10 +42,15 @@ You'll need a copy of `conservancy/djangocommonsettings.py`, a file that not committed to the repository that has database settings and other environment-specific config. +To run the tests, install `pytest-django` and run pytest: + + python3 -m pip install pytest-django + python3 -m pytest + Then run: - python manage.py migrate - python manage.py runserver + python3 manage.py migrate + python3 manage.py runserver There is also a Dockerfile available if that's more convenient. See that file for details. @@ -60,5 +65,5 @@ SystemD timer. See `systemd/conservancy-www-update.timer` for details. The `migrate` and `collectstatic` commands are not run automatically. You may need to run these if modifying the database schema or adding/moving static files: - sudo -u www-data /var/www/venv-website/bin/python manage.py migrate - sudo -u www-data /var/www/venv-website/bin/python manage.py collectstatic --link + sudo -u www-data /var/www/venv-website/bin/python3 manage.py migrate + sudo -u www-data /var/www/venv-website/bin/python3 manage.py collectstatic --link diff --git a/bin/deploy.sh b/bin/deploy.sh index bede2453..dd2cb145 100755 --- a/bin/deploy.sh +++ b/bin/deploy.sh @@ -6,9 +6,9 @@ set -x # Show output set -e # Abort on failure cd /var/www/website sudo -u www-data git pull -sudo -u www-data /var/www/venv-website/bin/python manage.py check -sudo -u www-data /var/www/venv-website/bin/python manage.py migrate -sudo -u www-data /var/www/venv-website/bin/python manage.py collectstatic -v0 --noinput --link +sudo -u www-data /var/www/venv-website/bin/python3 manage.py check +sudo -u www-data /var/www/venv-website/bin/python3 manage.py migrate +sudo -u www-data /var/www/venv-website/bin/python3 manage.py collectstatic -v0 --noinput --link sudo systemctl restart apache2 curl --silent --head https://sfconservancy.org | grep --perl-regexp "^HTTP/.+ 200" EOF diff --git a/conservancy/tests.py b/conservancy/tests.py index 43b46528..7ef3eed2 100644 --- a/conservancy/tests.py +++ b/conservancy/tests.py @@ -1,36 +1,40 @@ import datetime from django.http import Http404 -from django.test import RequestFactory, TestCase +import pytest +from pytest_django.asserts import assertContains, assertTemplateUsed from . import views from conservancy.fundgoal.models import FundraisingGoal -class ContentTest(TestCase): - def setUp(self): - self.factory = RequestFactory() - FundraisingGoal.objects.create( - fundraiser_code_name='cy2023-end-year-match', - fundraiser_goal_amount=0, - fundraiser_so_far_amount=0, - fundraiser_donation_count=0, - fundraiser_donation_count_disclose_threshold=0, - fundraiser_endtime=datetime.datetime(2000, 1, 1) - ) +def create_fundraising_goal(): + FundraisingGoal.objects.create( + fundraiser_code_name='cy2023-end-year-match', + fundraiser_goal_amount=0, + fundraiser_so_far_amount=0, + fundraiser_donation_count=0, + fundraiser_donation_count_disclose_threshold=0, + fundraiser_endtime=datetime.datetime(2000, 1, 1) + ) - def test_about_page_served(self): - request = self.factory.get('/about/') - with self.assertTemplateUsed('about/index.html'): - response = views.index(request).render() - self.assertContains(response, 'Conservancy is a nonprofit organization') - def test_annual_report_file_served(self): - request = self.factory.get('/docs/conservancy_annual-report_fy-2011.pdf') - response = views.index(request) - self.assertEqual(response.headers['Content-Type'], 'application/pdf') +@pytest.mark.django_db +def test_about_page_served(rf): + create_fundraising_goal() + request = rf.get('/about/') + with assertTemplateUsed('about/index.html'): + response = views.index(request).render() + assertContains(response, 'Conservancy is a nonprofit organization') - def test_path_traversal_404s(self): - request = self.factory.get('/about/../../settings.py') - with self.assertRaises(Http404): - views.index(request) + +def test_annual_report_file_served(rf): + request = rf.get('/docs/conservancy_annual-report_fy-2011.pdf') + response = views.index(request) + assert response.headers['Content-Type'] == 'application/pdf' + + +def test_path_traversal_404s(rf): + request = rf.get('/about/../../settings.py') + with pytest.raises(Http404): + views.index(request) diff --git a/requirements.txt b/requirements.txt index 7135ff1e..7b7a5ab5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,4 @@ Django==3.2.19 beautifulsoup4==4.11.2 html5lib==1.1 -django_countries==7.3.2 +django-countries==7.3.2