Refactor IPAM model classes to use records for Address, Subnetwork, Vlan, Vrf, Section, Tag, Domain, Nameserver, and Session; enhance documentation and implement value equality for records.

This commit is contained in:
2026-01-19 17:25:18 +03:00
parent 694822f0d6
commit f56784f2aa
44 changed files with 1601 additions and 1905 deletions

View File

@@ -27,9 +27,9 @@ public class RequestHelperTests : IDisposable
_mockHandler?.ForceDispose();
}
private void SetupSession(AuthType authType = AuthType.token)
private void SetupSession(AuthType authType = AuthType.Token)
{
if (authType == AuthType.token)
if (authType == AuthType.Token)
{
SessionManager.CreateSessionWithToken("https://ipam.example.com", "testapp", "test-token");
}
@@ -37,7 +37,7 @@ public class RequestHelperTests : IDisposable
{
// For credentials auth, we need to set up a session manually with future expiry
var session = new Session(
AuthType.credentials,
AuthType.Credentials,
"cred-token",
"testapp",
"https://ipam.example.com",
@@ -61,10 +61,10 @@ public class RequestHelperTests : IDisposable
// Arrange - no session set up
// Act
var action = async () => await RequestHelper.InvokeRequest("GET", controllers.addresses);
var action = async () => await RequestHelper.InvokeRequest("GET", ApiController.Addresses);
// Assert
await action.Should().ThrowAsync<Exception>().WithMessage("No session available!");
await action.Should().ThrowAsync<InvalidOperationException>().WithMessage("No session available!");
}
[Fact]
@@ -76,7 +76,7 @@ public class RequestHelperTests : IDisposable
handler.WithSuccessResponse("{\"id\":1,\"ip\":\"192.168.1.1\"}");
// Act
await RequestHelper.InvokeRequest("GET", controllers.addresses, types.Address, null, null, new[] { "1" });
await RequestHelper.InvokeRequest("GET", ApiController.Addresses, ModelType.Address, null, null, new[] { "1" });
// Assert
handler.LastRequest.Should().NotBeNull();
@@ -92,7 +92,7 @@ public class RequestHelperTests : IDisposable
handler.WithSuccessResponse("[]");
// Act
await RequestHelper.InvokeRequest("GET", controllers.subnets, null, subcontrollers.tags, null, new[] { "1" });
await RequestHelper.InvokeRequest("GET", ApiController.Subnets, null, ApiSubController.Tags, null, new[] { "1" });
// Assert
handler.LastRequest!.RequestUri!.ToString().Should().Contain("/subnets/tags/1/");
@@ -102,12 +102,12 @@ public class RequestHelperTests : IDisposable
public async Task InvokeRequest_WithTokenAuth_AddsPhpipamTokenHeader()
{
// Arrange
SetupSession(AuthType.token);
SetupSession(AuthType.Token);
var handler = SetupMockHandler();
handler.WithSuccessResponse("{}");
// Act
await RequestHelper.InvokeRequest("GET", controllers.addresses);
await RequestHelper.InvokeRequest("GET", ApiController.Addresses);
// Assert
handler.GetLastRequestHeader("phpipam-token").Should().Be("test-token");
@@ -117,12 +117,12 @@ public class RequestHelperTests : IDisposable
public async Task InvokeRequest_WithCredentialsAuth_AddsTokenHeader()
{
// Arrange
SetupSession(AuthType.credentials);
SetupSession(AuthType.Credentials);
var handler = SetupMockHandler();
handler.WithSuccessResponse("{}");
// Act
await RequestHelper.InvokeRequest("GET", controllers.addresses);
await RequestHelper.InvokeRequest("GET", ApiController.Addresses);
// Assert
handler.GetLastRequestHeader("token").Should().Be("cred-token");
@@ -137,7 +137,7 @@ public class RequestHelperTests : IDisposable
handler.WithSuccessResponse("{}");
// Act
await RequestHelper.InvokeRequest("GET", controllers.addresses);
await RequestHelper.InvokeRequest("GET", ApiController.Addresses);
// Assert
handler.LastRequest!.Method.Should().Be(HttpMethod.Get);
@@ -152,7 +152,7 @@ public class RequestHelperTests : IDisposable
handler.WithSuccessResponse("{\"id\":1}");
// Act
await RequestHelper.InvokeRequest("POST", controllers.addresses, null, null, new { ip = "10.0.0.1" });
await RequestHelper.InvokeRequest("POST", ApiController.Addresses, null, null, new { ip = "10.0.0.1" });
// Assert
handler.LastRequest!.Method.Should().Be(HttpMethod.Post);
@@ -167,7 +167,7 @@ public class RequestHelperTests : IDisposable
handler.WithSuccessResponse("{\"id\":1}");
// Act
await RequestHelper.InvokeRequest("PATCH", controllers.addresses, null, null, new { description = "updated" }, new[] { "1" });
await RequestHelper.InvokeRequest("PATCH", ApiController.Addresses, null, null, new { description = "updated" }, new[] { "1" });
// Assert
handler.LastRequest!.Method.Should().Be(new HttpMethod("PATCH"));
@@ -182,7 +182,7 @@ public class RequestHelperTests : IDisposable
handler.WithSuccessResponse("{}");
// Act
await RequestHelper.InvokeRequest("DELETE", controllers.addresses, null, null, null, new[] { "1" });
await RequestHelper.InvokeRequest("DELETE", ApiController.Addresses, null, null, null, new[] { "1" });
// Assert
handler.LastRequest!.Method.Should().Be(HttpMethod.Delete);
@@ -197,7 +197,7 @@ public class RequestHelperTests : IDisposable
handler.WithNotFoundResponse();
// Act
var result = await RequestHelper.InvokeRequest("GET", controllers.addresses, types.Address, null, null, new[] { "999" });
var result = await RequestHelper.InvokeRequest("GET", ApiController.Addresses, ModelType.Address, null, null, new[] { "999" });
// Assert
result.Should().BeNull();
@@ -212,7 +212,7 @@ public class RequestHelperTests : IDisposable
handler.WithErrorResponse(HttpStatusCode.InternalServerError, "Server error");
// Act
var action = async () => await RequestHelper.InvokeRequest("GET", controllers.addresses);
var action = async () => await RequestHelper.InvokeRequest("GET", ApiController.Addresses);
// Assert
await action.Should().ThrowAsync<HttpRequestException>();
@@ -249,7 +249,7 @@ public class RequestHelperTests : IDisposable
handler.WithSuccessResponse(addressJson);
// Act
var result = await RequestHelper.InvokeRequest("GET", controllers.addresses, types.Address, null, null, new[] { "1" });
var result = await RequestHelper.InvokeRequest("GET", ApiController.Addresses, ModelType.Address, null, null, new[] { "1" });
// Assert
result.Should().BeOfType<Address>();
@@ -272,7 +272,7 @@ public class RequestHelperTests : IDisposable
handler.WithSuccessResponse(addressArrayJson);
// Act
var result = await RequestHelper.InvokeRequest("GET", controllers.subnets, types.Address, null, null, new[] { "10", "addresses" });
var result = await RequestHelper.InvokeRequest("GET", ApiController.Subnets, ModelType.Address, null, null, new[] { "10", "addresses" });
// Assert
result.Should().BeAssignableTo<IEnumerable<object>>();
@@ -300,7 +300,7 @@ public class RequestHelperTests : IDisposable
handler.WithSuccessResponse(vlanJson);
// Act
var result = await RequestHelper.InvokeRequest("GET", controllers.vlan, types.Vlan, null, null, new[] { "100" });
var result = await RequestHelper.InvokeRequest("GET", ApiController.Vlan, ModelType.Vlan, null, null, new[] { "100" });
// Assert
result.Should().BeOfType<Vlan>();
@@ -351,14 +351,14 @@ public class RequestHelperTests : IDisposable
handler.WithSuccessResponse(subnetJson);
// Act
var result = await RequestHelper.InvokeRequest("GET", controllers.subnets, types.Subnetwork, null, null, new[] { "1" });
var result = await RequestHelper.InvokeRequest("GET", ApiController.Subnets, ModelType.Subnetwork, null, null, new[] { "1" });
// Assert
result.Should().BeOfType<Subnetwork>();
var subnet = (Subnetwork)result!;
subnet.Subnet.Should().Be("192.168.1.0");
subnet.Mask.Should().Be(24);
subnet.GetCIDR().Should().Be("192.168.1.0/24");
subnet.CIDR.Should().Be("192.168.1.0/24");
}
[Fact]
@@ -386,7 +386,7 @@ public class RequestHelperTests : IDisposable
handler.WithSuccessResponse(sectionJson);
// Act
var result = await RequestHelper.InvokeRequest("GET", controllers.sections, types.Section, null, null, new[] { "1" });
var result = await RequestHelper.InvokeRequest("GET", ApiController.Sections, ModelType.Section, null, null, new[] { "1" });
// Assert
result.Should().BeOfType<Section>();
@@ -411,12 +411,12 @@ public class RequestHelperTests : IDisposable
handler.WithSuccessResponse(addressJson);
// Act
var result = await RequestHelper.InvokeRequest("GET", controllers.addresses, types.Address, null, null, new[] { "1" });
var result = await RequestHelper.InvokeRequest("GET", ApiController.Addresses, ModelType.Address, null, null, new[] { "1" });
// Assert
var address = (Address)result!;
address.ExtendedData.Should().NotBeNull();
var extendedData = (Dictionary<string, object>)address.ExtendedData!;
var extendedData = address.ExtendedData!;
extendedData.Should().ContainKey("custom_environment");
extendedData.Should().ContainKey("custom_owner");
}
@@ -430,7 +430,7 @@ public class RequestHelperTests : IDisposable
handler.WithSuccessResponse(@"{""some"": ""data""}");
// Act
var result = await RequestHelper.InvokeRequest("GET", controllers.tools);
var result = await RequestHelper.InvokeRequest("GET", ApiController.Tools);
// Assert
result.Should().NotBeNull();
@@ -447,7 +447,7 @@ public class RequestHelperTests : IDisposable
var parameters = new { ip = "10.0.0.1", subnetId = 5, description = "New address" };
// Act
await RequestHelper.InvokeRequest("POST", controllers.addresses, null, null, parameters);
await RequestHelper.InvokeRequest("POST", ApiController.Addresses, null, null, parameters);
// Assert
handler.LastRequest!.Content.Should().NotBeNull();
@@ -465,7 +465,7 @@ public class RequestHelperTests : IDisposable
handler.WithSuccessResponse("{}");
// Act
await RequestHelper.InvokeRequest("GET", controllers.addresses);
await RequestHelper.InvokeRequest("GET", ApiController.Addresses);
// Assert
handler.LastRequest!.Headers.Accept.Should().Contain(h => h.MediaType == "application/json");
@@ -480,7 +480,7 @@ public class RequestHelperTests : IDisposable
handler.WithResponse(HttpStatusCode.OK, "", "application/json");
// Act
var result = await RequestHelper.InvokeRequest("GET", controllers.addresses);
var result = await RequestHelper.InvokeRequest("GET", ApiController.Addresses);
// Assert
result.Should().BeNull();
@@ -495,7 +495,7 @@ public class RequestHelperTests : IDisposable
handler.WithJsonResponse(@"{""code"": 200, ""success"": true, ""data"": null}");
// Act
var result = await RequestHelper.InvokeRequest("GET", controllers.addresses, types.Address);
var result = await RequestHelper.InvokeRequest("GET", ApiController.Addresses, ModelType.Address);
// Assert
result.Should().BeNull();

View File

@@ -21,60 +21,60 @@ public class SessionManagerTests : IDisposable
}
[Fact]
public void TestSession_WhenNoSession_ReturnsNoToken()
public void GetSessionStatus_WhenNoSession_ReturnsNoSession()
{
// Arrange
SessionManager.CurrentSession = null;
// Act
var result = SessionManager.TestSession();
var result = SessionManager.GetSessionStatus();
// Assert
result.Should().Be("NoToken");
result.Should().Be(SessionStatus.NoSession);
}
[Fact]
public void TestSession_WhenSessionWithNullExpires_ReturnsValid()
public void GetSessionStatus_WhenSessionWithNullExpires_ReturnsValid()
{
// Arrange
var session = new Session(AuthType.token, "test-token", "app", "https://test.com", null, null);
var session = new Session(AuthType.Token, "test-token", "app", "https://test.com", null, null);
SessionManager.CurrentSession = session;
// Act
var result = SessionManager.TestSession();
var result = SessionManager.GetSessionStatus();
// Assert
result.Should().Be("Valid");
result.Should().Be(SessionStatus.Valid);
}
[Fact]
public void TestSession_WhenSessionNotExpired_ReturnsValid()
public void GetSessionStatus_WhenSessionNotExpired_ReturnsValid()
{
// Arrange
var futureExpiry = DateTime.Now.AddHours(1);
var session = new Session(AuthType.credentials, "test-token", "app", "https://test.com", futureExpiry, null);
var session = new Session(AuthType.Credentials, "test-token", "app", "https://test.com", futureExpiry, null);
SessionManager.CurrentSession = session;
// Act
var result = SessionManager.TestSession();
var result = SessionManager.GetSessionStatus();
// Assert
result.Should().Be("Valid");
result.Should().Be(SessionStatus.Valid);
}
[Fact]
public void TestSession_WhenSessionExpired_ReturnsExpired()
public void GetSessionStatus_WhenSessionExpired_ReturnsExpired()
{
// Arrange
var pastExpiry = DateTime.Now.AddHours(-1);
var session = new Session(AuthType.credentials, "test-token", "app", "https://test.com", pastExpiry, null);
var session = new Session(AuthType.Credentials, "test-token", "app", "https://test.com", pastExpiry, null);
SessionManager.CurrentSession = session;
// Act
var result = SessionManager.TestSession();
var result = SessionManager.GetSessionStatus();
// Assert
result.Should().Be("Expired");
result.Should().Be(SessionStatus.Expired);
}
[Fact]
@@ -93,7 +93,7 @@ public class SessionManagerTests : IDisposable
session.URL.Should().Be(url);
session.AppID.Should().Be(appId);
session.Token.Should().Be(token);
session.AuthType.Should().Be(AuthType.token);
session.AuthType.Should().Be(AuthType.Token);
session.Expires.Should().BeNull();
session.Credentials.Should().BeNull();
}
@@ -144,7 +144,7 @@ public class SessionManagerTests : IDisposable
public void CurrentSession_CanBeSetDirectly()
{
// Arrange
var session = new Session(AuthType.token, "token", "app", "https://test.com", null, null);
var session = new Session(AuthType.Token, "token", "app", "https://test.com", null, null);
// Act
SessionManager.CurrentSession = session;