Skip to content

Commit 20d4296

Browse files
committed
Added SequentialKeyGenerator for html reports
1 parent 4b67089 commit 20d4296

12 files changed

Lines changed: 171 additions & 51 deletions
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using NUnit.Framework;
2+
using TestStack.BDDfy.Configuration;
3+
4+
namespace TestStack.BDDfy.Tests.Configuration
5+
{
6+
[TestFixture]
7+
public class SequentialKeyGeneratorTests
8+
{
9+
[Test]
10+
public void ShouldReturnOneForFirstScenario()
11+
{
12+
var sut = new SequentialKeyGenerator();
13+
14+
var result = sut.GetScenarioId();
15+
16+
Assert.That(result, Is.EqualTo("scenario-1"));
17+
}
18+
19+
[Test]
20+
public void ShouldIncrementScenarioIdForEachRequestForScenariId()
21+
{
22+
var sut = new SequentialKeyGenerator();
23+
24+
for (int i = 1; i <= 12; i++)
25+
{
26+
Assert.That(sut.GetScenarioId(), Is.EqualTo("scenario-" + i));
27+
}
28+
}
29+
30+
[Test]
31+
public void ShouldReturnOneOneForFirstStepOfFirstScenario()
32+
{
33+
var sut = new SequentialKeyGenerator();
34+
35+
var result = sut.GetStepId();
36+
37+
Assert.That(result, Is.EqualTo("step-1-1"));
38+
}
39+
40+
[Test]
41+
public void ShouldIncrementStepIdForEachRequestForStepId()
42+
{
43+
var sut = new SequentialKeyGenerator();
44+
45+
for (int i = 1; i <= 12; i++)
46+
{
47+
Assert.That(sut.GetStepId(), Is.EqualTo("step-1-" + i));
48+
}
49+
}
50+
51+
[Test]
52+
public void ShouldResetStepCountForNewScenario()
53+
{
54+
var sut = new SequentialKeyGenerator();
55+
sut.GetStepId();
56+
sut.GetScenarioId();
57+
58+
var result = sut.GetStepId();
59+
60+
Assert.That(result, Is.EqualTo("step-2-1"));
61+
}
62+
63+
}
64+
65+
}

TestStack.BDDfy.Tests/Reporters/Html/HtmlReport.approved.html renamed to TestStack.BDDfy.Tests/Reporters/Html/HtmlReportBuilderSpecs.ShouldProduceExpectedHtml.approved.txt

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
/*If you drop a custom stylesheet named BDDfyCustom.css in your output folder it gets embedded here. This way you can apply some custom styles over your html report.*/
1010

