Skip to content

Commit 4eb2c69

Browse files
committed
Move / clean up update_feeds_iter() tests.
1 parent 03af857 commit 4eb2c69

File tree

4 files changed

+110
-106
lines changed

4 files changed

+110
-106
lines changed

tests/fakeparser.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class Parser:
2929

3030
should_raise: callable or None = None
3131
exc: Exception = None
32-
is_not_modified: bool = False
32+
is_not_modified: callable or None = None
3333

3434
def copy(self):
3535
return deepcopy(self)
@@ -72,15 +72,15 @@ def raise_exc(self, cond=None, exc=None):
7272
self.exc = exc or Exception('failing')
7373
return self
7474

75-
def not_modified(self):
75+
def not_modified(self, cond=lambda _: True):
7676
self.reset_mode()
77-
self.is_not_modified = True
77+
self.is_not_modified = cond
7878
return self
7979

8080
def reset_mode(self):
8181
self.should_raise = None
8282
self.exc = None
83-
self.is_not_modified = False
83+
self.is_not_modified = None
8484
return self
8585

8686
# parser API
@@ -104,7 +104,7 @@ def retrieve(self, url, caching_info):
104104
raise
105105
except Exception as e:
106106
raise ParseError(url) from e
107-
if self.is_not_modified:
107+
if self.is_not_modified and self.is_not_modified(url):
108108
raise NotModified(url)
109109
return nullcontext(RetrievedFeed(BytesIO(b'opaque'), http_info=self.http_info))
110110

tests/reader_methods.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -122,14 +122,17 @@ def update_feed(reader, url):
122122

123123

124124
class _update_feeds_iter_methods:
125-
def update_feeds_iter(reader):
126-
return reader.update_feeds_iter()
125+
def update_feeds_iter(reader, **kwargs):
126+
return reader.update_feeds_iter(**kwargs)
127127

128-
def update_feeds_iter_workers(reader):
129-
return reader.update_feeds_iter(workers=2)
128+
def update_feeds_iter_workers(reader, **kwargs):
129+
return reader.update_feeds_iter(workers=2, **kwargs)
130130

131-
def update_feeds_iter_simulated(reader):
132-
for feed in reader.get_feeds(updates_enabled=True, scheduled=True):
131+
def update_feeds_iter_simulated(reader, **kwargs):
132+
scheduled = True
133+
if reader._scheduled_override is not None:
134+
kwargs['scheduled'] = reader._scheduled_override
135+
for feed in reader.get_feeds(updates_enabled=True, **kwargs):
133136
try:
134137
yield UpdateResult(feed.url, reader.update_feed(feed))
135138
except UpdateError as e:

tests/test_reader.py

Lines changed: 2 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ def test_next_update_after(monkeypatch, now, interval, jitter, random, expected)
332332
assert next_update_after(now, interval, jitter) == expected
333333

334334

335-
def test_update_scheduled(reader, parser, call_update_iter_method):
335+
def test_update_scheduled(reader, parser, update_feeds_iter):
336336
one = parser.feed(1)
337337
two = parser.feed(2)
338338
three = parser.feed(3)
@@ -343,7 +343,7 @@ def test_update_scheduled(reader, parser, call_update_iter_method):
343343
reader.set_tag(three, '.reader.update', {'interval': 120, 'jitter': 0.5})
344344

345345
def update():
346-
return set(dict(call_update_iter_method(reader, scheduled=True)))
346+
return set(dict(update_feeds_iter(reader, scheduled=True)))
347347

348348
reader._now = lambda: datetime(2010, 1, 1)
349349
assert update() == {'1', '2', '3'}
@@ -485,98 +485,6 @@ def test_set_update_interval_down(reader, parser):
485485
assert len(list(reader.update_feeds_iter(scheduled=True))) == 1
486486

487487

