Skip to content

Commit 91d887c

Browse files
author
Joel Collins
committed
Finished extensions coverage
1 parent c2e0a9c commit 91d887c

File tree

7 files changed

+188
-2
lines changed

7 files changed

+188
-2
lines changed

labthings/server/extensions.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def views(self):
6565
def add_view(self, view_class, rule, view_id=None, **kwargs):
6666
# Remove all leading slashes from view route
6767
cleaned_rule = rule
68-
while cleaned_rule[0] == "/":
68+
while cleaned_rule and cleaned_rule[0] == "/":
6969
cleaned_rule = cleaned_rule[1:]
7070

7171
# Expand the rule to include extension name
@@ -141,7 +141,7 @@ def add_method(self, method, method_name):
141141
if not hasattr(self, method_name):
142142
setattr(self, method_name, method)
143143
else:
144-
logging.warning(
144+
raise NameError(
145145
"Unable to bind method to extension. Method name already exists."
146146
)
147147

tests/conftest.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,8 @@ def static_path(app):
104104
@pytest.fixture
105105
def schemas_path(app):
106106
return os.path.join(os.path.dirname(__file__), "schemas")
107+
108+
109+
@pytest.fixture
110+
def extensions_path(app):
111+
return os.path.join(os.path.dirname(__file__), "extensions")
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from labthings.server.extensions import BaseExtension
2+
3+
test_extension = BaseExtension("org.labthings.tests.extension_package")

tests/extensions/test_extension.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from labthings.server.extensions import BaseExtension
2+
3+
test_extension = BaseExtension("org.labthings.tests.extension")
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
raise Exception
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from labthings.server.extensions import BaseExtension
2+
3+
test_extension = BaseExtension("org.labthings.tests.extension")
4+
test_extension_excluded = BaseExtension("org.labthings.tests.extension_excluded")
5+
6+
__extensions__ = ["test_extension"]

tests/test_server_extensions.py

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
from labthings.server import extensions
2+
import os
3+
4+
import pytest
5+
6+
7+
@pytest.fixture
8+
def lt_extension():
9+
return extensions.BaseExtension("org.labthings.tests.extension")
10+
11+
12+
def test_extension_init(lt_extension):
13+
assert lt_extension
14+
assert lt_extension.name
15+
16+
17+
def test_add_view(lt_extension, app, view_cls):
18+
lt_extension.add_view(view_cls, "/index")
19+
20+
assert "index" in lt_extension.views
21+
assert lt_extension.views.get("index") == {
22+
"rule": "/org.labthings.tests.extension/index",
23+
"view": view_cls,
24+
"kwargs": {},
25+
}
26+
27+
28+
def test_on_register(lt_extension):
29+
def f(arg, kwarg=1):
30+
pass
31+
32+
lt_extension.on_register(f, args=(1,), kwargs={"kwarg": 0})
33+
assert {
34+
"function": f,
35+
"args": (1,),
36+
"kwargs": {"kwarg": 0},
37+
} in lt_extension._on_registers
38+
39+
40+
def test_on_register_non_callable(lt_extension):
41+
with pytest.raises(TypeError):
42+
lt_extension.on_register(object())
43+
44+
45+
def test_on_component(lt_extension):
46+
def f():
47+
pass
48+
49+
lt_extension.on_component("org.labthings.tests.component", f)
50+
assert {
51+
"component": "org.labthings.tests.component",
52+
"function": f,
53+
"args": (),
54+
"kwargs": {},
55+
} in lt_extension._on_components
56+
57+
58+
def test_on_component_non_callable(lt_extension):
59+
with pytest.raises(TypeError):
60+
lt_extension.on_component("org.labthings.tests.component", object())
61+
62+
63+
def test_meta_simple(lt_extension):
64+
lt_extension.add_meta("key", "value")
65+
assert lt_extension.meta.get("key") == "value"
66+
67+
68+
def test_meta_callable(lt_extension):
69+
def f():
70+
return "callable value"
71+
72+
lt_extension.add_meta("key", f)
73+
assert lt_extension.meta.get("key") == "callable value"
74+
75+
76+
def test_add_method(lt_extension):
77+
def f():
78+
pass
79+
80+
lt_extension.add_method(
81+
f, "method_name",
82+
)
83+
assert lt_extension.method_name == f
84+
85+
86+
def test_add_method_name_clash(lt_extension):
87+
def f():
88+
pass
89+
90+
lt_extension.add_method(
91+
f, "method_name",
92+
)
93+
assert lt_extension.method_name == f
94+
95+
with pytest.raises(NameError):
96+
lt_extension.add_method(
97+
f, "method_name",
98+
)
99+
100+
101+
def test_static_file_url(lt_extension, app, app_ctx):
102+
endpoint = "extensionstatic"
103+
static_view = lt_extension.views.get("static").get("view")
104+
static_view.endpoint = endpoint
105+
static_rule = lt_extension.views.get("static").get("rule")
106+
107+
assert static_view
108+
assert static_rule
109+
110+
app.add_url_rule(static_rule, view_func=static_view.as_view(endpoint))
111+
112+
with app_ctx.test_request_context():
113+
assert (
114+
"org.labthings.tests.extension/static/filename"
115+
in lt_extension.static_file_url("filename")
116+
)
117+
118+
119+
def test_static_file_url_no_endpoint(lt_extension, app, app_ctx):
120+
static_view = lt_extension.views.get("static").get("view")
121+
static_rule = lt_extension.views.get("static").get("rule")
122+
123+
assert static_view
124+
assert static_rule
125+
126+
app.add_url_rule(static_rule, view_func=static_view.as_view("index"))
127+
128+
with app_ctx.test_request_context():
129+
assert lt_extension.static_file_url("filename") is None
130+
131+
132+
def test_find_instances_in_module(lt_extension):
133+
mod = type(
134+
"mod",
135+
(object,),
136+
{"extension_instance": lt_extension, "another_object": object()},
137+
)
138+
assert extensions.find_instances_in_module(mod, extensions.BaseExtension) == [
139+
lt_extension
140+
]
141+
142+
143+
def test_find_extensions_in_file(extensions_path):
144+
test_file = os.path.join(extensions_path, "test_extension.py")
145+
146+
found_extensions = extensions.find_extensions_in_file(test_file)
147+
assert len(found_extensions) == 1
148+
assert found_extensions[0].name == "org.labthings.tests.extension"
149+
150+
151+
def test_find_extensions_in_file_explicit_list(extensions_path):
152+
test_file = os.path.join(extensions_path, "test_extension_explicit_list.py")
153+
154+
found_extensions = extensions.find_extensions_in_file(test_file)
155+
assert len(found_extensions) == 1
156+
assert found_extensions[0].name == "org.labthings.tests.extension"
157+
158+
159+
def test_find_extensions_in_file_exception(extensions_path):
160+
test_file = os.path.join(extensions_path, "test_extension_exception.py")
161+
162+
found_extensions = extensions.find_extensions_in_file(test_file)
163+
assert found_extensions == []
164+
165+
166+
def test_find_extensions(extensions_path):
167+
found_extensions = extensions.find_extensions(extensions_path)
168+
assert len(found_extensions) == 3

0 commit comments

Comments
 (0)