diff --git a/app/main.py b/app/main.py index 4917ac8..e1dad58 100644 --- a/app/main.py +++ b/app/main.py @@ -865,7 +865,7 @@ def get_linkable_events(exclude_id: int | None = None): END ) >= CURRENT_DATE {exclude_clause} - ORDER BY start_datetime DESC + ORDER BY start_datetime ASC, id ASC """, parameters, ) diff --git a/app/tests/test_notifications.py b/app/tests/test_notifications.py index 4038fdd..9fee4ad 100644 --- a/app/tests/test_notifications.py +++ b/app/tests/test_notifications.py @@ -1,9 +1,10 @@ """Local PostgreSQL and simulated Firebase tests. Never contacts Firebase.""" from concurrent.futures import ThreadPoolExecutor -from datetime import datetime +from datetime import datetime, timedelta import hashlib import os from pathlib import Path +import re import unittest from unittest.mock import Mock, patch from uuid import uuid4 @@ -192,6 +193,62 @@ class NotificationDatabaseTests(unittest.TestCase): self.clients[0].post(f'/concerts/{concert}/edit', data=form, follow_redirects=False) self.assertEqual(self.scalar("SELECT count(*) FROM push_notifications WHERE state='pending'"), 1) + def test_linkable_events_are_chronological_in_create_and_edit_forms(self): + with main.get_db_connection() as db: + rows = db.execute(""" + INSERT INTO concerts(artist, start_datetime, end_datetime, event_type, visibility, created_by) + VALUES + ('Active festival', date_trunc('day', CURRENT_TIMESTAMP) - INTERVAL '1 day' + INTERVAL '18 hours', date_trunc('day', CURRENT_TIMESTAMP) + INTERVAL '23 hours 59 minutes', 'festival', 'public', 1), + ('Near concert', date_trunc('day', CURRENT_TIMESTAMP) + INTERVAL '2 days 20 hours', NULL, 'concert', 'public', 1), + ('Same-time concert', date_trunc('day', CURRENT_TIMESTAMP) + INTERVAL '2 days 20 hours', NULL, 'concert', 'public', 1), + ('Upcoming festival', date_trunc('day', CURRENT_TIMESTAMP) + INTERVAL '3 days 10 hours', date_trunc('day', CURRENT_TIMESTAMP) + INTERVAL '4 days 23 hours', 'festival', 'public', 1), + ('Later concert', date_trunc('day', CURRENT_TIMESTAMP) + INTERVAL '6 days 20 hours', NULL, 'concert', 'public', 1), + ('Past concert', date_trunc('day', CURRENT_TIMESTAMP) - INTERVAL '1 day', NULL, 'concert', 'public', 1), + ('Finished festival', date_trunc('day', CURRENT_TIMESTAMP) - INTERVAL '3 days', date_trunc('day', CURRENT_TIMESTAMP) - INTERVAL '1 day', 'festival', 'public', 1) + RETURNING id + """).fetchall() + active_festival, near_concert, same_time_concert, upcoming_festival, later_concert, _, _ = [row[0] for row in rows] + edit_event_id = db.execute(""" + INSERT INTO concerts(artist, start_datetime, event_type, visibility, created_by) + VALUES ('Test pre-show', date_trunc('day', CURRENT_TIMESTAMP) + INTERVAL '5 days', 'other', 'public', 1) + RETURNING id + """).fetchone()[0] + + expected_ids = [active_festival, near_concert, same_time_concert, upcoming_festival, later_concert] + for language in ('de', 'en'): + self.clients[0].get('/language/' + language, follow_redirects=False) + create_page = self.clients[0].get('/concerts/new') + self.assertEqual(create_page.status_code, 200) + create_select = re.search(r'