async def test_from_disk(tmp_path: pathlib.Path) -> None: path = tmp_path / "config.json" await concurrency.to_thread( path.write_text, '{"text_field": "value", ' '"numeric_field": 123}') config = await config_lib.Config.from_disk(path) assert config == config_lib.Config(text_field="value", numeric_field=123)
async def test_get(self) -> None: config = config_lib.Config(await asyncio.wait_for(services.get_config(), 5)) config["test"] = "test" r = await self.client.post("/config", json=config) self.assertEqual(r.status_code, 200) self.assertEqual((await asyncio.wait_for(services.get_config(), 5))["test"], "test")
async def test_write(tmp_path: pathlib.Path) -> None: path = tmp_path / "config.json" config = config_lib.Config(text_field="value", numeric_field=123) await config.write_to_disk(path) config_text = await concurrency.to_thread(path.read_text) assert (config_text == "{\n" ' "numeric_field": 123,\n' ' "text_field": "value"\n' "}")
async def test_save_path_loop(self) -> None: bad_link = pathlib.Path("bad_link") await concurrency.to_thread(bad_link.symlink_to, bad_link, target_is_directory=True) config = config_lib.Config(torrent_default_save_path=str(bad_link)) with self.assertRaises(config_lib.InvalidConfigError): await asyncio.wait_for(services.set_config(config), 5)
def create_isolated_config() -> config_lib.Config: return config_lib.Config( session_enable_dht=False, session_enable_lsd=False, session_enable_natpmp=False, session_enable_upnp=False, session_listen_interfaces="127.0.0.1:0", session_alert_mask=0, session_dht_bootstrap_nodes="", )
async def lifespan( chdir_tmp_path: pathlib.Path, lifecycle: Any) -> AsyncIterator[asgi_lifespan.LifespanManager]: config = config_lib.Config(public_enable=False, ) config.update( {f"session_{k}": v for k, v in get_isolated_settings().items()}) await config.write_to_disk(services.CONFIG_PATH) async with asgi_lifespan.LifespanManager(app_lib.APP, startup_timeout=None, shutdown_timeout=None) as manager: yield manager
async def test_success() -> None: config = config_lib.Config(new=True) receiver1 = Receiver() receiver2 = Receiver() async with config_lib.stage_config(config, receiver1.stage_config, receiver2.stage_config): pass assert receiver1.config == config assert receiver2.config == config
async def test_fail() -> None: config = config_lib.Config(new=True) good_receiver = Receiver() fail_receiver = FailReceiver() # fail_receiver should cause an exception to be raised with pytest.raises(DummyException): async with config_lib.stage_config(config, good_receiver.stage_config, fail_receiver.stage_config): pass # fail_receiver should prevent good_receiver from updating assert good_receiver.config == config_lib.Config() # Order should be independent with pytest.raises(DummyException): async with config_lib.stage_config(config, fail_receiver.stage_config, good_receiver.stage_config): pass assert good_receiver.config == config_lib.Config()
async def test_set_non_defaults(self) -> None: # Set all non-default configs config = config_lib.Config( torrent_default_save_path=self.tempdir.name, torrent_default_flags_apply_ip_filter=False, torrent_default_storage_mode="allocate", ) await asyncio.wait_for(services.set_config(config), 5) atp = await asyncio.wait_for(atp_services.get_default(), 5) self.assertEqual( pathlib.Path(atp.save_path).resolve(), pathlib.Path(self.tempdir.name).resolve(), ) self.assertEqual( atp.flags, lt.torrent_flags.default_flags & ~lt.torrent_flags.apply_ip_filter, ) self.assertEqual(atp.storage_mode, lt.storage_mode_t.storage_mode_allocate)
async def test_alert_mask_invalid_type(self) -> None: with self.assertRaises(config_lib.InvalidConfigError): session_lib.SessionService( config=config_lib.Config(session_alert_mask="invalid") )
def test_require_str() -> None: config = config_lib.Config(key="value") assert config.require_str("key") == "value"
def __init__(self) -> None: self.config = config_lib.Config()
def test_require_bool() -> None: config = config_lib.Config(key=True) assert config.require_bool("key") is True
def test_get_str() -> None: config = config_lib.Config(key="value") assert config.get_str("key") == "value"
def test_get_int() -> None: config = config_lib.Config(key=123) assert config.get_int("key") == 123
def test_get_bool_missing() -> None: config = config_lib.Config() assert config.get_bool("key") is None
def test_get_bool() -> None: config = config_lib.Config(key=True) assert config.get_bool("key") is True
async def test_setting_invalid_type(self) -> None: with self.assertRaises(config_lib.InvalidConfigError): session_lib.SessionService( config=config_lib.Config(session_cache_size="invalid") )
async def test_storage_mode_invalid(self) -> None: config = config_lib.Config(torrent_default_storage_mode="invalid") with self.assertRaises(config_lib.InvalidConfigError): await asyncio.wait_for(services.set_config(config), 5)
def test_get_bool_invalid() -> None: config = config_lib.Config(key=1) with pytest.raises(config_lib.InvalidConfigError): config.get_bool("key")
def test_require_int_invalid() -> None: config = config_lib.Config(key="not an int") with pytest.raises(config_lib.InvalidConfigError): config.require_int("key")
def test_require_int() -> None: config = config_lib.Config(key=123) assert config.require_int("key") == 123
async def test_flags_apply_ip_filter_null(self) -> None: config = config_lib.Config(torrent_default_flags_apply_ip_filter=None) with self.assertRaises(config_lib.InvalidConfigError): await asyncio.wait_for(services.set_config(config), 5)
def test_require_str_missing() -> None: config = config_lib.Config() with pytest.raises(config_lib.InvalidConfigError): config.require_str("key")
def test_require_str_invalid() -> None: config = config_lib.Config(key=123) with pytest.raises(config_lib.InvalidConfigError): config.require_str("key")
async def test_settings_base_invalid(self) -> None: with self.assertRaises(config_lib.InvalidConfigError): session_lib.SessionService( config=config_lib.Config(session_settings_base="invalid") )