Wrote full test suite for housewars app
This commit is contained in:
parent
63a28a6813
commit
58e3b16455
26 changed files with 590 additions and 32 deletions
|
|
@ -36,7 +36,7 @@ class UserEntryForm(Form):
|
|||
|
||||
# Verify that email domain matches
|
||||
if ('@slps.org' not in email):
|
||||
raise ValidationError("Please use your school email")
|
||||
raise ValidationError("Please use your school email.")
|
||||
# Verify that the email is unique
|
||||
if UserEntry.objects.filter(email=email).exists():
|
||||
raise ValidationError(
|
||||
|
|
|
|||
|
|
@ -0,0 +1,23 @@
|
|||
# Generated by Django 4.0.4 on 2022-09-07 12:05
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('housewars', '0004_alter_pointsentry_unique_together'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='activity',
|
||||
name='room_number',
|
||||
field=models.IntegerField(blank=True, default=None, null=True),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='teacher',
|
||||
name='grade',
|
||||
field=models.IntegerField(blank=True, choices=[(9, '9th/Freshman'), (10, '10th/Sophomore'), (11, '11th/Junior'), (12, '12th/Senior')], default=None, null=True),
|
||||
),
|
||||
]
|
||||
18
housewars/migrations/0005_alter_teacher_grade.py
Normal file
18
housewars/migrations/0005_alter_teacher_grade.py
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
# Generated by Django 4.0.4 on 2022-09-06 13:44
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('housewars', '0004_alter_pointsentry_unique_together'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='teacher',
|
||||
name='grade',
|
||||
field=models.IntegerField(blank=True, choices=[(9, '9th/Freshman'), (10, '10th/Sophomore'), (11, '11th/Junior'), (12, '12th/Senior')], default=None, null=True),
|
||||
),
|
||||
]
|
||||
|
|
@ -13,6 +13,7 @@ class Activity(models.Model):
|
|||
name = models.CharField(max_length=100)
|
||||
default_quota = models.IntegerField(default=0)
|
||||
time = models.IntegerField(choices=TimeslotChoices)
|
||||
room_number = models.IntegerField(blank=True, null=True, default=None)
|
||||
password = models.CharField(
|
||||
max_length=100, blank=True, null=True, default=None)
|
||||
|
||||
|
|
|
|||
|
|
@ -17,7 +17,8 @@ class Teacher(models.Model):
|
|||
last_name = models.CharField(max_length=100)
|
||||
house = models.ForeignKey(
|
||||
House, related_name='teacher', default=None, blank=True, null=True, on_delete=models.SET_NULL)
|
||||
grade = models.IntegerField(choices=GradeChoices)
|
||||
grade = models.IntegerField(
|
||||
choices=GradeChoices, default=None, blank=True, null=True)
|
||||
activity = models.OneToOneField(
|
||||
Activity, related_name='teacher', default=None, blank=True, null=True, on_delete=models.SET_NULL)
|
||||
|
||||
|
|
|
|||
0
housewars/tests/forms/__init__.py
Normal file
0
housewars/tests/forms/__init__.py
Normal file
33
housewars/tests/forms/test_activity_form.py
Normal file
33
housewars/tests/forms/test_activity_form.py
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
from django.test import TestCase
|
||||
|
||||
from housewars.forms import ActivityForm
|
||||
from housewars.models import Activity, House
|
||||
|
||||
|
||||
class ActivityFormTest(TestCase):
|
||||
def setUp(self):
|
||||
self.activity30 = Activity.objects.create(name='Dodgeball', time=30)
|
||||
self.activity60 = Activity.objects.create(name='Dodgeball', time=60)
|
||||
|
||||
def test_valid_time(self):
|
||||
form = ActivityForm(data={
|
||||
'activity1': self.activity30.id,
|
||||
'activity2': self.activity30.id,
|
||||
})
|
||||
|
||||
self.assertTrue(form.is_valid())
|
||||
|
||||
def test_invalid_time(self):
|
||||
form = ActivityForm(data={
|
||||
'activity1': self.activity60.id,
|
||||
'activity2': self.activity30.id,
|
||||
})
|
||||
|
||||
self.assertFalse(form.is_valid())
|
||||
self.assertEquals(len(form.errors), 1)
|
||||
|
||||
def test_no_data(self):
|
||||
form = ActivityForm(data={})
|
||||
|
||||
self.assertFalse(form.is_valid())
|
||||
self.assertEquals(len(form.errors), 2)
|
||||
27
housewars/tests/forms/test_points_entry_form.py
Normal file
27
housewars/tests/forms/test_points_entry_form.py
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
from django.test import TestCase
|
||||
|
||||
from housewars.forms import PointsEntryForm
|
||||
from housewars.models import Activity, House, Award
|
||||
|
||||
|
||||
class ActivityFormTest(TestCase):
|
||||
def setUp(self):
|
||||
self.house = House.objects.create(name='Hawk')
|
||||
self.activity = Activity.objects.create(name='Dodgeball', time=30)
|
||||
self.activity2 = Activity.objects.create(name='Dodgeball', time=30)
|
||||
self.award = Award.objects.create(name='1st', activity=self.activity)
|
||||
|
||||
def test_valid_time(self):
|
||||
form = PointsEntryForm(data={
|
||||
'house': self.house.id,
|
||||
'activity': self.activity.id,
|
||||
'award': self.award.id
|
||||
})
|
||||
|
||||
self.assertTrue(form.is_valid())
|
||||
|
||||
def test_no_data(self):
|
||||
form = PointsEntryForm(data={})
|
||||
|
||||
self.assertFalse(form.is_valid())
|
||||
self.assertEquals(len(form.errors), 3)
|
||||
38
housewars/tests/forms/test_user_entry_form.py
Normal file
38
housewars/tests/forms/test_user_entry_form.py
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
from django.test import TestCase
|
||||
|
||||
from housewars.forms import UserEntryForm
|
||||
from housewars.models import House
|
||||
|
||||
|
||||
class UserEntryFormTest(TestCase):
|
||||
def setUp(self):
|
||||
self.house = House.objects.create(name='Hawk', points=30)
|
||||
|
||||
def test_valid(self):
|
||||
form = UserEntryForm(data={
|
||||
'first_name': 'Test',
|
||||
'last_name': 'User',
|
||||
'email': 'test.user@slps.org',
|
||||
'grade': 9,
|
||||
'house': self.house.id
|
||||
})
|
||||
|
||||
self.assertTrue(form.is_valid())
|
||||
|
||||
def test_invalid_email(self):
|
||||
form = UserEntryForm(data={
|
||||
'first_name': 'Test',
|
||||
'last_name': 'User',
|
||||
'email': 'test.user@gmail.com',
|
||||
'grade': 9,
|
||||
'house': self.house.id
|
||||
})
|
||||
|
||||
self.assertFalse(form.is_valid())
|
||||
self.assertEqual(len(form.errors), 1)
|
||||
|
||||
def test_no_data(self):
|
||||
form = UserEntryForm(data={})
|
||||
|
||||
self.assertFalse(form.is_valid())
|
||||
self.assertEquals(len(form.errors), 5)
|
||||
0
housewars/tests/models/__init__.py
Normal file
0
housewars/tests/models/__init__.py
Normal file
23
housewars/tests/models/test_house.py
Normal file
23
housewars/tests/models/test_house.py
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
from django.test import TestCase
|
||||
|
||||
from housewars.models import Activity, House, Award, PointsEntry
|
||||
|
||||
|
||||
class HouseModelTest(TestCase):
|
||||
def setUp(self):
|
||||
self.house = House.objects.create(name='Hawk', points=30)
|
||||
self.activity = Activity.objects.create(name='Dodgeball', time=30)
|
||||
self.award = Award.objects.create(
|
||||
activity=self.activity, name='1st', points=30)
|
||||
|
||||
def test_current_points(self):
|
||||
PointsEntry.objects.create(
|
||||
activity=self.activity, house=self.house, award=self.award)
|
||||
|
||||
self.assertEquals(self.house.current_points, 30)
|
||||
|
||||
def test_total_points(self):
|
||||
PointsEntry.objects.create(
|
||||
activity=self.activity, house=self.house, award=self.award)
|
||||
|
||||
self.assertEquals(self.house.total_points, 60)
|
||||
18
housewars/tests/models/test_user_entry.py
Normal file
18
housewars/tests/models/test_user_entry.py
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
from django.test import TestCase, Client
|
||||
from django.urls import reverse
|
||||
|
||||
from housewars.models import Activity, House, Teacher, UserEntry
|
||||
|
||||
|
||||
class UserEntryTest(TestCase):
|
||||
def setUp(self):
|
||||
self.client = Client()
|
||||
self.house = House.objects.create(name='Hawk', points=30)
|
||||
self.activity = Activity.objects.create(name='Dodgeball', time=30)
|
||||
self.entry = UserEntry.objects.create(
|
||||
first_name='Test', last_name='User', email='test.user@slps.org', grade=9, house=self.house, activity1=self.activity, activity2=self.activity)
|
||||
self.teacher = Teacher.objects.create(
|
||||
first_name='Test', last_name='Teacher', grade=9, house=self.house)
|
||||
|
||||
def test_mentor(self):
|
||||
self.assertEquals(self.entry.mentor, self.teacher)
|
||||
14
housewars/tests/test_urls.py
Normal file
14
housewars/tests/test_urls.py
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
from django.test import TestCase
|
||||
from django.urls import reverse, resolve
|
||||
|
||||
from housewars.views import EntryCreateView, PointsEntryCreateView
|
||||
|
||||
|
||||
class TestUrls(TestCase):
|
||||
def test_entry_create_is_resolved(self):
|
||||
url = reverse('housewars:signup')
|
||||
self.assertEquals(resolve(url).func.view_class, EntryCreateView)
|
||||
|
||||
def test_points_entry_create_is_resolved(self):
|
||||
url = reverse('housewars:add_points')
|
||||
self.assertEquals(resolve(url).func.view_class, PointsEntryCreateView)
|
||||
0
housewars/tests/utils/__init__.py
Normal file
0
housewars/tests/utils/__init__.py
Normal file
15
housewars/tests/utils/test_get_random_string.py
Normal file
15
housewars/tests/utils/test_get_random_string.py
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
from django.test import TestCase
|
||||
|
||||
from housewars.utils import get_random_string
|
||||
|
||||
|
||||
class GetRandomStringTest(TestCase):
|
||||
def test_string_of_length_8(self):
|
||||
"""The string generated is of the correct length"""
|
||||
string = get_random_string(8)
|
||||
self.assertEqual(len(string), 8)
|
||||
|
||||
def test_string_of_length_6(self):
|
||||
"""The string generated is of the correct length"""
|
||||
string = get_random_string(6)
|
||||
self.assertEqual(len(string), 6)
|
||||
25
housewars/tests/utils/test_unpack_values.py
Normal file
25
housewars/tests/utils/test_unpack_values.py
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
from django.test import TestCase
|
||||
|
||||
from housewars.utils import unpack_values
|
||||
from housewars.models import House
|
||||
|
||||
|
||||
class UnpackValuesTest(TestCase):
|
||||
def setUp(self):
|
||||
House.objects.create(name="Hawk")
|
||||
House.objects.create(name="Snowy")
|
||||
|
||||
self.test_queryset = House.objects.all()
|
||||
|
||||
def test_valid_row_headers(self):
|
||||
"""Correctly unpacks the headers into the first index"""
|
||||
values = unpack_values(self.test_queryset)
|
||||
self.assertEqual(
|
||||
values[0], [field.name for field in House._meta.fields])
|
||||
|
||||
def test_complete_values(self):
|
||||
"""Maintains the complete queryset and returns it"""
|
||||
values = unpack_values(self.test_queryset)
|
||||
queryset = list(self.test_queryset.values_list())
|
||||
for row in queryset:
|
||||
self.assertIn(list(row), values)
|
||||
|
|
@ -1,15 +1,35 @@
|
|||
from django.test import TestCase
|
||||
from django.test import TestCase, Client
|
||||
from django.urls import reverse
|
||||
|
||||
from ...models import Activity, House
|
||||
from housewars.models import Activity, House, Award
|
||||
|
||||
|
||||
class PointsEntryCreateViewTest(TestCase):
|
||||
def test_view_url_accessible_by_name(self):
|
||||
response = self.client.get(reverse('housewars:add_points'))
|
||||
self.assertEqual(response.status_code, 200)
|
||||
def setUp(self):
|
||||
self.client = Client()
|
||||
self.url = reverse('housewars:add_points')
|
||||
self.house = House.objects.create(name='Hawk')
|
||||
self.activity = Activity.objects.create(name='Dodgeball', time=30)
|
||||
self.award = Award.objects.create(activity=self.activity, name='1st')
|
||||
|
||||
def test_view_uses_correct_template(self):
|
||||
response = self.client.get(reverse('housewars:add_points'))
|
||||
self.assertEqual(response.status_code, 200)
|
||||
def test_GET(self):
|
||||
response = self.client.get(self.url)
|
||||
|
||||
self.assertEquals(response.status_code, 200)
|
||||
self.assertTemplateUsed(response, 'housewars/pointsentry_form.html')
|
||||
|
||||
def test_POST(self):
|
||||
response = self.client.post(self.url, {
|
||||
'house': self.house.id,
|
||||
'activity': self.activity.id,
|
||||
'award': self.award.id
|
||||
})
|
||||
|
||||
self.assertEquals(response.status_code, 302)
|
||||
self.assertEquals(self.house.pointsentry_set.count(), 1)
|
||||
|
||||
def test_failed_POST(self):
|
||||
response = self.client.post(self.url)
|
||||
|
||||
self.assertEquals(response.status_code, 200)
|
||||
self.assertEquals(self.house.pointsentry_set.count(), 0)
|
||||
|
|
|
|||
|
|
@ -1,15 +1,68 @@
|
|||
from django.test import TestCase
|
||||
import enum
|
||||
from django.test import TestCase, Client
|
||||
from django.urls import reverse
|
||||
|
||||
from ...models import Activity, House
|
||||
from housewars.models import Activity, House
|
||||
|
||||
|
||||
class UserEntryCreateViewTest(TestCase):
|
||||
def test_view_url_accessible_by_name(self):
|
||||
response = self.client.get(reverse('housewars:signup'))
|
||||
self.assertEqual(response.status_code, 200)
|
||||
def setUp(self):
|
||||
self.client = Client()
|
||||
self.url = reverse('housewars:signup')
|
||||
self.house = House.objects.create(name='Hawk')
|
||||
self.activity = Activity.objects.create(
|
||||
name='Dodgeball', time=30, default_quota=5)
|
||||
self.full_activity = Activity.objects.create(
|
||||
name='Dodgeball', time=30)
|
||||
|
||||
def test_view_uses_correct_template(self):
|
||||
response = self.client.get(reverse('housewars:signup'))
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertTemplateUsed(response, 'housewars/entry_form.html')
|
||||
def test_POST(self):
|
||||
user_info_form = {
|
||||
'user-first_name': 'Test',
|
||||
'user-last_name': 'User',
|
||||
'user-email': 'asdfasdf@slps.org',
|
||||
'user-grade': 9,
|
||||
'user-house': self.house.id,
|
||||
'entry_create_view-current_step': 'user'
|
||||
}
|
||||
|
||||
activity_form = {
|
||||
'activity-activity1': self.activity.id,
|
||||
'activity-activity2': self.activity.id,
|
||||
'entry_create_view-current_step': 'activity'
|
||||
}
|
||||
|
||||
steps_data = [user_info_form, activity_form]
|
||||
|
||||
for data in steps_data:
|
||||
self.client.post(self.url, data)
|
||||
|
||||
self.assertEquals(self.house.userentry_set.count(), 1)
|
||||
|
||||
def test_full_activity_POST(self):
|
||||
user_info_form = {
|
||||
'user-first_name': 'Test',
|
||||
'user-last_name': 'User',
|
||||
'user-email': 'asdfasdf@slps.org',
|
||||
'user-grade': 9,
|
||||
'user-house': self.house.id,
|
||||
'entry_create_view-current_step': 'user'
|
||||
}
|
||||
|
||||
activity_form = {
|
||||
'activity-activity1': self.full_activity.id,
|
||||
'activity-activity2': self.full_activity.id,
|
||||
'entry_create_view-current_step': 'activity'
|
||||
}
|
||||
|
||||
steps_data = [user_info_form, activity_form]
|
||||
|
||||
for data in steps_data:
|
||||
self.client.post(self.url, data)
|
||||
|
||||
self.assertEquals(self.house.userentry_set.count(), 0)
|
||||
|
||||
def test_empty_POST(self):
|
||||
response = self.client.post(self.url)
|
||||
|
||||
self.assertEquals(response.status_code, 400)
|
||||
self.assertEquals(self.house.pointsentry_set.count(), 0)
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ class EntryCreateView(SessionWizardView):
|
|||
def done(self, form_list, **kwargs):
|
||||
UserEntry.objects.create(**self.get_all_cleaned_data())
|
||||
|
||||
messages.success(self.request, 'Your entry has been submitted')
|
||||
messages.success(self.request, 'Your signup has been submitted.')
|
||||
return redirect('housewars:signup')
|
||||
|
||||
def get_success_url(self):
|
||||
|
|
|
|||
Reference in a new issue