Skip to content
This repository was archived by the owner on Jan 13, 2024. It is now read-only.

Commit 416ee57

Browse files
committed
refacto urls
1 parent 34a67f2 commit 416ee57

File tree

7 files changed

+168
-151
lines changed

7 files changed

+168
-151
lines changed

Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,11 @@ lint-fix:
3737
$(BLACK) $(FLASK_APP)
3838

3939
serve:
40+
echo 'Running on http://$(HOST):$(PORT)'
4041
$(FLASK) run --with-threads -h $(HOST) -p $(PORT)
4142

4243
run:
44+
echo 'Running on http://$(HOST):$(PORT)'
4345
FLASK_ENV=production && $(GUNICORN) -b 127.0.0.1:5000 "$(FLASK_APP):create_app()" --error-logfile $(GUNICORN_LOG)
4446

4547
venv:

twootfeed/config.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import os
2-
import secrets
32

43
from twootfeed import param
4+
from twootfeed.tests.data import TEST_TOKEN
55

66
if os.getenv('TWOOTFEED_SETTINGS') == 'TestingConfig':
7-
param['feed']['token'] = secrets.token_urlsafe()
7+
param['feed']['token'] = TEST_TOKEN
88

99

1010
class BaseConfig:

twootfeed/mastodon/routes.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,46 @@
11
from typing import Tuple
22

3-
from flask import Blueprint
3+
from flask import Blueprint, request
44
from twootfeed import mastodon_api, param as mastodon_param
55
from twootfeed.mastodon.generate_toots_feed import generate_xml
66
from twootfeed.utils.decorator import require_token
77

88
mastodon_bp = Blueprint('mastodon', __name__)
99

1010

11-
@mastodon_bp.route('/toots/<hashtag>', methods=['GET'])
11+
@mastodon_bp.route('/toots/tags/<tag>', methods=['GET'])
1212
@require_token
13-
def tootfeed_hashtag(hashtag: str) -> Tuple[str, int]:
13+
def toots_feed_hashtag(tag: str) -> Tuple[str, int]:
1414
"""generate a rss feed from parsed mastodon search"""
15-
return generate_xml(mastodon_api, mastodon_param, {'hashtag': hashtag})
15+
return generate_xml(mastodon_api, mastodon_param, {'hashtag': tag})
1616

1717

18-
@mastodon_bp.route('/toots/search/<query_feed>', methods=['GET'])
19-
@mastodon_bp.route('/toot_search/<query_feed>', methods=['GET'])
18+
@mastodon_bp.route('/toots/search', methods=['GET'])
2019
@require_token
21-
def tootfeed(query_feed: str) -> Tuple[str, int]:
20+
def toots_feed_search() -> Tuple[str, int]:
2221
"""generate a rss feed from parsed mastodon search"""
23-
return generate_xml(mastodon_api, mastodon_param, {'query': query_feed})
22+
q = request.args.get('q')
23+
if not q:
24+
return 'missing query', 400
25+
return generate_xml(mastodon_api, mastodon_param, {'query': q})
2426

2527

2628
@mastodon_bp.route('/toots/favorites', methods=['GET'])
27-
@mastodon_bp.route('/toot_favorites', methods=['GET'])
2829
@require_token
29-
def toot_favorites_feed() -> Tuple[str, int]:
30+
def toots_favorites_feed() -> Tuple[str, int]:
3031
"""generate a rss feed authenticated user's favorites"""
3132
return generate_xml(mastodon_api, mastodon_param, target='favorites')
3233

3334

3435
@mastodon_bp.route('/toots/bookmarks', methods=['GET'])
35-
@mastodon_bp.route('/toot_bookmarks', methods=['GET'])
3636
@require_token
37-
def toot_bookmarks_feed() -> Tuple[str, int]:
37+
def toots_bookmarks_feed() -> Tuple[str, int]:
3838
"""generate a rss feed authenticated user's bookmarks"""
3939
return generate_xml(mastodon_api, mastodon_param, target='bookmarks')
4040

4141

