test(core): add config store and docker provider tests
This commit is contained in:
1 parent
c85751150a
commit
4fdbcc7417
2 files changed
+131
No files matched your search
@@ -0,0 +1,63 @@
|
||||
using Vantage.Core.Configuration;
|
||||
using Vantage.Core.Models;
|
||||
using Xunit;
|
||||
|
||||
namespace Vantage.Core.Tests.Configuration;
|
||||
|
||||
public class JsonConfigStoreTests : IDisposable
|
||||
{
|
||||
private readonly string tempDir = Path.Combine(Path.GetTempPath(), "vantage-tests-" + Guid.NewGuid().ToString("N"));
|
||||
|
||||
private string ConfigPath => Path.Combine(tempDir, "config.json");
|
||||
|
||||
[Fact]
|
||||
public async Task LoadAsync_MissingFileReturnsEmptyConfig()
|
||||
{
|
||||
var store = new JsonConfigStore(ConfigPath);
|
||||
var config = await store.LoadAsync();
|
||||
|
||||
Assert.Empty(config.Hosts);
|
||||
Assert.Empty(config.HealthChecks);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task SaveThenLoad_RoundTripsHostsAndChecks()
|
||||
{
|
||||
var store = new JsonConfigStore(ConfigPath);
|
||||
var original = new VantageConfig
|
||||
{
|
||||
RefreshIntervalSeconds = 9,
|
||||
Hosts = { new HostConfig { Name = "edge", Address = "10.0.0.1", Username = "root", AuthMethod = SshAuthMethod.PrivateKey } },
|
||||
HealthChecks = { new HealthCheckConfig { Name = "web", Kind = HealthKind.Http, Target = "https://x" } }
|
||||
};
|
||||
|
||||
await store.SaveAsync(original);
|
||||
var loaded = await store.LoadAsync();
|
||||
|
||||
Assert.Equal(9, loaded.RefreshIntervalSeconds);
|
||||
Assert.Single(loaded.Hosts);
|
||||
Assert.Equal("edge", loaded.Hosts[0].Name);
|
||||
Assert.Equal(SshAuthMethod.PrivateKey, loaded.Hosts[0].AuthMethod);
|
||||
Assert.Equal(HealthKind.Http, loaded.HealthChecks[0].Kind);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task SaveAsync_WritesEnumsAsStrings()
|
||||
{
|
||||
var store = new JsonConfigStore(ConfigPath);
|
||||
await store.SaveAsync(new VantageConfig
|
||||
{
|
||||
Hosts = { new HostConfig { AuthMethod = SshAuthMethod.PrivateKey } }
|
||||
});
|
||||
|
||||
var json = await File.ReadAllTextAsync(ConfigPath);
|
||||
Assert.Contains("privateKey", json);
|
||||
Assert.DoesNotContain("\"authMethod\": 0", json);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (Directory.Exists(tempDir))
|
||||
Directory.Delete(tempDir, recursive: true);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
using Vantage.Core.Docker;
|
||||
using Vantage.Core.Models;
|
||||
using Vantage.Core.Tests.Fakes;
|
||||
using Xunit;
|
||||
|
||||
namespace Vantage.Core.Tests.Docker;
|
||||
|
||||
public class DockerTests
|
||||
{
|
||||
private const string PsOutput =
|
||||
"c1a2\tcaddy\tcaddy:2\trunning\tUp 6 days\n" +
|
||||
"9f8e\tbackup\talpine:3.20\texited\tExited (0) 3 hours ago\n" +
|
||||
"aa11\tpaused-svc\tredis:7\tpaused\tUp 2 hours (Paused)\n";
|
||||
|
||||
[Fact]
|
||||
public void Parser_MapsFieldsAndStates()
|
||||
{
|
||||
var containers = DockerContainerParser.Parse(PsOutput);
|
||||
|
||||
Assert.Equal(3, containers.Count);
|
||||
Assert.Equal("caddy", containers[0].Name);
|
||||
Assert.Equal(ContainerState.Running, containers[0].State);
|
||||
Assert.True(containers[0].IsRunning);
|
||||
Assert.Equal(ContainerState.Exited, containers[1].State);
|
||||
Assert.Equal(ContainerState.Paused, containers[2].State);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task SshDockerProvider_ListParsesRunnerOutput()
|
||||
{
|
||||
var runner = new FakeSshCommandRunner(PsOutput);
|
||||
var provider = new SshDockerProvider(runner);
|
||||
|
||||
var containers = await provider.ListContainersAsync(new HostConfig(), CancellationToken.None);
|
||||
|
||||
Assert.Equal(3, containers.Count);
|
||||
Assert.Contains("docker ps -a", runner.Commands.Single());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task SshDockerProvider_ExecuteBuildsRestartCommand()
|
||||
{
|
||||
var runner = new FakeSshCommandRunner(_ => "");
|
||||
var provider = new SshDockerProvider(runner);
|
||||
|
||||
await provider.ExecuteAsync(new HostConfig(), DockerAction.Restart, "abc123", CancellationToken.None);
|
||||
|
||||
Assert.Equal("docker restart 'abc123'", runner.Commands.Single());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task MockDockerProvider_StopThenStartTransitionsState()
|
||||
{
|
||||
var provider = new MockDockerProvider();
|
||||
var host = new HostConfig { Id = "h1" };
|
||||
|
||||
var initial = await provider.ListContainersAsync(host, CancellationToken.None);
|
||||
var running = initial.First(c => c.IsRunning);
|
||||
|
||||
await provider.ExecuteAsync(host, DockerAction.Stop, running.Id, CancellationToken.None);
|
||||
var afterStop = await provider.ListContainersAsync(host, CancellationToken.None);
|
||||
Assert.Equal(ContainerState.Exited, afterStop.First(c => c.Id == running.Id).State);
|
||||
|
||||
await provider.ExecuteAsync(host, DockerAction.Start, running.Id, CancellationToken.None);
|
||||
var afterStart = await provider.ListContainersAsync(host, CancellationToken.None);
|
||||
Assert.Equal(ContainerState.Running, afterStart.First(c => c.Id == running.Id).State);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user