microsoft/TypeAgent
Publicmirrored fromhttps://github.com/microsoft/TypeAgentAvailable
dotnet/autoShell.Tests/ActionHandlerBaseTests.cs
82lines · modecode
| 1 | // Copyright (c) Microsoft Corporation. |
| 2 | // Licensed under the MIT License. |
| 3 | |
| 4 | using System.Text.Json; |
| 5 | using System.Text.Json.Serialization; |
| 6 | using autoShell.Handlers; |
| 7 | |
| 8 | namespace autoShell.Tests; |
| 9 | |
| 10 | /// <summary> |
| 11 | /// Tests for <see cref="ActionHandlerBase"/> deserialization and error handling in AddAction<T>. |
| 12 | /// </summary> |
| 13 | public class ActionHandlerBaseTests |
| 14 | { |
| 15 | private record TestParams |
| 16 | { |
| 17 | [JsonPropertyName("name")] |
| 18 | public string Name { get; init; } = ""; |
| 19 | |
| 20 | [JsonPropertyName("count")] |
| 21 | public int Count { get; init; } = 0; |
| 22 | } |
| 23 | |
| 24 | private class TestHandler : ActionHandlerBase |
| 25 | { |
| 26 | public TestParams? LastParams { get; private set; } |
| 27 | |
| 28 | public TestHandler() |
| 29 | { |
| 30 | AddAction<TestParams>("TypedAction", p => |
| 31 | { |
| 32 | LastParams = p; |
| 33 | return ActionResult.Ok("ok"); |
| 34 | }); |
| 35 | } |
| 36 | } |
| 37 | |
| 38 | private static JsonElement Parse(string json) => JsonDocument.Parse(json).RootElement; |
| 39 | |
| 40 | /// <summary> |
| 41 | /// Verifies that AddAction<T> correctly deserializes valid JSON to the typed parameter record. |
| 42 | /// </summary> |
| 43 | [Fact] |
| 44 | public void TypedAction_ValidJson_DeserializesToTypedParams() |
| 45 | { |
| 46 | var handler = new TestHandler(); |
| 47 | var result = handler.Handle("TypedAction", Parse("""{"name":"test","count":5}""")); |
| 48 | |
| 49 | Assert.True(result.Success); |
| 50 | Assert.NotNull(handler.LastParams); |
| 51 | Assert.Equal("test", handler.LastParams!.Name); |
| 52 | Assert.Equal(5, handler.LastParams.Count); |
| 53 | } |
| 54 | |
| 55 | /// <summary> |
| 56 | /// Verifies that AddAction<T> returns a failure when the JSON is "null". |
| 57 | /// JsonSerializer.Deserialize returns null for the JSON literal "null". |
| 58 | /// </summary> |
| 59 | [Fact] |
| 60 | public void TypedAction_NullJson_ReturnsFailure() |
| 61 | { |
| 62 | var handler = new TestHandler(); |
| 63 | var result = handler.Handle("TypedAction", Parse("null")); |
| 64 | |
| 65 | Assert.False(result.Success); |
| 66 | Assert.Contains("null", result.Message, StringComparison.OrdinalIgnoreCase); |
| 67 | } |
| 68 | |
| 69 | /// <summary> |
| 70 | /// Verifies that AddAction<T> returns a failure when JSON has a type mismatch |
| 71 | /// (e.g., string where int is expected). |
| 72 | /// </summary> |
| 73 | [Fact] |
| 74 | public void TypedAction_TypeMismatch_ReturnsFailure() |
| 75 | { |
| 76 | var handler = new TestHandler(); |
| 77 | var result = handler.Handle("TypedAction", Parse("""{"name":"test","count":"notAnInt"}""")); |
| 78 | |
| 79 | Assert.False(result.Success); |
| 80 | Assert.Contains("Invalid parameters", result.Message); |
| 81 | } |
| 82 | } |
| 83 | |