Skip to content

Commit

Permalink
Increase coverage (#334)
Browse files Browse the repository at this point in the history
  • Loading branch information
blink1073 authored Nov 8, 2022
1 parent 0bd0b71 commit 45117ee
Show file tree
Hide file tree
Showing 14 changed files with 269 additions and 37 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:
- os: ubuntu-latest
python-version: "pypy-3.7"
- os: ubuntu-latest
python-version: "3.11-dev"
python-version: "3.11"
- os: macos-latest
python-version: "3.8"
steps:
Expand Down
13 changes: 7 additions & 6 deletions jupyterlab_server/process.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@
else:

def list2cmdline(cmd_list):
import pipes
import shlex

return " ".join(map(pipes.quote, cmd_list))
return " ".join(map(shlex.quote, cmd_list))


def which(command, env=None):
Expand Down Expand Up @@ -125,7 +125,8 @@ def terminate(self):
os.kill(proc.pid, sig)

finally:
Process._procs.remove(self)
if self in Process._procs:
Process._procs.remove(self)

return proc.wait()

Expand Down Expand Up @@ -220,8 +221,7 @@ def __init__(self, cmd, startup_regex, logger=None, cwd=None, kill_event=None, e
if re.match(startup_regex, line):
break

self._read_thread = threading.Thread(target=self._read_incoming)
self._read_thread.setDaemon(True)
self._read_thread = threading.Thread(target=self._read_incoming, daemon=True)
self._read_thread.start()

def terminate(self):
Expand All @@ -239,7 +239,8 @@ def terminate(self):
try:
proc.wait()
finally:
Process._procs.remove(self)
if self in Process._procs:
Process._procs.remove(self)

return proc.returncode

Expand Down
15 changes: 0 additions & 15 deletions jupyterlab_server/test_utils.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
import json
import os
import sys
from contextlib import contextmanager
from http.cookies import SimpleCookie
from pathlib import Path
from urllib.parse import parse_qs, urlparse

import requests
import tornado
from openapi_core.validation.request.datatypes import OpenAPIRequest, RequestParameters
from openapi_core.validation.request.validators import RequestValidator
Expand Down Expand Up @@ -150,16 +148,3 @@ def expected_http_error(error, expected_code, expected_message=None):
return True

return False


@contextmanager
def assert_http_error(status, msg=None):
try:
yield
except requests.HTTPError as e:
real_status = e.response.status_code
assert real_status == status, "Expected status %d, got %d" % (status, real_status)
if msg:
assert msg in str(e), e
else:
raise AssertionError("Expected HTTP error status")
7 changes: 3 additions & 4 deletions jupyterlab_server/translation_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@
from packaging.version import parse as parse_version

# See compatibility note on `group` keyword in https://docs.python.org/3/library/importlib.metadata.html#entry-points
if sys.version_info < (3, 10):
if sys.version_info < (3, 10): # pragma: no cover
from importlib_metadata import entry_points
else:
else: # pragma: no cover
from importlib.metadata import entry_points

# Entry points
Expand Down Expand Up @@ -94,7 +94,7 @@ def _get_installed_language_pack_locales():
for entry_point in entry_points(group=JUPYTERLAB_LANGUAGEPACK_ENTRY):
try:
data[entry_point.name] = os.path.dirname(entry_point.load().__file__)
except Exception:
except Exception: # pragma: no cover
messages.append(traceback.format_exc())

message = "\n".join(messages)
Expand Down Expand Up @@ -139,7 +139,6 @@ def _main():
if len(sys.argv) == 2:
func_name = sys.argv[-1]
func = globals().get(func_name, None)

if func:
try:
data, message = func()
Expand Down
14 changes: 7 additions & 7 deletions jupyterlab_server/workspaces_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,15 +85,15 @@ def initialize(self, *args, **kwargs):
self.manager = WorkspacesManager(self.workspaces_dir)

def start(self):
if len(self.extra_args) > 1:
if len(self.extra_args) > 1: # pragma: no cover
warnings.warn("Too many arguments were provided for workspace export.")
self.exit(1)

raw = DEFAULT_WORKSPACE if not self.extra_args else self.extra_args[0]
try:
workspace = self.manager.load(raw)
print(json.dumps(workspace))
except Exception:
except Exception: # pragma: no cover
print(json.dumps(dict(data=dict(), metadata=dict(id=raw))))


Expand Down Expand Up @@ -124,20 +124,20 @@ def initialize(self, *args, **kwargs):

def start(self):

if len(self.extra_args) != 1:
if len(self.extra_args) != 1: # pragma: no cover
print("One argument is required for workspace import.")
self.exit(1)

with self._smart_open() as fid:
try: # to load, parse, and validate the workspace file.
workspace = self._validate(fid)
except Exception as e:
except Exception as e: # pragma: no cover
print(f"{fid.name} is not a valid workspace:\n{e}")
self.exit(1)

try:
workspace_path = self.manager.save(workspace["metadata"]["id"], json.dumps(workspace))
except Exception as e:
except Exception as e: # pragma: no cover
print(f"Workspace could not be exported:\n{e!s}")
self.exit(1)

Expand All @@ -146,12 +146,12 @@ def start(self):
def _smart_open(self):
file_name = self.extra_args[0]

if file_name == "-":
if file_name == "-": # pragma: no cover
return sys.stdin
else:
file_path = Path(file_name).resolve()

if not file_path.exists():
if not file_path.exists(): # pragma: no cover
print(f"{file_name!s} does not exist.")
self.exit(1)

Expand Down
6 changes: 3 additions & 3 deletions jupyterlab_server/workspaces_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ def delete(self, space_name):
return self.set_status(204)
except FileNotFoundError as e:
raise web.HTTPError(404, str(e)) from e
except Exception as e:
except Exception as e: # pragma: no cover
raise web.HTTPError(500, str(e)) from e

@web.authenticated
Expand All @@ -201,7 +201,7 @@ def get(self, space_name=""):

workspace = self.manager.load(space_name)
return self.finish(json.dumps(workspace))
except Exception as e:
except Exception as e: # pragma: no cover
raise web.HTTPError(500, str(e)) from e

@web.authenticated
Expand All @@ -217,7 +217,7 @@ def put(self, space_name=""):
self.manager.save(space_name, raw)
except ValueError as e:
raise web.HTTPError(400, str(e)) from e
except Exception as e:
except Exception as e: # pragma: no cover
raise web.HTTPError(500, str(e)) from e

self.set_status(204)
3 changes: 2 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ test = [
# openapi_core 0.15.0 alpha is not working
"openapi_core~=0.14.2",
"openapi-spec-validator<0.5",
"requests_mock",
"pytest>=7.0",
"pytest-console-scripts",
"pytest-cov",
Expand Down Expand Up @@ -99,7 +100,7 @@ dependencies = ["coverage", "pytest-cov"]
[tool.hatch.envs.cov.env-vars]
ARGS = "-vv --cov jupyterlab_server --cov-branch --cov-report term-missing:skip-covered"
[tool.hatch.envs.cov.scripts]
test = "python -m pytest $ARGS --cov-fail-under 65 {args}"
test = "python -m pytest $ARGS --cov-fail-under 80 {args}"

[tool.pytest.ini_options]
addopts = "-raXs --durations 10 --color=yes --doctest-modules"
Expand Down
27 changes: 27 additions & 0 deletions tests/test_config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import json
import os

from jupyterlab_server.config import get_page_config


def test_get_page_config(tmp_path):
labext_path = [os.path.join(tmp_path, "ext")]
settings_path = os.path.join(tmp_path, "settings")
os.mkdir(settings_path)

with open(os.path.join(settings_path, "page_config.json"), "w") as fid:
data = dict(deferredExtensions=["foo"])
json.dump(data, fid)

static_dir = os.path.join(tmp_path, "static")
os.mkdir(static_dir)
with open(os.path.join(static_dir, "package.json"), "w") as fid:
data = dict(jupyterlab=dict(extensionMetadata=dict(foo=dict(disabledExtensions=["bar"]))))
json.dump(data, fid)

config = get_page_config(labext_path, settings_path)
assert config == {
"deferredExtensions": ["foo"],
"federated_extensions": [],
"disabledExtensions": ["bar"],
}
18 changes: 18 additions & 0 deletions tests/test_listings_api.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,25 @@
import json

import requests_mock

from jupyterlab_server.listings_handler import ListingsHandler, fetch_listings
from jupyterlab_server.test_utils import validate_request


async def test_get_listing(jp_fetch, labserverapp):
url = r"lab/api/listings/@jupyterlab/extensionmanager-extension/listings.json"
r = await jp_fetch(*url.split("/"))
validate_request(r)


def test_fetch_listings():
ListingsHandler.allowed_extensions_uris = ["http://foo"]
ListingsHandler.blocked_extensions_uris = ["http://bar"]
with requests_mock.Mocker() as m:
data = dict(blocked_extensions=[])
m.get("http://bar", text=json.dumps(data))
data = dict(allowed_extensions=[])
m.get("http://foo", text=json.dumps(data))
fetch_listings(None)
ListingsHandler.allowed_extensions_uris = []
ListingsHandler.blocked_extensions_uris = []
46 changes: 46 additions & 0 deletions tests/test_process.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import os
import sys
import warnings

import pytest

from jupyterlab_server.process import Process, WatchHelper, which
from jupyterlab_server.process_app import ProcessApp


def test_which():
assert which("python")


async def test_process():
p = Process([sys.executable, "--version"])
p.get_log().info("test")
assert p.wait() == 0

p = Process([sys.executable, "--version"])
p.get_log().info("test")
assert await p.wait_async() == 0
assert p.terminate() == 0


@pytest.mark.skipif(os.name == "nt", reason="Fails on Windows")
async def test_watch_helper():
helper = WatchHelper([sys.executable, "-i"], ">>>")
helper.terminate()
helper.wait()


def test_process_app():
class TestApp(ProcessApp):
name = "tests"

app = TestApp()
app.initialize_server([])
try:
app.initialize()
with pytest.raises(SystemExit):
app.start()
# Kandle exception on older versions of server.
except Exception as e:
# Convert to warning so the test will pass on min version test.
warnings.warn(str(e))
27 changes: 27 additions & 0 deletions tests/test_themes_api.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,33 @@
from unittest.mock import Mock

from tornado.httpserver import HTTPRequest
from tornado.web import Application

from jupyterlab_server.test_utils import validate_request
from jupyterlab_server.themes_handler import ThemesHandler


async def test_get_theme(jp_fetch, labserverapp):
r = await jp_fetch("lab", "api", "themes", "@jupyterlab", "foo", "index.css")
validate_request(r)


def test_themes_handler(tmp_path):
app = Application()
request = HTTPRequest(connection=Mock())
data_path = f"{tmp_path}/test.txt"
with open(data_path, "w") as fid:
fid.write("hi")
handler = ThemesHandler(app, request, path=str(tmp_path))
handler.absolute_path = data_path
handler.get_content_size()
handler.get_content("test.txt")

css_path = f"{tmp_path}/test.css"
with open(css_path, "w") as fid:
fid.write("url('./foo.css')")
handler.absolute_path = css_path
handler.path = "/"
handler.themes_url = "foo"
content = handler.get_content(css_path)
assert content == b"url('foo/./foo.css')"
40 changes: 40 additions & 0 deletions tests/test_translation_utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import sys

from jupyterlab_server.translation_utils import (
TranslationBundle,
_main,
get_installed_packages_locale,
get_language_packs,
translator,
)


def test_transutils_main():
sys.argv = ["", "get_language_packs"]
_main()
sys.argv = [""]


def test_get_installed_packages_locale(jp_environ):
get_installed_packages_locale("es_co")


def test_get_language_packs(jp_environ):
get_language_packs("es_co")


def test_translation_bundle():
bundle = TranslationBundle("foo", "bar")
bundle.update_locale("fizz")
bundle.gettext("hi")
bundle.ngettext("hi", "his", 1)
bundle.npgettext("foo", "bar", "bars", 2)
bundle.pgettext("foo", "bar")


def test_translator():
t = translator()
t.load("foo")
t.normalize_domain("bar")
t.set_locale("fizz")
t.translate_schema({})
Loading

0 comments on commit 45117ee

Please sign in to comment.