Skip to content

Commit

Permalink
Cleanup tracker codebase a little, more tests
Browse files Browse the repository at this point in the history
  • Loading branch information
rafalp committed Aug 27, 2024
1 parent 674af24 commit 828a631
Show file tree
Hide file tree
Showing 13 changed files with 225 additions and 110 deletions.
2 changes: 1 addition & 1 deletion misago/categories/components.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

from ..permissions.enums import CategoryPermission
from ..permissions.proxy import UserPermissionsProxy
from ..readtracker.categories import (
from ..readtracker.tracker import (
annotate_categories_read_time,
get_categories_unread_posts,
)
Expand Down
56 changes: 0 additions & 56 deletions misago/readtracker/categories.py

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Generated by Django 4.2.10 on 2024-08-24 11:29
# Generated by Django 4.2.10 on 2024-08-27 16:36

from django.conf import settings
from django.db import migrations, models
Expand All @@ -9,15 +9,15 @@
class Migration(migrations.Migration):

dependencies = [
("misago_threads", "0014_plugin_data"),
("misago_categories", "0013_new_behaviors"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("misago_threads", "0014_plugin_data"),
("misago_readtracker", "0004_auto_20171015_2010"),
]

operations = [
migrations.CreateModel(
name="ReadThread",
name="ReadCategory",
fields=[
(
"id",
Expand All @@ -36,13 +36,6 @@ class Migration(migrations.Migration):
to="misago_categories.category",
),
),
(
"thread",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="misago_threads.thread",
),
),
(
"user",
models.ForeignKey(
Expand All @@ -51,16 +44,9 @@ class Migration(migrations.Migration):
),
),
],
options={
"indexes": [
models.Index(
fields=["user", "thread"], name="misago_read_user_id_537fc1_idx"
)
],
},
),
migrations.CreateModel(
name="ReadCategory",
name="ReadThread",
fields=[
(
"id",
Expand All @@ -79,6 +65,13 @@ class Migration(migrations.Migration):
to="misago_categories.category",
),
),
(
"thread",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="misago_threads.thread",
),
),
(
"user",
models.ForeignKey(
Expand All @@ -87,13 +80,20 @@ class Migration(migrations.Migration):
),
),
],
options={
"indexes": [
models.Index(
fields=["user", "category"],
name="misago_read_user_id_203f85_idx",
)
],
},
),
migrations.DeleteModel(
name="PostRead",
),
migrations.AddConstraint(
model_name="readthread",
constraint=models.UniqueConstraint(
fields=("user", "thread"), name="uniq_user_thread"
),
),
migrations.AddConstraint(
model_name="readcategory",
constraint=models.UniqueConstraint(
fields=("user", "category"), name="uniq_user_category"
),
),
]
16 changes: 0 additions & 16 deletions misago/readtracker/migrations/0006_delete_postread.py

This file was deleted.

10 changes: 6 additions & 4 deletions misago/readtracker/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,10 @@ class ReadCategory(models.Model):
read_time = models.DateTimeField(default=timezone.now)