1111
</style>
12-
<title>BDDfy Test Result 24/03/2014</title>
12+
<title>BDDfy Test Result 25/03/2014</title>
1313
</head>
1414
<body>
1515
<div id='main'>
@@ -79,29 +79,29 @@ <h3 id='detailsLable'>Details:</h3>
7979
</div>
8080
<div class='scenarios'>
8181
<div class='scenario'>
82-
<div class='NotExecuted canToggle scenarioTitle' data-toggle-target='14813549-b503-4cf4-9573-6013f44fd2ac'>Happy Path Scenario</div>
83-
<ul class='steps' id='14813549-b503-4cf4-9573-6013f44fd2ac'>
84-
<li class='step NotExecuted Assertion ' data-toggle-target='45408fed-c743-41bc-bc4c-db608b7a4690' >
82+
<div class='NotExecuted canToggle scenarioTitle' data-toggle-target='scenario-3'>Happy Path Scenario</div>
83+
<ul class='steps' id='scenario-3'>
84+
<li class='step NotExecuted Assertion ' data-toggle-target='step-3-1' >
8585
<span>Given a positive account balance</span>
8686
</li>
87-
<li class='step NotExecuted Assertion ' data-toggle-target='f2905b00-9ada-4288-a7b5-9d0d81312c43' >
87+
<li class='step NotExecuted Assertion ' data-toggle-target='step-3-2' >
8888
<span>When the account holder requests money</span>
8989
</li>
90-
<li class='step NotExecuted Assertion ' data-toggle-target='4e27eb36-3689-4b2b-bf28-64d1eed12689' >
90+
<li class='step NotExecuted Assertion ' data-toggle-target='step-3-3' >
9191
<span>Then money is dispensed</span>
9292
</li>
9393
</ul>
9494
</div>
9595
<div class='scenario'>
96-
<div class='NotExecuted canToggle scenarioTitle' data-toggle-target='7a5bcd14-ebef-4913-b063-f6cfbb28de13'>Sad Path Scenario</div>
97-
<ul class='steps' id='7a5bcd14-ebef-4913-b063-f6cfbb28de13'>
98-
<li class='step NotExecuted Assertion ' data-toggle-target='91bebf29-0729-4cd7-8c2a-8a5aadfbd375' >
96+
<div class='NotExecuted canToggle scenarioTitle' data-toggle-target='scenario-4'>Sad Path Scenario</div>
97+
<ul class='steps' id='scenario-4'>
98+
<li class='step NotExecuted Assertion ' data-toggle-target='step-4-1' >
9999
<span>Given a negative account balance</span>
100100
</li>
101-
<li class='step NotExecuted Assertion ' data-toggle-target='e35ee1b2-11db-47d4-a32d-54673f7169ce' >
101+
<li class='step NotExecuted Assertion ' data-toggle-target='step-4-2' >
102102
<span>When the account holder requests money</span>
103103
</li>
104-
<li class='step NotExecuted Assertion ' data-toggle-target='f02eb934-99f7-466c-ac4a-0b68f0ec886b' >
104+
<li class='step NotExecuted Assertion ' data-toggle-target='step-4-3' >
105105
<span>Then no money is dispensed</span>
106106
</li>
107107
</ul>
@@ -121,29 +121,29 @@ <h3 id='detailsLable'>Details:</h3>
121121
</div>
122122
<div class='scenarios'>
123123
<div class='scenario'>
124-
<div class='NotExecuted canToggle scenarioTitle' data-toggle-target='320ba464-b9b2-41e8-bf9b-09b7dddd4ede'>Happy Path Scenario</div>
125-
<ul class='steps' id='320ba464-b9b2-41e8-bf9b-09b7dddd4ede'>
126-
<li class='step NotExecuted Assertion ' data-toggle-target='e928a159-1cf7-41b1-88ba-7502f20701f1' >
124+
<div class='NotExecuted canToggle scenarioTitle' data-toggle-target='scenario-1'>Happy Path Scenario</div>
125+
<ul class='steps' id='scenario-1'>
126+
<li class='step NotExecuted Assertion ' data-toggle-target='step-1-1' >
127127
<span>Given a positive account balance</span>
128128
</li>
129-
<li class='step NotExecuted Assertion ' data-toggle-target='17175f18-892e-4d3a-80da-70488168be3e' >
129+
<li class='step NotExecuted Assertion ' data-toggle-target='step-1-2' >
130130
<span>When the account holder requests money</span>
131131
</li>
132-
<li class='step NotExecuted Assertion ' data-toggle-target='7ac9aca2-36da-46ae-9b93-777156d5a7e5' >
132+
<li class='step NotExecuted Assertion ' data-toggle-target='step-1-3' >
133133
<span>Then money is dispensed</span>
134134
</li>
135135
</ul>
136136
</div>
137137
<div class='scenario'>
138-
<div class='NotExecuted canToggle scenarioTitle' data-toggle-target='179d79fd-c235-4aee-a820-4a7fc9f8b6b4'>Sad Path Scenario</div>
139-
<ul class='steps' id='179d79fd-c235-4aee-a820-4a7fc9f8b6b4'>
140-
<li class='step NotExecuted Assertion ' data-toggle-target='fbae9904-5d52-4aa0-a525-acc4ae60b2ef' >
138+
<div class='NotExecuted canToggle scenarioTitle' data-toggle-target='scenario-2'>Sad Path Scenario</div>
139+
<ul class='steps' id='scenario-2'>
140+
<li class='step NotExecuted Assertion ' data-toggle-target='step-2-1' >
141141
<span>Given a negative account balance</span>
142142
</li>
143-
<li class='step NotExecuted Assertion ' data-toggle-target='64e01c01-75a2-4263-bedf-bbcb25c32d27' >
143+
<li class='step NotExecuted Assertion ' data-toggle-target='step-2-2' >
144144
<span>When the account holder requests money</span>
145145
</li>
146-
<li class='step NotExecuted Assertion ' data-toggle-target='22bd7e82-9b0a-42ca-a341-d590418e7295' >
146+
<li class='step NotExecuted Assertion ' data-toggle-target='step-2-3' >
147147
<span>Then no money is dispensed</span>
148148
</li>
149149
</ul>
@@ -152,7 +152,7 @@ <h3 id='detailsLable'>Details:</h3>
152152
</div>
153153
</li>
154154
</ul>
155-
<p><span>Tested at: 24/03/2014 21:45:27</span></p>
155+
<p><span>Tested at: 25/03/2014 11:30:05</span></p>
156156
</div>
157157
</div>
158158
<div class='footer'>Powered by <a href='https://github.com/TestStack/TestStack.BDDfy'>BDDfy</a> framework</div>
Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,29 @@
11
using System;
22
using System.IO;
33
using System.Reflection;
4+
using ApprovalTests;
5+
using ApprovalTests.Reporters;
46
using NUnit.Framework;
57
using TestStack.BDDfy.Reporters.Html;
68

