Merge pull request #126 from danieldupriest/test-report

Tests for report get, review, finalize, delete and one date bug fix
This commit is contained in:
ppdom 2019-03-08 22:07:17 -08:00 committed by GitHub
commit e1a2ffbec7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 217 additions and 4 deletions

View file

@ -0,0 +1,25 @@
# Generated by Django 2.1.7 on 2019-03-08 22:16
import datetime
from django.db import migrations, models
from django.utils.timezone import utc
class Migration(migrations.Migration):
dependencies = [
('backend', '0002_auto_20190303_0106'),
]
operations = [
migrations.AlterField(
model_name='report',
name='date_created',
field=models.DateTimeField(default=datetime.datetime(2019, 3, 8, 22, 16, 32, 697634, tzinfo=utc), verbose_name='date created'),
),
migrations.AlterField(
model_name='report',
name='date_submitted',
field=models.DateTimeField(default=datetime.datetime(2019, 3, 8, 22, 16, 32, 697634, tzinfo=utc), verbose_name='date submitted'),
),
]

View file

@ -0,0 +1,24 @@
# Generated by Django 2.1.7 on 2019-03-08 22:23
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('backend', '0003_auto_20190308_1416'),
]
operations = [
migrations.AlterField(
model_name='report',
name='date_created',
field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='date created'),
),
migrations.AlterField(
model_name='report',
name='date_submitted',
field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='date submitted'),
),
]

View file

@ -1,6 +1,6 @@
from django.db import models from django.db import models
from django.conf import settings from django.conf import settings
import datetime from django.utils import timezone
import ntpath import ntpath
class Report(models.Model): class Report(models.Model):
@ -10,8 +10,8 @@ class Report(models.Model):
""" """
user_id = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) user_id = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
title = models.CharField(max_length=128) title = models.CharField(max_length=128)
date_created = models.DateTimeField('date created', default=datetime.date.today) date_created = models.DateTimeField('date created', default=timezone.now)
date_submitted = models.DateTimeField('date submitted', default=datetime.date.today) date_submitted = models.DateTimeField('date submitted', default=timezone.now)
submitted = models.BooleanField(default=False) submitted = models.BooleanField(default=False)
reference_number = models.CharField(max_length=32, default='') reference_number = models.CharField(max_length=32, default='')

View file