class Meta:
indexes = [
models.Index(fields=["user", "category"]),
constraints = [
models.UniqueConstraint(
fields=["user", "category"], name="uniq_user_category"
),
]


Expand All @@ -21,6 +23,6 @@ class ReadThread(models.Model):
read_time = models.DateTimeField(default=timezone.now)

class Meta:
indexes = [
models.Index(fields=["user", "thread"]),
constraints = [
models.UniqueConstraint(fields=["user", "thread"], name="uniq_user_thread"),
]
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from django.utils import timezone

from ...categories.models import Category
from ..categories import annotate_categories_read_time
from ..models import ReadCategory
from ..tracker import annotate_categories_read_time


def test_annotate_categories_read_time_is_noop_for_anonymous_user(db, anonymous_user):
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from django.utils import timezone

from ...threads.models import Thread
from ..threads import annotate_threads_read_time
from ..models import ReadCategory, ReadThread
from ..tracker import annotate_threads_read_time


def test_annotate_threads_read_time_is_noop_for_anonymous_user(anonymous_user, thread):
Expand Down
4 changes: 2 additions & 2 deletions misago/readtracker/tests/test_get_categories_unread_posts.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@
from django.utils import timezone

from ...categories.models import Category
from ..categories import annotate_categories_read_time, get_categories_unread_posts
from ..models import ReadCategory
from ..tracker import annotate_categories_read_time, get_categories_unread_posts


def test_get_categories_unread_posts_returns_false_anonymous_user(
def test_get_categories_unread_posts_returns_false_for_anonymous_user(
dynamic_settings, default_category, anonymous_user
):
default_category.last_post_on = timezone.now()
Expand Down
137 changes: 137 additions & 0 deletions misago/readtracker/tests/test_get_threads_unread_posts.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
from datetime import timedelta
from unittest.mock import Mock

from django.utils import timezone

from ..models import ReadCategory, ReadThread
from ..tracker import annotate_threads_read_time, get_threads_unread_posts


def test_get_threads_unread_posts_returns_false_for_anonymous_user(
dynamic_settings, default_category, thread, anonymous_user
):
request = Mock(settings=dynamic_settings, user=anonymous_user)
queryset = annotate_threads_read_time(anonymous_user, default_category.thread_set)
unread_posts = get_threads_unread_posts(request, queryset.all())

assert not unread_posts[thread.id]


def test_get_threads_unread_posts_returns_true_for_unread_thread(
dynamic_settings, default_category, thread, user
):
user.joined_on -= timedelta(minutes=30)
user.save()

request = Mock(settings=dynamic_settings, user=user)
queryset = annotate_threads_read_time(user, default_category.thread_set)
unread_posts = get_threads_unread_posts(request, queryset.all())

assert unread_posts[thread.id]


def test_get_threads_unread_posts_returns_false_for_unread_thread_older_than_user(
dynamic_settings, default_category, thread, user
):
thread.last_post_on -= timedelta(minutes=30)
thread.save()

request = Mock(settings=dynamic_settings, user=user)
queryset = annotate_threads_read_time(user, default_category.thread_set)
unread_posts = get_threads_unread_posts(request, queryset.all())

assert not unread_posts[thread.id]


def test_get_threads_unread_posts_returns_false_for_old_unread_thread(
dynamic_settings, default_category, thread, user
):
user.joined_on = user.joined_on.replace(year=2010)
user.save()

thread.last_post_on = thread.last_post_on.replace(year=2012)
thread.save()

request = Mock(settings=dynamic_settings, user=user)
queryset = annotate_threads_read_time(user, default_category.thread_set)
unread_posts = get_threads_unread_posts(request, queryset.all())

assert not unread_posts[thread.id]


def test_get_threads_unread_posts_returns_false_for_read_thread(
dynamic_settings, default_category, thread, user
):
user.joined_on -= timedelta(minutes=30)
user.save()

ReadThread.objects.create(
user=user,
category=default_category,
thread=thread,
read_time=timezone.now(),
)

request = Mock(settings=dynamic_settings, user=user)
queryset = annotate_threads_read_time(user, default_category.thread_set)
unread_posts = get_threads_unread_posts(request, queryset.all())

assert not unread_posts[thread.id]


def test_get_threads_unread_posts_returns_false_for_unread_thread_in_read_category(
dynamic_settings, default_category, thread, user
):
user.joined_on -= timedelta(minutes=30)
user.save()

ReadCategory.objects.create(
user=user,
category=default_category,
read_time=timezone.now(),
)

request = Mock(settings=dynamic_settings, user=user)
queryset = annotate_threads_read_time(user, default_category.thread_set)
unread_posts = get_threads_unread_posts(request, queryset.all())

assert not unread_posts[thread.id]


def test_get_threads_unread_posts_returns_true_for_read_thread_with_unread_reply(
dynamic_settings, default_category, thread, user
):
user.joined_on -= timedelta(minutes=30)
user.save()

ReadThread.objects.create(
user=user,
category=default_category,
thread=thread,
read_time=timezone.now() - timedelta(minutes=5),
)

request = Mock(settings=dynamic_settings, user=user)
queryset = annotate_threads_read_time(user, default_category.thread_set)
unread_posts = get_threads_unread_posts(request, queryset.all())

assert unread_posts[thread.id]


def test_get_threads_unread_posts_returns_true_for_read_thread_in_read_category_with_unread_reply(
dynamic_settings, default_category, thread, user
):
user.joined_on -= timedelta(minutes=30)
user.save()

ReadCategory.objects.create(
user=user,
category=default_category,
read_time=timezone.now() - timedelta(minutes=5),
)

request = Mock(settings=dynamic_settings, user=user)
queryset = annotate_threads_read_time(user, default_category.thread_set)
unread_posts = get_threads_unread_posts(request, queryset.all())

assert unread_posts[thread.id]
Loading

0 comments on commit 828a631

Please sign in to comment.