Wrote full test suite for housewars app

This commit is contained in:
Ceferino Patino 2022-09-05 21:01:33 -05:00
commit 58e3b16455
26 changed files with 590 additions and 32 deletions

View file

@ -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(

View file

@ -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),
),
]

View 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),
),
]

View file

@ -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)

View file

@ -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)

View file

View 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)

View 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)

View 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)

View file

View 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)

View 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)

View 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)

View file

View 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)

View 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)

View file

@ -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)

View file

@ -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)

View file

@ -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):