126 lines
3.7 KiB
Python
126 lines
3.7 KiB
Python
import hashlib
|
|
import random
|
|
|
|
import pytest
|
|
from django.contrib.auth import get_user_model
|
|
|
|
from vrobbler.apps.books.koreader import KoReaderBookColumn
|
|
|
|
User = get_user_model()
|
|
|
|
ordinal = lambda n: "%d%s" % (
|
|
n,
|
|
"tsnrhtdd"[(n // 10 % 10 != 1) * (n % 10 < 4) * n % 10 :: 4],
|
|
)
|
|
AVERAGE_PAGE_READING_SECONDS = 60
|
|
|
|
|
|
class DummyResponse:
|
|
status_code = 200
|
|
|
|
def status_code(self):
|
|
return self.status_code
|
|
|
|
|
|
@pytest.fixture
|
|
def valid_response():
|
|
return DummyResponse()
|
|
|
|
|
|
class KoReaderBookRows:
|
|
id = 1
|
|
DEFAULT_STR = "N/A"
|
|
DEFAULT_INT = 0
|
|
DEFAULT_TIME = 1703800469
|
|
BOOK_ROWS = []
|
|
PAGE_STATS_ROWS = []
|
|
|
|
def _gen_random_row(self, i):
|
|
wiggle = random.randrange(15)
|
|
title = f"Memoirs, Volume {i}"
|
|
return [
|
|
i,
|
|
title,
|
|
f"Lord Beaverbrook the {ordinal(i)}",
|
|
self.DEFAULT_INT + wiggle / 10,
|
|
self.DEFAULT_TIME + i * wiggle,
|
|
0,
|
|
300 + wiggle,
|
|
self.DEFAULT_STR,
|
|
self.DEFAULT_STR,
|
|
hashlib.md5(title.encode()).hexdigest(),
|
|
i * wiggle * 20,
|
|
120,
|
|
]
|
|
|
|
def _generate_random_book_rows(self, book_count):
|
|
if book_count > 0:
|
|
for i in range(1, book_count + 1):
|
|
self.BOOK_ROWS.append(self._gen_random_row(i))
|
|
|
|
def _generate_custom_book_row(self, **kwargs):
|
|
title = kwargs.get("title", self.DEFAULT_STR)
|
|
if title and title != "N/A":
|
|
self.BOOK_ROWS.append(
|
|
[
|
|
kwargs.get("id", self.id),
|
|
kwargs.get("title", self.DEFAULT_STR),
|
|
kwargs.get("authors", self.DEFAULT_STR),
|
|
kwargs.get("notes", self.DEFAULT_INT),
|
|
kwargs.get("last_open", self.DEFAULT_TIME),
|
|
kwargs.get("highlights", self.DEFAULT_INT),
|
|
kwargs.get("pages", self.DEFAULT_INT),
|
|
kwargs.get("series", self.DEFAULT_STR),
|
|
kwargs.get("language", self.DEFAULT_STR),
|
|
hashlib.md5(title.encode()),
|
|
kwargs.get("total_read_time", self.DEFAULT_INT),
|
|
kwargs.get("total_read_pages", self.DEFAULT_INT),
|
|
]
|
|
)
|
|
|
|
def _generate_random_page_stats_rows(self):
|
|
for book in self.BOOK_ROWS:
|
|
pages = book[KoReaderBookColumn.PAGES.value]
|
|
pages_per_session = 20
|
|
|
|
start_time = book[KoReaderBookColumn.LAST_OPEN.value]
|
|
end_session = False
|
|
for page_num in range(
|
|
1, book[KoReaderBookColumn.TOTAL_READ_PAGES.value] + 1
|
|
):
|
|
wiggle = random.randrange(5)
|
|
self.PAGE_STATS_ROWS.append(
|
|
[
|
|
book[KoReaderBookColumn.ID.value],
|
|
page_num,
|
|
start_time,
|
|
AVERAGE_PAGE_READING_SECONDS + wiggle,
|
|
pages,
|
|
]
|
|
)
|
|
if end_session:
|
|
start_time += (
|
|
3600 # one second over an hour, marking a new reading session
|
|
)
|
|
end_session = False
|
|
else:
|
|
start_time += AVERAGE_PAGE_READING_SECONDS
|
|
|
|
if page_num % pages_per_session == 0:
|
|
end_session = True
|
|
|
|
def __init__(self, book_count=0, **kwargs):
|
|
self._generate_random_book_rows(book_count)
|
|
self._generate_custom_book_row(**kwargs)
|
|
self._generate_random_page_stats_rows()
|
|
|
|
|
|
@pytest.fixture
|
|
def koreader_rows():
|
|
return KoReaderBookRows(book_count=1)
|
|
|
|
|
|
@pytest.fixture
|
|
def demo_user():
|
|
return User.objects.create(email="demo@example.com")
|