diff --git a/src/WireMockInspector/ViewModels/MainWindowViewModel.cs b/src/WireMockInspector/ViewModels/MainWindowViewModel.cs index f4bce53..9a149a5 100644 --- a/src/WireMockInspector/ViewModels/MainWindowViewModel.cs +++ b/src/WireMockInspector/ViewModels/MainWindowViewModel.cs @@ -221,16 +221,10 @@ public MainWindowViewModel() LastHit = hitCalculator.GetFirstPerfectHitDateAfter(m.Guid, estimatedScenarioStateDate ?? DateTime.MinValue), Description = $"[{m.WhenStateIs}] -> [{m.SetStateTo}]", MappingDefinition =AsMarkdownCode("json", JsonConvert.SerializeObject(m, Formatting.Indented)).AsMarkdownSyntax(), - TriggeredBy = hitCalculator.GetPerfectHitCountAfter(m.Guid, estimatedScenarioStateDate) - .OrderBy(x=>x.Request.DateTime) - .Select(l=> new ScenarioTransitionLogEntry - { - Timestamp = l.Request.DateTime, - Description = $"{l.Request.Method} {l.Request.Path}", - RequestDefinition = AsMarkdownCode("json", JsonConvert.SerializeObject(l.Request, Formatting.Indented)), - ResponseDefinition = AsMarkdownCode("json", JsonConvert.SerializeObject(l.Response, Formatting.Indented)), - } ) - .ToList() + TriggeredBy = new RequestLogViewModel() + { + MapToLogEntries(hitCalculator.GetPerfectHitCountAfter(m.Guid, estimatedScenarioStateDate)) + } }; }).OrderBy(x=> x.LastHit??DateTime.MaxValue).ToList(); return new Scenario @@ -278,6 +272,14 @@ public MainWindowViewModel() Content = AsMarkdownCode("json", JsonConvert.SerializeObject(model, Formatting.Indented)).AsMarkdownSyntax(), PartialHitCount = partialHitCount, PerfectHitCount = perfectHitCount, + PerfectMatches = new RequestLogViewModel() + { + MapToLogEntries(x.requests.Where(x=>x.MappingGuid == model.Guid).OrderByDescending(x=>x.Request.DateTime)) + }, + PartialMatches = new RequestLogViewModel() + { + MapToLogEntries(x.requests.Where(x=>x.PartialMappingGuid == model.Guid && x.MappingGuid != model.Guid).OrderByDescending(x=>x.Request.DateTime)) + }, HitType = (perfectHitCount, partialHitCount) switch { ( > 0, _) => MappingHitType.PerfectMatch, @@ -437,6 +439,22 @@ public MainWindowViewModel() }); } + private static List MapToLogEntries(IEnumerable logs) + { + return logs + .OrderBy(x=>x.Request.DateTime) + .Select(l=> new RequestLogEntry + { + Timestamp = l.Request.DateTime, + Method = l.Request.Method, + Path = l.Request.Path, + RequestDefinition = AsMarkdownCode("json", JsonConvert.SerializeObject(l.Request, Formatting.Indented)), + ResponseDefinition = AsMarkdownCode("json", JsonConvert.SerializeObject(l.Response, Formatting.Indented)), + StatusCode = l.Response.StatusCode?.ToString() + } ) + .ToList(); + } + private static DateTime? CalculateEstimatedScenarioStateDate(ScenarioStateModel? state, IGrouping mappingsFromScenario, MappingHitCalculator hitCalculator) { DateTime? estimatedScenarioStateDate = null; @@ -851,12 +869,14 @@ private static Markdown ExpectationsAsJson(object? data) public MappingDetails RelatedMapping => _relatedMapping.Value; } - public class ScenarioTransitionLogEntry + public class RequestLogEntry { public DateTime Timestamp { get; set; } - public string Description { get; set; } + public string Method { get; set; } + public string Path { get; set; } public Markdown RequestDefinition { get; set; } public Markdown ResponseDefinition { get; set; } + public string StatusCode { get; set; } } public record ScenarioNode(string Id); @@ -866,10 +886,15 @@ public record ScenarioTransition(string Id, ScenarioNode From, ScenarioNode To, { public string Description { get; set; } public string MappingDefinition { get; set; } - public List TriggeredBy { get; set; } + public RequestLogViewModel TriggeredBy { get; set; } public DateTime? LastHit { get; set; } }; + public class RequestLogViewModel:List + { + + } + public class MappingDetails:ViewModelBase { public MatchingStatus MatchingStatus { get; set; } @@ -948,7 +973,8 @@ public string Code private string _code; public Scenario Scenario { get; set; } - + public RequestLogViewModel PerfectMatches { get; set; } + public RequestLogViewModel PartialMatches { get; set; } } public record Scenario(string CurrentTransitionId, IReadOnlyList Transitions, diff --git a/src/WireMockInspector/Views/MappingPage.axaml b/src/WireMockInspector/Views/MappingPage.axaml index bec1bd6..c10f1fd 100644 --- a/src/WireMockInspector/Views/MappingPage.axaml +++ b/src/WireMockInspector/Views/MappingPage.axaml @@ -108,8 +108,19 @@ - - + + + + + + + + + + + + + @@ -134,6 +145,9 @@ + + + diff --git a/src/WireMockInspector/Views/RequestLogs.axaml b/src/WireMockInspector/Views/RequestLogs.axaml new file mode 100644 index 0000000..6348dfd --- /dev/null +++ b/src/WireMockInspector/Views/RequestLogs.axaml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/WireMockInspector/Views/RequestLogs.axaml.cs b/src/WireMockInspector/Views/RequestLogs.axaml.cs new file mode 100644 index 0000000..55927e7 --- /dev/null +++ b/src/WireMockInspector/Views/RequestLogs.axaml.cs @@ -0,0 +1,18 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Markup.Xaml; + +namespace WireMockInspector.Views; + +public partial class RequestLogs : UserControl +{ + public RequestLogs() + { + InitializeComponent(); + } + + private void InitializeComponent() + { + AvaloniaXamlLoader.Load(this); + } +} \ No newline at end of file diff --git a/src/WireMockInspector/Views/ScenarioPage.axaml b/src/WireMockInspector/Views/ScenarioPage.axaml index fec8ee7..08a239a 100644 --- a/src/WireMockInspector/Views/ScenarioPage.axaml +++ b/src/WireMockInspector/Views/ScenarioPage.axaml @@ -113,28 +113,7 @@ - - - - - - - - - - - - - - - - - - - - - - +