mirror of
https://github.com/JockeTF/fimfarchive.git
synced 2024-11-25 14:37:59 +01:00
Implement fetch method in fetcher base class
This commit is contained in:
parent
dbebdfae98
commit
80e105abb9
2 changed files with 92 additions and 2 deletions
|
@ -32,6 +32,7 @@ from zipfile import ZipFile, BadZipFile
|
|||
import requests
|
||||
|
||||
from fimfarchive.exceptions import InvalidStoryError, StorySourceError
|
||||
from fimfarchive.stories import Story
|
||||
|
||||
|
||||
StreamReader = codecs.getreader('utf-8')
|
||||
|
@ -62,12 +63,14 @@ class Fetcher:
|
|||
"""
|
||||
pass
|
||||
|
||||
def fetch(self, key):
|
||||
def fetch(self, key, prefetch_meta=None, prefetch_data=None):
|
||||
"""
|
||||
Fetches story information.
|
||||
|
||||
Args:
|
||||
key: Primary key of the story.
|
||||
prefetch_meta: Force prefetching of meta.
|
||||
prefetch_data: Force prefetching of data.
|
||||
|
||||
Returns:
|
||||
Story: A new `Story` object.
|
||||
|
@ -76,7 +79,23 @@ class Fetcher:
|
|||
InvalidStoryError: If a valid story is not found.
|
||||
StorySourceError: If source does not return any data.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
if prefetch_meta is None:
|
||||
prefetch_meta = self.prefetch_meta
|
||||
|
||||
if prefetch_meta:
|
||||
meta = self.fetch_meta(key)
|
||||
else:
|
||||
meta = None
|
||||
|
||||
if prefetch_data is None:
|
||||
prefetch_data = self.prefetch_data
|
||||
|
||||
if prefetch_data:
|
||||
data = self.fetch_data(key)
|
||||
else:
|
||||
data = None
|
||||
|
||||
return Story(key, self, meta, data)
|
||||
|
||||
def fetch_data(self, key):
|
||||
"""
|
||||
|
|
|
@ -22,6 +22,8 @@ Fetcher tests.
|
|||
#
|
||||
|
||||
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
import pytest
|
||||
|
||||
from fimfarchive.exceptions import InvalidStoryError, StorySourceError
|
||||
|
@ -36,6 +38,75 @@ PROTECTED_STORY_KEY = 208799
|
|||
FIMFARCHIVE_PATH = 'fimfarchive-20160525.zip'
|
||||
|
||||
|
||||
class TestFetcher:
|
||||
"""
|
||||
Fetcher tests.
|
||||
"""
|
||||
|
||||
def test_fetch_with_prefetch_meta(self, fetcher):
|
||||
"""
|
||||
Tests `fetch_meta` is called when prefetch_meta is enabled.
|
||||
"""
|
||||
fetcher.fetch(VALID_STORY_KEY, prefetch_meta=True)
|
||||
fetcher.fetch_meta.assert_called_once_with(VALID_STORY_KEY)
|
||||
|
||||
def test_fetch_without_prefetch_meta(self, fetcher):
|
||||
"""
|
||||
Tests `fetch_meta` is not called when prefetch_meta is disabled.
|
||||
"""
|
||||
fetcher.fetch(VALID_STORY_KEY, prefetch_meta=False)
|
||||
fetcher.fetch_meta.assert_not_called()
|
||||
|
||||
def test_fetch_with_prefetch_data(self, fetcher):
|
||||
"""
|
||||
Tests `fetch_data` is called when prefetch_data is enabled.
|
||||
"""
|
||||
fetcher.fetch(VALID_STORY_KEY, prefetch_data=True)
|
||||
fetcher.fetch_data.assert_called_once_with(VALID_STORY_KEY)
|
||||
|
||||
def test_fetch_without_prefetch_data(self, fetcher):
|
||||
"""
|
||||
Tests `fetch_data` is not called when prefetch_data is disabled.
|
||||
"""
|
||||
fetcher.fetch(VALID_STORY_KEY, prefetch_data=False)
|
||||
fetcher.fetch_data.assert_not_called()
|
||||
|
||||
def test_fetch_with_default_prefetch(self, fetcher):
|
||||
"""
|
||||
Tests prefetching can be enabled using attributes.
|
||||
"""
|
||||
fetcher.prefetch_meta = True
|
||||
fetcher.prefetch_data = True
|
||||
|
||||
fetcher.fetch(VALID_STORY_KEY)
|
||||
|
||||
fetcher.fetch_meta.assert_called_once_with(VALID_STORY_KEY)
|
||||
fetcher.fetch_data.assert_called_once_with(VALID_STORY_KEY)
|
||||
|
||||
def test_fetch_without_default_prefetch(self, fetcher):
|
||||
"""
|
||||
Tests prefetching can be disabled using attributes.
|
||||
"""
|
||||
fetcher.prefetch_meta = False
|
||||
fetcher.prefetch_data = False
|
||||
|
||||
fetcher.fetch(VALID_STORY_KEY)
|
||||
|
||||
fetcher.fetch_meta.assert_not_called()
|
||||
fetcher.fetch_data.assert_not_called()
|
||||
|
||||
def test_close_is_called_on_exit(self, fetcher):
|
||||
"""
|
||||
Test `close` is called on exit in with statement.
|
||||
"""
|
||||
fetcher.close = MagicMock(method='close')
|
||||
|
||||
with fetcher:
|
||||
pass
|
||||
|
||||
fetcher.close.assert_called_once_with()
|
||||
|
||||
|
||||
class TestFimfictionFetcher:
|
||||
"""
|
||||
FimfictionFetcher tests.
|
||||
|
|
Loading…
Reference in a new issue