Files
PSProxmoxVE/tests/PSProxmoxVE.Core.Tests/Authentication/PveAuthenticatorTests.cs
T
Clint Branham 0c70e11fe8 fix: resolve all C# compiler warnings (CS8604, CS8618, CS8603, CS1573, xUnit1012)
- CS8604: Use cmdlet's own Node property instead of nullable task.Node
  in WaitForTask calls across all VM cmdlets
- CS8618: Make PveSession.ServerVersion nullable (PveVersion?) since it
  is set post-construction by PveAuthenticator
- CS8603: Add null-forgiving operator where IsNullOrWhiteSpace guards
  guarantee non-null in PveHttpClient
- CS1573: Add XML param documentation to all public service methods
- xUnit1012: Make test parameters nullable (string?) for null test cases

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 18:11:49 -05:00

86 lines
3.1 KiB
C#

using System;
using Xunit;
using PSProxmoxVE.Core.Authentication;
namespace PSProxmoxVE.Core.Tests.Authentication
{
/// <summary>
/// Tests for PveAuthenticator input validation. These tests exercise the
/// argument-validation logic without making actual HTTP calls.
/// </summary>
public class PveAuthenticatorTests
{
private const string ValidHostname = "pve.example.com";
private const int ValidPort = 8006;
[Fact]
public void ValidateUsername_MissingAtSign_Throws()
{
var ex = Assert.Throws<ArgumentException>(() =>
PveAuthenticator.AuthenticateWithCredentials(ValidHostname, ValidPort, false, "rootpam", "password"));
Assert.Contains("realm", ex.Message, StringComparison.OrdinalIgnoreCase);
}
[Fact]
public void ValidateApiToken_InvalidFormat_NoTokenId_Throws()
{
// Missing the !TOKENID part — no exclamation mark
var ex = Assert.Throws<ArgumentException>(() =>
PveAuthenticator.AuthenticateWithApiToken(ValidHostname, ValidPort, false, "root@pam=someuuid"));
Assert.Contains("token", ex.Message, StringComparison.OrdinalIgnoreCase);
}
[Fact]
public void ValidateApiToken_InvalidFormat_NoEquals_Throws()
{
// Has ! but no = sign after TOKENID
var ex = Assert.Throws<ArgumentException>(() =>
PveAuthenticator.AuthenticateWithApiToken(ValidHostname, ValidPort, false, "root@pam!mytoken"));
Assert.Contains("token", ex.Message, StringComparison.OrdinalIgnoreCase);
}
[Fact]
public void ValidateApiToken_InvalidFormat_NoRealm_Throws()
{
// Missing the @realm portion
var ex = Assert.Throws<ArgumentException>(() =>
PveAuthenticator.AuthenticateWithApiToken(ValidHostname, ValidPort, false, "root!mytoken=someuuid"));
Assert.Contains("token", ex.Message, StringComparison.OrdinalIgnoreCase);
}
[Theory]
[InlineData(null)]
[InlineData("")]
[InlineData(" ")]
public void ValidateHostname_NullOrEmpty_Throws_ForCredentials(string? hostname)
{
Assert.Throws<ArgumentException>(() =>
PveAuthenticator.AuthenticateWithCredentials(hostname, ValidPort, false, "root@pam", "password"));
}
[Theory]
[InlineData(null)]
[InlineData("")]
[InlineData(" ")]
public void ValidateHostname_NullOrEmpty_Throws_ForApiToken(string? hostname)
{
Assert.Throws<ArgumentException>(() =>
PveAuthenticator.AuthenticateWithApiToken(hostname, ValidPort, false, "root@pam!mytoken=uuid"));
}
[Theory]
[InlineData(null)]
[InlineData("")]
[InlineData(" ")]
public void ValidateApiToken_NullOrEmpty_Throws(string? token)
{
Assert.Throws<ArgumentException>(() =>
PveAuthenticator.AuthenticateWithApiToken(ValidHostname, ValidPort, false, token));
}
}
}