refactor: update Blazor testing guidelines and improve regex for hostname parsing in Caddy configuration
Some checks failed
Caddy Manager CI build / docker (push) Failing after 51s
Some checks failed
Caddy Manager CI build / docker (push) Failing after 51s
This commit is contained in:
@@ -32,7 +32,7 @@ alwaysApply: true
|
|||||||
|
|
||||||
## Testing and Debugging
|
## Testing and Debugging
|
||||||
- All unit testing and integration testing should be done in Cursor ide
|
- All unit testing and integration testing should be done in Cursor ide
|
||||||
- Test Blazor components and services using xUnit
|
- Test services, unit and integration, using xUnit
|
||||||
- Use Moq for mocking dependencies during tests
|
- Use Moq for mocking dependencies during tests
|
||||||
- Debug Blazor UI issues using browser developer tools and Cursor ide's debugging tools for backend and server-side issues
|
- Debug Blazor UI issues using browser developer tools and Cursor ide's debugging tools for backend and server-side issues
|
||||||
- For performance profiling and optimization, rely on Cursor ide's diagnostics tools
|
- For performance profiling and optimization, rely on Cursor ide's diagnostics tools
|
||||||
@@ -8,9 +8,11 @@ public partial class CaddyConfigurationParsingService: ICaddyConfigurationParsin
|
|||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Regex to help parse hostnames from a Caddyfile.
|
/// Regex to help parse hostnames from a Caddyfile.
|
||||||
|
/// This regex only matches hostname declarations at the beginning of lines (column 1 after optional whitespace)
|
||||||
|
/// and excludes nested directives like "reverse_proxy target {".
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[GeneratedRegex(@"(?m)^\s*([^\{\r\n]+?)\s*\{", RegexOptions.Multiline)]
|
[GeneratedRegex(@"(?m)^([^\s\{\r\n][^\{\r\n]*?)\s*\{", RegexOptions.Multiline)]
|
||||||
private static partial Regex HostnamesRegex();
|
private static partial Regex HostnamesRegex();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -67,8 +69,8 @@ public partial class CaddyConfigurationParsingService: ICaddyConfigurationParsin
|
|||||||
|
|
||||||
foreach (Match match in matches)
|
foreach (Match match in matches)
|
||||||
{
|
{
|
||||||
var parts = match.Value.TrimEnd('}').Trim().Split(' ');
|
// Use the captured group which contains the target (e.g., pikachu:3011)
|
||||||
var targetPart = parts.LastOrDefault(string.Empty);
|
var targetPart = match.Groups[1].Value.Trim();
|
||||||
if (string.IsNullOrEmpty(targetPart)) continue;
|
if (string.IsNullOrEmpty(targetPart)) continue;
|
||||||
|
|
||||||
var targetComponents = targetPart.Split(':');
|
var targetComponents = targetPart.Split(':');
|
||||||
|
|||||||
@@ -74,11 +74,9 @@ public class CaddyConfigurationParsingServiceTests
|
|||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
result.Should().NotBeNull();
|
result.Should().NotBeNull();
|
||||||
result.Should().HaveCount(4); // Updated to reflect correct parsing of labels before blocks
|
result.Should().HaveCount(2); // Should only return outermost hostname declarations
|
||||||
result.Should().Contain("api.example.com");
|
result.Should().Contain("api.example.com");
|
||||||
result.Should().Contain("app.example.com");
|
result.Should().Contain("app.example.com");
|
||||||
result.Should().Contain("route /v1/*");
|
|
||||||
result.Should().Contain("route /v2/*");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -522,12 +520,9 @@ app.example.com {
|
|||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
result.Should().NotBeNull();
|
result.Should().NotBeNull();
|
||||||
result.Should().HaveCount(5);
|
result.Should().HaveCount(2); // Should only return outermost hostname declarations
|
||||||
result.Should().Contain("api.example.com");
|
result.Should().Contain("api.example.com");
|
||||||
result.Should().Contain("app.example.com");
|
result.Should().Contain("app.example.com");
|
||||||
result.Should().Contain("header");
|
|
||||||
result.Should().Contain("@cors");
|
|
||||||
result.Should().Contain("tls");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -669,5 +664,36 @@ api.test {
|
|||||||
stopwatch.ElapsedMilliseconds.Should().BeLessThan(1000); // Should process in under 1 second
|
stopwatch.ElapsedMilliseconds.Should().BeLessThan(1000); // Should process in under 1 second
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Tests the parsing issue where the provided configuration is incorrectly parsed as 2 sites and 0 ports
|
||||||
|
/// instead of 1 site and 1 port.
|
||||||
|
/// </summary>
|
||||||
|
[Fact]
|
||||||
|
public void GetHostnamesAndPortsFromCaddyfileContent_WithProvidedConfiguration_ReturnsCorrectSiteAndPort()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var caddyfileContent = @"pika-auth.duydao.org {
|
||||||
|
reverse_proxy pikachu:3011 {
|
||||||
|
header_down X-Frame-Options """"
|
||||||
|
}
|
||||||
|
encode zstd gzip
|
||||||
|
}";
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var hostnames = _service.GetHostnamesFromCaddyfileContent(caddyfileContent);
|
||||||
|
var ports = _service.GetReverseProxyPortsFromCaddyfileContent(caddyfileContent);
|
||||||
|
|
||||||
|
// Assert - Should have 1 site and 1 port
|
||||||
|
hostnames.Should().NotBeNull();
|
||||||
|
hostnames.Should().HaveCount(1);
|
||||||
|
hostnames.Should().Contain("pika-auth.duydao.org");
|
||||||
|
|
||||||
|
ports.Should().NotBeNull();
|
||||||
|
ports.Should().HaveCount(1);
|
||||||
|
ports.Should().Contain(3011);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user