def test_precedence(self) -> None: class FakeSettings: config_override = {} config_user = {} config_system = {} ps = bs.PrioritizedSetting("foo", env_var="BOKEH_FOO", convert=int, default=0, dev_default=15) ps._parent = FakeSettings # 0. global default assert ps() == 0 # 1. local default assert ps(default=10) == 10 # 1.5. implicit default (DEV) with envset(BOKEH_DEV="yes"): assert ps() == 15 # 2. global config file FakeSettings.config_system['foo'] = 20 assert ps() == 20 assert ps(default=10) == 20 # 3. local config file FakeSettings.config_user['foo'] = 30 assert ps() == 30 assert ps(default=10) == 30 # 4. environment variable with envset(BOKEH_FOO="40"): assert ps() == 40 assert ps(default=10) == 40 # 5. override config file FakeSettings.config_override['foo'] = 50 assert ps() == 50 assert ps(default=10) == 50 # 6. previously user-set value ps.set_value(60) assert ps() == 60 assert ps(default=10) == 60 # 7. immediate values assert ps(70) == 70 assert ps(70, default=10) == 70
def test_envset_restores() -> None: if "foo" in os.environ: old_foo = os.environ["foo"] os.environ["foo"] = "123" with _tue.envset(foo="10"): pass assert os.environ["foo"] == "123" os.environ["foo"] = old_foo else: os.environ["foo"] = "123" with _tue.envset(foo="10"): pass assert os.environ["foo"] == "123" del os.environ["foo"]
def test_none_envvar(self) -> None: with envset(BOKEH_ICO_PATH="none"): with run_bokeh_serve(["--port", "0", "--glob", APPS]) as (p, nbsr): port = check_port(nbsr) assert port > 0 r = requests.get(f"http://localhost:{port}/favicon.ico") assert r.status_code == 404
def test_dev_resources(ManagedServerLoop: MSL) -> None: with envset(BOKEH_DEV="yes"): application = Application() with ManagedServerLoop(application) as server: r = server._tornado.resources() assert r.mode == "absolute" assert r.dev
def test_with_Server_resources_dev(self) -> None: from latex_label import LatexLabel plot = Plot() plot.add_layout(LatexLabel()) with envset(BOKEH_RESOURCES="server", BOKEH_DEV="true"): bundle = beb.bundle_for_objs_and_resources([plot], "server") assert len(bundle.js_files) == 2 assert bundle.js_files[1] == "http://localhost:5006/static/extensions/latex_label/latex_label.js"
def test_missing_sysrandom_with_secret_key( self, _mock_sysrandom: MagicMock) -> None: with envset(BOKEH_SECRET_KEY="foo"): with pytest.warns(UserWarning) as warns: random, using_sysrandom = _get_sysrandom() assert not using_sysrandom assert len(warns) == 1 assert warns[0].message.args[0] == _MERSENNE_MSG
def test_explicit_envvar(self) -> None: with envset(BOKEH_ICO_PATH=join(HERE, "favicon-dev.ico")): with run_bokeh_serve(["--port", "0", "--glob", APPS]) as (p, nbsr): port = check_port(nbsr) assert port > 0 r = requests.get(f"http://localhost:{port}/favicon.ico") assert r.status_code == 200 assert r.headers["content-type"] == "image/x-icon" assert r.content == open( join(HERE, "favicon-dev.ico"), "rb").read()
def test_dev_default(self) -> None: ps = bs.PrioritizedSetting("foo", env_var="BOKEH_FOO", default=10, dev_default=25) assert ps.dev_default == 25 with envset(BOKEH_DEV="yes"): assert ps() == 25 assert ps(default=20) == 25
def test_env_vars_precedence(self) -> None: b = beb.bundle_for_objs_and_resources([], INLINE) assert all('localhost' not in x for x in b.js_files) # this is a cheap test that a BokehJS file is inline assert any(len(x) > 5000 for x in b.js_raw) with envset(BOKEH_RESOURCES="server-dev"): b = beb.bundle_for_objs_and_resources([], INLINE) assert any('localhost' in x for x in b.js_files) # this is a cheap test that a BokehJS file is NOT inline assert all(len(x) < 5000 for x in b.js_raw) with envset(BOKEH_RESOURCES="cdn"): b = beb.bundle_for_objs_and_resources([], INLINE) assert any('cdn' in x for x in b.js_files) # this is a cheap test that a BokehJS file is NOT inline assert all(len(x) < 5000 for x in b.js_raw)
def test_xsrf_printed_envar() -> None: pat = re.compile(r'XSRF cookie protection enabled') m = None with envset(BOKEH_XSRF_COOKIES="yes"): with run_bokeh_serve(["--enable-xsrf-cookies"]) as p: nbsr = NBSR(p.stdout) m = None for i in range(20): o = nbsr.readline(0.5) if not o: continue m = pat.search(o.decode()) if m is not None: break if m is None: pytest.fail("no matching log line in process output")
async def test_allow_websocket_origin(self, ManagedServerLoop: MSL) -> None: application = Application() # allow good local origin with random port with ManagedServerLoop(application, port=0) as server: await self.check_http_ok_socket_ok(server, origin="http://localhost:%s" % server.port) # allow good origin with ManagedServerLoop(application, allow_websocket_origin=["example.com" ]) as server: await self.check_http_ok_socket_ok(server, origin="http://example.com:80") # allow good origin from environment variable with ManagedServerLoop(application) as server: with envset(BOKEH_ALLOW_WS_ORIGIN="example.com"): await self.check_http_ok_socket_ok( server, origin="http://example.com:80") # allow good origin with port with ManagedServerLoop(application, allow_websocket_origin=["example.com:8080" ]) as server: await self.check_http_ok_socket_ok( server, origin="http://example.com:8080") # allow good origin with port from environment variable with ManagedServerLoop(application) as server: with envset(BOKEH_ALLOW_WS_ORIGIN="example.com:8080"): await self.check_http_ok_socket_ok( server, origin="http://example.com:8080") # allow good origin header with an implicit 80 with ManagedServerLoop(application, allow_websocket_origin=["example.com" ]) as server: await self.check_http_ok_socket_ok(server, origin="http://example.com") # allow good origin header with an implicit 80 with ManagedServerLoop(application) as server: with envset(BOKEH_ALLOW_WS_ORIGIN="example.com"): await self.check_http_ok_socket_ok(server, origin="http://example.com") # block non-Host origins by default even if no extra origins specified with ManagedServerLoop(application) as server: await self.check_http_ok_socket_blocked( server, origin="http://example.com:80") # block on a garbage Origin header with ManagedServerLoop(application) as server: await self.check_http_ok_socket_blocked( server, origin="hsdf:::///%#^$#:8080") # block bad origin with ManagedServerLoop(application, allow_websocket_origin=["example.com" ]) as server: await self.check_http_ok_socket_blocked( server, origin="http://foobar.com:80") # block bad origin from environment variable with ManagedServerLoop(application) as server: with envset(BOKEH_ALLOW_WS_ORIGIN="example.com"): await self.check_http_ok_socket_blocked( server, origin="http://foobar.com:80") # block bad origin port with ManagedServerLoop(application, allow_websocket_origin=["example.com:8080" ]) as server: await self.check_http_ok_socket_blocked( server, origin="http://example.com:8081") # block bad origin port from environment variable with ManagedServerLoop(application) as server: with envset(BOKEH_ALLOW_WS_ORIGIN="example.com:8080"): await self.check_http_ok_socket_blocked( server, origin="http://example.com:8081")
def test_envset_accepts_items() -> None: with _tue.envset([(UNLIKELY_KEY1, "10"), (UNLIKELY_KEY2, "20")]): assert os.environ[UNLIKELY_KEY1] == "10" assert os.environ[UNLIKELY_KEY2] == "20" assert UNLIKELY_KEY1 not in os.environ assert UNLIKELY_KEY2 not in os.environ
def test_envset_accepts_kwargs() -> None: with _tue.envset(**{UNLIKELY_KEY1: "10", UNLIKELY_KEY2: "20"}): assert os.environ[UNLIKELY_KEY1] == "10" assert os.environ[UNLIKELY_KEY2] == "20" assert UNLIKELY_KEY1 not in os.environ assert UNLIKELY_KEY2 not in os.environ
def test_envset_accepts_mix() -> None: with _tue.envset([(UNLIKELY_KEY1, "10")], **{UNLIKELY_KEY2: "20"}): assert os.environ[UNLIKELY_KEY1] == "10" assert os.environ[UNLIKELY_KEY2] == "20" assert UNLIKELY_KEY1 not in os.environ assert UNLIKELY_KEY2 not in os.environ
def test_envset_applies_kwargs_last() -> None: with _tue.envset([(UNLIKELY_KEY1, "10")], **{UNLIKELY_KEY1: "30", UNLIKELY_KEY2: "20"}): assert os.environ[UNLIKELY_KEY1] == "30" assert os.environ[UNLIKELY_KEY2] == "20" assert UNLIKELY_KEY1 not in os.environ assert UNLIKELY_KEY2 not in os.environ
def test_printed_envar(self) -> None: pat = re.compile(r'XSRF cookie protection enabled') with envset(BOKEH_XSRF_COOKIES="yes"): with run_bokeh_serve(["--enable-xsrf-cookies"]) as (p, nbsr): assert_pattern(nbsr, pat)
def test_get_browser_controller_value_with_env(mock_get: MagicMock) -> None: with envset(BOKEH_BROWSER="bar"): bub.get_browser_controller('foo') assert mock_get.called assert mock_get.call_args[0] == ("foo", ) assert mock_get.call_args[1] == {}
def test_simple_ids_yes(self) -> None: bus._simple_id = 999 with envset(BOKEH_SIMPLE_IDS="yes"): assert bus.make_id() == "1000" assert bus.make_id() == "1001" assert bus.make_id() == "1002"
def test_env_var(self) -> None: with envset(BOKEH_FOO="30"): ps = bs.PrioritizedSetting("foo", env_var="BOKEH_FOO") assert ps.env_var == "BOKEH_FOO" assert ps() == "30" assert ps(default=20) == "30"
def test_env_resources(ManagedServerLoop: MSL) -> None: with envset(BOKEH_RESOURCES="cdn"): application = Application() with ManagedServerLoop(application) as server: r = server._tornado.resources() assert r.mode == "cdn"
def test_env_var_converts(self) -> None: with envset(BOKEH_FOO="30"): ps = bs.PrioritizedSetting("foo", convert=int, env_var="BOKEH_FOO") assert ps() == 30
def test_get_browser_controller_dummy_with_env(mock_get: MagicMock) -> None: with envset(BOKEH_BROWSER="bar"): bub.get_browser_controller('none')
def test_simple_ids_no(self) -> None: with envset(BOKEH_SIMPLE_IDS="no"): assert len(bus.make_id()) == 36 assert isinstance(bus.make_id(), str)
def test_envset_preserves_id() -> None: env = os.environ with _tue.envset(foo="10"): assert os.environ is env assert os.environ is env