Forge
csharp3407750f
1namespace AgentForge.Mcp.Tests;
2
3using AgentForge.Mcp;
4
5public sealed class ForgeMcpConfigLoaderTests
6{
7 [Fact]
8 public void Load_uses_toml_when_no_env()
9 {
10 var path = WriteToml(
11 """
12 version = 1
13
14 [forge]
15 base_url = "http://forge.test:9000"
16
17 [identity]
18 actor = "oar:TestAgent"
19 api_token = "forge_test_token"
20 """);
21
22 using var env = EnvScope.Empty("FORGE_BASE_URL", "FORGE_API_TOKEN", "FORGE_ACTOR");
23 var result = ForgeMcpConfigLoader.Load(["--config", path]);
24
25 Assert.True(result.IsSuccess);
26 Assert.Equal("http://forge.test:9000/", result.Settings!.BaseUri.ToString());
27 Assert.Equal("forge_test_token", result.Settings.ApiToken);
28 Assert.Equal("oar:TestAgent", result.Settings.Actor);
29 }
30
31 [Fact]
32 public void Load_env_overrides_toml()
33 {
34 var path = WriteToml(
35 """
36 version = 1
37 [forge]
38 base_url = "http://forge.test:9000"
39 [identity]
40 actor = "oar:FromToml"
41 """);
42
43 using var env = EnvScope.Set(
44 ("FORGE_BASE_URL", "http://override.test:8770"),
45 ("FORGE_ACTOR", "oar:FromEnv"));
46
47 var result = ForgeMcpConfigLoader.Load(["--config", path]);
48
49 Assert.True(result.IsSuccess);
50 Assert.Equal("http://override.test:8770/", result.Settings!.BaseUri.ToString());
51 Assert.Equal("oar:FromEnv", result.Settings.Actor);
52 }
53
54 [Fact]
55 public void Load_without_config_falls_back_to_env_and_default_url()
56 {
57 using var env = EnvScope.Set(("FORGE_ACTOR", "oar:Solo"));
58 var result = ForgeMcpConfigLoader.Load([]);
59
60 Assert.True(result.IsSuccess);
61 Assert.Equal(ForgeMcpSettings.DefaultBaseUrl + "/", result.Settings!.BaseUri.ToString());
62 Assert.Equal("oar:Solo", result.Settings.Actor);
63 }
64
65 [Fact]
66 public void Load_fails_when_config_missing()
67 {
68 var result = ForgeMcpConfigLoader.Load(["--config", Path.Combine(Path.GetTempPath(), $"missing-{Guid.NewGuid():N}.toml")]);
69 Assert.False(result.IsSuccess);
70 Assert.Contains("not found", result.Error, StringComparison.OrdinalIgnoreCase);
71 }
72
73 private static string WriteToml(string content)
74 {
75 var path = Path.Combine(Path.GetTempPath(), $"forge-mcp-test-{Guid.NewGuid():N}.toml");
76 File.WriteAllText(path, content);
77 return path;
78 }
79
80 private sealed class EnvScope : IDisposable
81 {
82 private readonly Dictionary<string, string?> _previous = [];
83
84 private EnvScope()
85 {
86 }
87
88 public static EnvScope Empty(params string[] names)
89 {
90 var scope = new EnvScope();
91 foreach (var name in names)
92 scope.Save(name, null);
93 return scope;
94 }
95
96 public static EnvScope Set(params (string Name, string? Value)[] values)
97 {
98 var scope = new EnvScope();
99 foreach (var (name, value) in values)
100 scope.Save(name, value);
101 return scope;
102 }
103
104 private void Save(string name, string? value)
105 {
106 _previous[name] = Environment.GetEnvironmentVariable(name);
107 Environment.SetEnvironmentVariable(name, value);
108 }
109
110 public void Dispose()
111 {
112 foreach (var (name, value) in _previous)
113 Environment.SetEnvironmentVariable(name, value);
114 }
115 }
116}
117
View only · write via MCP/CIDE