From 27d074d7606b951aa9d91bd61e6402df8b3c1ac1 Mon Sep 17 00:00:00 2001 From: stijndcl Date: Fri, 1 Jul 2022 15:46:56 +0200 Subject: [PATCH] Increase coverage --- didier/utils/types/datetime.py | 2 +- didier/utils/types/string.py | 5 +- .../test_crud/test_ufora_announcements.py | 67 +++++++++++++++++++ tests/test_didier/test_data/__init__.py | 0 .../test_data/test_embeds/__init__.py | 0 .../test_embeds/test_ufora/__init__.py | 0 .../test_ufora/test_ufora_announcements.py | 0 .../test_utils/test_types/__init__.py | 0 .../test_utils/test_types/test_string.py | 22 ++++++ 9 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 tests/test_database/test_crud/test_ufora_announcements.py create mode 100644 tests/test_didier/test_data/__init__.py create mode 100644 tests/test_didier/test_data/test_embeds/__init__.py create mode 100644 tests/test_didier/test_data/test_embeds/test_ufora/__init__.py create mode 100644 tests/test_didier/test_data/test_embeds/test_ufora/test_ufora_announcements.py create mode 100644 tests/test_didier/test_utils/test_types/__init__.py create mode 100644 tests/test_didier/test_utils/test_types/test_string.py diff --git a/didier/utils/types/datetime.py b/didier/utils/types/datetime.py index 6e5c88e..73d9072 100644 --- a/didier/utils/types/datetime.py +++ b/didier/utils/types/datetime.py @@ -1,3 +1,3 @@ -def int_to_weekday(number: int) -> str: +def int_to_weekday(number: int) -> str: # pragma: no cover # it's useless to write a test for this """Get the Dutch name of a weekday from the number""" return ["Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag", "Zondag"][number] diff --git a/didier/utils/types/string.py b/didier/utils/types/string.py index 773890a..eddfff8 100644 --- a/didier/utils/types/string.py +++ b/didier/utils/types/string.py @@ -1,9 +1,10 @@ +import math from typing import Optional def leading(character: str, string: str, target_length: Optional[int] = 2) -> str: """Add a leading [character] to [string] to make it length [target_length] - Pass None to target length to always do it, no matter the length + Pass None to target length to always do it (once), no matter the length """ # Cast to string just in case string = str(string) @@ -16,6 +17,6 @@ def leading(character: str, string: str, target_length: Optional[int] = 2) -> st if len(string) >= target_length: return string - frequency = (target_length - len(string)) // len(character) + frequency = math.ceil((target_length - len(string)) / len(character)) return (frequency * character) + string diff --git a/tests/test_database/test_crud/test_ufora_announcements.py b/tests/test_database/test_crud/test_ufora_announcements.py new file mode 100644 index 0000000..ba6564a --- /dev/null +++ b/tests/test_database/test_crud/test_ufora_announcements.py @@ -0,0 +1,67 @@ +import datetime + +import pytest +from sqlalchemy.ext.asyncio import AsyncSession + +from database.crud import ufora_announcements as crud +from database.models import UforaAnnouncement, UforaCourse + + +@pytest.fixture +async def course(database_session: AsyncSession) -> UforaCourse: + """Fixture to create a course""" + course = UforaCourse(name="test", code="code", year=1, log_announcements=True) + database_session.add(course) + await database_session.commit() + return course + + +@pytest.fixture +async def announcement(course: UforaCourse, database_session: AsyncSession) -> UforaAnnouncement: + """Fixture to create an announcement""" + announcement = UforaAnnouncement(course_id=course.course_id, publication_date=datetime.datetime.now()) + database_session.add(announcement) + await database_session.commit() + return announcement + + +async def test_get_courses_with_announcements_none(database_session: AsyncSession): + """Test getting all courses with announcements when there are none""" + results = await crud.get_courses_with_announcements(database_session) + assert len(results) == 0 + + +async def test_get_courses_with_announcements(database_session: AsyncSession): + """Test getting all courses with announcements""" + course_1 = UforaCourse(name="test", code="code", year=1, log_announcements=True) + course_2 = UforaCourse(name="test2", code="code2", year=1, log_announcements=False) + database_session.add_all([course_1, course_2]) + await database_session.commit() + + results = await crud.get_courses_with_announcements(database_session) + assert len(results) == 1 + assert results[0] == course_1 + + +async def test_create_new_announcement(course: UforaCourse, database_session: AsyncSession): + """Test creating a new announcement""" + await crud.create_new_announcement(database_session, 1, course=course, publication_date=datetime.datetime.now()) + await database_session.refresh(course) + assert len(course.announcements) == 1 + + +async def test_remove_old_announcements(announcement: UforaAnnouncement, database_session: AsyncSession): + """Test removing all stale announcements""" + course = announcement.course + announcement.publication_date -= datetime.timedelta(weeks=2) + announcement_2 = UforaAnnouncement(course_id=announcement.course_id, publication_date=datetime.datetime.now()) + database_session.add_all([announcement, announcement_2]) + await database_session.commit() + await database_session.refresh(course) + assert len(course.announcements) == 2 + + await crud.remove_old_announcements(database_session) + + await database_session.refresh(course) + assert len(course.announcements) == 1 + assert announcement_2.course.announcements[0] == announcement_2 diff --git a/tests/test_didier/test_data/__init__.py b/tests/test_didier/test_data/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_didier/test_data/test_embeds/__init__.py b/tests/test_didier/test_data/test_embeds/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_didier/test_data/test_embeds/test_ufora/__init__.py b/tests/test_didier/test_data/test_embeds/test_ufora/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_didier/test_data/test_embeds/test_ufora/test_ufora_announcements.py b/tests/test_didier/test_data/test_embeds/test_ufora/test_ufora_announcements.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_didier/test_utils/test_types/__init__.py b/tests/test_didier/test_utils/test_types/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_didier/test_utils/test_types/test_string.py b/tests/test_didier/test_utils/test_types/test_string.py new file mode 100644 index 0000000..c3826df --- /dev/null +++ b/tests/test_didier/test_utils/test_types/test_string.py @@ -0,0 +1,22 @@ +from didier.utils.types.string import leading + + +def test_leading(): + """Test leading() when it actually does something""" + assert leading("0", "5") == "05" + assert leading("0", "5", target_length=3) == "005" + + +def test_leading_not_necessary(): + """Test leading() when the input is already long enough""" + assert leading("0", "05") == "05" + + +def test_leading_no_exact(): + """Test leading() when adding would bring you over the required length""" + assert leading("ab", "c", target_length=6) == "abababc" + + +def test_leading_no_target_length(): + """Test leading() when target_length is None""" + assert leading("0", "05", target_length=None) == "005"