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:
@@ -109,6 +109,13 @@ public class GetAddressCmdletTests : IDisposable
|
||||
cmdlet.SubnetCIDR.Should().Be("192.168.1.0/24");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetAddressCmdlet_InheritsFromBaseCmdlet()
|
||||
{
|
||||
var cmdlet = new GetAddressCmdlet();
|
||||
cmdlet.Should().BeAssignableTo<BaseCmdlet>();
|
||||
}
|
||||
|
||||
// Test the underlying RequestHelper functionality that the cmdlet uses
|
||||
|
||||
[Fact]
|
||||
@@ -129,8 +136,8 @@ public class GetAddressCmdletTests : IDisposable
|
||||
// Act
|
||||
var result = await RequestHelper.InvokeRequest(
|
||||
"GET",
|
||||
controllers.addresses,
|
||||
types.Address,
|
||||
ApiController.Addresses,
|
||||
ModelType.Address,
|
||||
null,
|
||||
null,
|
||||
new[] { "1" }
|
||||
@@ -155,8 +162,8 @@ public class GetAddressCmdletTests : IDisposable
|
||||
// Act
|
||||
await RequestHelper.InvokeRequest(
|
||||
"GET",
|
||||
controllers.addresses,
|
||||
types.Address,
|
||||
ApiController.Addresses,
|
||||
ModelType.Address,
|
||||
null,
|
||||
null,
|
||||
new[] { "42" }
|
||||
@@ -177,8 +184,8 @@ public class GetAddressCmdletTests : IDisposable
|
||||
// Act
|
||||
await RequestHelper.InvokeRequest(
|
||||
"GET",
|
||||
controllers.addresses,
|
||||
types.Address,
|
||||
ApiController.Addresses,
|
||||
ModelType.Address,
|
||||
null,
|
||||
null,
|
||||
new[] { "search", "192.168.1.50" }
|
||||
@@ -199,8 +206,8 @@ public class GetAddressCmdletTests : IDisposable
|
||||
// Act
|
||||
await RequestHelper.InvokeRequest(
|
||||
"GET",
|
||||
controllers.addresses,
|
||||
types.Address,
|
||||
ApiController.Addresses,
|
||||
ModelType.Address,
|
||||
null,
|
||||
null,
|
||||
new[] { "search_hostname", "myserver.example.com" }
|
||||
@@ -221,8 +228,8 @@ public class GetAddressCmdletTests : IDisposable
|
||||
// Act
|
||||
await RequestHelper.InvokeRequest(
|
||||
"GET",
|
||||
controllers.subnets,
|
||||
types.Address,
|
||||
ApiController.Subnets,
|
||||
ModelType.Address,
|
||||
null,
|
||||
null,
|
||||
new[] { "10", "addresses" }
|
||||
@@ -243,8 +250,8 @@ public class GetAddressCmdletTests : IDisposable
|
||||
// Act
|
||||
await RequestHelper.InvokeRequest(
|
||||
"GET",
|
||||
controllers.addresses,
|
||||
types.Address,
|
||||
ApiController.Addresses,
|
||||
ModelType.Address,
|
||||
null,
|
||||
null,
|
||||
new[] { "tags", "2", "addresses" }
|
||||
@@ -269,8 +276,8 @@ public class GetAddressCmdletTests : IDisposable
|
||||
// Act
|
||||
var result = await RequestHelper.InvokeRequest(
|
||||
"GET",
|
||||
controllers.subnets,
|
||||
types.Address,
|
||||
ApiController.Subnets,
|
||||
ModelType.Address,
|
||||
null,
|
||||
null,
|
||||
new[] { "10", "addresses" }
|
||||
@@ -294,8 +301,8 @@ public class GetAddressCmdletTests : IDisposable
|
||||
// Act
|
||||
var result = await RequestHelper.InvokeRequest(
|
||||
"GET",
|
||||
controllers.addresses,
|
||||
types.Address,
|
||||
ApiController.Addresses,
|
||||
ModelType.Address,
|
||||
null,
|
||||
null,
|
||||
new[] { "999" }
|
||||
@@ -313,11 +320,11 @@ public class GetAddressCmdletTests : IDisposable
|
||||
// Act
|
||||
var action = async () => await RequestHelper.InvokeRequest(
|
||||
"GET",
|
||||
controllers.addresses,
|
||||
types.Address
|
||||
ApiController.Addresses,
|
||||
ModelType.Address
|
||||
);
|
||||
|
||||
// Assert
|
||||
await action.Should().ThrowAsync<Exception>().WithMessage("No session available!");
|
||||
await action.Should().ThrowAsync<InvalidOperationException>().WithMessage("No session available!");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,11 +93,18 @@ public class NewSessionCmdletTests : IDisposable
|
||||
session.URL.Should().Be("https://ipam.example.com");
|
||||
session.AppID.Should().Be("testapp");
|
||||
session.Token.Should().Be("my-api-token");
|
||||
session.AuthType.Should().Be(AuthType.token);
|
||||
session.AuthType.Should().Be(AuthType.Token);
|
||||
session.Expires.Should().BeNull();
|
||||
session.Credentials.Should().BeNull();
|
||||
|
||||
// Verify it was set as current session
|
||||
SessionManager.CurrentSession.Should().BeSameAs(session);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void NewSessionCmdlet_InheritsFromBaseCmdlet()
|
||||
{
|
||||
var cmdlet = new NewSessionCmdlet();
|
||||
cmdlet.Should().BeAssignableTo<BaseCmdlet>();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -55,7 +55,7 @@ public class AddressTests
|
||||
address.Note.Should().Be(note);
|
||||
address.LastSeen.Should().Be(lastSeen);
|
||||
address.ExcludePing.Should().Be(excludePing);
|
||||
address.PTRignore.Should().Be(ptrIgnore);
|
||||
address.PTRIgnore.Should().Be(ptrIgnore);
|
||||
address.PTR.Should().Be(ptr);
|
||||
address.FirewallAddressObject.Should().Be(firewallObject);
|
||||
address.EditDate.Should().Be(editDate);
|
||||
@@ -113,4 +113,24 @@ public class AddressTests
|
||||
// Act & Assert
|
||||
address.ToString().Should().Be(expectedIp);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Record_Equality_WorksCorrectly()
|
||||
{
|
||||
// Arrange
|
||||
var address1 = new Address(
|
||||
1, 10, "192.168.1.1", false, "Test", "host", "", "",
|
||||
0, 0, "", "", "", null, false,
|
||||
false, 0, "", null, 0, null
|
||||
);
|
||||
|
||||
var address2 = new Address(
|
||||
1, 10, "192.168.1.1", false, "Test", "host", "", "",
|
||||
0, 0, "", "", "", null, false,
|
||||
false, 0, "", null, 0, null
|
||||
);
|
||||
|
||||
// Assert
|
||||
address1.Should().Be(address2);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ public class NameserverTests
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Constructor_WithEmptyNameservers_ReturnsArrayWithEmptyString()
|
||||
public void Constructor_WithEmptyNameservers_ReturnsEmptyArray()
|
||||
{
|
||||
// Arrange
|
||||
var nameServersString = "";
|
||||
@@ -65,9 +65,8 @@ public class NameserverTests
|
||||
// Act
|
||||
var nameserver = new Nameserver(1, "Test", nameServersString, "", "", null);
|
||||
|
||||
// Assert
|
||||
nameserver.NameServers.Should().HaveCount(1);
|
||||
nameserver.NameServers[0].Should().BeEmpty();
|
||||
// Assert - Empty entries are excluded
|
||||
nameserver.NameServers.Should().BeEmpty();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -79,4 +78,27 @@ public class NameserverTests
|
||||
// Assert
|
||||
nameserver.EditDate.Should().BeNull();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Constructor_WithSemicolonOnlyString_ReturnsEmptyArray()
|
||||
{
|
||||
// Arrange - edge case with just semicolons
|
||||
var nameServersString = ";;;";
|
||||
|
||||
// Act
|
||||
var nameserver = new Nameserver(1, "Test", nameServersString, "", "", null);
|
||||
|
||||
// Assert
|
||||
nameserver.NameServers.Should().BeEmpty();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ToString_ReturnsName()
|
||||
{
|
||||
// Arrange
|
||||
var nameserver = new Nameserver(1, "Google DNS", "8.8.8.8", "", "", null);
|
||||
|
||||
// Act & Assert
|
||||
nameserver.ToString().Should().Be("Google DNS");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ public class SessionTests
|
||||
public void Constructor_WithCredentialsAuth_SetsAllProperties()
|
||||
{
|
||||
// Arrange
|
||||
var authType = AuthType.credentials;
|
||||
var authType = AuthType.Credentials;
|
||||
var token = "test-token-123";
|
||||
var appId = "myApp";
|
||||
var url = "https://ipam.example.com";
|
||||
@@ -21,7 +21,7 @@ public class SessionTests
|
||||
var session = new Session(authType, token, appId, url, expires, credentials);
|
||||
|
||||
// Assert
|
||||
session.AuthType.Should().Be(AuthType.credentials);
|
||||
session.AuthType.Should().Be(AuthType.Credentials);
|
||||
session.Token.Should().Be(token);
|
||||
session.AppID.Should().Be(appId);
|
||||
session.URL.Should().Be(url);
|
||||
@@ -33,7 +33,7 @@ public class SessionTests
|
||||
public void Constructor_WithTokenAuth_SetsAllProperties()
|
||||
{
|
||||
// Arrange
|
||||
var authType = AuthType.token;
|
||||
var authType = AuthType.Token;
|
||||
var token = "static-api-token";
|
||||
var appId = "apiApp";
|
||||
var url = "https://ipam.test.com";
|
||||
@@ -42,7 +42,7 @@ public class SessionTests
|
||||
var session = new Session(authType, token, appId, url, null, null);
|
||||
|
||||
// Assert
|
||||
session.AuthType.Should().Be(AuthType.token);
|
||||
session.AuthType.Should().Be(AuthType.Token);
|
||||
session.Token.Should().Be(token);
|
||||
session.AppID.Should().Be(appId);
|
||||
session.URL.Should().Be(url);
|
||||
@@ -54,7 +54,7 @@ public class SessionTests
|
||||
public void Token_CanBeModified()
|
||||
{
|
||||
// Arrange
|
||||
var session = new Session(AuthType.credentials, "old-token", "app", "https://test.com", null, null);
|
||||
var session = new Session(AuthType.Credentials, "old-token", "app", "https://test.com", null, null);
|
||||
|
||||
// Act
|
||||
session.Token = "new-token";
|
||||
@@ -67,7 +67,7 @@ public class SessionTests
|
||||
public void Expires_CanBeModified()
|
||||
{
|
||||
// Arrange
|
||||
var session = new Session(AuthType.credentials, "token", "app", "https://test.com", null, null);
|
||||
var session = new Session(AuthType.Credentials, "token", "app", "https://test.com", null, null);
|
||||
var newExpiry = new DateTime(2027, 1, 1);
|
||||
|
||||
// Act
|
||||
@@ -78,15 +78,13 @@ public class SessionTests
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ToString_ReturnsDefaultObjectString()
|
||||
public void Record_Equality_WorksForSameValues()
|
||||
{
|
||||
// Arrange
|
||||
var session = new Session(AuthType.token, "token", "app", "https://test.com", null, null);
|
||||
var session1 = new Session(AuthType.Token, "token", "app", "https://test.com", null, null);
|
||||
var session2 = new Session(AuthType.Token, "token", "app", "https://test.com", null, null);
|
||||
|
||||
// Act
|
||||
var result = session.ToString();
|
||||
|
||||
// Assert
|
||||
result.Should().Contain("PS.IPAM.Session");
|
||||
// Assert - Records use value equality
|
||||
session1.Should().Be(session2);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,13 +93,13 @@ public class SubnetworkTests
|
||||
[InlineData("10.0.0.0", 8, "10.0.0.0/8")]
|
||||
[InlineData("172.16.0.0", 16, "172.16.0.0/16")]
|
||||
[InlineData("192.168.100.0", 30, "192.168.100.0/30")]
|
||||
public void GetCIDR_ReturnsCidrNotation(string subnet, int mask, string expectedCidr)
|
||||
public void CIDR_ReturnsCidrNotation(string subnet, int mask, string expectedCidr)
|
||||
{
|
||||
// Arrange
|
||||
var subnetwork = CreateSubnetwork(subnet, mask);
|
||||
|
||||
// Act
|
||||
var result = subnetwork.GetCIDR();
|
||||
var result = subnetwork.CIDR;
|
||||
|
||||
// Assert
|
||||
result.Should().Be(expectedCidr);
|
||||
@@ -119,16 +119,31 @@ public class SubnetworkTests
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ToString_EqualsGetCIDR()
|
||||
public void ToString_EqualsCIDRProperty()
|
||||
{
|
||||
// Arrange
|
||||
var subnetwork = CreateSubnetwork("172.20.0.0", 12);
|
||||
|
||||
// Act & Assert
|
||||
subnetwork.ToString().Should().Be(subnetwork.GetCIDR());
|
||||
subnetwork.ToString().Should().Be(subnetwork.CIDR);
|
||||
}
|
||||
|
||||
private static Subnetwork CreateSubnetwork(string subnet, int mask)
|
||||
[Fact]
|
||||
public void Record_Equality_WorksCorrectly()
|
||||
{
|
||||
// Arrange - use same calculation object for equality comparison
|
||||
var calculation = new { maxhosts = 254 };
|
||||
var subnet1 = CreateSubnetwork("192.168.1.0", 24, calculation);
|
||||
var subnet2 = CreateSubnetwork("192.168.1.0", 24, calculation);
|
||||
|
||||
// Assert - records use value equality (except for the Calculation object reference)
|
||||
subnet1.Id.Should().Be(subnet2.Id);
|
||||
subnet1.Subnet.Should().Be(subnet2.Subnet);
|
||||
subnet1.Mask.Should().Be(subnet2.Mask);
|
||||
subnet1.CIDR.Should().Be(subnet2.CIDR);
|
||||
}
|
||||
|
||||
private static Subnetwork CreateSubnetwork(string subnet, int mask, object? calculation = null)
|
||||
{
|
||||
return new Subnetwork(
|
||||
1, subnet, mask, 1, "", "", "",
|
||||
@@ -136,7 +151,7 @@ public class SubnetworkTests
|
||||
"", false, false, false, false,
|
||||
false, 0, false, false, false, false,
|
||||
0, 0, 0, null, null, null,
|
||||
new object(), null
|
||||
calculation ?? new object(), null
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,28 +26,13 @@ public class TagTests
|
||||
tag.Id.Should().Be(id);
|
||||
tag.Type.Should().Be(type);
|
||||
tag.ShowTag.Should().Be(showTag);
|
||||
tag.BGColor.Should().Be(bgColor);
|
||||
tag.FGColor.Should().Be(fgColor);
|
||||
tag.Compress.Should().BeTrue();
|
||||
tag.Locked.Should().BeFalse();
|
||||
tag.BackgroundColor.Should().Be(bgColor);
|
||||
tag.ForegroundColor.Should().Be(fgColor);
|
||||
tag.Compress.Should().Be(compress);
|
||||
tag.Locked.Should().Be(locked);
|
||||
tag.UpdateTag.Should().Be(updateTag);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("Yes", true)]
|
||||
[InlineData("No", false)]
|
||||
[InlineData("", false)]
|
||||
[InlineData("yes", false)] // Case sensitive
|
||||
[InlineData("true", false)] // Only "Yes" is true
|
||||
public void StringToBool_ConvertsCorrectly(string input, bool expected)
|
||||
{
|
||||
// The StringToBool is private, so we test through the constructor
|
||||
// Using Compress field which uses StringToBool
|
||||
var tag = new Tag(1, "Test", false, "", "", input, "No", false);
|
||||
|
||||
tag.Compress.Should().Be(expected);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("Used")]
|
||||
[InlineData("Available")]
|
||||
@@ -66,12 +51,13 @@ public class TagTests
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Locked_WithYes_IsTrue()
|
||||
public void Record_Equality_WorksCorrectly()
|
||||
{
|
||||
// Arrange & Act
|
||||
var tag = new Tag(1, "Test", false, "", "", "No", "Yes", false);
|
||||
// Arrange
|
||||
var tag1 = new Tag(1, "Used", true, "#fff", "#000", "Yes", "No", false);
|
||||
var tag2 = new Tag(1, "Used", true, "#fff", "#000", "Yes", "No", false);
|
||||
|
||||
// Assert
|
||||
tag.Locked.Should().BeTrue();
|
||||
tag1.Should().Be(tag2);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user