mirror of
https://github.com/ajurna/cbwebreader.git
synced 2026-11-02 10:36:55 +00:00
- Removed `flake8` and `flake8-annotations` from dependencies, replaced by `ruff` for linting. - Introduced cleaner type hinting and modern Python annotations (PEP 604 style) across multiple modules. - Moved archive processing to a dedicated helper (`comic.archives`) for improved maintainability. - Updated and simplified logic for archive file retrieval, directory cleaning, and user access validation. - Improved error handling and added support for user classification restrictions in API responses.
72 lines
2.7 KiB
Python
72 lines
2.7 KiB
Python
"""Tests for the comic models."""
|
|
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
from comic import models
|
|
from comic.tests.factories import make_cbz, make_pdf
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_page_count_excludes_metadata(comic_volume: Path) -> None:
|
|
make_cbz(comic_volume / 'issue.cbz', pages=3, metadata=True)
|
|
book = models.ComicBook.objects.create(file_name='issue.cbz')
|
|
assert book.get_page_count() == 3
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_pdf_page_count(comic_volume: Path) -> None:
|
|
make_pdf(comic_volume / 'issue.pdf', pages=2)
|
|
book = models.ComicBook.objects.create(file_name='issue.pdf')
|
|
assert book.get_page_count() == 2
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_unreadable_archive_is_indexed_without_pages(comic_volume: Path) -> None:
|
|
path = comic_volume / 'broken.cbz'
|
|
path.write_bytes(b'this is not an archive')
|
|
result = models.ComicBook.process_comic_book(path)
|
|
assert isinstance(result, Path)
|
|
assert models.ComicBook.objects.get(file_name='broken.cbz').page_count == 0
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_archive_path_uses_the_directory_tree(comic_volume: Path) -> None:
|
|
parent = models.Directory.objects.create(name='Series')
|
|
child = models.Directory.objects.create(name='Volume 1', parent=parent)
|
|
book = models.ComicBook.objects.create(file_name='issue.cbz', directory=child)
|
|
assert book.get_archive_path == comic_volume / 'Series' / 'Volume 1' / 'issue.cbz'
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_book_without_a_directory_uses_the_volume_root(comic_volume: Path) -> None:
|
|
book = models.ComicBook.objects.create(file_name='issue.cbz')
|
|
assert book.get_archive_path == comic_volume / 'issue.cbz'
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_directory_path_is_built_from_its_parents() -> None:
|
|
parent = models.Directory.objects.create(name='Series')
|
|
child = models.Directory.objects.create(name='Volume 1', parent=parent)
|
|
assert child.get_path() == Path('Series') / 'Volume 1'
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_get_image_returns_the_requested_page(comic_volume: Path) -> None:
|
|
make_cbz(comic_volume / 'issue.cbz', pages=2, metadata=False)
|
|
book = models.ComicBook.objects.create(file_name='issue.cbz')
|
|
stream, mime_type = book.get_image(1)
|
|
assert mime_type == 'image/png'
|
|
assert stream.read()
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_classification_comparison() -> None:
|
|
directory = models.Directory.objects.create(name='Rated', classification=models.Directory.Classification.C_18)
|
|
misc = models.UserMisc.objects.create(
|
|
user=models.User.objects.create_user('pg', 'pg@example.com', 'password12345'),
|
|
allowed_to_read=models.Directory.Classification.C_PG,
|
|
)
|
|
assert directory.classification > misc.allowed_to_read
|