2021-04-20 00:02:10 +02:00
|
|
|
from typing import List
|
|
|
|
|
|
|
|
from django.contrib.auth import get_user_model
|
|
|
|
from django.test import TestCase
|
|
|
|
|
|
|
|
from writingtogether.models import StoryRound, Story, StoryPart
|
|
|
|
|
|
|
|
User = get_user_model()
|
|
|
|
|
|
|
|
class TestModelFunctions(TestCase):
|
|
|
|
|
|
|
|
def create_users_and_story_round_with_stories_and_parts(self):
|
|
|
|
self.user1 = User.objects.create(username='player1')
|
|
|
|
self.user2 = User.objects.create(username='player2')
|
|
|
|
|
|
|
|
self.story_round = StoryRound.objects.create(
|
|
|
|
name='test_round',
|
|
|
|
number_of_rounds=4
|
|
|
|
)
|
|
|
|
self.story_round.participants.add(self.user1)
|
|
|
|
self.story_round.participants.add(self.user2)
|
|
|
|
|
|
|
|
self.story1 = Story.objects.create(
|
|
|
|
name='story1',
|
|
|
|
part_of_round=self.story_round,
|
|
|
|
started_by=self.user1,
|
|
|
|
)
|
|
|
|
|
|
|
|
self.story2 = Story.objects.create(
|
|
|
|
name='story2',
|
|
|
|
part_of_round=self.story_round,
|
|
|
|
started_by=self.user2,
|
|
|
|
)
|
|
|
|
|
|
|
|
self.parts1 = self.create_story_parts(self.story1, users=[self.user1, self.user2], num_rounds=4)
|
|
|
|
self.parts2 = self.create_story_parts(self.story2, users=[self.user1, self.user2], num_rounds=4,
|
|
|
|
first_user_index=1)
|
|
|
|
|
|
|
|
def create_story_parts(
|
|
|
|
self, story: Story, users: List[User],
|
|
|
|
num_rounds: int, first_user_index: int = 0
|
|
|
|
) -> List[StoryPart]:
|
|
|
|
parts = []
|
|
|
|
previous_part = None
|
|
|
|
for i in range(num_rounds):
|
|
|
|
user = users[(first_user_index + i) % len(users)]
|
|
|
|
new_part = StoryPart.objects.create(
|
|
|
|
user=user,
|
|
|
|
previous_part=previous_part,
|
2021-04-20 00:25:15 +02:00
|
|
|
part_of=story,
|
2021-04-20 00:25:58 +02:00
|
|
|
turn_number=i
|
2021-04-20 00:02:10 +02:00
|
|
|
)
|
|
|
|
parts.append(new_part)
|
|
|
|
previous_part = new_part
|
|
|
|
|
|
|
|
return parts
|
|
|
|
|
|
|
|
def test_get_first_unfinished_part__nothing_written(self):
|
|
|
|
self.create_users_and_story_round_with_stories_and_parts()
|
|
|
|
|
|
|
|
result = self.story1.get_first_unfinished_part()
|
|
|
|
|
|
|
|
self.assertEqual(result, self.parts1[0])
|
|
|
|
|
|
|
|
def test_get_first_unfinished_part__one_written(self):
|
|
|
|
self.create_users_and_story_round_with_stories_and_parts()
|
|
|
|
self.parts1[0].text = 'some text'
|
|
|
|
self.parts1[0].save()
|
|
|
|
|
|
|
|
result = self.story1.get_first_unfinished_part()
|
|
|
|
|
|
|
|
self.assertEqual(result, self.parts1[1])
|
|
|
|
|
|
|
|
def test_get_first_unfinished_part__finished(self):
|
|
|
|
self.create_users_and_story_round_with_stories_and_parts()
|
|
|
|
self.parts1[0].text = 'some text'
|
|
|
|
self.parts1[0].save()
|
|
|
|
self.parts1[1].text = 'some text'
|
|
|
|
self.parts1[1].save()
|
|
|
|
self.parts1[2].text = 'some text'
|
|
|
|
self.parts1[2].save()
|
|
|
|
self.parts1[3].text = 'some text'
|
|
|
|
self.parts1[3].save()
|
|
|
|
self.story1.finished = True
|
|
|
|
self.story1.save()
|
|
|
|
|
|
|
|
result = self.story1.get_first_unfinished_part()
|
|
|
|
|
|
|
|
self.assertEqual(result, None)
|
2021-04-20 00:25:58 +02:00
|
|
|
|
|
|
|
def test_next_round_ready__game_start(self):
|
|
|
|
self.create_users_and_story_round_with_stories_and_parts()
|
|
|
|
self.assertFalse(self.story_round.next_round_ready())
|
|
|
|
|
|
|
|
def test_next_round_ready__half_done(self):
|
|
|
|
self.create_users_and_story_round_with_stories_and_parts()
|
|
|
|
self.parts1[0].text = 'some text'
|
|
|
|
self.parts1[0].save()
|
|
|
|
self.assertFalse(self.story_round.next_round_ready())
|
|
|
|
|
|
|
|
def test_next_round_ready__first_round_done(self):
|
|
|
|
self.create_users_and_story_round_with_stories_and_parts()
|
|
|
|
|
|
|
|
self.parts1[0].text = 'some text'
|
|
|
|
self.parts1[0].save()
|
|
|
|
self.parts2[0].text = 'some text'
|
|
|
|
self.parts2[0].save()
|
|
|
|
self.assertTrue(self.story_round.next_round_ready())
|
|
|
|
|
|
|
|
def test_next_round_ready__second_round_done(self):
|
|
|
|
self.create_users_and_story_round_with_stories_and_parts()
|
|
|
|
self.story_round.current_turn = 1
|
|
|
|
self.story_round.save()
|
|
|
|
|
|
|
|
self.parts1[1].text = 'some text'
|
|
|
|
self.parts1[1].save()
|
|
|
|
self.parts2[1].text = 'some text'
|
|
|
|
self.parts2[1].save()
|
|
|
|
self.assertTrue(self.story_round.next_round_ready())
|
2021-04-20 00:31:50 +02:00
|
|
|
|
|
|
|
def test_get_next_story_part__each_user_starts_with_own_story(self):
|
|
|
|
self.create_users_and_story_round_with_stories_and_parts()
|
|
|
|
|
|
|
|
result = self.story_round.get_next_story_part(self.user1)
|
|
|
|
self.assertEqual(result, self.parts1[0])
|
|
|
|
|
|
|
|
result = self.story_round.get_next_story_part(self.user2)
|
|
|
|
self.assertEqual(result, self.parts2[0])
|
|
|
|
|
|
|
|
def test_get_next_story_part__second_round_story_switched(self):
|
|
|
|
self.create_users_and_story_round_with_stories_and_parts()
|
|
|
|
self.parts1[0].text = 'some text'
|
|
|
|
self.parts1[0].save()
|
|
|
|
|
|
|
|
self.parts2[0].text = 'some text'
|
|
|
|
self.parts2[0].save()
|
|
|
|
|
|
|
|
self.story_round.current_turn = 1
|
|
|
|
self.story_round.save()
|
|
|
|
|
|
|
|
result = self.story_round.get_next_story_part(self.user1)
|
|
|
|
self.assertEqual(result, self.parts2[1])
|
|
|
|
|
|
|
|
result = self.story_round.get_next_story_part(self.user2)
|
|
|
|
self.assertEqual(result, self.parts1[1])
|