79
namespace TestStack.BDDfy.Tests.Reporters.Html
810
{
911
[TestFixture]
12+
[UseReporter(typeof(DiffReporter))]
1013
public class HtmlReportBuilderSpecs
1114
{
1215
[Test]
1316
public void ShouldProduceExpectedHtml()
1417
{
15-
string expected = GetReportHtml();
1618
var model = new HtmlReportViewModel(
1719
new DefaultHtmlReportConfiguration(),
1820
new ReportTestData().CreateTwoStoriesEachWithTwoScenariosWithThreeStepsOfFiveMilliseconds());
1921
var sut = new HtmlReportBuilder();
22+
sut.DateProvider = () => new DateTime(2014, 3, 25, 11, 30,5);
2023

2124
var result = sut.CreateReport(model);
2225

23-
// would prefer to assert the string contents but different IDs are generated each time so reports are never exacty the same.
24-
Assert.That(result.Length, Is.EqualTo(expected.Length));
25-
}
26-
27-
private string GetReportHtml()
28-
{
29-
var assembly = Assembly.GetExecutingAssembly();
30-
var resourceName = "TestStack.BDDfy.Tests.Reporters.Html.HtmlReport.approved.html";
31-
32-
string result;
33-
using (Stream stream = assembly.GetManifestResourceStream(resourceName))
34-
{
35-
using (StreamReader reader = new StreamReader(stream))
36-
{
37-
result = reader.ReadToEnd();
38-
}
39-
}
40-
41-
return result;
26+
Approvals.Verify(result);
4227
}
4328
}
4429
}

TestStack.BDDfy.Tests/TestStack.BDDfy.Tests.csproj

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@
4646
<Prefer32Bit>false</Prefer32Bit>
4747
</PropertyGroup>
4848
<ItemGroup>
49+
<Reference Include="ApprovalTests">
50+
<HintPath>..\packages\ApprovalTests.3.0.5\lib\net40\ApprovalTests.dll</HintPath>
51+
</Reference>
52+
<Reference Include="ApprovalUtilities">
53+
<HintPath>..\packages\ApprovalUtilities.3.0.5\lib\net35\ApprovalUtilities.dll</HintPath>
54+
</Reference>
4955
<Reference Include="NSubstitute, Version=1.6.1.0, Culture=neutral, PublicKeyToken=92dd2e9066daa5ca, processorArchitecture=MSIL">
5056
<SpecificVersion>False</SpecificVersion>
5157
<HintPath Condition="$(TargetFrameworkVersion)=='v4.0'">..\packages\NSubstitute.1.6.1.0\lib\NET40\NSubstitute.dll</HintPath>
@@ -66,6 +72,7 @@
6672
<Compile Include="Arguments\ArgumentsProvidedForGiven.cs" />
6773
<Compile Include="Arguments\ArgumentsProvidedForThen.cs" />
6874
<Compile Include="Arguments\MultipleArgumentsProvidedForTheSameStep.cs" />
75+
<Compile Include="Configuration\SequentialKeyGeneratorTests.cs" />
6976
<Compile Include="Configuration\TestRunnerTests.cs" />
7077
<Compile Include="Reporters\Html\HtmlReportBuilderSpecs.cs" />
7178
<Compile Include="Reporters\Html\HtmlReporterSpecs.cs" />
@@ -140,9 +147,6 @@
140147
<ItemGroup>
141148
<None Include="packages.config" />
142149
</ItemGroup>
143-
<ItemGroup>
144-
<EmbeddedResource Include="Reporters\Html\HtmlReport.approved.html" />
145-
</ItemGroup>
146150
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
147151
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
148152
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<packages>
3+
<package id="ApprovalTests" version="3.0.5" targetFramework="net45" />
4+
<package id="ApprovalUtilities" version="3.0.5" targetFramework="net45" />
35
<package id="NSubstitute" version="1.6.1.0" targetFramework="net40" />
46
<package id="NUnit" version="2.6.2" targetFramework="net40" />
57
</packages>

