Fix build and code structure improvements. New but essential UI functionality. CI improvements. Documentation improvements. AI module improvements.

This commit is contained in:
StellaOps Bot
2025-12-26 21:54:17 +02:00
parent 335ff7da16
commit c2b9cd8d1f
3717 changed files with 264714 additions and 48202 deletions

View File

@@ -46,11 +46,11 @@ public sealed class NotifyApiEndpointsTests : IClassFixture<WebApplicationFactor
public async Task GetRules_ReturnsEmptyList_WhenNoRules()
{
// Act
var response = await _client.GetAsync("/api/v2/notify/rules");
var response = await _client.GetAsync("/api/v2/notify/rules", CancellationToken.None);
// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var rules = await response.Content.ReadFromJsonAsync<List<RuleResponse>>();
var rules = await response.Content.ReadFromJsonAsync<List<RuleResponse>>(cancellationToken: CancellationToken.None);
Assert.NotNull(rules);
Assert.Empty(rules);
}
@@ -82,11 +82,11 @@ public sealed class NotifyApiEndpointsTests : IClassFixture<WebApplicationFactor
};
// Act
var response = await _client.PostAsJsonAsync("/api/v2/notify/rules", request);
var response = await _client.PostAsJsonAsync("/api/v2/notify/rules", request, cancellationToken: CancellationToken.None);
// Assert
Assert.Equal(HttpStatusCode.Created, response.StatusCode);
var rule = await response.Content.ReadFromJsonAsync<RuleResponse>();
var rule = await response.Content.ReadFromJsonAsync<RuleResponse>(cancellationToken: CancellationToken.None);
Assert.NotNull(rule);
Assert.Equal("rule-001", rule.RuleId);
Assert.Equal("Test Rule", rule.Name);
@@ -108,14 +108,14 @@ public sealed class NotifyApiEndpointsTests : IClassFixture<WebApplicationFactor
channel: "slack:alerts",
template: "tmpl-001")
});
await _ruleRepository.UpsertAsync(rule);
await _ruleRepository.UpsertAsync(rule, CancellationToken.None);
// Act
var response = await _client.GetAsync("/api/v2/notify/rules/rule-get-001");
var response = await _client.GetAsync("/api/v2/notify/rules/rule-get-001", CancellationToken.None);
// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var result = await response.Content.ReadFromJsonAsync<RuleResponse>();
var result = await response.Content.ReadFromJsonAsync<RuleResponse>(cancellationToken: CancellationToken.None);
Assert.NotNull(result);
Assert.Equal("rule-get-001", result.RuleId);
}
@@ -124,7 +124,7 @@ public sealed class NotifyApiEndpointsTests : IClassFixture<WebApplicationFactor
public async Task GetRule_ReturnsNotFound_WhenNotExists()
{
// Act
var response = await _client.GetAsync("/api/v2/notify/rules/nonexistent");
var response = await _client.GetAsync("/api/v2/notify/rules/nonexistent", CancellationToken.None);
// Assert
Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
@@ -146,10 +146,10 @@ public sealed class NotifyApiEndpointsTests : IClassFixture<WebApplicationFactor
channel: "slack:alerts",
template: "tmpl-001")
});
await _ruleRepository.UpsertAsync(rule);
await _ruleRepository.UpsertAsync(rule, CancellationToken.None);
// Act
var response = await _client.DeleteAsync("/api/v2/notify/rules/rule-delete-001");
var response = await _client.DeleteAsync("/api/v2/notify/rules/rule-delete-001", CancellationToken.None);
// Assert
Assert.Equal(HttpStatusCode.NoContent, response.StatusCode);
@@ -163,11 +163,11 @@ public sealed class NotifyApiEndpointsTests : IClassFixture<WebApplicationFactor
public async Task GetTemplates_ReturnsEmptyList_WhenNoTemplates()
{
// Act
var response = await _client.GetAsync("/api/v2/notify/templates");
var response = await _client.GetAsync("/api/v2/notify/templates", CancellationToken.None);
// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var templates = await response.Content.ReadFromJsonAsync<List<TemplateResponse>>();
var templates = await response.Content.ReadFromJsonAsync<List<TemplateResponse>>(cancellationToken: CancellationToken.None);
Assert.NotNull(templates);
}
@@ -182,11 +182,11 @@ public sealed class NotifyApiEndpointsTests : IClassFixture<WebApplicationFactor
};
// Act
var response = await _client.PostAsJsonAsync("/api/v2/notify/templates/preview", request);
var response = await _client.PostAsJsonAsync("/api/v2/notify/templates/preview", request, cancellationToken: CancellationToken.None);
// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var preview = await response.Content.ReadFromJsonAsync<TemplatePreviewResponse>();
var preview = await response.Content.ReadFromJsonAsync<TemplatePreviewResponse>(cancellationToken: CancellationToken.None);
Assert.NotNull(preview);
Assert.Contains("Hello World", preview.RenderedBody);
Assert.Contains("5", preview.RenderedBody);
@@ -202,11 +202,11 @@ public sealed class NotifyApiEndpointsTests : IClassFixture<WebApplicationFactor
};
// Act
var response = await _client.PostAsJsonAsync("/api/v2/notify/templates/validate", request);
var response = await _client.PostAsJsonAsync("/api/v2/notify/templates/validate", request, cancellationToken: CancellationToken.None);
// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var result = await response.Content.ReadFromJsonAsync<JsonElement>();
var result = await response.Content.ReadFromJsonAsync<JsonElement>(cancellationToken: CancellationToken.None);
Assert.True(result.GetProperty("isValid").GetBoolean());
}
@@ -220,11 +220,11 @@ public sealed class NotifyApiEndpointsTests : IClassFixture<WebApplicationFactor
};
// Act
var response = await _client.PostAsJsonAsync("/api/v2/notify/templates/validate", request);
var response = await _client.PostAsJsonAsync("/api/v2/notify/templates/validate", request, cancellationToken: CancellationToken.None);
// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var result = await response.Content.ReadFromJsonAsync<JsonElement>();
var result = await response.Content.ReadFromJsonAsync<JsonElement>(cancellationToken: CancellationToken.None);
Assert.False(result.GetProperty("isValid").GetBoolean());
}
@@ -236,11 +236,11 @@ public sealed class NotifyApiEndpointsTests : IClassFixture<WebApplicationFactor
public async Task GetIncidents_ReturnsIncidentList()
{
// Act
var response = await _client.GetAsync("/api/v2/notify/incidents");
var response = await _client.GetAsync("/api/v2/notify/incidents", CancellationToken.None);
// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var result = await response.Content.ReadFromJsonAsync<IncidentListResponse>();
var result = await response.Content.ReadFromJsonAsync<IncidentListResponse>(cancellationToken: CancellationToken.None);
Assert.NotNull(result);
Assert.NotNull(result.Incidents);
}
@@ -256,7 +256,7 @@ public sealed class NotifyApiEndpointsTests : IClassFixture<WebApplicationFactor
};
// Act
var response = await _client.PostAsJsonAsync("/api/v2/notify/incidents/incident-001/ack", request);
var response = await _client.PostAsJsonAsync("/api/v2/notify/incidents/incident-001/ack", request, cancellationToken: CancellationToken.None);
// Assert
Assert.Equal(HttpStatusCode.NoContent, response.StatusCode);
@@ -273,7 +273,7 @@ public sealed class NotifyApiEndpointsTests : IClassFixture<WebApplicationFactor
var clientWithoutTenant = _factory.CreateClient();
// Act
var response = await clientWithoutTenant.GetAsync("/api/v2/notify/rules");
var response = await clientWithoutTenant.GetAsync("/api/v2/notify/rules", CancellationToken.None);
// Assert - should fail without tenant header
Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);