42-
@mastodon_bp.route('/home_timeline', methods=['GET'])
42+
@mastodon_bp.route('/toots/home_timeline', methods=['GET'])
4343
@require_token
44-
def home_timeline() -> Tuple[str, int]:
44+
def toots_home_timeline() -> Tuple[str, int]:
4545
"""generate a rss feed authenticated user's bookmarks"""
4646
return generate_xml(mastodon_api, mastodon_param, target='home_timeline')
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
from uuid import uuid4
2+
3+
import pytest
4+
from flask import Flask
5+
6+
from .data import TEST_TOKEN
7+
from .test_twitter_routes import TestTwitterRoutes
8+
9+
MASTODON_ENDPOINTS = [
10+
'/toots/favorites',
11+
'/toots/bookmarks',
12+
'/toots/home_timeline',
13+
]
14+
15+
16+
class TestMastodonTagsRoute:
17+
endpoint = '/toots/tags/{tag}'
18+
19+
def test_it_returns_401_when_token_is_missing(
20+
self, app_missing_token: Flask
21+
) -> None:
22+
client = app_missing_token.test_client()
23+
24+
response = client.get(self.endpoint.format(tag=uuid4().hex))
25+
26+
assert response.status_code == 401
27+
data = response.data.decode()
28+
assert data == 'missing token'
29+
30+
def test_it_returns_403_when_token_is_invalid(
31+
self, app_invalid_token: Flask
32+
) -> None:
33+
client = app_invalid_token.test_client()
34+
35+
response = client.get(
36+
f'{self.endpoint.format(tag=uuid4().hex)}?token=invalid'
37+
)
38+
39+
assert response.status_code == 403
40+
data = response.data.decode()
41+
assert data == 'invalid token'
42+
43+
def test_it_returns_200_when_tag_is_provided(self, app: Flask) -> None:
44+
client = app.test_client()
45+
46+
response = client.get(
47+
f'{self.endpoint.format(tag=uuid4().hex)}?&token={TEST_TOKEN}'
48+
)
49+
50+
assert response.status_code == 200
51+
data = response.data.decode()
52+
assert '<rss version="2.0">' in data
53+
54+
55+
class TestMastodonSearchRoute(TestTwitterRoutes):
56+
endpoint = '/toots/search'
57+
58+
59+
class TestMastodonRoutes:
60+
@pytest.mark.parametrize('input_endpoint', MASTODON_ENDPOINTS)
61+
def test_it_returns_401_when_token_is_missing(
62+
self, app_missing_token: Flask, input_endpoint: str
63+
) -> None:
64+
client = app_missing_token.test_client()
65+
66+
response = client.get(input_endpoint)
67+
68+
assert response.status_code == 401
69+
data = response.data.decode()
70+
assert data == 'missing token'
71+
72+
@pytest.mark.parametrize('input_endpoint', MASTODON_ENDPOINTS)
73+
def test_it_returns_403_when_token_is_invalid(
74+
self, app_invalid_token: Flask, input_endpoint: str
75+
) -> None:
76+
client = app_invalid_token.test_client()
77+
78+
response = client.get(f'{input_endpoint}?token=invalid')
79+
80+
assert response.status_code == 403
81+
data = response.data.decode()
82+
assert data == 'invalid token'
83+
84+
@pytest.mark.parametrize('input_endpoint', MASTODON_ENDPOINTS)
85+
def test_it_returns_200(self, app: Flask, input_endpoint: str) -> None:
86+
client = app.test_client()
87+
88+
response = client.get(f'{input_endpoint}?token={TEST_TOKEN}')
89+
90+
assert response.status_code == 200
91+
data = response.data.decode()
92+
assert '<rss version="2.0">' in data

twootfeed/tests/test_routes.py

Lines changed: 0 additions & 130 deletions
This file was deleted.
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
from uuid import uuid4
2+
3+
from flask import Flask
4+
5+
from .data import TEST_TOKEN
6+
7+
8+
class TestTwitterRoutes:
9+
endpoint = '/tweets'
10+
11+
def test_it_returns_401_when_token_is_missing(
12+
self, app_missing_token: Flask
13+
) -> None:
14+
client = app_missing_token.test_client()
15+
16+
response = client.get(self.endpoint)
17+
18+
assert response.status_code == 401
19+
data = response.data.decode()
20+
assert data == 'missing token'
21+
22+
def test_it_returns_403_when_token_is_invalid(
23+
self, app_invalid_token: Flask
24+
) -> None:
25+
client = app_invalid_token.test_client()
26+
27+
response = client.get(f'{self.endpoint}?token=invalid')
28+
29+
assert response.status_code == 403
30+
data = response.data.decode()
31+
assert data == 'invalid token'
32+
33+
def test_it_returns_400_when_query_is_missing(self, app: Flask) -> None:
34+
client = app.test_client()
35+
36+
response = client.get(f'{self.endpoint}?token={TEST_TOKEN}')
37+
38+
assert response.status_code == 400
39+
data = response.data.decode()
40+
assert data == 'missing query'
41+
42+
def test_it_returns_200_when_query_valid(self, app: Flask) -> None:
43+
client = app.test_client()
44+
45+
response = client.get(
46+
f'{self.endpoint}?q={uuid4().hex}&token={TEST_TOKEN}'
47+
)
48+
49+
assert response.status_code == 200
50+
data = response.data.decode()
51+
assert '<rss version="2.0">' in data

twootfeed/twitter/routes.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
from typing import Tuple
22

3-
from flask import Blueprint
3+
from flask import Blueprint, request
44
from twootfeed import param, twitter_api
55
from twootfeed.twitter.generate_tweets_feed import generate_xml
66
from twootfeed.utils.decorator import require_token
77

88
twitter_bp = Blueprint('twitter', __name__)
99

1010

11-
@twitter_bp.route('/<query_feed>', methods=['GET'])
12-
@twitter_bp.route('/tweets/<query_feed>', methods=['GET'])
11+
@twitter_bp.route('/tweets', methods=['GET'])
1312
@require_token
14-
def tweetfeed(query_feed: str) -> Tuple[str, int]:
13+
def tweetfeed() -> Tuple[str, int]:
1514
"""generate a rss feed from parsed twitter search"""
16-
return generate_xml(twitter_api, query_feed, param)
15+
q = request.args.get('q')
16+
if not q:
17+
return 'missing query', 400
18+
return generate_xml(twitter_api, q, param)

0 commit comments

Comments
 (0)