create story round: add tests & fix implementation

This commit is contained in:
Gesche 2021-04-20 22:52:03 +02:00
parent b1e3031254
commit 82e26a812c
3 changed files with 102 additions and 7 deletions

View File

@ -12,8 +12,8 @@
{% if open_story_round_list %} {% if open_story_round_list %}
<ul> <ul>
{% for story in open_story_round_list %} {% for story_round in open_story_round_list %}
<li><a href="{% url 'writing:redirect_story_part' story_pk=story.pk %}">{{ story.name }}</a></li> <li><a href="{% url 'writing:redirect_story_part' story_round_pk=story_round.pk %}">{{ story_round.name }}</a></li>
{% endfor %} {% endfor %}
</ul> </ul>

View File

@ -0,0 +1,92 @@
from django.contrib.auth import get_user_model
from django.test import TestCase
from django.urls import reverse
from writingtogether.models import Story, StoryPart
User = get_user_model()
class TestViews(TestCase):
def setUp(self) -> None:
self.user1 = User.objects.create(username='player1')
self.user2 = User.objects.create(username='player2')
def test_create_story_round_two_rounds(self):
response = self.client.post(
reverse('writing:create_story_round'),
{
'name': 'test round',
'participants': [self.user1.pk, self.user2.pk],
'number_of_rounds': 2
}
)
self.assertEqual(response.status_code, 302)
self.assertEqual(Story.objects.all().count(), 2)
self.assertEqual(StoryPart.objects.all().count(), 4)
story_user1 = Story.objects.get(started_by=self.user1.pk)
story_user2 = Story.objects.get(started_by=self.user2.pk)
story_user1_parts = StoryPart.objects.filter(part_of=story_user1)
story_user2_parts = StoryPart.objects.filter(part_of=story_user2)
# each story has 2 story parts
self.assertEqual(story_user1_parts.count(), 2)
self.assertEqual(story_user2_parts.count(), 2)
def test_create_story_round_4_rounds(self):
response = self.client.post(
reverse('writing:create_story_round'),
{
'name': 'test round',
'participants': [self.user1.pk, self.user2.pk],
'number_of_rounds': 4
}
)
self.assertEqual(response.status_code, 302)
self.assertEqual(Story.objects.all().count(), 2)
self.assertEqual(StoryPart.objects.all().count(), 8)
story_user1 = Story.objects.get(started_by=self.user1.pk)
story_user2 = Story.objects.get(started_by=self.user2.pk)
story_user1_parts = StoryPart.objects.filter(part_of=story_user1)
story_user2_parts = StoryPart.objects.filter(part_of=story_user2)
# each story has 2 story parts
self.assertEqual(story_user1_parts.count(), 4)
self.assertEqual(story_user2_parts.count(), 4)
def test_create_story_round_three_users_two_rounds(self):
user3 = User.objects.create(username='player3')
response = self.client.post(
reverse('writing:create_story_round'),
{
'name': 'test round',
'participants': [self.user1.pk, self.user2.pk, user3.pk],
'number_of_rounds': 2
}
)
self.assertEqual(response.status_code, 302)
self.assertEqual(Story.objects.all().count(), 3)
self.assertEqual(StoryPart.objects.all().count(), 6)
story_user1 = Story.objects.get(started_by=self.user1.pk)
story_user2 = Story.objects.get(started_by=self.user2.pk)
story_user3 = Story.objects.get(started_by=user3.pk)
story_user1_parts = StoryPart.objects.filter(part_of=story_user1)
story_user2_parts = StoryPart.objects.filter(part_of=story_user2)
story_user3_parts = StoryPart.objects.filter(part_of=story_user3)
# each story has 2 story parts
self.assertEqual(story_user1_parts.count(), 2)
self.assertEqual(story_user2_parts.count(), 2)
self.assertEqual(story_user3_parts.count(), 2)

View File

@ -31,24 +31,27 @@ class StoryRoundCreate(CreateView):
def form_valid(self, form): def form_valid(self, form):
self.object = form.save() self.object = form.save()
sorted_participants = sorted(form.cleaned_data['participants']) sorted_participants = sorted([user.pk for user in form.cleaned_data['participants']])
number_of_participants = len(sorted_participants) number_of_participants = len(sorted_participants)
for user in sorted_participants: for user_id in sorted_participants:
story = Story.objects.create( story = Story.objects.create(
part_of_round=self.object, part_of_round=self.object,
started_by=user started_by_id=user_id
) )
previous_part=None previous_part=None
for i in range(form.cleaned_data['number_of_rounds']): for i in range(form.cleaned_data['number_of_rounds']):
current_part = StoryPart.objects.create( current_part = StoryPart.objects.create(
user=sorted_participants[i % number_of_participants], user_id=sorted_participants[i % number_of_participants],
previous_part=previous_part, previous_part=previous_part,
part_of=story part_of=story,
turn_number=0
) )
previous_part = current_part previous_part = current_part
return HttpResponseRedirect(self.get_success_url())
class StoryUpdate(UpdateView): class StoryUpdate(UpdateView):
model = Story model = Story