mirror of
https://github.com/JockeTF/fimfarchive.git
synced 2024-11-22 05:17:59 +01:00
Add mocked test data for Fimfiction APIv1
This commit is contained in:
parent
d9a0a78c79
commit
b7c7fcc780
4 changed files with 179 additions and 6 deletions
145
tests/fetchers/test_fimfiction.json
Normal file
145
tests/fetchers/test_fimfiction.json
Normal file
|
@ -0,0 +1,145 @@
|
||||||
|
{
|
||||||
|
"responses": [
|
||||||
|
{
|
||||||
|
"method": "GET",
|
||||||
|
"status_code": 404,
|
||||||
|
"text": "<html><body>REDACTED</body></html>",
|
||||||
|
"url": "http://example.com/-"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"story": {
|
||||||
|
"author": {
|
||||||
|
"id": 197482,
|
||||||
|
"name": "That Naga Pone"
|
||||||
|
},
|
||||||
|
"chapter_count": 1,
|
||||||
|
"chapters": [
|
||||||
|
{
|
||||||
|
"date_modified": 1417226139,
|
||||||
|
"id": 666935,
|
||||||
|
"link": "https://www.fimfiction.net/story/208799/1/forgotten-ponies-of-equestria/chapter-1-celestias-and-lunas-3rd-sister-turnout",
|
||||||
|
"title": "Chapter 1: Celestia's and Luna's 3rd Sister Turnout",
|
||||||
|
"views": 37,
|
||||||
|
"words": 1893
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"comments": 6,
|
||||||
|
"content_rating": 0,
|
||||||
|
"content_rating_text": "Everyone",
|
||||||
|
"date_modified": 1415461804,
|
||||||
|
"description": "REDACTED",
|
||||||
|
"dislikes": -1,
|
||||||
|
"id": 208799,
|
||||||
|
"likes": -1,
|
||||||
|
"short_description": "REDACTED",
|
||||||
|
"status": "Incomplete",
|
||||||
|
"title": "Forgotten Ponies of Equestria",
|
||||||
|
"total_views": 37,
|
||||||
|
"url": "https://www.fimfiction.net/story/208799/forgotten-ponies-of-equestria",
|
||||||
|
"views": 37,
|
||||||
|
"words": 1893
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"method": "GET",
|
||||||
|
"status_code": 200,
|
||||||
|
"url": "https://www.fimfiction.net/api/story.php?story=208799"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"error": "Invalid story id"
|
||||||
|
},
|
||||||
|
"method": "GET",
|
||||||
|
"status_code": 200,
|
||||||
|
"url": "https://www.fimfiction.net/api/story.php?story=7"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"story": {
|
||||||
|
"author": {
|
||||||
|
"id": 17,
|
||||||
|
"name": "Cheddah"
|
||||||
|
},
|
||||||
|
"chapter_count": 0,
|
||||||
|
"comments": 1,
|
||||||
|
"content_rating": 0,
|
||||||
|
"content_rating_text": "Everyone",
|
||||||
|
"date_modified": 0,
|
||||||
|
"description": "REDACTED",
|
||||||
|
"dislikes": 8,
|
||||||
|
"id": 8,
|
||||||
|
"likes": 111,
|
||||||
|
"short_description": "REDACTED",
|
||||||
|
"status": "Incomplete",
|
||||||
|
"title": "The Reports of Agent X",
|
||||||
|
"total_views": 0,
|
||||||
|
"url": "https://www.fimfiction.net/story/8/the-reports-of-agent-x",
|
||||||
|
"views": 0,
|
||||||
|
"words": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"method": "GET",
|
||||||
|
"status_code": 200,
|
||||||
|
"url": "https://www.fimfiction.net/api/story.php?story=8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"story": {
|
||||||
|
"author": {
|
||||||
|
"id": 18,
|
||||||
|
"name": "Sethisto"
|
||||||
|
},
|
||||||
|
"chapter_count": 1,
|
||||||
|
"chapters": [
|
||||||
|
{
|
||||||
|
"date_modified": 1390908352,
|
||||||
|
"id": 10,
|
||||||
|
"link": "https://www.fimfiction.net/story/9/1/the-greatest-equine-who-has-ever-lived/chapter-1",
|
||||||
|
"title": "Chapter 1",
|
||||||
|
"views": 10362,
|
||||||
|
"words": 321
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"comments": 231,
|
||||||
|
"content_rating": 0,
|
||||||
|
"content_rating_text": "Everyone",
|
||||||
|
"date_modified": 1309035953,
|
||||||
|
"description": "REDACTED",
|
||||||
|
"dislikes": 52,
|
||||||
|
"full_image": "https://cdn-img.fimfiction.net/story/vr3n-1432418803-9-full",
|
||||||
|
"id": 9,
|
||||||
|
"image": "https://cdn-img.fimfiction.net/story/vr3n-1432418803-9-medium",
|
||||||
|
"likes": 393,
|
||||||
|
"short_description": "REDACTED",
|
||||||
|
"status": "Incomplete",
|
||||||
|
"title": "The Greatest Equine Who has Ever Lived!",
|
||||||
|
"total_views": 10362,
|
||||||
|
"url": "https://www.fimfiction.net/story/9/the-greatest-equine-who-has-ever-lived",
|
||||||
|
"views": 10362,
|
||||||
|
"words": 321
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"method": "GET",
|
||||||
|
"status_code": 200,
|
||||||
|
"url": "https://www.fimfiction.net/api/story.php?story=9"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "GET",
|
||||||
|
"status_code": 403,
|
||||||
|
"text": "<html><body>REDACTED</body></html>",
|
||||||
|
"url": "https://www.fimfiction.net/story/download/208799/html"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "GET",
|
||||||
|
"status_code": 403,
|
||||||
|
"text": "<html><body>REDACTED</body></html>",
|
||||||
|
"url": "https://www.fimfiction.net/story/download/8/html"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "GET",
|
||||||
|
"status_code": 200,
|
||||||
|
"text": "<html><body><h1><a name='1'></a>REDACTED</h1></body></html>",
|
||||||
|
"url": "https://www.fimfiction.net/story/download/9/html"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -5,7 +5,7 @@ Fimfiction fetcher tests.
|
||||||
|
|
||||||
#
|
#
|
||||||
# Fimfarchive, preserves stories from Fimfiction.
|
# Fimfarchive, preserves stories from Fimfiction.
|
||||||
# Copyright (C) 2015 Joakim Soderlund
|
# Copyright (C) 2018 Joakim Soderlund
|
||||||
#
|
#
|
||||||
# This program is free software: you can redistribute it and/or modify
|
# This program is free software: you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
@ -26,6 +26,9 @@ import pytest
|
||||||
|
|
||||||
from fimfarchive.exceptions import InvalidStoryError, StorySourceError
|
from fimfarchive.exceptions import InvalidStoryError, StorySourceError
|
||||||
from fimfarchive.fetchers import FimfictionFetcher
|
from fimfarchive.fetchers import FimfictionFetcher
|
||||||
|
from fimfarchive.utils import JayWalker
|
||||||
|
|
||||||
|
from tests.fixtures.responses import Recorder
|
||||||
|
|
||||||
|
|
||||||
VALID_STORY_KEY = 9
|
VALID_STORY_KEY = 9
|
||||||
|
@ -34,17 +37,42 @@ EMPTY_STORY_KEY = 8
|
||||||
PROTECTED_STORY_KEY = 208799
|
PROTECTED_STORY_KEY = 208799
|
||||||
|
|
||||||
|
|
||||||
|
class Redactor(JayWalker):
|
||||||
|
"""
|
||||||
|
Redacts recorded responses.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def wrap(self, text: str) -> str:
|
||||||
|
"""
|
||||||
|
Wraps text in a valid HTML body.
|
||||||
|
"""
|
||||||
|
return f"<html><body>{text}</body></html>"
|
||||||
|
|
||||||
|
def handle(self, data, key, value) -> None:
|
||||||
|
if key in ('description', 'short_description'):
|
||||||
|
data[key] = "REDACTED"
|
||||||
|
elif key == 'text' and "<h1><a name='1'></a>" in value:
|
||||||
|
data[key] = self.wrap("<h1><a name='1'></a>REDACTED</h1>")
|
||||||
|
elif key == 'text':
|
||||||
|
data[key] = self.wrap("REDACTED")
|
||||||
|
else:
|
||||||
|
self.walk(value)
|
||||||
|
|
||||||
|
|
||||||
class TestFimfictionFetcher:
|
class TestFimfictionFetcher:
|
||||||
"""
|
"""
|
||||||
FimfictionFetcher tests.
|
FimfictionFetcher tests.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def fetcher(self):
|
def fetcher(self, responses):
|
||||||
"""
|
"""
|
||||||
Returns the fetcher instance to test.
|
Returns the fetcher instance to test.
|
||||||
"""
|
"""
|
||||||
return FimfictionFetcher()
|
if isinstance(responses, Recorder):
|
||||||
|
responses.walker = Redactor()
|
||||||
|
|
||||||
|
yield FimfictionFetcher()
|
||||||
|
|
||||||
def test_with_statment(self):
|
def test_with_statment(self):
|
||||||
"""
|
"""
|
||||||
|
@ -53,6 +81,7 @@ class TestFimfictionFetcher:
|
||||||
with FimfictionFetcher() as fetcher:
|
with FimfictionFetcher() as fetcher:
|
||||||
fetcher.get('http://example.com/')
|
fetcher.get('http://example.com/')
|
||||||
|
|
||||||
|
@pytest.mark.xfail(reason="Recorder issue")
|
||||||
def test_get_for_invalid_host(self, fetcher):
|
def test_get_for_invalid_host(self, fetcher):
|
||||||
"""
|
"""
|
||||||
Tests `StorySourceError` is raised if server is unreachable.
|
Tests `StorySourceError` is raised if server is unreachable.
|
||||||
|
|
4
tests/fixtures/responses.py
vendored
4
tests/fixtures/responses.py
vendored
|
@ -5,7 +5,7 @@ Requests mocking fixture.
|
||||||
|
|
||||||
#
|
#
|
||||||
# Fimfarchive, preserves stories from Fimfiction.
|
# Fimfarchive, preserves stories from Fimfiction.
|
||||||
# Copyright (C) 2015 Joakim Soderlund
|
# Copyright (C) 2018 Joakim Soderlund
|
||||||
#
|
#
|
||||||
# This program is free software: you can redistribute it and/or modify
|
# This program is free software: you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
@ -60,7 +60,7 @@ class Recorder(ContextManager['Recorder']):
|
||||||
"""
|
"""
|
||||||
self.original = Session.send
|
self.original = Session.send
|
||||||
self.responses: Dict = dict()
|
self.responses: Dict = dict()
|
||||||
self.walker: Optional[JayWalker]
|
self.walker: Optional[JayWalker] = None
|
||||||
self.path = path
|
self.path = path
|
||||||
|
|
||||||
def __iter__(self) -> Iterator[Dict[str, Any]]:
|
def __iter__(self) -> Iterator[Dict[str, Any]]:
|
||||||
|
|
1
tox.ini
1
tox.ini
|
@ -18,7 +18,6 @@ commands =
|
||||||
[pytest]
|
[pytest]
|
||||||
addopts =
|
addopts =
|
||||||
--ignore tests/fetchers/test_fimfarchive.py
|
--ignore tests/fetchers/test_fimfarchive.py
|
||||||
--ignore tests/fetchers/test_fimfiction.py
|
|
||||||
tests
|
tests
|
||||||
|
|
||||||
[flake8]
|
[flake8]
|
||||||
|
|
Loading…
Reference in a new issue