Skip to content

Commit

Permalink
docker testing setup and recurrent todo tests
Browse files Browse the repository at this point in the history
  • Loading branch information
awallenfang committed Sep 20, 2024
1 parent 70ad366 commit d41d23e
Show file tree
Hide file tree
Showing 13 changed files with 205 additions and 18 deletions.
1 change: 0 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,3 @@ WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
ENTRYPOINT ["sh", "./startup.sh"]
2 changes: 2 additions & 0 deletions startup.sh → debug_startup.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#!/bin/bash

echo "Running debug build"

echo "Building migrations"
python ./manage.py makemigrations

Expand Down
30 changes: 30 additions & 0 deletions docker-compose-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
services:
db:
image: postgres
volumes:
- ./data/db:/var/lib/postgresql/data
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
ports:
- "5432:5432"
web:
build: .
# command: python manage.py runserver 0.0.0.0:42069
entrypoint: bash test_startup.sh
volumes:
- .:/code
ports:
- "42069:42069"
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_PORT=5432
- POSTGRES_HOST=db
- DJANGO_SUPERUSER_USERNAME=admin
- [email protected]
- DJANGO_SUPERUSER_PASSWORD=admin
depends_on:
- db
2 changes: 1 addition & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ services:
web:
build: .
# command: python manage.py runserver 0.0.0.0:42069
command: bash startup.sh
entrypoint: bash debug_startup.sh
volumes:
- .:/code
ports:
Expand Down
20 changes: 11 additions & 9 deletions hub/tests.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,26 @@
from django.test import TestCase
from django.contrib.auth.models import User as AuthUser
from .models import InvalidTokenError, User, SharedSpace
from space.models import InvalidTokenError, SharedSpace
from .models import User
# Create your tests here.
class UserTest(TestCase):
def create_testuser(self):
auth_user = AuthUser.objects.create_user(username="testname", password="test")
def create_testuser(self, name):
auth_user = AuthUser.objects.create_user(username=name, password="test")
user = User.objects.create(auth_user=auth_user)
return user

def test_user_creation(self):
user = self.create_testuser()
user = self.create_testuser("test1")
self.assertTrue(isinstance(user, User))
self.assertEqual(user.__str__(), "User: testname")
self.assertEqual(user.__str__(), "User: test1")

class SharedSpaceTest(TestCase):
def create_testspace(self):
return SharedSpace.create_space("test space")
user = self.create_testuser("test2")
return SharedSpace.create_space("test space", user)

def create_testuser(self):
auth_user = AuthUser.objects.create_user(username="testname1", password="test")
def create_testuser(self, name):
auth_user = AuthUser.objects.create_user(username=name, password="test")
user = User.objects.create(auth_user=auth_user)
return user

Expand All @@ -30,7 +32,7 @@ def test_space_creation(self):

def test_space_user_connection(self):
space = self.create_testspace()
user = self.create_testuser()
user = self.create_testuser("test3")

SharedSpace.join(user, space.invite_token)

Expand Down
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ sqlparse==0.5.1
typing_extensions==4.12.2
coverage==7.6.1
django-htmx==1.19.0
psycopg2-binary
psycopg2==2.9.9
4 changes: 4 additions & 0 deletions space/tests.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
from django.test import TestCase

# Create your tests here.

class SpaceTest(TestCase):
def create_test_spaces(self):
pass
2 changes: 1 addition & 1 deletion space/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ def select_space(request, space_id):
def create_space(request):
user = User.objects.get(auth_user = request.user)
space = SharedSpace.create_space("My Space", user)
user = User.objects.get(auth_user = request.user)

SharedSpace.join(user, space.invite_token)

if user.selected_space == None:
Expand Down
18 changes: 18 additions & 0 deletions test_startup.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#!/bin/bash

echo "Running test docker file"

echo "Building migrations"
python ./manage.py makemigrations

echo "Applying migrations"
python ./manage.py migrate

echo "Running tests"
python manage.py test

# echo "Creating superuser"
# python manage.py createsuperuser --noinput

# echo "Starting Django application"
# python manage.py runserver 0.0.0.0:42069
25 changes: 25 additions & 0 deletions todos/migrations/0009_ordereduser_empty_alter_ordereduser_user.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Generated by Django 5.0.8 on 2024-09-20 13:21

import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('hub', '0007_alter_user_selected_space'),
('todos', '0008_todo_assigned_user_ordereduser_todorecurrency_and_more'),
]

operations = [
migrations.AddField(
model_name='ordereduser',
name='empty',
field=models.BooleanField(default=False),
),
migrations.AlterField(
model_name='ordereduser',
name='user',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='hub.user'),
),
]
18 changes: 18 additions & 0 deletions todos/migrations/0010_alter_todorecurrency_started_at.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 5.0.8 on 2024-09-20 13:49

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('todos', '0009_ordereduser_empty_alter_ordereduser_user'),
]

