fix apply subscription
This commit is contained in:
@@ -21,6 +21,7 @@ build-backend = "uv_build"
|
||||
dev = [
|
||||
"black>=25.1.0",
|
||||
"isort>=6.0.1",
|
||||
"pytest>=8.4.2",
|
||||
]
|
||||
|
||||
[project.scripts]
|
||||
|
||||
@@ -19,8 +19,8 @@ class Event(Base):
|
||||
title: Mapped[str] = mapped_column(nullable=False)
|
||||
event_time: Mapped[datetime] = mapped_column(nullable=False)
|
||||
registration_deadline: Mapped[datetime] = mapped_column(nullable=False)
|
||||
description: Mapped[str] = mapped_column()
|
||||
recipe_link: Mapped[str] = mapped_column()
|
||||
description: Mapped[str] = mapped_column(nullable=True)
|
||||
recipe_link: Mapped[str] = mapped_column(nullable=True)
|
||||
|
||||
# Min and max number of people needed for cooking, doing the dishes and preparing the tables
|
||||
team_cooking_min: Mapped[int] = mapped_column(default=3, nullable=False)
|
||||
|
||||
@@ -42,9 +42,9 @@ def apply_subscriptions(session: Session, event: Event = None, dry_run: bool = F
|
||||
query = select(Event).where(
|
||||
~Event.subscriptions_applied,
|
||||
~Event.ignore_subscriptions,
|
||||
func.strftime("%Y-%m-%d %H:%M:%S", Event.event_time) >= today.isoformat(),
|
||||
func.strftime("%Y-%m-%d %H:%M:%S", Event.event_time)
|
||||
<= (today + datetime.timedelta(days=7)).isoformat(),
|
||||
func.strftime("%Y-%m-%d", Event.event_time) >= today.strftime("%Y-%m-%d"),
|
||||
func.strftime("%Y-%m-%d", Event.event_time)
|
||||
<= (today + datetime.timedelta(days=7)).strftime("%Y-%m-%d"),
|
||||
)
|
||||
events = session.scalars(query).all()
|
||||
|
||||
|
||||
19
tests/conftest.py
Normal file
19
tests/conftest.py
Normal file
@@ -0,0 +1,19 @@
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
|
||||
from meal_manager.models import Base
|
||||
import pytest
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def db_session():
|
||||
engine = create_engine("sqlite:///:memory:")
|
||||
Base.metadata.create_all(bind=engine) # Create tables
|
||||
TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
||||
|
||||
# Provide a session and the engine
|
||||
db = TestingSessionLocal()
|
||||
try:
|
||||
yield db
|
||||
finally:
|
||||
db.close()
|
||||
56
tests/test_nightly_tasks.py
Normal file
56
tests/test_nightly_tasks.py
Normal file
@@ -0,0 +1,56 @@
|
||||
import datetime
|
||||
|
||||
from meal_manager.models import Event, Household, Subscription
|
||||
from meal_manager.scripts import apply_subscriptions
|
||||
|
||||
|
||||
def test_subscriptions(db_session):
|
||||
now = datetime.datetime.now()
|
||||
event1 = Event(
|
||||
title="far future",
|
||||
event_time=now + datetime.timedelta(days=8, hours=2),
|
||||
registration_deadline=now + datetime.timedelta(days=3),
|
||||
description="This event should not be proceesed.",
|
||||
)
|
||||
event2 = Event(
|
||||
title="soon",
|
||||
event_time=now + datetime.timedelta(days=7, hours=2),
|
||||
registration_deadline=now + datetime.timedelta(days=2),
|
||||
description="This event should be proceesed.",
|
||||
)
|
||||
ignore = Event(
|
||||
title="ignore me",
|
||||
event_time=now + datetime.timedelta(days=7, hours=2),
|
||||
description=(
|
||||
"This event should not be proceesed because it "
|
||||
"has ignore_subscriptions set to True."
|
||||
),
|
||||
registration_deadline=now + datetime.timedelta(days=2, hours=2),
|
||||
ignore_subscriptions=True,
|
||||
)
|
||||
db_session.add(event1)
|
||||
db_session.add(event2)
|
||||
db_session.add(ignore)
|
||||
|
||||
db_session.add(Household(name="Klaus", id=1))
|
||||
db_session.add(
|
||||
Subscription(
|
||||
household_id=1,
|
||||
num_adult_meals=2,
|
||||
num_children_meals=1,
|
||||
num_small_children_meals=0,
|
||||
)
|
||||
)
|
||||
db_session.commit()
|
||||
|
||||
assert not event1.subscriptions_applied
|
||||
assert not event2.subscriptions_applied
|
||||
|
||||
apply_subscriptions(db_session)
|
||||
|
||||
assert len(event1.registrations) == 0
|
||||
assert len(event2.registrations) == 1
|
||||
assert len(ignore.registrations) == 0
|
||||
assert not event1.subscriptions_applied
|
||||
assert not ignore.subscriptions_applied
|
||||
assert event2.subscriptions_applied
|
||||
36
uv.lock
generated
36
uv.lock
generated
@@ -275,6 +275,15 @@ wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "iniconfig"
|
||||
version = "2.3.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "isort"
|
||||
version = "6.0.1"
|
||||
@@ -375,6 +384,7 @@ dependencies = [
|
||||
dev = [
|
||||
{ name = "black" },
|
||||
{ name = "isort" },
|
||||
{ name = "pytest" },
|
||||
]
|
||||
|
||||
[package.metadata]
|
||||
@@ -392,6 +402,7 @@ requires-dist = [
|
||||
dev = [
|
||||
{ name = "black", specifier = ">=25.1.0" },
|
||||
{ name = "isort", specifier = ">=6.0.1" },
|
||||
{ name = "pytest", specifier = ">=8.4.2" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -463,6 +474,15 @@ wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/40/4b/2028861e724d3bd36227adfa20d3fd24c3fc6d52032f4a93c133be5d17ce/platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85", size = 18654, upload-time = "2025-08-26T14:32:02.735Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pluggy"
|
||||
version = "1.6.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pydantic"
|
||||
version = "2.11.7"
|
||||
@@ -533,6 +553,22 @@ wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/f2/47/e43f2d8b88477a9b27b39d97e3c61534ae3cda4c99771f8b3c81d2469486/pygrister-0.8.0-py3-none-any.whl", hash = "sha256:b882a93db0aae642435d23f8e6f6a50f737befa35e3cce72f234bedd0ef4bee6", size = 31863, upload-time = "2025-08-10T10:53:46.345Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pytest"
|
||||
version = "8.4.2"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
||||
{ name = "iniconfig" },
|
||||
{ name = "packaging" },
|
||||
{ name = "pluggy" },
|
||||
{ name = "pygments" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "python-dotenv"
|
||||
version = "1.1.1"
|
||||
|
||||
Reference in New Issue
Block a user