TestStack.BDDfy/Configuration/Configurator.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using System;
2+
13
namespace TestStack.BDDfy.Configuration
24
{
35
public static class Configurator
@@ -26,5 +28,18 @@ public static Scanners Scanners
2628
return ScannersFactory;
2729
}
2830
}
31+
32+
private static IKeyGenerator _idGenerator = new SequentialKeyGenerator();
33+
public static IKeyGenerator IdGenerator
34+
{
35+
get
36+
{
37+
return _idGenerator;
38+
}
39+
set
40+
{
41+
_idGenerator = value;
42+
}
43+
}
2944
}
3045
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace TestStack.BDDfy.Configuration
2+
{
3+
public interface IKeyGenerator
4+
{
5+
string GetScenarioId();
6+
string GetStepId();
7+
void Reset();
8+
}
9+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
namespace TestStack.BDDfy.Configuration
2+
{
3+
public class SequentialKeyGenerator : IKeyGenerator
4+
{
5+
private int _currentScenarioNumber = 1;
6+
private int _currentStepNumber = 1;
7+
8+
public string GetScenarioId()
9+
{
10+
var id = string.Format("scenario-{0}", _currentScenarioNumber);
11+
_currentScenarioNumber++;
12+
_currentStepNumber = 1;
13+
return id;
14+
}
15+
16+
public string GetStepId()
17+
{
18+
var id = string.Format("step-{0}-{1}", _currentScenarioNumber, _currentStepNumber);
19+
_currentStepNumber++;
20+
return id;
21+
}
22+
23+
public void Reset()
24+
{
25+
_currentScenarioNumber = 1;
26+
_currentStepNumber = 1;
27+
}
28+
}
29+
}

TestStack.BDDfy/Reporters/Html/HtmlReportBuilder.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@ namespace TestStack.BDDfy.Reporters.Html
66
{
77
public class HtmlReportBuilder : IReportBuilder
88
{
9+
private Func<DateTime> _dateProvider = () => DateTime.Now;
910
private HtmlReportViewModel _viewModel;
1011
readonly StringBuilder _html;
1112
const int TabIndentation = 2;
1213
int _tabCount;
1314

14-
public HtmlReportBuilder()
15+
public HtmlReportBuilder()
1516
{
1617
_html = new StringBuilder();
1718
}
@@ -128,7 +129,7 @@ private void ResultDetails()
128129
}
129130
}
130131

131-
AddLine(string.Format("<p><span>Tested at: {0}</span></p>", DateTime.Now));
132+
AddLine(string.Format("<p><span>Tested at: {0}</span></p>", _dateProvider()));
132133
}
133134
}
134135

@@ -296,5 +297,11 @@ private void AddHtmlComment(string htmlComment)
296297
_html.AppendFormat("/*{0}*/", htmlComment);
297298
_html.AppendLine();
298299
}
300+
301+
public Func<DateTime> DateProvider
302+
{
303+
get { return _dateProvider; }
304+
set { _dateProvider = value; }
305+
}
299306
}
300307
}

TestStack.BDDfy/Scenario.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using System.Reflection;
5+
using TestStack.BDDfy.Configuration;
56

67
namespace TestStack.BDDfy
78
{
@@ -11,15 +12,15 @@ public Scenario(object testObject, IEnumerable<Step> steps, string scenarioText)
1112
{
1213
TestObject = testObject;
1314
_steps = steps.OrderBy(o => o.ExecutionOrder).ThenBy(o => o.ExecutionSubOrder).ToList();
14-
Id = Guid.NewGuid();
15+
Id = Configurator.IdGenerator.GetScenarioId();
1516

1617
Title = scenarioText;
1718
}
1819

1920
public string Title { get; private set; }
2021
public TimeSpan Duration { get { return new TimeSpan(_steps.Sum(x => x.Duration.Ticks)); } }
2122
public object TestObject { get; internal set; }
22-
public Guid Id { get; private set; }
23+
public string Id { get; private set; }
2324

2425
private readonly List<Step> _steps;
2526
public List<Step> Steps

0 commit comments

Comments
 (0)