operations = [
migrations.AlterField(
model_name='todorecurrency',
name='started_at',
field=models.DateField(auto_created=True, auto_now_add=True),
),
]
50 changes: 46 additions & 4 deletions todos/models.py
Original file line number Diff line number Diff line change
@@ -1,34 +1,56 @@
import datetime

from django.db import models, transaction
from django.db.models import F
from django.utils.timezone import localtime, now

from hub.models import SharedSpace, User

######## Recurrent Todo helpers

class OrderedUser(models.Model):
user = models.ForeignKey("hub.User", on_delete=models.CASCADE)
user = models.ForeignKey("hub.User", on_delete=models.CASCADE, null=True, blank=True)
recurrent_todo = models.ForeignKey("todos.TodoRecurrency", on_delete=models.CASCADE)
order = models.IntegerField(default=0)
empty = models.BooleanField(default=False)

def __str__(self):
return f'OrderedUser: {self.user} - {self.recurrent_todo} | {self.order}'

class TodoRecurrency(models.Model):
assigned_users = models.ManyToManyField("hub.User", through=OrderedUser)
recurrency_turn = models.IntegerField(default=0, blank=False, null=False)
started_at = models.DateField(auto_created=True)
started_at = models.DateField(auto_created=True, auto_now_add=True)
day_rotation = models.IntegerField(default=7)

def create_with_settings(users, rate):
recurrency = TodoRecurrency.objects.create(recurrency_turn = 0, day_rotation = rate)

for (i, user) in enumerate(users):
OrderedUser(user=user, recurrent_todo = recurrency, order = i)
OrderedUser.save()
if user:
user = OrderedUser(user=user, recurrent_todo = recurrency, order = i)
user.save()
else:
user = OrderedUser(empty = True, recurrent_todo = recurrency, order = i)
user.save()


return recurrency

def add_user(self,user):
OrderedUser(user=user, recurrent_todo = self, order = len(OrderedUser.objects.all(recurrent_todo = self)))
OrderedUser.save()

def add_empty(self):
OrderedUser(empty = True, recurrent_todo = self, order = len(OrderedUser.objects.all(recurrent_todo = self)))
OrderedUser.save()

def get_user_at_day(self,n) -> User:
users = OrderedUser.objects.filter(recurrent_todo = self).order_by("order")
idx = (n // self.day_rotation) % len(users)
return users[idx].user


#######

class Todo(models.Model):
Expand Down Expand Up @@ -133,6 +155,26 @@ def add_recurrent_user(self, user):
recurrency.add_user(user)
recurrency.save()

def get_currently_assigned_user(self) -> User:
if self.recurrent_state:
current_time = localtime(now()).date()
start_time = self.recurrent_state.started_at

passed_time = current_time - start_time
return self.recurrent_state.get_user_at_day(passed_time.days)
else:
return self.assigned_user

def get_next_assigned_user(self) -> User:
if self.recurrent_state:
current_time = localtime(now()).date()
start_time = self.recurrent_state.started_at

passed_time = current_time - start_time
return self.recurrent_state.get_user_at_day(passed_time.days + self.recurrent_state.day_rotation)
else:
return self.assigned_user




Expand Down
50 changes: 48 additions & 2 deletions todos/tests.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,39 @@
from django.test import TestCase
from django.contrib.auth.models import User as AuthUser


from .models import Todo
from space.models import SharedSpace
from hub.models import User

# Create your tests here.
class TodosTest(TestCase):
def create_random_users(self, n) -> list[User]:
users = []
for i in range(n):
auth_user = AuthUser.objects.create(username=str(i), password="a")
user = User.objects.create(auth_user=auth_user)

users.append(user)

return users


def create_test_todos(self, n):
auth_user = AuthUser.objects.create(username="a", password="a")
user = User.objects.create(auth_user=auth_user)
space = SharedSpace.create_space("test", user)
for _ in range(n):
Todo.create_in_space()
Todo.create_in_space(space)

def create_single_todo(self) -> Todo:
auth_user = AuthUser.objects.create(username="a", password="a")
user = User.objects.create(auth_user=auth_user)
space = SharedSpace.create_space("test", user)

todo = Todo.create_in_space(space)

return todo

def test_creation(self):
self.create_test_todos(10)
Expand All @@ -23,4 +50,23 @@ def test_reordering(self):
self.assertEqual(left_todo.position, 8)

left_todo.reorder(-1,0)
self.assertEqual(left_todo.position, 0)
self.assertEqual(left_todo.position, 0)

def test_recurrency(self):
todo = self.create_single_todo()
users = self.create_random_users(3)

todo.make_recurrent(users)

self.assertEqual(users[0], todo.get_currently_assigned_user())
self.assertEqual(users[1], todo.get_next_assigned_user())

def test_empty_recurrency(self):
todo = self.create_single_todo()
users = self.create_random_users(3)
users[1] = None

todo.make_recurrent(users)

self.assertEqual(users[0], todo.get_currently_assigned_user())
self.assertEqual(None, todo.get_next_assigned_user())

0 comments on commit d41d23e

Please sign in to comment.