diff --git a/cloudbot/util/web.py b/cloudbot/util/web.py index 3d0db332..0c2818df 100644 --- a/cloudbot/util/web.py +++ b/cloudbot/util/web.py @@ -38,7 +38,7 @@ # Constants DEFAULT_SHORTENER = "is.gd" -DEFAULT_PASTEBIN = "" +DEFAULT_PASTEBIN = "sharey" HASTEBIN_SERVER = "https://hastebin.com" diff --git a/plugins/pastebins/sprunge.py b/plugins/pastebins/sharey.py similarity index 62% rename from plugins/pastebins/sprunge.py rename to plugins/pastebins/sharey.py index ea47dbb6..129a89ee 100644 --- a/plugins/pastebins/sprunge.py +++ b/plugins/pastebins/sharey.py @@ -1,3 +1,5 @@ +import json + import requests from requests import HTTPError, RequestException @@ -10,25 +12,21 @@ ) -class Sprunge(Pastebin): +class Sharey(Pastebin): def __init__(self, base_url) -> None: super().__init__() self.url = base_url - def paste(self, data, ext) -> str: - if isinstance(data, str): - encoded = data.encode() - else: - encoded = data - - params = { - "sprunge": encoded, - } + def paste(self, data: str | bytes, ext: str) -> str: + try: + encoded = json.loads(data) + except json.JSONDecodeError: + encoded = {"content": data} try: - with requests.post(self.url, data=params) as response: + with requests.post(self.url, json=encoded) as response: response.raise_for_status() - url = response.text.strip() + url = response.json()["url"] except HTTPError as e: r = e.response raise ServiceHTTPError(r.reason, r) from e @@ -43,9 +41,9 @@ def paste(self, data, ext) -> str: @hook.on_start() def register() -> None: - pastebins.register("sprunge", Sprunge("http://sprunge.us")) + pastebins.register("sharey", Sharey("https://sharey.org/api/paste")) @hook.on_stop() def unregister() -> None: - pastebins.remove("sprunge") + pastebins.remove("sharey") diff --git a/tests/plugin_tests/test_paste_sharey.py b/tests/plugin_tests/test_paste_sharey.py new file mode 100644 index 00000000..8d0be33e --- /dev/null +++ b/tests/plugin_tests/test_paste_sharey.py @@ -0,0 +1,92 @@ +import json + +import pytest + +from cloudbot.util import web +from plugins.pastebins import sharey + + +def test_register() -> None: + sharey.register() + + assert web.pastebins.get("sharey") is not None + + sharey.unregister() + + assert web.pastebins.get("sharey") is None + + +def test_paste(mock_requests) -> None: + sharey.register() + + paster = web.pastebins["sharey"] + + mock_requests.add( + "POST", + "https://sharey.org/api/paste", + json={"url": "https://sharey.org/foobar"}, + ) + assert paster.paste("test data", "txt") == "https://sharey.org/foobar?txt" + sharey.unregister() + + +def test_data_params(mock_requests) -> None: + sharey.register() + + body: str | bytes | None = None + + def req_cb(req): + nonlocal body + body = req.body + return 200, {}, json.dumps({"url": "https://sharey.org/foobar"}) + + paster = web.pastebins["sharey"] + mock_requests.add_callback( + "POST", "https://sharey.org/api/paste", callback=req_cb + ) + assert paster.paste("test data", "txt") == "https://sharey.org/foobar?txt" + assert body is not None + assert json.loads(body) == {"content": "test data"} + sharey.unregister() + + +def test_paste_json_input(mock_requests) -> None: + sharey.register() + + body: str | bytes | None = None + + def req_cb(req): + nonlocal body + body = req.body + return 200, {}, json.dumps({"url": "https://sharey.org/foobar"}) + + paster = web.pastebins["sharey"] + mock_requests.add_callback( + "POST", "https://sharey.org/api/paste", callback=req_cb + ) + assert ( + paster.paste('{"foo": "bar"}', "txt") == "https://sharey.org/foobar?txt" + ) + assert body is not None + assert json.loads(body) == {"foo": "bar"} + sharey.unregister() + + +def test_paste_error(mock_requests) -> None: + sharey.register() + + paster = web.pastebins["sharey"] + + with pytest.raises(web.ServiceError): + paster.paste("test data", "txt") + + mock_requests.add( + "POST", + "https://sharey.org/api/paste", + status=500, + ) + + with pytest.raises(web.ServiceHTTPError): + paster.paste("test data", "txt") + + sharey.unregister() diff --git a/tests/plugin_tests/test_paste_sprunge.py b/tests/plugin_tests/test_paste_sprunge.py deleted file mode 100644 index 762085ee..00000000 --- a/tests/plugin_tests/test_paste_sprunge.py +++ /dev/null @@ -1,75 +0,0 @@ -import pytest - -from cloudbot.util import web -from plugins.pastebins import sprunge - - -def test_register() -> None: - sprunge.register() - - assert web.pastebins.get("sprunge") is not None - - sprunge.unregister() - - assert web.pastebins.get("sprunge") is None - - -def test_paste(mock_requests) -> None: - sprunge.register() - - paster = web.pastebins["sprunge"] - - mock_requests.add( - "POST", "http://sprunge.us", body="http://sprunge.us/foobar" - ) - assert paster.paste("test data", "txt") == "http://sprunge.us/foobar?txt" - sprunge.unregister() - - -def test_data_params(mock_requests) -> None: - sprunge.register() - - body = None - - def req_cb(req): - nonlocal body - body = req.body - return 200, {}, "http://sprunge.us/foobar\n" - - paster = web.pastebins["sprunge"] - mock_requests.add_callback("POST", "http://sprunge.us", callback=req_cb) - assert paster.paste("test data", "txt") == "http://sprunge.us/foobar?txt" - assert body == "sprunge=test+data" - sprunge.unregister() - - -def test_paste_bytes(mock_requests) -> None: - sprunge.register() - - paster = web.pastebins["sprunge"] - - mock_requests.add( - "POST", "http://sprunge.us", body="http://sprunge.us/foobar" - ) - assert paster.paste(b"test data", "txt") == "http://sprunge.us/foobar?txt" - sprunge.unregister() - - -def test_paste_error(mock_requests) -> None: - sprunge.register() - - paster = web.pastebins["sprunge"] - - with pytest.raises(web.ServiceError): - paster.paste("test data", "txt") - - mock_requests.add( - "POST", - "http://sprunge.us", - status=500, - ) - - with pytest.raises(web.ServiceHTTPError): - paster.paste("test data", "txt") - - sprunge.unregister()