test_ok2/testing/test_pastebin.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

189 lines
6.1 KiB
Python
Raw Normal View History

# mypy: allow-untyped-defs
2021-12-22 09:42:32 +08:00
import email.message
2020-10-17 21:54:54 +08:00
import io
from typing import List
from typing import Union
from _pytest.monkeypatch import MonkeyPatch
from _pytest.pytester import Pytester
import pytest
2019-06-03 06:32:00 +08:00
class TestPasteCapture:
@pytest.fixture
def pastebinlist(self, monkeypatch, request) -> List[Union[str, bytes]]:
2020-10-06 09:13:05 +08:00
pastebinlist: List[Union[str, bytes]] = []
2018-05-23 22:48:46 +08:00
plugin = request.config.pluginmanager.getplugin("pastebin")
monkeypatch.setattr(plugin, "create_new_paste", pastebinlist.append)
return pastebinlist
def test_failed(self, pytester: Pytester, pastebinlist) -> None:
testpath = pytester.makepyfile(
2018-05-23 22:48:46 +08:00
"""
import pytest
def test_pass() -> None:
pass
def test_fail():
assert 0
def test_skip():
pytest.skip("")
2018-05-23 22:48:46 +08:00
"""
)
reprec = pytester.inline_run(testpath, "--pastebin=failed")
assert len(pastebinlist) == 1
s = pastebinlist[0]
assert s.find("def test_fail") != -1
assert reprec.countoutcomes() == [1, 1, 1]
def test_all(self, pytester: Pytester, pastebinlist) -> None:
from _pytest.pytester import LineMatcher
2018-05-23 22:48:46 +08:00
testpath = pytester.makepyfile(
2018-05-23 22:48:46 +08:00
"""
import pytest
def test_pass():
pass
def test_fail():
assert 0
def test_skip():
pytest.skip("")
2018-05-23 22:48:46 +08:00
"""
)
reprec = pytester.inline_run(testpath, "--pastebin=all", "-v")
assert reprec.countoutcomes() == [1, 1, 1]
assert len(pastebinlist) == 1
2018-05-23 22:48:46 +08:00
contents = pastebinlist[0].decode("utf-8")
matcher = LineMatcher(contents.splitlines())
2018-05-23 22:48:46 +08:00
matcher.fnmatch_lines(
[
"*test_pass PASSED*",
"*test_fail FAILED*",
"*test_skip SKIPPED*",
"*== 1 failed, 1 passed, 1 skipped in *",
]
)
def test_non_ascii_paste_text(self, pytester: Pytester, pastebinlist) -> None:
"""Make sure that text which contains non-ascii characters is pasted
correctly. See #1219.
"""
pytester.makepyfile(
test_unicode="""\
def test():
assert '' == 1
"""
2018-05-23 22:48:46 +08:00
)
result = pytester.runpytest("--pastebin=all")
expected_msg = "*assert '' == 1*"
2018-05-23 22:48:46 +08:00
result.stdout.fnmatch_lines(
[
expected_msg,
"*== 1 failed in *",
"*Sending information to Paste Service*",
]
)
assert len(pastebinlist) == 1
2019-06-03 06:32:00 +08:00
class TestPaste:
@pytest.fixture
def pastebin(self, request):
2018-05-23 22:48:46 +08:00
return request.config.pluginmanager.getplugin("pastebin")
@pytest.fixture
def mocked_urlopen_fail(self, monkeypatch: MonkeyPatch):
"""Monkeypatch the actual urlopen call to emulate a HTTP Error 400."""
calls = []
import urllib.error
import urllib.request
def mocked(url, data):
calls.append((url, data))
2021-12-22 09:42:32 +08:00
raise urllib.error.HTTPError(
url, 400, "Bad request", email.message.Message(), io.BytesIO()
)
monkeypatch.setattr(urllib.request, "urlopen", mocked)
return calls
@pytest.fixture
def mocked_urlopen_invalid(self, monkeypatch: MonkeyPatch):
"""Monkeypatch the actual urlopen calls done by the internal plugin
function that connects to bpaste service, but return a url in an
unexpected format."""
calls = []
def mocked(url, data):
calls.append((url, data))
class DummyFile:
def read(self):
# part of html of a normal response
return b'View <a href="/invalid/3c0c6750bd">raw</a>.'
return DummyFile()
import urllib.request
monkeypatch.setattr(urllib.request, "urlopen", mocked)
return calls
@pytest.fixture
def mocked_urlopen(self, monkeypatch: MonkeyPatch):
"""Monkeypatch the actual urlopen calls done by the internal plugin
function that connects to bpaste service."""
calls = []
def mocked(url, data):
calls.append((url, data))
2019-06-03 06:32:00 +08:00
class DummyFile:
def read(self):
# part of html of a normal response
return b'View <a href="/raw/3c0c6750bd">raw</a>.'
2018-05-23 22:48:46 +08:00
return DummyFile()
import urllib.request
2018-05-23 22:48:46 +08:00
monkeypatch.setattr(urllib.request, "urlopen", mocked)
return calls
def test_pastebin_invalid_url(self, pastebin, mocked_urlopen_invalid) -> None:
result = pastebin.create_new_paste(b"full-paste-contents")
assert (
result
== "bad response: invalid format ('View <a href=\"/invalid/3c0c6750bd\">raw</a>.')"
)
assert len(mocked_urlopen_invalid) == 1
def test_pastebin_http_error(self, pastebin, mocked_urlopen_fail) -> None:
result = pastebin.create_new_paste(b"full-paste-contents")
assert result == "bad response: HTTP Error 400: Bad request"
assert len(mocked_urlopen_fail) == 1
def test_create_new_paste(self, pastebin, mocked_urlopen) -> None:
2018-05-23 22:48:46 +08:00
result = pastebin.create_new_paste(b"full-paste-contents")
assert result == "https://bpa.st/show/3c0c6750bd"
assert len(mocked_urlopen) == 1
url, data = mocked_urlopen[0]
assert type(data) is bytes
lexer = "text"
assert url == "https://bpa.st"
assert f"lexer={lexer}" in data.decode()
2018-05-23 22:48:46 +08:00
assert "code=full-paste-contents" in data.decode()
assert "expiry=1week" in data.decode()
2019-08-25 01:41:06 +08:00
def test_create_new_paste_failure(self, pastebin, monkeypatch: MonkeyPatch) -> None:
2019-08-25 01:41:06 +08:00
import io
import urllib.request
def response(url, data):
stream = io.BytesIO(b"something bad occurred")
return stream
monkeypatch.setattr(urllib.request, "urlopen", response)
result = pastebin.create_new_paste(b"full-paste-contents")
assert result == "bad response: invalid format ('something bad occurred')"