from datetime import datetime import dateparser import pytz from apscheduler.job import Job from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore from apscheduler.schedulers.asyncio import AsyncIOScheduler from discord_reminder_bot.main import send_to_discord class TestCountdown: """This tests everything. This sets up sqlite database in memory, changes scheduler timezone to Europe/Stockholm and creates job that runs January 18 2040 and one that runs at 00:00. """ jobstores: dict[str, SQLAlchemyJobStore] = {"default": SQLAlchemyJobStore(url="sqlite:///:memory")} job_defaults: dict[str, bool] = {"coalesce": True} scheduler = AsyncIOScheduler( jobstores=jobstores, timezone=pytz.timezone("Europe/Stockholm"), job_defaults=job_defaults, ) parsed_date: datetime | None = dateparser.parse( "18 January 2040", settings={ "PREFER_DATES_FROM": "future", "TO_TIMEZONE": "Europe/Stockholm", }, ) assert parsed_date run_date: str = parsed_date.strftime("%Y-%m-%d %H:%M:%S") job: Job = scheduler.add_job( send_to_discord, run_date=run_date, kwargs={ "channel_id": 865712621109772329, "message": "Running PyTest", "author_id": 126462229892694018, }, ) timezone_date: datetime | None = dateparser.parse( "00:00", settings={ "PREFER_DATES_FROM": "future", "TIMEZONE": "Europe/Stockholm", "TO_TIMEZONE": "Europe/Stockholm", }, ) assert timezone_date timezone_run_date: str = timezone_date.strftime("%Y-%m-%d %H:%M:%S") timezone_job: Job = scheduler.add_job( send_to_discord, run_date=timezone_run_date, kwargs={ "channel_id": 865712621109772329, "message": "Running PyTest at 00:00", "author_id": 126462229892694018, }, ) timezone_date2: datetime | None = dateparser.parse( "13:37", settings={ "PREFER_DATES_FROM": "future", "TIMEZONE": "Europe/Stockholm", "TO_TIMEZONE": "Europe/Stockholm", }, ) assert timezone_date2 timezone_run_date2: str = timezone_date2.strftime("%Y-%m-%d %H:%M:%S") timezone_job2: Job = scheduler.add_job( send_to_discord, run_date=timezone_run_date2, kwargs={ "channel_id": 865712621109772329, "message": "Running PyTest at 13:37", "author_id": 126462229892694018, }, ) def test_if_timezones_are_working(self) -> None: # noqa: ANN101 """Check if timezones are working. Args: self: TestCountdown """ time_job: Job | None = self.scheduler.get_job(self.timezone_job.id) assert time_job assert time_job.trigger.run_date.hour == 0 assert time_job.trigger.run_date.minute == 0 assert time_job.trigger.run_date.second == 0 time_job2: Job | None = self.scheduler.get_job(self.timezone_job2.id) assert time_job2 assert time_job2.trigger.run_date.hour == 13 # noqa: PLR2004 assert time_job2.trigger.run_date.minute == 37 # noqa: PLR2004 assert time_job2.trigger.run_date.second == 0