488-
def call_update_feeds_iter(reader, **kwargs):
489-
yield from reader.update_feeds_iter(**kwargs)
490-
491-
492-
def call_update_feed_iter(reader, **kwargs):
493-
for feed in reader.get_feeds(updates_enabled=True, **kwargs):
494-
try:
495-
yield feed.url, reader.update_feed(feed)
496-
except ParseError as e:
497-
yield feed.url, e
498-
499-
500-
@pytest.fixture(params=[call_update_feeds_iter, call_update_feed_iter])
501-
def call_update_iter_method(request):
502-
return request.param
503-
504-
505-
@pytest.mark.noscheduled
506-
def test_update_feeds_iter(reader, parser, call_update_iter_method):
507-
parser.raise_exc(lambda url: url == '3')
508-
509-
one = parser.feed(1, datetime(2010, 1, 1))
510-
one_one = parser.entry(1, 1, datetime(2010, 1, 1))
511-
one_two = parser.entry(1, 2, datetime(2010, 2, 1))
512-
two = parser.feed(2, datetime(2010, 1, 1))
513-
two_one = parser.entry(2, 1, datetime(2010, 2, 1))
514-
515-
for feed in one, two:
516-
reader.add_feed(feed)
517-
518-
assert dict(call_update_iter_method(reader)) == {
519-
'1': UpdatedFeed(url='1', new=2, modified=0),
520-
'2': UpdatedFeed(url='2', new=1, modified=0),
521-
}
522-
523-
assert next(call_update_iter_method(reader)) == UpdateResult(
524-
'1', UpdatedFeed(url='1', new=0, modified=0, unmodified=2)
525-
)
526-
527-
one_two = parser.entry(1, 2, datetime(2010, 2, 2), title='new title')
528-
one_three = parser.entry(1, 3, datetime(2010, 2, 1))
529-
one_four = parser.entry(1, 4, datetime(2010, 2, 1))
530-
three = parser.feed(3, datetime(2010, 1, 1))
531-
532-
reader.add_feed(three)
533-
534-
rv = dict(call_update_iter_method(reader))
535-
assert set(rv) == set('123')
536-
537-
assert rv['1'] == UpdatedFeed(url='1', new=2, modified=1, unmodified=1)
538-
assert rv['2'] == UpdatedFeed(url='2', new=0, modified=0, unmodified=1)
539-
540-
assert isinstance(rv['3'], ParseError)
541-
assert rv['3'].url == '3'
542-
assert rv['3'].__cause__ is parser.exc
543-
544-
reader._parser.not_modified()
545-
546-
assert dict(call_update_iter_method(reader)) == dict.fromkeys('123')
547-
548-
549-
@pytest.mark.parametrize('exc_type', [StorageError, Exception])
550-
def test_update_feeds_iter_raised_exception(
551-
reader, parser, exc_type, call_update_iter_method
552-
):
553-
one = parser.feed(1, datetime(2010, 1, 1))
554-
two = parser.feed(2, datetime(2010, 1, 1))
555-
three = parser.feed(3, datetime(2010, 1, 1))
556-
557-
for feed in one, two, three:
558-
reader.add_feed(feed)
559-
560-
original_storage_update_feed = reader._storage.update_feed
561-
562-
def storage_update_feed(intent):
563-
if intent.url == '2':
564-
raise exc_type('message')
565-
return original_storage_update_feed(intent)
566-
567-
reader._storage.update_feed = storage_update_feed
568-
569-
rv = {}
570-
with pytest.raises(exc_type) as excinfo:
571-
rv.update(call_update_iter_method(reader))
572-
assert 'message' in str(excinfo.value)
573-
574-
if not sys.implementation.name == 'pypy':
575-
# for some reason, on PyPy the updates sometimes
576-
# happen out of order and rv is empty
577-
assert rv == {'1': UpdatedFeed(url='1', new=0, modified=0)}
578-
579-
580488
def test_mark_as_read_unread(reader, parser, entry_arg):
581489
# TODO: Test read/unread the same way important/unimportant are (or the other way around).
582490

tests/test_reader_update.py

