[AZ-1113] Cycle 10 closeout: docs, perf harness, security

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Oleksandr Bezdieniezhnykh
2026-06-26 10:55:59 +03:00
parent 01d7e7d584
commit c79998bfa7
24 changed files with 600 additions and 46 deletions
@@ -133,8 +133,12 @@ public static class CreateRouteValidationTests
var problem = await ProblemDetailsAssertions.ReadProblemDetailsAsync(response, "AZ-809 missing id");
// Assert
ProblemDetailsAssertions.AssertValidationProblem(problem, expectedStatus: 400, label: "AZ-809 missing id");
ProblemDetailsAssertions.AssertErrorsContainsMention(problem, expectedMention: "id", label: "AZ-809 missing id");
ProblemDetailsAssertions.AssertValidationProblem(
problem,
expectedStatus: 400,
label: "AZ-809 missing id",
expectedErrorPath: "$",
expectedErrorContains: "The field value is invalid.");
Console.WriteLine(" ✓ Missing `id` rejected with HTTP 400 (no silent coercion)");
}
@@ -431,8 +435,12 @@ public static class CreateRouteValidationTests
var problem = await ProblemDetailsAssertions.ReadProblemDetailsAsync(response, "AZ-809 missing requestMaps");
// Assert
ProblemDetailsAssertions.AssertValidationProblem(problem, expectedStatus: 400, label: "AZ-809 missing requestMaps");
ProblemDetailsAssertions.AssertErrorsContainsMention(problem, expectedMention: "requestMaps", label: "AZ-809 missing requestMaps");
ProblemDetailsAssertions.AssertValidationProblem(
problem,
expectedStatus: 400,
label: "AZ-809 missing requestMaps",
expectedErrorPath: "$",
expectedErrorContains: "The field value is invalid.");
Console.WriteLine(" ✓ Missing `requestMaps` rejected");
}
@@ -113,8 +113,12 @@ public static class RegionRequestValidationTests
var problem = await ProblemDetailsAssertions.ReadProblemDetailsAsync(response, "AZ-808 missing id");
// Assert
ProblemDetailsAssertions.AssertValidationProblem(problem, expectedStatus: 400, label: "AZ-808 missing id");
ProblemDetailsAssertions.AssertErrorsContainsMention(problem, expectedMention: "id", label: "AZ-808 missing id");
ProblemDetailsAssertions.AssertValidationProblem(
problem,
expectedStatus: 400,
label: "AZ-808 missing id",
expectedErrorPath: "$",
expectedErrorContains: "The field value is invalid.");
Console.WriteLine(" ✓ Missing `id` rejected with HTTP 400 (no silent coercion)");
}
@@ -151,8 +155,12 @@ public static class RegionRequestValidationTests
var problem = await ProblemDetailsAssertions.ReadProblemDetailsAsync(response, "AZ-808 missing lat");
// Assert
ProblemDetailsAssertions.AssertValidationProblem(problem, expectedStatus: 400, label: "AZ-808 missing lat");
ProblemDetailsAssertions.AssertErrorsContainsMention(problem, expectedMention: "lat", label: "AZ-808 missing lat");
ProblemDetailsAssertions.AssertValidationProblem(
problem,
expectedStatus: 400,
label: "AZ-808 missing lat",
expectedErrorPath: "$",
expectedErrorContains: "The field value is invalid.");
Console.WriteLine(" ✓ Missing `lat` rejected with HTTP 400");
}
@@ -190,8 +198,12 @@ public static class RegionRequestValidationTests
var problem = await ProblemDetailsAssertions.ReadProblemDetailsAsync(response, "AZ-808 missing lon");
// Assert
ProblemDetailsAssertions.AssertValidationProblem(problem, expectedStatus: 400, label: "AZ-808 missing lon");
ProblemDetailsAssertions.AssertErrorsContainsMention(problem, expectedMention: "lon", label: "AZ-808 missing lon");
ProblemDetailsAssertions.AssertValidationProblem(
problem,
expectedStatus: 400,
label: "AZ-808 missing lon",
expectedErrorPath: "$",
expectedErrorContains: "The field value is invalid.");
Console.WriteLine(" ✓ Missing `lon` rejected with HTTP 400");
}
@@ -229,8 +241,12 @@ public static class RegionRequestValidationTests
var problem = await ProblemDetailsAssertions.ReadProblemDetailsAsync(response, "AZ-808 missing sizeMeters");
// Assert
ProblemDetailsAssertions.AssertValidationProblem(problem, expectedStatus: 400, label: "AZ-808 missing sizeMeters");
ProblemDetailsAssertions.AssertErrorsContainsMention(problem, expectedMention: "sizeMeters", label: "AZ-808 missing sizeMeters");
ProblemDetailsAssertions.AssertValidationProblem(
problem,
expectedStatus: 400,
label: "AZ-808 missing sizeMeters",
expectedErrorPath: "$",
expectedErrorContains: "The field value is invalid.");
Console.WriteLine(" ✓ Missing `sizeMeters` rejected with HTTP 400");
}
@@ -268,8 +284,12 @@ public static class RegionRequestValidationTests
var problem = await ProblemDetailsAssertions.ReadProblemDetailsAsync(response, "AZ-808 missing zoomLevel");
// Assert
ProblemDetailsAssertions.AssertValidationProblem(problem, expectedStatus: 400, label: "AZ-808 missing zoomLevel");
ProblemDetailsAssertions.AssertErrorsContainsMention(problem, expectedMention: "zoomLevel", label: "AZ-808 missing zoomLevel");
ProblemDetailsAssertions.AssertValidationProblem(
problem,
expectedStatus: 400,
label: "AZ-808 missing zoomLevel",
expectedErrorPath: "$",
expectedErrorContains: "The field value is invalid.");
Console.WriteLine(" ✓ Missing `zoomLevel` rejected with HTTP 400");
}
@@ -307,8 +327,12 @@ public static class RegionRequestValidationTests
var problem = await ProblemDetailsAssertions.ReadProblemDetailsAsync(response, "AZ-808 missing stitchTiles");
// Assert
ProblemDetailsAssertions.AssertValidationProblem(problem, expectedStatus: 400, label: "AZ-808 missing stitchTiles");
ProblemDetailsAssertions.AssertErrorsContainsMention(problem, expectedMention: "stitchTiles", label: "AZ-808 missing stitchTiles");
ProblemDetailsAssertions.AssertValidationProblem(
problem,
expectedStatus: 400,
label: "AZ-808 missing stitchTiles",
expectedErrorPath: "$",
expectedErrorContains: "The field value is invalid.");
Console.WriteLine(" ✓ Missing `stitchTiles` rejected with HTTP 400");
}
@@ -197,11 +197,15 @@ public static class TileInventoryValidationTests
var response = await PostJsonAsync(httpClient, body);
var problem = await ProblemDetailsAssertions.ReadProblemDetailsAsync(response, "AZ-796 missing z");
// Assert
ProblemDetailsAssertions.AssertValidationProblem(problem, expectedStatus: 400, label: "AZ-796 missing z");
ProblemDetailsAssertions.AssertErrorsContainsMention(problem, expectedMention: "z", label: "AZ-796 missing z");
// Assert — JsonRequired surfaces parent path `tiles[0]` with static deserializer message (AZ-1113).
ProblemDetailsAssertions.AssertValidationProblem(
problem,
expectedStatus: 400,
label: "AZ-796 missing z",
expectedErrorPath: "tiles[0]",
expectedErrorContains: "The field value is invalid.");
Console.WriteLine(" ✓ Missing `z` rejected with errors map mentioning the field");
Console.WriteLine(" ✓ Missing `z` rejected with errors[\"tiles[0]\"] and sanitized message");
}
private static async Task MissingXAndY_Returns400(HttpClient httpClient)