Files
worblehat/tests/queries/test_bookcase_item.py
T

116 lines
3.6 KiB
Python

from sqlalchemy.orm import Session
from worblehat.models import (
Bookcase,
BookcaseItem,
BookcaseShelf,
MediaType,
)
from worblehat.queries.bookcase_item import (
find_bookcase_item_by_isbn,
find_bookcase_item_by_name,
list_bookcase_items_by_owner,
search_bookcase_item_owners,
search_bookcase_items_by_title,
)
def _make_bookcase_item(
sql_session: Session,
name: str = "Some Book",
isbn: str = "1234567890",
owner: str = "PVV",
) -> BookcaseItem:
media_type = MediaType(name=f"Media type for {name}")
bookcase = Bookcase(name=f"Bookcase for {name}")
shelf = BookcaseShelf(row=0, column=0, bookcase=bookcase)
sql_session.add_all([media_type, bookcase, shelf])
sql_session.flush()
item = BookcaseItem(name, isbn, owner)
item.media_type = media_type
item.shelf = shelf
sql_session.add(item)
sql_session.flush()
return item
def test_find_bookcase_item_by_isbn_returns_match(sql_session: Session) -> None:
item = _make_bookcase_item(sql_session, isbn="1111111111")
result = find_bookcase_item_by_isbn(sql_session, "1111111111")
assert result is item
def test_find_bookcase_item_by_isbn_returns_none_when_missing(sql_session: Session) -> None:
_make_bookcase_item(sql_session, isbn="1111111111")
result = find_bookcase_item_by_isbn(sql_session, "2222222222")
assert result is None
def test_find_bookcase_item_by_name_returns_match(sql_session: Session) -> None:
item = _make_bookcase_item(sql_session, name="Unique Title")
result = find_bookcase_item_by_name(sql_session, "Unique Title")
assert result is item
def test_find_bookcase_item_by_name_returns_none_when_missing(sql_session: Session) -> None:
_make_bookcase_item(sql_session, name="Unique Title")
result = find_bookcase_item_by_name(sql_session, "Other Title")
assert result is None
def test_search_bookcase_items_by_title_matches_substring_case_insensitively(
sql_session: Session,
) -> None:
item = _make_bookcase_item(sql_session, name="The Great Gatsby", isbn="1111111111")
_make_bookcase_item(sql_session, name="Moby Dick", isbn="2222222222")
result = search_bookcase_items_by_title(sql_session, "great gatsby")
assert result == [item]
def test_search_bookcase_items_by_title_returns_empty_when_no_match(sql_session: Session) -> None:
_make_bookcase_item(sql_session, name="The Great Gatsby")
result = search_bookcase_items_by_title(sql_session, "nonexistent")
assert result == []
def test_search_bookcase_item_owners_matches_substring_case_insensitively(
sql_session: Session,
) -> None:
_make_bookcase_item(sql_session, name="Book A", isbn="1111111111", owner="alice")
_make_bookcase_item(sql_session, name="Book B", isbn="2222222222", owner="bob")
result = search_bookcase_item_owners(sql_session, "ALI")
assert result == ["alice"]
def test_search_bookcase_item_owners_returns_distinct_owners(sql_session: Session) -> None:
_make_bookcase_item(sql_session, name="Book A", isbn="1111111111", owner="alice")
_make_bookcase_item(sql_session, name="Book B", isbn="2222222222", owner="alice")
result = search_bookcase_item_owners(sql_session, "ali")
assert result == ["alice"]
def test_list_bookcase_items_by_owner_returns_only_matching_owner(sql_session: Session) -> None:
item_a = _make_bookcase_item(sql_session, name="Book A", isbn="1111111111", owner="alice")
_make_bookcase_item(sql_session, name="Book B", isbn="2222222222", owner="bob")
result = list_bookcase_items_by_owner(sql_session, "alice")
assert result == [item_a]