Skip to content

Commit

Permalink
Add list of matched requests on mapping
Browse files Browse the repository at this point in the history
  • Loading branch information
cezarypiatek committed Jul 22, 2023
1 parent 4368cd8 commit 19d2aa2
Show file tree
Hide file tree
Showing 5 changed files with 113 additions and 38 deletions.
54 changes: 40 additions & 14 deletions src/WireMockInspector/ViewModels/MainWindowViewModel.cs
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -437,6 +439,22 @@ public MainWindowViewModel()
});
}

private static List<RequestLogEntry> MapToLogEntries(IEnumerable<LogEntryModel> 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<string?, MappingModel> mappingsFromScenario, MappingHitCalculator hitCalculator)
{
DateTime? estimatedScenarioStateDate = null;
Expand Down Expand Up @@ -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);
Expand All @@ -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<ScenarioTransitionLogEntry> TriggeredBy { get; set; }
public RequestLogViewModel TriggeredBy { get; set; }
public DateTime? LastHit { get; set; }
};

public class RequestLogViewModel:List<RequestLogEntry>
{

}

public class MappingDetails:ViewModelBase
{
public MatchingStatus MatchingStatus { get; set; }
Expand Down Expand Up @@ -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<ScenarioTransition> Transitions,
Expand Down
18 changes: 16 additions & 2 deletions src/WireMockInspector/Views/MappingPage.axaml
Expand Up @@ -108,8 +108,19 @@
<TabItem Header="Definition">
<avalonia:MarkdownScrollViewer Markdown="{Binding SelectedMapping.Content }"></avalonia:MarkdownScrollViewer>
</TabItem>
<TabItem Header="Code">
<avalonia:MarkdownScrollViewer Markdown="{Binding SelectedMapping.Code }"></avalonia:MarkdownScrollViewer>
<TabItem Header="Matches">
<ScrollViewer>
<StackPanel Orientation="Vertical">
<Border BorderThickness="0,0,0,1" BorderBrush="#808080" Margin="0,0,0,15">
<Label DockPanel.Dock="Left" VerticalAlignment="Center" >Perfect matches</Label>
</Border>
<views:RequestLogs DataContext="{Binding SelectedMapping.PerfectMatches}"></views:RequestLogs>
<Border BorderThickness="0,0,0,1" BorderBrush="#808080" Margin="0,15,0,15">
<Label DockPanel.Dock="Left" VerticalAlignment="Center" >Partial matches</Label>
</Border>
<views:RequestLogs DataContext="{Binding SelectedMapping.PartialMatches}"></views:RequestLogs>
</StackPanel>
</ScrollViewer>
</TabItem>
<TabItem Header="Scenario" IsVisible="{Binding SelectedMapping.Scenario, Converter={x:Static ObjectConverters.IsNotNull}}">
<Grid Background="#404040">
Expand All @@ -134,6 +145,9 @@
<Image Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Source="{Binding SelectedMapping.Scenario, Converter={x:Static viewModels:GraphConverter.Instance}}"></Image>
</Grid>
</TabItem>
<TabItem Header="Code">
<avalonia:MarkdownScrollViewer Markdown="{Binding SelectedMapping.Code }"></avalonia:MarkdownScrollViewer>
</TabItem>
</TabControl>
</views:ContentWithSidebar.Sidebar>
</views:ContentWithSidebar>
Expand Down
38 changes: 38 additions & 0 deletions src/WireMockInspector/Views/RequestLogs.axaml
@@ -0,0 +1,38 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:viewModels="clr-namespace:WireMockInspector.ViewModels"
xmlns:avalonia="clr-namespace:Markdown.Avalonia;assembly=Markdown.Avalonia"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="WireMockInspector.Views.RequestLogs"
x:DataType="viewModels:RequestLogViewModel">
<ItemsControl Items="{Binding }">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Expander HorizontalAlignment="Stretch">
<Expander.Header>
<DockPanel HorizontalAlignment="Stretch">
<TextBlock VerticalAlignment="Center" Margin="0,0,10,0" Text="{Binding Timestamp, StringFormat={}{0:s}}"></TextBlock>
<Border Width="100" BorderThickness="2" Margin="5,0" VerticalAlignment="Center" CornerRadius="5" BorderBrush="{Binding Method, Converter={x:Static viewModels:RequestMethodToColorConverter.Instance}}">
<TextBlock TextAlignment="Center" Text="{Binding Method}" Margin="5" Foreground="white"></TextBlock>
</Border>
<TextBlock Margin="10,0" VerticalAlignment="Center" Text="{Binding Path}"></TextBlock>
<Border HorizontalAlignment="Right" DockPanel.Dock="Right" ToolTip.Tip="{Binding StatusCode, Converter={x:Static viewModels:HttpStatusCodeToDescriptionConverter.Instance}}" Grid.Column="4" BorderThickness="2" Margin="5,0" VerticalAlignment="Center" CornerRadius="5" BorderBrush="{Binding StatusCode, Converter={x:Static viewModels:ResponseCodeToColorConverter.Instance}}">
<TextBlock TextAlignment="Center" Text="{Binding StatusCode}" Margin="5" Foreground="white"></TextBlock>
</Border>
</DockPanel>
</Expander.Header>
<TabControl Classes="minor">
<TabItem Header="Request">
<avalonia:MarkdownScrollViewer Markdown="{Binding RequestDefinition}"></avalonia:MarkdownScrollViewer>
</TabItem>
<TabItem Header="Response">
<avalonia:MarkdownScrollViewer Markdown="{Binding ResponseDefinition}"></avalonia:MarkdownScrollViewer>
</TabItem>
</TabControl>
</Expander>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</UserControl>
18 changes: 18 additions & 0 deletions 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);
}
}
23 changes: 1 addition & 22 deletions src/WireMockInspector/Views/ScenarioPage.axaml
Expand Up @@ -113,28 +113,7 @@
<avalonia:MarkdownScrollViewer Markdown="{Binding MappingDefinition}"></avalonia:MarkdownScrollViewer>
</TabItem>
<TabItem Header="Triggered by">
<ItemsControl Items="{Binding TriggeredBy}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Expander HorizontalAlignment="Stretch">
<Expander.Header>
<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" Text="{Binding Timestamp}"></TextBlock>
<TextBlock Margin="10,0" VerticalAlignment="Center" Text="{Binding Description}"></TextBlock>
</StackPanel>
</Expander.Header>
<TabControl Classes="minor">
<TabItem Header="Request">
<avalonia:MarkdownScrollViewer Markdown="{Binding RequestDefinition}"></avalonia:MarkdownScrollViewer>
</TabItem>
<TabItem Header="Response">
<avalonia:MarkdownScrollViewer Markdown="{Binding ResponseDefinition}"></avalonia:MarkdownScrollViewer>
</TabItem>
</TabControl>
</Expander>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<views:RequestLogs DataContext="{Binding TriggeredBy}"></views:RequestLogs>
</TabItem>
</TabControl>
</Expander>
Expand Down

0 comments on commit 19d2aa2

Please sign in to comment.