Changeset - daf93dc32b26
[Not reviewed]
0 4 0
Ben Sturmfels (bsturmfels) - 1 month ago 2024-03-13 03:26:01
ben@sturm.com.au
Switch content tests to pytest
4 files changed with 45 insertions and 36 deletions:
0 comments (0 inline, 0 general)
README.md
Show inline comments
...
 
@@ -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
bin/deploy.sh
Show inline comments
...
 
@@ -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
conservancy/tests.py
Show inline comments
 
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 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')
 

	
 
    def test_path_traversal_404s(self):
 
        request = self.factory.get('/about/../../settings.py')
 
        with self.assertRaises(Http404):
 
            views.index(request)
 
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)
 
    )
 

	
 

	
 
@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_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)
requirements.txt
Show inline comments
...
 
@@ -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
0 comments (0 inline, 0 general)