PageRenderTime 29ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 1ms

/Tests/TechTalk.SpecFlow.RuntimeTests/CucumberMessages/CucumberMessageFactoryTests.cs

http://github.com/techtalk/SpecFlow
C# | 378 lines | 261 code | 60 blank | 57 comment | 0 complexity | ce7fee25aebbb31173e3b34a6ad83d9d MD5 | raw file
Possible License(s): BSD-3-Clause, GPL-2.0
  1. using System;
  2. using FluentAssertions;
  3. using Google.Protobuf.WellKnownTypes;
  4. using Io.Cucumber.Messages;
  5. using TechTalk.SpecFlow.CommonModels;
  6. using TechTalk.SpecFlow.CucumberMessages;
  7. using TechTalk.SpecFlow.TestProjectGenerator.CucumberMessages;
  8. using Xunit;
  9. using static Io.Cucumber.Messages.TestResult.Types;
  10. using static Io.Cucumber.Messages.TestCaseStarted.Types;
  11. using Duration = Io.Cucumber.Messages.Duration;
  12. using Timestamp = Io.Cucumber.Messages.Timestamp;
  13. namespace TechTalk.SpecFlow.RuntimeTests.CucumberMessages
  14. {
  15. public class CucumberMessageFactoryTests
  16. {
  17. [Fact(DisplayName = @"BuildTestRunResultMessage should return a TestRunResult message object")]
  18. public void BuildTestRunResultMessage_DateTime_ShouldReturnTestRunResultMessageObject()
  19. {
  20. // ARRANGE
  21. var cucumberMessageFactory = new CucumberMessageFactory();
  22. var dateTime = new DateTime(2019, 5, 9, 14, 27, 48, DateTimeKind.Utc);
  23. // ACT
  24. var actualTestRunStartedMessageResult = cucumberMessageFactory.BuildTestRunStartedMessage(dateTime);
  25. // ASSERT
  26. actualTestRunStartedMessageResult.Should().BeAssignableTo<ISuccess<TestRunStarted>>();
  27. }
  28. [Fact(DisplayName = @"BuildTestRunResultMessage should return a TestRunResult message object with the specified date and time")]
  29. public void BuildTestRunResultMessage_DateTime_ShouldReturnTestRunResultMessageObjectWithSpecifiedDateAndTime()
  30. {
  31. // ARRANGE
  32. var cucumberMessageFactory = new CucumberMessageFactory();
  33. var dateTime = new DateTime(2019, 5, 9, 14, 27, 48, DateTimeKind.Utc);
  34. // ACT
  35. var actualTestRunStartedMessageResult = cucumberMessageFactory.BuildTestRunStartedMessage(dateTime);
  36. // ASSERT
  37. actualTestRunStartedMessageResult.Should().BeAssignableTo<ISuccess<TestRunStarted>>()
  38. .Which.Result.Timestamp.ToDateTime().Should().Be(dateTime);
  39. }
  40. [Theory(DisplayName = @"BuildTestCaseStarted should return a failure when a non-UTC date has been specified")]
  41. [InlineData(DateTimeKind.Local)]
  42. [InlineData(DateTimeKind.Unspecified)]
  43. public void BuildTestRunResultMessage_NonUtcDate_ShouldReturnFailure(DateTimeKind dateTimeKind)
  44. {
  45. // ARRANGE
  46. var cucumberMessageFactory = new CucumberMessageFactory();
  47. var dateTime = new DateTime(2019, 5, 9, 14, 27, 48, dateTimeKind);
  48. var pickleId = Guid.NewGuid();
  49. var platform = new Platform
  50. {
  51. Cpu = "x64",
  52. Implementation = "SpecFlow",
  53. Os = "Windows",
  54. Version = "3.1.0"
  55. };
  56. // ACT
  57. var result = cucumberMessageFactory.BuildTestCaseStartedMessage(pickleId, dateTime, platform);
  58. // ASSERT
  59. result.Should().BeAssignableTo<IFailure>();
  60. }
  61. [Fact(DisplayName = @"BuildTestCaseStarted should return a message with the correct pickle ID")]
  62. public void BuildTestCaseStarted_ValidData_ShouldReturnMessageWithCorrectPickleId()
  63. {
  64. // ARRANGE
  65. var cucumberMessageFactory = new CucumberMessageFactory();
  66. var dateTime = new DateTime(2019, 5, 9, 14, 27, 48, DateTimeKind.Utc);
  67. var pickleId = Guid.NewGuid();
  68. var platform = new Platform
  69. {
  70. Cpu = "x64",
  71. Implementation = "SpecFlow",
  72. Os = "Windows",
  73. Version = "3.1.0"
  74. };
  75. // ACT
  76. var result = cucumberMessageFactory.BuildTestCaseStartedMessage(pickleId, dateTime, platform);
  77. // ASSERT
  78. result.Should().BeAssignableTo<ISuccess<TestCaseStarted>>().Which
  79. .Result.PickleId.Should().Be(pickleId.ToString("D"));
  80. }
  81. [Fact(DisplayName = @"BuildTestCaseStarted should return a success when a UTC date has been specified")]
  82. public void BuildTestCaseStarted_UtcDate_ShouldReturnSuccess()
  83. {
  84. // ARRANGE
  85. var cucumberMessageFactory = new CucumberMessageFactory();
  86. var dateTime = new DateTime(2019, 5, 9, 14, 27, 48, DateTimeKind.Utc);
  87. var pickleId = Guid.NewGuid();
  88. var platform = new Platform
  89. {
  90. Cpu = "x64",
  91. Implementation = "SpecFlow",
  92. Os = "Windows",
  93. Version = "3.1.0"
  94. };
  95. // ACT
  96. var result = cucumberMessageFactory.BuildTestCaseStartedMessage(pickleId, dateTime, platform);
  97. // ASSERT
  98. result.Should().BeAssignableTo<ISuccess<TestCaseStarted>>();
  99. }
  100. [Fact(DisplayName = @"BuildTestCaseStarted should return a success when the platform information has been specified")]
  101. public void BuildTestCaseStarted_PlatformInformation_ShouldReturnSuccess()
  102. {
  103. // ARRANGE
  104. var cucumberMessageFactory = new CucumberMessageFactory();
  105. var dateTime = new DateTime(2019, 5, 9, 14, 27, 48, DateTimeKind.Utc);
  106. var pickleId = Guid.NewGuid();
  107. var platform = new Platform
  108. {
  109. Cpu = "x64",
  110. Implementation = "SpecFlow",
  111. Os = "Windows",
  112. Version = "3.1.0"
  113. };
  114. // ACT
  115. var result = cucumberMessageFactory.BuildTestCaseStartedMessage(pickleId, dateTime, platform);
  116. // ASSERT
  117. result.Should().BeAssignableTo<ISuccess<TestCaseStarted>>()
  118. .Which.Result.Platform.Should().BeEquivalentTo(platform);
  119. }
  120. [Fact(DisplayName = @"BuildTestCaseStarted should return a failure when the platform information is null")]
  121. public void BuildTestCaseStarted_PlatformInformationIsNull_ShouldReturnFailue()
  122. {
  123. // ARRANGE
  124. var cucumberMessageFactory = new CucumberMessageFactory();
  125. var dateTime = new DateTime(2019, 5, 9, 14, 27, 48, DateTimeKind.Utc);
  126. var pickleId = Guid.NewGuid();
  127. // ACT
  128. var result = cucumberMessageFactory.BuildTestCaseStartedMessage(pickleId, dateTime, null);
  129. // ASSERT
  130. result.Should().BeAssignableTo<IFailure>();
  131. }
  132. [Fact(DisplayName = @"BuildTestCaseFinished should return a message with the correct pickle ID")]
  133. public void BuildTestCaseFinished_PickleId_ShouldReturnMessageWithCorrectPickleId()
  134. {
  135. // ARRANGE
  136. var cucumberMessageFactory = new CucumberMessageFactory();
  137. var dateTime = new DateTime(2019, 5, 9, 14, 27, 48, DateTimeKind.Utc);
  138. var pickleId = Guid.NewGuid();
  139. var testResult = new TestResult
  140. {
  141. Duration = new Duration(){},
  142. Message = "",
  143. Status = Status.Passed
  144. };
  145. // ACT
  146. var result = cucumberMessageFactory.BuildTestCaseFinishedMessage(pickleId, dateTime, testResult);
  147. // ASSERT
  148. result.Should().BeAssignableTo<ISuccess<TestCaseFinished>>().Which
  149. .Result.PickleId.Should().Be(pickleId.ToString("D"));
  150. }
  151. [Fact(DisplayName = @"BuildTestCaseFinished should return a message with the correct time stamp when a UTC time stamp is passed")]
  152. public void BuildTestCaseFinished_UtcDateTime_ShouldReturnMessageWithCorrectTimeStamp()
  153. {
  154. // ARRANGE
  155. var cucumberMessageFactory = new CucumberMessageFactory();
  156. var dateTime = new DateTime(2019, 5, 9, 14, 27, 48, DateTimeKind.Utc);
  157. var pickleId = Guid.NewGuid();
  158. var testResult = new TestResult
  159. {
  160. Duration = new Duration(),
  161. Message = "",
  162. Status = Status.Passed
  163. };
  164. // ACT
  165. var result = cucumberMessageFactory.BuildTestCaseFinishedMessage(pickleId, dateTime, testResult);
  166. // ASSERT
  167. result.Should().BeAssignableTo<ISuccess<TestCaseFinished>>().Which
  168. .Result.Timestamp.ToDateTime().Should().Be(dateTime);
  169. }
  170. [Theory(DisplayName = @"BuildTestCaseFinished should return a failure when a non-UTC time stamp is passed")]
  171. [InlineData(DateTimeKind.Local)]
  172. [InlineData(DateTimeKind.Unspecified)]
  173. public void BuildTestCaseFinished_NonUtcDateTime_ShouldReturnFailure(DateTimeKind dateTimeKind)
  174. {
  175. // ARRANGE
  176. var cucumberMessageFactory = new CucumberMessageFactory();
  177. var dateTime = new DateTime(2019, 5, 9, 14, 27, 48, dateTimeKind);
  178. var pickleId = Guid.NewGuid();
  179. var testResult = new TestResult
  180. {
  181. Duration = new Duration(),
  182. Message = "",
  183. Status = Status.Passed
  184. };
  185. // ACT
  186. var result = cucumberMessageFactory.BuildTestCaseFinishedMessage(pickleId, dateTime, testResult);
  187. // ASSERT
  188. result.Should().BeAssignableTo<IFailure<TestCaseFinished>>();
  189. }
  190. [Fact(DisplayName = @"BuildTestCaseFinished should return a message with the correct TestResult")]
  191. public void BuildTestCaseFinished_TestResult_ShouldReturnMessageWithCorrectTestResult()
  192. {
  193. // ARRANGE
  194. var cucumberMessageFactory = new CucumberMessageFactory();
  195. var dateTime = new DateTime(2019, 5, 9, 14, 27, 48, DateTimeKind.Utc);
  196. var pickleId = Guid.NewGuid();
  197. var testResult = new TestResult
  198. {
  199. Duration = new Duration() { },
  200. Message = "",
  201. Status = Status.Passed
  202. };
  203. // ACT
  204. var result = cucumberMessageFactory.BuildTestCaseFinishedMessage(pickleId, dateTime, testResult);
  205. // ASSERT
  206. result.Should().BeAssignableTo<ISuccess<TestCaseFinished>>().Which
  207. .Result.TestResult.Should().Be(testResult);
  208. }
  209. [Fact(DisplayName = @"BuildTestCaseFinished should return a failure with exception information when null has been specified as TestResult")]
  210. public void BuildTestCaseFinished_NullTestResult_ShouldReturnExceptionFailure()
  211. {
  212. // ARRANGE
  213. var cucumberMessageFactory = new CucumberMessageFactory();
  214. var dateTime = new DateTime(2019, 5, 9, 14, 27, 48, DateTimeKind.Utc);
  215. var pickleId = Guid.NewGuid();
  216. // ACT
  217. var result = cucumberMessageFactory.BuildTestCaseFinishedMessage(pickleId, dateTime, default);
  218. // ASSERT
  219. result.Should().BeAssignableTo<ExceptionFailure<TestCaseFinished>>().Which
  220. .Exception.Should().BeOfType<ArgumentNullException>();
  221. }
  222. [Fact(DisplayName = @"BuildEnvelopeMessage should return an envelope of type TestCaseFinished")]
  223. public void BuildEnvelopeMessage_TestCaseFinishedSuccess_ShouldReturnEnvelopeOfTypeTestCaseFinished()
  224. {
  225. // ARRANGE
  226. var cucumberMessageFactory = new CucumberMessageFactory();
  227. var testCaseFinished = new TestCaseFinished
  228. {
  229. PickleId = Guid.NewGuid().ToString(),
  230. TestResult = new TestResult(),
  231. Timestamp = new Timestamp()
  232. };
  233. // ACT
  234. var result = cucumberMessageFactory.BuildEnvelopeMessage(new Success<TestCaseFinished>(testCaseFinished));
  235. // ASSERT
  236. result.Should().BeAssignableTo<ISuccess<Envelope>>().Which
  237. .Result.MessageCase.Should().Be(Envelope.MessageOneofCase.TestCaseFinished);
  238. }
  239. [Fact(DisplayName = @"BuildEnvelopeMessage should return an envelope with the passed TestCaseFinished message")]
  240. public void BuildEnvelopeMessage_TestCaseFinishedSuccess_ShouldReturnEnvelopeWithTestCaseFinishedMessage()
  241. {
  242. // ARRANGE
  243. var cucumberMessageFactory = new CucumberMessageFactory();
  244. var testCaseFinished = new TestCaseFinished
  245. {
  246. PickleId = Guid.NewGuid().ToString(),
  247. TestResult = new TestResult(),
  248. Timestamp = new Timestamp()
  249. };
  250. // ACT
  251. var result = cucumberMessageFactory.BuildEnvelopeMessage(new Success<TestCaseFinished>(testCaseFinished));
  252. // ASSERT
  253. result.Should().BeAssignableTo<ISuccess<Envelope>>().Which
  254. .Result.TestCaseFinished.Should().Be(testCaseFinished);
  255. }
  256. [Fact(DisplayName = @"BuildTestRunFinishedMessage should return a TestRunFinished message")]
  257. public void BuildTestRunFinished_Success_ShouldReturnTestRunFinishedMessage()
  258. {
  259. // ARRANGE
  260. var cucumberMessageFactory = new CucumberMessageFactory();
  261. var dateTime = new DateTime(2019, 5, 9, 14, 27, 48, DateTimeKind.Utc);
  262. // ACT
  263. var result = cucumberMessageFactory.BuildTestRunFinishedMessage(true, dateTime);
  264. // ASSERT
  265. result.Should().BeAssignableTo<ISuccess<TestRunFinished>>();
  266. }
  267. [Theory(DisplayName = @"BuildTestRunFinishedMessage should return a TestRunFinished message with the specified success value")]
  268. [InlineData(true, true)]
  269. [InlineData(false, false)]
  270. public void BuildTestRunFinished_SuccessValue_ShouldReturnTestRunFinishedMessageWithSpecifiedSuccessValue(bool inputSuccess, bool expectedSuccess)
  271. {
  272. // ARRANGE
  273. var cucumberMessageFactory = new CucumberMessageFactory();
  274. var dateTime = new DateTime(2019, 5, 9, 14, 27, 48, DateTimeKind.Utc);
  275. // ACT
  276. var result = cucumberMessageFactory.BuildTestRunFinishedMessage(inputSuccess, dateTime);
  277. // ASSERT
  278. result.Should().BeAssignableTo<ISuccess<TestRunFinished>>().Which
  279. .Result.Success.Should().Be(expectedSuccess);
  280. }
  281. [Theory]
  282. [InlineData(DateTimeKind.Local)]
  283. [InlineData(DateTimeKind.Unspecified)]
  284. public void BuildTestRunFinished_DateTimeWithInvalidKind_ShouldReturnFailure(DateTimeKind dateTimeKind)
  285. {
  286. // ARRANGE
  287. var cucumberMessageFactory = new CucumberMessageFactory();
  288. var dateTime = new DateTime(2019, 5, 9, 14, 27, 48, dateTimeKind);
  289. // ACT
  290. var result = cucumberMessageFactory.BuildTestRunFinishedMessage(true, dateTime);
  291. // ASSERT
  292. result.Should().BeAssignableTo<IFailure<TestRunFinished>>();
  293. }
  294. [Fact]
  295. public void BuildTestRunFinished_UtcDateTime_ShouldReturnSuccess()
  296. {
  297. // ARRANGE
  298. var cucumberMessageFactory = new CucumberMessageFactory();
  299. var dateTime = new DateTime(2019, 5, 9, 14, 27, 48, DateTimeKind.Utc);
  300. // ACT
  301. var result = cucumberMessageFactory.BuildTestRunFinishedMessage(true, dateTime);
  302. // ASSERT
  303. result.Should().BeAssignableTo<ISuccess<TestRunFinished>>();
  304. }
  305. [Fact]
  306. public void BuildTestRunFinished_UtcDateTime_ShouldReturnSuccessWithSpecifiedTimeStamp()
  307. {
  308. // ARRANGE
  309. var cucumberMessageFactory = new CucumberMessageFactory();
  310. var dateTime = new DateTime(2019, 5, 9, 14, 27, 48, DateTimeKind.Utc);
  311. // ACT
  312. var result = cucumberMessageFactory.BuildTestRunFinishedMessage(true, dateTime);
  313. // ASSERT
  314. result.Should().BeAssignableTo<ISuccess<TestRunFinished>>()
  315. .Which.Result.Timestamp.ToDateTime().Should().Be(dateTime);
  316. }
  317. }
  318. }