mirror of https://github.com/stijndcl/didier
				
				
				
			
						commit
						76f1ba3543
					
				|  | @ -54,7 +54,11 @@ jobs: | |||
|       - name: Install dependencies | ||||
|         run: pip3 install -r requirements.txt -r requirements-dev.txt | ||||
|       - name: Run Pytest | ||||
|         run: pytest tests | ||||
|         run: | | ||||
|           coverage run -m pytest | ||||
|           coverage xml | ||||
|       - name: Upload coverage report to CodeCov | ||||
|         uses: codecov/codecov-action@v3 | ||||
|   linting: | ||||
|     needs: [dependencies] | ||||
|     runs-on: ubuntu-latest | ||||
|  |  | |||
|  | @ -0,0 +1,14 @@ | |||
| comment: | ||||
|   layout: "reach, diff, flags, files" | ||||
|   behavior: default | ||||
|   require_changes: false  # if true: only post the comment if coverage changes | ||||
|   require_base: no        # [yes :: must have a base report to post] | ||||
|   require_head: yes       # [yes :: must have a head report to post] | ||||
| 
 | ||||
| coverage: | ||||
|   round: down | ||||
|   precision: 5 | ||||
| 
 | ||||
| ignore: | ||||
|   - "./tests/*" | ||||
|   - "./didier/cogs/*"     # Cogs can't really be tested properly | ||||
|  | @ -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] | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -1,6 +1,22 @@ | |||
| [tool.black] | ||||
| line-length = 120 | ||||
| 
 | ||||
| [tool.coverage.run] | ||||
| concurrency = [ | ||||
|     "greenlet" | ||||
| ] | ||||
| source = [ | ||||
|     "didier", | ||||
|     "database" | ||||
| ] | ||||
| omit = [ | ||||
|     "./tests/*", | ||||
|     "./database/migrations.py", | ||||
|     "./didier/cogs/*", | ||||
|     "./didier/didier.py", | ||||
|     "./didier/data/* | ||||
| ] | ||||
| 
 | ||||
| [tool.mypy] | ||||
| plugins = [ | ||||
|     "sqlalchemy.ext.mypy.plugin" | ||||
|  |  | |||
|  | @ -1,4 +1,5 @@ | |||
| black==22.3.0 | ||||
| coverage[toml]==6.4.1 | ||||
| mypy==0.961 | ||||
| pylint==2.14.1 | ||||
| pytest==7.1.2 | ||||
|  |  | |||
|  | @ -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 | ||||
|  | @ -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" | ||||
		Loading…
	
		Reference in New Issue