Merge pull request #354 from cincodenada/progress_update
Keep track of progress through books over time
This commit is contained in:
1
bookwyrm/tests/actions/__init__.py
Normal file
1
bookwyrm/tests/actions/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
from . import *
|
88
bookwyrm/tests/actions/test_readthrough.py
Normal file
88
bookwyrm/tests/actions/test_readthrough.py
Normal file
@ -0,0 +1,88 @@
|
||||
from unittest.mock import patch
|
||||
from django.test import TestCase, Client
|
||||
from django.utils import timezone
|
||||
from datetime import datetime
|
||||
|
||||
from bookwyrm import models
|
||||
|
||||
@patch('bookwyrm.broadcast.broadcast_task.delay')
|
||||
class ReadThrough(TestCase):
|
||||
def setUp(self):
|
||||
self.client = Client()
|
||||
|
||||
self.work = models.Work.objects.create(
|
||||
title='Example Work'
|
||||
)
|
||||
|
||||
self.edition = models.Edition.objects.create(
|
||||
title='Example Edition',
|
||||
parent_work=self.work
|
||||
)
|
||||
self.work.default_edition = self.edition
|
||||
self.work.save()
|
||||
|
||||
self.user = models.User.objects.create_user(
|
||||
'cinco', 'cinco@example.com', 'seissiete',
|
||||
local=True, localname='cinco')
|
||||
|
||||
self.client.force_login(self.user)
|
||||
|
||||
def test_create_basic_readthrough(self, delay_mock):
|
||||
"""A basic readthrough doesn't create a progress update"""
|
||||
self.assertEqual(self.edition.readthrough_set.count(), 0)
|
||||
|
||||
self.client.post('/start-reading/{}'.format(self.edition.id), {
|
||||
'start_date': '2020-11-27',
|
||||
})
|
||||
|
||||
readthroughs = self.edition.readthrough_set.all()
|
||||
self.assertEqual(len(readthroughs), 1)
|
||||
self.assertEqual(readthroughs[0].progressupdate_set.count(), 0)
|
||||
self.assertEqual(readthroughs[0].start_date,
|
||||
datetime(2020, 11, 27, tzinfo=timezone.utc))
|
||||
self.assertEqual(readthroughs[0].progress, None)
|
||||
self.assertEqual(readthroughs[0].finish_date, None)
|
||||
self.assertEqual(delay_mock.call_count, 1)
|
||||
|
||||
def test_create_progress_readthrough(self, delay_mock):
|
||||
self.assertEqual(self.edition.readthrough_set.count(), 0)
|
||||
|
||||
self.client.post('/start-reading/{}'.format(self.edition.id), {
|
||||
'start_date': '2020-11-27',
|
||||
'progress': 50,
|
||||
})
|
||||
|
||||
readthroughs = self.edition.readthrough_set.all()
|
||||
self.assertEqual(len(readthroughs), 1)
|
||||
self.assertEqual(readthroughs[0].start_date,
|
||||
datetime(2020, 11, 27, tzinfo=timezone.utc))
|
||||
self.assertEqual(readthroughs[0].progress, 50)
|
||||
self.assertEqual(readthroughs[0].finish_date, None)
|
||||
|
||||
progress_updates = readthroughs[0].progressupdate_set.all()
|
||||
self.assertEqual(len(progress_updates), 1)
|
||||
self.assertEqual(progress_updates[0].mode, models.ProgressMode.PAGE)
|
||||
self.assertEqual(progress_updates[0].progress, 50)
|
||||
self.assertEqual(delay_mock.call_count, 1)
|
||||
|
||||
# Update progress
|
||||
self.client.post('/edit-readthrough', {
|
||||
'id': readthroughs[0].id,
|
||||
'progress': 100,
|
||||
})
|
||||
|
||||
progress_updates = readthroughs[0].progressupdate_set\
|
||||
.order_by('updated_date').all()
|
||||
self.assertEqual(len(progress_updates), 2)
|
||||
self.assertEqual(progress_updates[1].mode, models.ProgressMode.PAGE)
|
||||
self.assertEqual(progress_updates[1].progress, 100)
|
||||
self.assertEqual(delay_mock.call_count, 1) # Edit doesn't publish anything
|
||||
|
||||
self.client.post('/delete-readthrough', {
|
||||
'id': readthroughs[0].id,
|
||||
})
|
||||
|
||||
readthroughs = self.edition.readthrough_set.all()
|
||||
updates = self.user.progressupdate_set.all()
|
||||
self.assertEqual(len(readthroughs), 0)
|
||||
self.assertEqual(len(updates), 0)
|
@ -23,9 +23,9 @@ class BookWyrmConnector(TestCase):
|
||||
self.connector = Connector('example.com')
|
||||
|
||||
work_file = pathlib.Path(__file__).parent.joinpath(
|
||||
'../data/fr_work.json')
|
||||
'../data/bw_work.json')
|
||||
edition_file = pathlib.Path(__file__).parent.joinpath(
|
||||
'../data/fr_edition.json')
|
||||
'../data/bw_edition.json')
|
||||
self.work_data = json.loads(work_file.read_bytes())
|
||||
self.edition_data = json.loads(edition_file.read_bytes())
|
||||
|
||||
@ -33,7 +33,7 @@ class BookWyrmConnector(TestCase):
|
||||
def test_format_search_result(self):
|
||||
''' create a SearchResult object from search response json '''
|
||||
datafile = pathlib.Path(__file__).parent.joinpath(
|
||||
'../data/fr_search.json')
|
||||
'../data/bw_search.json')
|
||||
search_data = json.loads(datafile.read_bytes())
|
||||
results = self.connector.parse_search_data(search_data)
|
||||
self.assertIsInstance(results, list)
|
||||
|
51
bookwyrm/tests/models/test_readthrough_model.py
Normal file
51
bookwyrm/tests/models/test_readthrough_model.py
Normal file
@ -0,0 +1,51 @@
|
||||
''' testing models '''
|
||||
from django.test import TestCase
|
||||
from django.core.exceptions import ValidationError
|
||||
|
||||
from bookwyrm import models, settings
|
||||
|
||||
|
||||
class ReadThrough(TestCase):
|
||||
''' some activitypub oddness ahead '''
|
||||
def setUp(self):
|
||||
''' look, a shelf '''
|
||||
self.user = models.User.objects.create_user(
|
||||
'mouse', 'mouse@mouse.mouse', 'mouseword',
|
||||
local=True, localname='mouse')
|
||||
|
||||
self.work = models.Work.objects.create(
|
||||
title='Example Work'
|
||||
)
|
||||
|
||||
self.edition = models.Edition.objects.create(
|
||||
title='Example Edition',
|
||||
parent_work=self.work
|
||||
)
|
||||
self.work.default_edition = self.edition
|
||||
self.work.save()
|
||||
|
||||
self.readthrough = models.ReadThrough.objects.create(
|
||||
user=self.user,
|
||||
book=self.edition)
|
||||
|
||||
def test_progress_update(self):
|
||||
''' Test progress updates '''
|
||||
self.readthrough.create_update() # No-op, no progress yet
|
||||
self.readthrough.progress = 10
|
||||
self.readthrough.create_update()
|
||||
self.readthrough.progress = 20
|
||||
self.readthrough.progress_mode = models.ProgressMode.PERCENT
|
||||
self.readthrough.create_update()
|
||||
|
||||
updates = self.readthrough.progressupdate_set \
|
||||
.order_by('created_date').all()
|
||||
self.assertEqual(len(updates), 2)
|
||||
self.assertEqual(updates[0].progress, 10)
|
||||
self.assertEqual(updates[0].mode, models.ProgressMode.PAGE)
|
||||
self.assertEqual(updates[1].progress, 20)
|
||||
self.assertEqual(updates[1].mode, models.ProgressMode.PERCENT)
|
||||
|
||||
self.readthrough.progress = -10
|
||||
self.assertRaises(ValidationError, self.readthrough.clean_fields)
|
||||
update = self.readthrough.create_update()
|
||||
self.assertRaises(ValidationError, update.clean_fields)
|
@ -32,14 +32,14 @@ class Book(TestCase):
|
||||
inbox='http://example.com/u/2/inbox')
|
||||
self.user.followers.add(no_inbox_follower)
|
||||
|
||||
non_fr_follower = models.User.objects.create_user(
|
||||
non_bw_follower = models.User.objects.create_user(
|
||||
'gerbil', 'gerb@mouse.mouse', 'gerbword',
|
||||
remote_id='http://example.com/u/3',
|
||||
outbox='http://example2.com/u/3/o',
|
||||
inbox='http://example2.com/u/3/inbox',
|
||||
shared_inbox='http://example2.com/inbox',
|
||||
bookwyrm_user=False, local=False)
|
||||
self.user.followers.add(non_fr_follower)
|
||||
self.user.followers.add(non_bw_follower)
|
||||
|
||||
models.User.objects.create_user(
|
||||
'nutria', 'nutria@mouse.mouse', 'nuword',
|
||||
|
@ -506,7 +506,7 @@ class Incoming(TestCase):
|
||||
def test_handle_update_edition(self):
|
||||
''' update an existing edition '''
|
||||
datafile = pathlib.Path(__file__).parent.joinpath(
|
||||
'data/fr_edition.json')
|
||||
'data/bw_edition.json')
|
||||
bookdata = json.loads(datafile.read_bytes())
|
||||
|
||||
models.Work.objects.create(
|
||||
@ -527,7 +527,7 @@ class Incoming(TestCase):
|
||||
def test_handle_update_work(self):
|
||||
''' update an existing edition '''
|
||||
datafile = pathlib.Path(__file__).parent.joinpath(
|
||||
'data/fr_work.json')
|
||||
'data/bw_work.json')
|
||||
bookdata = json.loads(datafile.read_bytes())
|
||||
|
||||
book = models.Work.objects.create(
|
||||
|
Reference in New Issue
Block a user