Small improvements to CLI experience (#2136)
* Small improvements to CLI experience * Add tests * Add test server for cli testing * Add LOGO logging to reloader and some additional context to logging debug * Cleanup tests
This commit is contained in:
32
tests/fake/server.py
Normal file
32
tests/fake/server.py
Normal file
@@ -0,0 +1,32 @@
|
||||
import json
|
||||
import logging
|
||||
|
||||
from sanic import Sanic, text
|
||||
from sanic.log import LOGGING_CONFIG_DEFAULTS, logger
|
||||
|
||||
|
||||
LOGGING_CONFIG = {**LOGGING_CONFIG_DEFAULTS}
|
||||
LOGGING_CONFIG["formatters"]["generic"]["format"] = "%(message)s"
|
||||
LOGGING_CONFIG["loggers"]["sanic.root"]["level"] = "DEBUG"
|
||||
|
||||
app = Sanic(__name__, log_config=LOGGING_CONFIG)
|
||||
|
||||
|
||||
@app.get("/")
|
||||
async def handler(request):
|
||||
return text(request.ip)
|
||||
|
||||
|
||||
@app.before_server_start
|
||||
async def app_info_dump(app: Sanic, _):
|
||||
app_data = {
|
||||
"access_log": app.config.ACCESS_LOG,
|
||||
"auto_reload": app.auto_reload,
|
||||
"debug": app.debug,
|
||||
}
|
||||
logger.info(json.dumps(app_data))
|
||||
|
||||
|
||||
@app.after_server_start
|
||||
async def shutdown(app: Sanic, _):
|
||||
app.stop()
|
||||
125
tests/test_cli.py
Normal file
125
tests/test_cli.py
Normal file
@@ -0,0 +1,125 @@
|
||||
import json
|
||||
import subprocess
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
from sanic_routing import __version__ as __routing_version__
|
||||
|
||||
from sanic import __version__
|
||||
from sanic.config import BASE_LOGO
|
||||
|
||||
|
||||
def capture(command):
|
||||
proc = subprocess.Popen(
|
||||
command,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE,
|
||||
cwd=Path(__file__).parent,
|
||||
)
|
||||
try:
|
||||
out, err = proc.communicate(timeout=0.5)
|
||||
except subprocess.TimeoutExpired:
|
||||
proc.kill()
|
||||
out, err = proc.communicate()
|
||||
return out, err, proc.returncode
|
||||
|
||||
|
||||
@pytest.mark.parametrize("appname", ("fake.server.app", "fake.server:app"))
|
||||
def test_server_run(appname):
|
||||
command = ["sanic", appname]
|
||||
out, err, exitcode = capture(command)
|
||||
lines = out.split(b"\n")
|
||||
firstline = lines[6]
|
||||
|
||||
assert exitcode != 1
|
||||
assert firstline == b"Goin' Fast @ http://127.0.0.1:8000"
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"cmd",
|
||||
(
|
||||
("--host=localhost", "--port=9999"),
|
||||
("-H", "localhost", "-p", "9999"),
|
||||
),
|
||||
)
|
||||
def test_host_port(cmd):
|
||||
command = ["sanic", "fake.server.app", *cmd]
|
||||
out, err, exitcode = capture(command)
|
||||
lines = out.split(b"\n")
|
||||
firstline = lines[6]
|
||||
|
||||
assert exitcode != 1
|
||||
assert firstline == b"Goin' Fast @ http://localhost:9999"
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"num,cmd",
|
||||
(
|
||||
(1, (f"--workers={1}",)),
|
||||
(2, (f"--workers={2}",)),
|
||||
(4, (f"--workers={4}",)),
|
||||
(1, ("-w", "1")),
|
||||
(2, ("-w", "2")),
|
||||
(4, ("-w", "4")),
|
||||
),
|
||||
)
|
||||
def test_num_workers(num, cmd):
|
||||
command = ["sanic", "fake.server.app", *cmd]
|
||||
out, err, exitcode = capture(command)
|
||||
lines = out.split(b"\n")
|
||||
|
||||
worker_lines = [line for line in lines if b"worker" in line]
|
||||
assert exitcode != 1
|
||||
assert len(worker_lines) == num * 2
|
||||
|
||||
|
||||
@pytest.mark.parametrize("cmd", ("--debug", "-d"))
|
||||
def test_debug(cmd):
|
||||
command = ["sanic", "fake.server.app", cmd]
|
||||
out, err, exitcode = capture(command)
|
||||
lines = out.split(b"\n")
|
||||
|
||||
app_info = lines[9]
|
||||
info = json.loads(app_info)
|
||||
|
||||
assert (b"\n".join(lines[:6])).decode("utf-8") == BASE_LOGO
|
||||
assert info["debug"] is True
|
||||
assert info["auto_reload"] is True
|
||||
|
||||
|
||||
@pytest.mark.parametrize("cmd", ("--auto-reload", "-r"))
|
||||
def test_auto_reload(cmd):
|
||||
command = ["sanic", "fake.server.app", cmd]
|
||||
out, err, exitcode = capture(command)
|
||||
lines = out.split(b"\n")
|
||||
|
||||
app_info = lines[9]
|
||||
info = json.loads(app_info)
|
||||
|
||||
assert info["debug"] is False
|
||||
assert info["auto_reload"] is True
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"cmd,expected", (("--access-log", True), ("--no-access-log", False))
|
||||
)
|
||||
def test_access_logs(cmd, expected):
|
||||
command = ["sanic", "fake.server.app", cmd]
|
||||
out, err, exitcode = capture(command)
|
||||
lines = out.split(b"\n")
|
||||
|
||||
app_info = lines[9]
|
||||
info = json.loads(app_info)
|
||||
|
||||
assert info["access_log"] is expected
|
||||
|
||||
|
||||
@pytest.mark.parametrize("cmd", ("--version", "-v"))
|
||||
def test_version(cmd):
|
||||
command = ["sanic", cmd]
|
||||
out, err, exitcode = capture(command)
|
||||
version_string = f"Sanic {__version__}; Routing {__routing_version__}\n"
|
||||
|
||||
assert out == version_string.encode("utf-8")
|
||||
Reference in New Issue
Block a user