@ -5,14 +5,21 @@ from users.models import CustomUser
from unittest.mock import Mock, patch from unittest.mock import Mock, patch
from datetime import date from datetime import date
from backend.views import * from backend.views import *
import json
class ReportTests(TestCase): class ReportTests(TestCase):
def create_test_user(self, email, first, last, password): def create_test_user(self, email, first, last, password):
"""
Create a test user and return it.
"""
user = CustomUser.objects.create_user(username=email, email=email, first_name=first, last_name=last, password=password) user = CustomUser.objects.create_user(username=email, email=email, first_name=first, last_name=last, password=password)
return user return user
def mock_report(): def mock_report():
"""
Generates a mock object with the attributes of a report.
"""
r = Mock() r = Mock()
r.report_pk = 1 r.report_pk = 1
r.title = 'Report Title' r.title = 'Report Title'
@ -23,10 +30,18 @@ class ReportTests(TestCase):
return r return r
def setUp(self): def setUp(self):
"""
Create a couple test users and save them in the database.
"""
self.test_user_1 = self.create_test_user('one@one.com', 'One', 'Mr. One', '1password') self.test_user_1 = self.create_test_user('one@one.com', 'One', 'Mr. One', '1password')
self.test_user_1.save() self.test_user_1.save()
self.test_user_2 = self.create_test_user('two@two.com', 'Two', 'Mr. Two', '1password')
self.test_user_2.save()
def test_create_report_logged_in(self): def test_create_report_logged_in(self):
"""
Test when an authenticated user tries to submit a report.
"""
factory = APIRequestFactory() factory = APIRequestFactory()
request = factory.post('/api/v1/report', {'title':'Test Report', 'reference':'12345'}) request = factory.post('/api/v1/report', {'title':'Test Report', 'reference':'12345'})
user = CustomUser.objects.get(email='one@one.com') user = CustomUser.objects.get(email='one@one.com')
@ -37,6 +52,9 @@ class ReportTests(TestCase):
self.assertEqual(report.title, 'Test Report') self.assertEqual(report.title, 'Test Report')
def test_create_report_logged_out(self): def test_create_report_logged_out(self):
"""
Test when an unauthenticated user tries to create a report.
"""
factory = APIRequestFactory() factory = APIRequestFactory()
request = factory.post('/api/v1/report', {'title':'Test Report', 'reference':'12345'}) request = factory.post('/api/v1/report', {'title':'Test Report', 'reference':'12345'})
response = create_report(request) response = create_report(request)
@ -57,3 +75,147 @@ class ReportTests(TestCase):
'submitted':False 'submitted':False
} }
) )
def test_report_submit_for_review_logged_out(self):
"""
Test for when an unauthenticated user tries to submit a report for review.
"""
factory = APIRequestFactory()
request = factory.put('/api/v1/report/1')
response = report_detail(request)
self.assertEqual(response.status_code, 401)
def test_report_submit_for_review_logged_in_not_finalized(self):
"""
Test for when an authenticated user tries to submit for review a report
that has not been finalized yet.
"""
factory = APIRequestFactory()
add_report_request = factory.post('/api/v1/report', {'title':'Test Report', 'reference':'12345'})
user = CustomUser.objects.get(email='one@one.com')
force_authenticate(add_report_request, user=user)
create_report(add_report_request)
review_request = factory.put('/api/v1/report/1')
force_authenticate(review_request, user=user)
response = report_detail(review_request, 1)
self.assertEqual(response.status_code, 200)
report = Report.objects.get(user_id=user)
self.assertFalse(report.submitted)
def test_report_submit_for_review_logged_in_already_finalized(self):
"""
Test for when an authenticated user tries to submit for review a report
that has already been finalized.
"""
factory = APIRequestFactory()
add_report_request = factory.post('/api/v1/report', {'title':'Test Report', 'reference':'12345'})
user = CustomUser.objects.get(email='one@one.com')
force_authenticate(add_report_request, user=user)
create_report(add_report_request)
report = Report.objects.get(user_id=user)
report.submitted = True
report.save()
review_request = factory.put('/api/v1/report/1')
force_authenticate(review_request, user=user)
response = report_detail(review_request, 1)
self.assertEqual(response.status_code, 409)
def test_report_finalize_logged_out(self):
"""
Test for when an unauthenticated user tries to finalize a report.
"""
factory = APIRequestFactory()
request = factory.put('/api/v1/report/1/final')
response = finalize_report(request, 1)
self.assertEqual(response.status_code, 401)
def test_report_finalize_wrong_owner(self):
"""
Test for when an authenticated user tries to finalize someone else's report.
"""
factory = APIRequestFactory()
# Create a report for user One
add_report_1_request = factory.post('/api/v1/report', {'title':'One\'s Report', 'reference':'12345'})
force_authenticate(add_report_1_request, user=self.test_user_1)
create_report(add_report_1_request)
# Create a report for user Two
add_report_2_request = factory.post('/api/v1/report', {'title':'Two\'s Report', 'reference':'12345'})
force_authenticate(add_report_2_request, user=self.test_user_2)
create_report(add_report_2_request)
# Try finalizing user Two's report with user One
request = factory.put('/api/v1/report/2/final')
force_authenticate(request, user=self.test_user_1)
response = finalize_report(request, 2)
self.assertEqual(response.status_code, 401)
def test_report_finalize_logged_in_not_finalized(self):
"""
Test for when an authenticated user tries to finalize a report
that has not been finalized yet.
"""
factory = APIRequestFactory()
add_report_request = factory.post('/api/v1/report', {'title':'Test Report', 'reference':'12345'})
user = CustomUser.objects.get(email='one@one.com')
force_authenticate(add_report_request, user=user)
create_report(add_report_request)
review_request = factory.put('/api/v1/report/1/final')
force_authenticate(review_request, user=user)
response = finalize_report(review_request, 1)
self.assertEqual(response.status_code, 200)
report = Report.objects.get(user_id=user)
self.assertTrue(report.submitted)
def test_report_finalize_logged_in_already_finalized(self):
"""
Test for when an authenticated user tries to finalize a report
that has already been finalized.
"""
factory = APIRequestFactory()
add_report_request = factory.post('/api/v1/report', {'title':'Test Report', 'reference':'12345'})
user = CustomUser.objects.get(email='one@one.com')
force_authenticate(add_report_request, user=user)
create_report(add_report_request)
report = Report.objects.get(user_id=user)
report.submitted = True
report.save()
review_request = factory.put('/api/v1/report/1/final')
force_authenticate(review_request, user=user)
response = finalize_report(review_request, 1)
self.assertEqual(response.status_code, 409)
def test_report_get_report_logged_in(self):
"""
Test for when an authenticated user tries to view a report.
"""
factory = APIRequestFactory()
add_report_request = factory.post('/api/v1/report', {'title':'Test Report', 'reference':'12345'})
user = CustomUser.objects.get(email='one@one.com')
force_authenticate(add_report_request, user=user)
create_report(add_report_request)
get_request = factory.get('/api/v1/report/1')
force_authenticate(get_request, user=user)
response = report_detail(get_request, 1)
self.assertEqual(response.status_code, 200)
report = Report.objects.get(user_id=user)
# Check that the json response contains the title of the report we want
j = json.loads(response.content.decode("utf-8", "strict"))
self.assertEqual(report.title, j['title'])
def test_report_delete_report_logged_in(self):
"""
Test for when an authenticated user tries to delete a report.
"""
factory = APIRequestFactory()
add_report_request = factory.post('/api/v1/report', {'title':'Test Report', 'reference':'12345'})
user = CustomUser.objects.get(email='one@one.com')
force_authenticate(add_report_request, user=user)
create_report(add_report_request)
delete_request = factory.delete('/api/v1/report/1')
force_authenticate(delete_request, user=user)
response = report_detail(delete_request, 1)
self.assertEqual(response.status_code, 200)
reports = Report.objects.filter(user_id=user)
self.assertEqual(len(reports), 0)

View file

@ -6,6 +6,7 @@ import os
from django.core.mail import EmailMultiAlternatives from django.core.mail import EmailMultiAlternatives
from django.template.loader import render_to_string from django.template.loader import render_to_string
from decouple import config from decouple import config
from django.utils import timezone
def get_report(report_pk): def get_report(report_pk):
""" """
@ -125,7 +126,7 @@ def create_report(request):
report = Report.objects.create( report = Report.objects.create(
user_id=request.user, user_id=request.user,
title=request.data['title'], title=request.data['title'],
date_created=datetime.date.today(), date_created=timezone.now(),
reference_number=request.data['reference'] reference_number=request.data['reference']
) )
report.save() report.save()
@ -245,6 +246,7 @@ def finalize_report(request, report_pk):
if r.submitted: if r.submitted:
return JsonResponse({"message": "Cannot submit a report that has already been submitted."}, status=409) return JsonResponse({"message": "Cannot submit a report that has already been submitted."}, status=409)
r.submitted = True r.submitted = True
r.date_submitted = timezone.now()
r.save() r.save()
# Send email # Send email
send_report_to_admin(request, report_pk, status="FINAL") send_report_to_admin(request, report_pk, status="FINAL")

Binary file not shown.