Skip to content

Commit 3ee67e1

Browse files
committed
Add test file for config validation
1 parent a1f1c5e commit 3ee67e1

File tree

1 file changed

+166
-0
lines changed

1 file changed

+166
-0
lines changed

tests/test_config_schema.py

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
"""
2+
Unit test functions to test JSON Schema validation
3+
"""
4+
5+
import pytest
6+
7+
from tljh import config
8+
9+
10+
@pytest.mark.parametrize(
11+
"valid_config",
12+
[
13+
# Valid configuration with JupyterLab as default app and HTTPS enabled with Let's Encrypt
14+
{
15+
"user_environment": {"default_app": "jupyterlab"},
16+
"https": {
17+
"enabled": True,
18+
"letsencrypt": {
19+
"email": "[email protected]",
20+
"domains": ["example.com"],
21+
},
22+
},
23+
},
24+
# Valid configuration with classic notebook UI
25+
{"user_environment": {"default_app": "classic"}, "https": {"enabled": False}},
26+
# Valid configuration with culling service enabled
27+
{
28+
"user_environment": {"default_app": "jupyterlab"},
29+
"https": {"enabled": False},
30+
"services": {
31+
"cull": {
32+
"enabled": True,
33+
"timeout": 3600,
34+
"every": 600,
35+
"concurrency": 5,
36+
"users": True,
37+
"max_age": 86400,
38+
"remove_named_servers": False,
39+
}
40+
},
41+
},
42+
# Valid configuration of resource limits
43+
{
44+
"user_environment": {"default_app": "jupyterlab"},
45+
"https": {"enabled": False},
46+
"limits": {"memory": "2G", "cpu": 1.5},
47+
},
48+
# Valid configuration with TLS certificates instead of Let's Encrypt
49+
{
50+
"user_environment": {"default_app": "jupyterlab"},
51+
"https": {
52+
"enabled": True,
53+
"tls": {
54+
"key": "/etc/tljh/tls/private.key",
55+
"cert": "/etc/tljh/tls/certificate.crt",
56+
},
57+
},
58+
},
59+
# Valid configuration with TLS and custom HTTPS address/port
60+
{
61+
"user_environment": {"default_app": "jupyterlab"},
62+
"https": {
63+
"enabled": True,
64+
"address": "192.168.1.1",
65+
"port": 443,
66+
"tls": {
67+
"key": "/etc/tljh/tls/private.key",
68+
"cert": "/etc/tljh/tls/certificate.crt",
69+
},
70+
},
71+
},
72+
],
73+
)
74+
def test_valid_configs(valid_config):
75+
"""Test that known good configs pass validation without errors."""
76+
try:
77+
config.validate_config(valid_config, validate=True)
78+
except Exception as e:
79+
pytest.fail(f"Valid config failed validation: {e}")
80+
81+
82+
@pytest.mark.parametrize(
83+
"invalid_config",
84+
[
85+
# Invalid default_app value
86+
{
87+
"user_environment": {"default_app": "saturnlab"},
88+
"https": {
89+
"enabled": True,
90+
"letsencrypt": {
91+
"email": "[email protected]",
92+
"domains": ["sub.example.com"],
93+
},
94+
},
95+
},
96+
# Invalid domains type (should be array)
97+
{
98+
"user_environment": {"default_app": "jupyterlab"},
99+
"https": {
100+
"enabled": True,
101+
"letsencrypt": {"email": "not-an-email", "domains": "example.com"},
102+
},
103+
},
104+
# Extra unexpected property
105+
{
106+
"user_environment": {"default_app": "jupyterlab"},
107+
"https": {
108+
"enabled": True,
109+
"letsencrypt": {
110+
"email": "[email protected]",
111+
"domains": ["example.com"],
112+
"extra_property": "invalid",
113+
},
114+
},
115+
},
116+
# Invalid culling service config (timeout should be an integer)
117+
{
118+
"user_environment": {"default_app": "jupyterlab"},
119+
"https": {"enabled": False},
120+
"services": {
121+
"cull": {
122+
"enabled": True,
123+
"timeout": "one hour",
124+
"every": 600,
125+
"concurrency": 5,
126+
"users": True,
127+
"max_age": 86400,
128+
"remove_named_servers": False,
129+
}
130+
},
131+
},
132+
# Invalid resource limits (negative CPU value)
133+
{
134+
"user_environment": {"default_app": "jupyterlab"},
135+
"https": {"enabled": False},
136+
"limits": {"memory": "2G", "cpu": -1}, # Negative CPU not allowed
137+
},
138+
# TLS enabled but missing required key
139+
{
140+
"user_environment": {"default_app": "jupyterlab"},
141+
"https": {
142+
"enabled": True,
143+
"tls": {
144+
"cert": "/etc/tljh/tls/certificate.crt"
145+
# Missing 'key' field
146+
},
147+
},
148+
},
149+
{
150+
"user_environment": {"default_app": "jupyterlab"},
151+
"https": {
152+
"enabled": True,
153+
"tls": {
154+
"key": "/etc/tljh/tls/private.key"
155+
# Missing 'cert' field
156+
},
157+
},
158+
},
159+
],
160+
)
161+
def test_invalid_configs(invalid_config):
162+
"""Test that known bad configs raise validation errors."""
163+
with pytest.raises(SystemExit) as exc_info:
164+
config.validate_config(invalid_config, validate=True)
165+
166+
assert exc_info.value.code == 1

0 commit comments

Comments
 (0)