513fa1aa16
Comment/XML-doc changes only: - add summaries to ~10k test methods, fixtures, fakes and helpers (+ <param> on theories, <returns> on async Task methods, <inheritdoc/> on interface implementations the checker can resolve) - strip ~2.6k project-tracking references (WP*, P*-*, row-NN, Task N, #NN, Component-0NN) from comments, keeping the explanatory text; reword false positives in comments only - real docs on fakes implementing BCL/library interfaces (IDisposable, ILogger, IOptionsMonitor, IAsyncLifetime) - reword the last 5 src/ false positives (CWE-1236, failures-1, year-0001, M365) Only non-comment edits: four one-line nested classes split across lines so members can carry docs. Build 0 errors / 0 warnings.
96 lines
4.4 KiB
C#
96 lines
4.4 KiB
C#
using System.Text.Json;
|
|
using ZB.MOM.WW.ScadaBridge.CLI.Commands;
|
|
using ZB.MOM.WW.ScadaBridge.Commons.Messages.Management;
|
|
using ZB.MOM.WW.ScadaBridge.Commons.Types.Deployment;
|
|
using ZB.MOM.WW.ScadaBridge.Commons.Types.Enums;
|
|
|
|
namespace ZB.MOM.WW.ScadaBridge.CLI.Tests;
|
|
|
|
/// <summary>
|
|
/// Tests for the <c>deploy status</c> table projection (deferred-work register rows
|
|
/// 37/87). The handler now returns a <see cref="DeploymentQueryResult"/> OBJECT where
|
|
/// it used to return a bare row array; without a projector the generic renderer takes
|
|
/// its Property/Value branch and prints the whole <c>deployments</c> array as raw JSON
|
|
/// inside one cell. The projection unwraps the envelope and keeps the total visible as
|
|
/// a trailing note — which matters more here than for the audit query, because the
|
|
/// page size is bounded server-side and a full page is no longer proof there is
|
|
/// nothing more.
|
|
/// </summary>
|
|
public class DeploymentStatusTableProjectionTests
|
|
{
|
|
/// <summary>
|
|
/// The real server shape, serialised from the REAL <see cref="DeploymentQueryResult"/>
|
|
/// / <see cref="DeploymentListRow"/> types rather than hand-written JSON, so renaming
|
|
/// one of their properties fails this test instead of silently blanking a column.
|
|
/// </summary>
|
|
private static string RealPayload(int rowCount, int totalCount) =>
|
|
JsonSerializer.Serialize(
|
|
new DeploymentQueryResult(
|
|
Enumerable.Range(1, rowCount).Select(i => new DeploymentListRow(
|
|
i, $"dep-{i:D3}", i, $"Line3.Pump{i}", 2, DeploymentStatus.Success,
|
|
$"rev-{i}", "alice",
|
|
new DateTimeOffset(2026, 8, 15, 12, 0, 0, TimeSpan.Zero), null, null)).ToList(),
|
|
totalCount,
|
|
Page: 1,
|
|
PageSize: rowCount),
|
|
new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
|
|
|
|
/// <summary>Verifies that projection: unwraps the envelope to a row array.</summary>
|
|
[Fact]
|
|
public void Projection_UnwrapsTheEnvelopeToARowArray()
|
|
{
|
|
var projected = DeploymentStatusTableProjection.ProjectRows(RealPayload(2, 2));
|
|
|
|
using var doc = JsonDocument.Parse(projected);
|
|
Assert.Equal(JsonValueKind.Array, doc.RootElement.ValueKind);
|
|
Assert.Equal(2, doc.RootElement.GetArrayLength());
|
|
Assert.Equal("dep-001", doc.RootElement[0].GetProperty("deploymentId").GetString());
|
|
Assert.Equal("Line3.Pump1", doc.RootElement[0].GetProperty("instanceUniqueName").GetString());
|
|
}
|
|
|
|
/// <summary>Verifies that projection, when page is a strict subset, appends a total note.</summary>
|
|
[Fact]
|
|
public void Projection_WhenPageIsAStrictSubset_AppendsATotalNote()
|
|
{
|
|
var projected = DeploymentStatusTableProjection.ProjectRows(RealPayload(2, 57));
|
|
|
|
using var doc = JsonDocument.Parse(projected);
|
|
Assert.Equal(3, doc.RootElement.GetArrayLength());
|
|
var note = doc.RootElement[2].GetProperty("note").GetString();
|
|
Assert.Contains("showing 2 of 57", note);
|
|
Assert.Contains("--page-size", note);
|
|
}
|
|
|
|
/// <summary>Verifies that projection, when page is the whole result, emits no note column.</summary>
|
|
[Fact]
|
|
public void Projection_WhenPageIsTheWholeResult_EmitsNoNoteColumn()
|
|
{
|
|
var projected = DeploymentStatusTableProjection.ProjectRows(RealPayload(2, 2));
|
|
|
|
using var doc = JsonDocument.Parse(projected);
|
|
Assert.All(doc.RootElement.EnumerateArray(),
|
|
e => Assert.False(e.TryGetProperty("note", out _)));
|
|
}
|
|
|
|
/// <summary>Verifies that projection, when accepts a bare row array, from a pre-envelope server.</summary>
|
|
[Fact]
|
|
public void Projection_AcceptsABareRowArray_FromAPreEnvelopeServer()
|
|
{
|
|
var projected = DeploymentStatusTableProjection.ProjectRows("""[{"deploymentId":"dep-001"}]""");
|
|
|
|
using var doc = JsonDocument.Parse(projected);
|
|
Assert.Equal("dep-001", Assert.Single(doc.RootElement.EnumerateArray())
|
|
.GetProperty("deploymentId").GetString());
|
|
}
|
|
|
|
/// <summary>Verifies that projection: leaves unrecognised bodies untouched.</summary>
|
|
/// <param name="body">The body.</param>
|
|
[Theory]
|
|
[InlineData("not json at all")]
|
|
[InlineData("""{"error":"boom"}""")]
|
|
public void Projection_LeavesUnrecognisedBodiesUntouched(string body)
|
|
{
|
|
Assert.Equal(body, DeploymentStatusTableProjection.ProjectRows(body));
|
|
}
|
|
}
|