import csv from datetime import datetime from io import StringIO import pytest from books.models import Author, Book from django.contrib.auth import get_user_model from django.urls import reverse from django.utils import timezone from scrobbles.models import Scrobble User = get_user_model() @pytest.fixture def user(): return User.objects.create_user( username="reader", email="reader@example.com", password="testpass" ) @pytest.fixture def book(user): author = Author.objects.create(name="Nicholas A. Basbanes") book = Book.objects.create( title="A Gentle Madness", isbn_13="0805061762", pages=500, publisher="Holt Paperbacks", first_publish_year=1999, ) book.authors.add(author) return book def test_librarything_export_requires_login(client): url = reverse("books:librarything_export") response = client.get(url) assert response.status_code == 302 @pytest.mark.django_db def test_librarything_export_empty(client, user): client.force_login(user) url = reverse("books:librarything_export") response = client.get(url) assert response.status_code == 200 assert response["Content-Type"] == "text/csv" rows = list(csv.reader(StringIO(response.content.decode()))) assert rows[0] == [ "TITLE", "AUTHOR (last, first)", "DATE", "ISBN", "PUBLICATION INFO", "TAGS", "RATING", "REVIEW", "DATE READ", "ENTRY DATE", "PAGE COUNT", "CALL NUMBER", ] assert len(rows) == 1 @pytest.mark.django_db def test_librarything_export_marks_in_progress(client, user, book): Scrobble.objects.create( book=book, media_type=Scrobble.MediaType.BOOK, user=user, timestamp=timezone.make_aware(datetime(2023, 3, 1)), long_play_complete=False, ) client.force_login(user) url = reverse("books:librarything_export") response = client.get(url) rows = list(csv.DictReader(StringIO(response.content.decode()))) assert len(rows) == 1 assert rows[0]["TITLE"] == "A Gentle Madness" assert rows[0]["AUTHOR (last, first)"] == "Basbanes, Nicholas A." assert rows[0]["ISBN"] == "0805061762" assert rows[0]["PAGE COUNT"] == "500" assert rows[0]["TAGS"] == "in-progress" assert rows[0]["DATE READ"] == "" assert rows[0]["ENTRY DATE"] == "2023-03-01" @pytest.mark.django_db def test_librarything_export_marks_finished(client, user, book): Scrobble.objects.create( book=book, media_type=Scrobble.MediaType.BOOK, user=user, timestamp=timezone.make_aware(datetime(2023, 5, 5)), long_play_complete=True, ) client.force_login(user) url = reverse("books:librarything_export") response = client.get(url) rows = list(csv.DictReader(StringIO(response.content.decode()))) assert len(rows) == 1 assert rows[0]["TAGS"] == "finished" assert rows[0]["DATE READ"] == "2023-05-05" assert rows[0]["ENTRY DATE"] == "2023-05-05" @pytest.mark.django_db def test_librarything_export_entry_date_is_first_scrobble(client, user, book): Scrobble.objects.create( book=book, media_type=Scrobble.MediaType.BOOK, user=user, timestamp=timezone.make_aware(datetime(2023, 3, 1)), long_play_complete=False, ) Scrobble.objects.create( book=book, media_type=Scrobble.MediaType.BOOK, user=user, timestamp=timezone.make_aware(datetime(2023, 5, 5)), long_play_complete=True, ) client.force_login(user) url = reverse("books:librarything_export") response = client.get(url) rows = list(csv.DictReader(StringIO(response.content.decode()))) assert len(rows) == 1 assert rows[0]["TAGS"] == "finished" assert rows[0]["ENTRY DATE"] == "2023-03-01" assert rows[0]["DATE READ"] == "2023-05-05"