def test_bad_arg_type(
    mandatory_env_args: List[EnvArg],
    monkeypatch: MonkeyPatch,
    set_vars: SetVarsFixture,
    bad_arg: EnvArg,
) -> None:
    set_vars(mandatory_env_args)
    monkeypatch.setenv(bad_arg.name, bad_arg.value)
    with pytest.raises(ConfigError, match=re.escape(bad_arg.name)):
        Settings()
def test_missing_mandatory_arg(
    mandatory_env_args: List[EnvArg],
    mandatory_env_args_keys: str,
    monkeypatch: MonkeyPatch,
    set_vars: SetVarsFixture,
) -> None:
    set_vars(mandatory_env_args)
    monkeypatch.delenv(mandatory_env_args_keys)
    with pytest.raises(ConfigError, match=re.escape(mandatory_env_args_keys)):
        Settings()
def test_overlapping_nodes(
    mandatory_env_args: List[EnvArg],
    monkeypatch: MonkeyPatch,
    overlapping_arg: EnvArg,
    set_vars: SetVarsFixture,
) -> None:
    set_vars(mandatory_env_args)
    monkeypatch.setenv(overlapping_arg.name, overlapping_arg.value)
    with pytest.raises(ConfigError, match="Same node ids found"):
        Settings()
def test_opc_cert_and_key(
    apply_args: List[str],
    expect_failure: bool,
    mandatory_env_args: List[EnvArg],
    monkeypatch: MonkeyPatch,
    set_vars: SetVarsFixture,
    tmp_path: Path,
) -> None:
    set_vars(mandatory_env_args)
    for arg in apply_args:
        file = tmp_path / arg.lower()
        file.touch()
        monkeypatch.setenv(arg, str(file))
    if expect_failure:
        with pytest.raises(
                ConfigError,
                match="Missing one of OPC_CERT_FILE/OPC_PRIVATE_KEY_FILE"):
            Settings()
    else:
        Settings()
def test_all_mandatory_args(
    mandatory_env_args: List[EnvArg],
    set_vars: SetVarsFixture,
) -> None:
    set_vars(mandatory_env_args)
    assert Settings() is not None
def test_help(mandatory_env_args: List[EnvArg],
              set_vars: SetVarsFixture) -> None:
    set_vars(mandatory_env_args)
    mandatory_names = [n for n, _ in mandatory_env_args]
    for env_var, help_text in Settings.help():
        assert (env_var in mandatory_names) != ("default:" in help_text)