test: add xUnit unit tests for core library

144 tests covering authentication (version parsing, session expiry, token
format validation), model deserialization from real PVE 8.x/9.x API JSON
fixtures, and service layer behavior. Includes TestHelper with mock
HttpMessageHandler factory and 21 JSON fixture files.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Clint Branham
2026-03-17 15:48:01 -05:00
parent c5d6cde6eb
commit c1a9dd5ca1
35 changed files with 1604 additions and 0 deletions
@@ -0,0 +1,125 @@
using Xunit;
using Newtonsoft.Json.Linq;
using PSProxmoxVE.Core.Models.Containers;
namespace PSProxmoxVE.Core.Tests.Models
{
public class ContainerModelTests
{
[Fact]
public void PveContainer_Deserialize_Pve9_ReturnsCorrectCount()
{
var json = TestHelper.LoadFixture("pve9_containers.json");
var data = JObject.Parse(json)["data"];
var containers = data.ToObject<PveContainer[]>();
Assert.NotNull(containers);
Assert.Equal(2, containers.Length);
}
[Fact]
public void PveContainer_Deserialize_Pve9_FirstContainer_HasCorrectVmId()
{
var json = TestHelper.LoadFixture("pve9_containers.json");
var data = JObject.Parse(json)["data"];
var containers = data.ToObject<PveContainer[]>();
Assert.NotNull(containers);
Assert.Equal(200, containers[0].VmId);
}
[Fact]
public void PveContainer_Deserialize_Pve9_FirstContainer_HasCorrectName()
{
var json = TestHelper.LoadFixture("pve9_containers.json");
var data = JObject.Parse(json)["data"];
var containers = data.ToObject<PveContainer[]>();
Assert.NotNull(containers);
Assert.Equal("ct-web", containers[0].Name);
}
[Fact]
public void PveContainer_Deserialize_Pve9_FirstContainer_HasCorrectStatus()
{
var json = TestHelper.LoadFixture("pve9_containers.json");
var data = JObject.Parse(json)["data"];
var containers = data.ToObject<PveContainer[]>();
Assert.NotNull(containers);
Assert.Equal("running", containers[0].Status);
}
[Fact]
public void PveContainer_Deserialize_Pve9_FirstContainer_HasCorrectNode()
{
var json = TestHelper.LoadFixture("pve9_containers.json");
var data = JObject.Parse(json)["data"];
var containers = data.ToObject<PveContainer[]>();
Assert.NotNull(containers);
Assert.Equal("pve1", containers[0].Node);
}
[Fact]
public void PveContainer_Deserialize_Pve9_FirstContainer_HasCorrectCpuAndMem()
{
var json = TestHelper.LoadFixture("pve9_containers.json");
var data = JObject.Parse(json)["data"];
var containers = data.ToObject<PveContainer[]>();
Assert.NotNull(containers);
Assert.Equal(2, containers[0].CpuCount);
Assert.Equal(2147483648L, containers[0].MaxMem);
}
[Fact]
public void PveContainer_Deserialize_Pve9_FirstContainer_HasSwapAndDisk()
{
var json = TestHelper.LoadFixture("pve9_containers.json");
var data = JObject.Parse(json)["data"];
var containers = data.ToObject<PveContainer[]>();
Assert.NotNull(containers);
Assert.Equal(536870912L, containers[0].MaxSwap);
Assert.Equal(8589934592L, containers[0].RootFsSize);
}
[Fact]
public void PveContainer_Deserialize_Pve9_FirstContainer_IsUnprivileged()
{
var json = TestHelper.LoadFixture("pve9_containers.json");
var data = JObject.Parse(json)["data"];
var containers = data.ToObject<PveContainer[]>();
Assert.NotNull(containers);
Assert.Equal(1, containers[0].Unprivileged);
}
[Fact]
public void PveContainer_Deserialize_Pve9_FirstContainer_HasOsType()
{
var json = TestHelper.LoadFixture("pve9_containers.json");
var data = JObject.Parse(json)["data"];
var containers = data.ToObject<PveContainer[]>();
Assert.NotNull(containers);
Assert.Equal("ubuntu", containers[0].OsType);
}
[Fact]
public void PveContainer_Deserialize_Pve9_SecondContainer_IsStopped()
{
var json = TestHelper.LoadFixture("pve9_containers.json");
var data = JObject.Parse(json)["data"];
var containers = data.ToObject<PveContainer[]>();
Assert.NotNull(containers);
Assert.Equal(201, containers[1].VmId);
Assert.Equal("stopped", containers[1].Status);
Assert.Equal(0L, containers[1].Uptime);
}
[Fact]
public void PveContainer_OptionalFields_NullWhenMissing()
{
var json = TestHelper.LoadFixture("pve9_containers.json");
var data = JObject.Parse(json)["data"];
var containers = data.ToObject<PveContainer[]>();
Assert.NotNull(containers);
// Tags field is only in the first container
Assert.Equal("web", containers[0].Tags);
Assert.Null(containers[1].Tags);
}
}
}