Lines changed: 94 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"""
77

88
import logging
9+
import sys
910
import threading
1011
from contextlib import contextmanager
1112
from unittest.mock import ANY
@@ -14,6 +15,9 @@
1415

1516
from reader import FeedNotFoundError
1617
from reader import ParseError
18+
from reader import StorageError
19+
from reader import UpdatedFeed
20+
from reader import UpdateResult
1721
from utils import Blocking
1822
from utils import utc_datetime as datetime
1923

@@ -411,9 +415,98 @@ def test_last_exception_is_not_reset_by_another_feed(reader, parser):
411415
# END: update errors
412416

413417

418+
# BEGIN: update_feeds_iter()
419+
420+
# TODO: these don't necessarily need the workers= version
421+
422+
423+
@pytest.mark.noscheduled
424+
def test_update_feeds_iter_basic(reader, parser, update_feeds_iter):
425+
assert dict(update_feeds_iter(reader)) == {}
426+
427+
for i in 1, 2:
428+
reader.add_feed(parser.feed(i))
429+
430+
assert dict(update_feeds_iter(reader)) == {
431+
'1': UpdatedFeed(url='1'),
432+
'2': UpdatedFeed(url='2'),
433+
}
434+
435+
parser.entry(1, 1)
436+
parser.entry(1, 2)
437+
parser.entry(2, 1)
438+
439+
assert dict(update_feeds_iter(reader)) == {
440+
'1': UpdatedFeed(url='1', new=2),
441+
'2': UpdatedFeed(url='2', new=1),
442+
}
443+
444+
parser.entry(1, 2, title='new')
445+
parser.entry(1, 3)
446+
parser.entry(1, 4)
447+
448+
assert dict(update_feeds_iter(reader)) == {
449+
'1': UpdatedFeed(url='1', new=2, modified=1, unmodified=1),
450+
'2': UpdatedFeed(url='2', new=0, modified=0, unmodified=1),
451+
}
452+
453+
454+
def test_update_feeds_iter_parse_error(reader, parser, update_feeds_iter):
455+
for i in 1, 2:
456+
reader.add_feed(parser.feed(i))
457+
parser.raise_exc(lambda url: url == '1')
458+
459+
rv = dict(update_feeds_iter(reader))
460+
461+
assert isinstance(rv['1'], ParseError)
462+
assert rv['1'].url == '1'
463+
assert rv['1'].__cause__ is parser.exc
464+
assert rv['2'] == UpdatedFeed(url='2')
465+
466+
467+
def test_update_feeds_iter_not_modified(reader, parser, update_feeds_iter):
468+
for i in 1, 2:
469+
reader.add_feed(parser.feed(i))
470+
parser.not_modified(lambda url: url == '1')
471+
472+
assert dict(update_feeds_iter(reader)) == {
473+
'1': None,
474+
'2': UpdatedFeed(url='2'),
475+
}
476+
477+
478+
@pytest.mark.parametrize('exc_type', [StorageError, Exception])
479+
def test_update_feeds_iter_unexpected_error(
480+
reader, parser, exc_type, update_feeds_iter
481+
):
482+
for i in 1, 2, 3:
483+
reader.add_feed(parser.feed(i))
484+
485+
original_storage_update_feed = reader._storage.update_feed
486+
exc = exc_type('message')
487+
488+
def storage_update_feed(intent):
489+
if intent.url == '2':
490+
raise exc
491+
return original_storage_update_feed(intent)
492+
493+
reader._storage.update_feed = storage_update_feed
494+
495+
rv = {}
496+
with pytest.raises(exc_type) as excinfo:
497+
rv.update(update_feeds_iter(reader))
498+
assert excinfo.value is exc
499+
500+
if 'workers' not in update_feeds_iter.__name__:
501+
assert rv == {'1': UpdatedFeed(url='1')}
502+
503+
504+
# END: update_feeds_iter()
505+
506+
414507
# BEGIN: update_feed()
415508

416-
# return value and ParseError handling covered in test_update_feeds_iter
509+
# return value and ParseError handling covered in update_feeds_iter() tests
417510

418511

419512
def test_update_feed_basic(reader, parser, feed_arg):

0 commit comments

Comments
 (0)