diff --git a/src/Alba.Testing/Acceptance/asserting_against_status_code.cs b/src/Alba.Testing/Acceptance/asserting_against_status_code.cs index 35b21fb9..e511e9d8 100644 --- a/src/Alba.Testing/Acceptance/asserting_against_status_code.cs +++ b/src/Alba.Testing/Acceptance/asserting_against_status_code.cs @@ -69,5 +69,53 @@ public async Task happily_blows_up_on_an_unexpected_500() ex.Message.ShouldContain("Expected status code 200, but was 500"); ex.Message.ShouldContain("the error text"); } + + [Fact] + public async Task using_scenario_with_StatusCodeShouldBeSuccess_happy_path() + { + router.Handlers["/one"] = c => + { + c.Response.StatusCode = 204; + c.Response.ContentType("text/plain"); + c.Response.Write("Some text"); + + return Task.CompletedTask; + }; + + var ex = await Exception.ShouldBeThrownBy(() => + { + return host.Scenario(x => + { + x.Get.Url("/one"); + x.StatusCodeShouldBeSuccess(); + }); + }); + + } + + [Fact] + public async Task using_scenario_with_StatusCodeShouldBeSuccess_sad_path() + { + router.Handlers["/one"] = c => + { + c.Response.StatusCode = 500; + c.Response.ContentType("text/plain"); + c.Response.Write("Some text"); + + return Task.CompletedTask; + }; + + var ex = await Exception.ShouldBeThrownBy(() => + { + return host.Scenario(x => + { + x.Get.Url("/one"); + x.StatusCodeShouldBeSuccess(); + }); + }); + + ex.Message.ShouldContain("Expected status code 200, but was 500"); + } + } } \ No newline at end of file diff --git a/src/Alba.Testing/Assertions/StatusCodeSuccessAssertionTests.cs b/src/Alba.Testing/Assertions/StatusCodeSuccessAssertionTests.cs new file mode 100644 index 00000000..e16f311f --- /dev/null +++ b/src/Alba.Testing/Assertions/StatusCodeSuccessAssertionTests.cs @@ -0,0 +1,69 @@ +using Alba.Assertions; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace Alba.Testing.Assertions +{ + public class StatusCodeSuccessAssertionTests + { + [Theory] + [ClassData(typeof(SuccessStatusCodes))] + public void HappyPath(int statusCode) + { + var assertion = new StatusCodeSuccessAssertion(); + + AssertionRunner.Run(assertion, _ => _.StatusCode(statusCode)) + .AssertAll(); + } + + [Theory] + [ClassData(typeof(FailureStatusCodes))] + public void SadPath(int statusCode) + { + var assertion = new StatusCodeSuccessAssertion(); + + AssertionRunner.Run(assertion, _ => _.StatusCode(statusCode)) + .SingleMessageShouldBe($"Expected a status code between 200 and 299, but was {statusCode}"); + } + } + + + +} + +public class SuccessStatusCodes : IEnumerable +{ + public IEnumerator GetEnumerator() + { + foreach (var code in Enumerable.Range(200, 99)) + { + yield return new object[] { code }; + } + } + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + +} + +public class FailureStatusCodes : IEnumerable +{ + public IEnumerator GetEnumerator() + { + foreach (var code in Enumerable.Range(100, 99)) + { + yield return new object[] { code }; + } + foreach (var code in Enumerable.Range(300, 200)) + { + yield return new object[] { code }; + } + } + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + +} \ No newline at end of file diff --git a/src/Alba/Assertions/StatusCodeSuccessAssertion.cs b/src/Alba/Assertions/StatusCodeSuccessAssertion.cs new file mode 100644 index 00000000..838c99ba --- /dev/null +++ b/src/Alba/Assertions/StatusCodeSuccessAssertion.cs @@ -0,0 +1,22 @@ +using Microsoft.AspNetCore.Http; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Alba.Assertions +{ + public class StatusCodeSuccessAssertion : IScenarioAssertion + { + public void Assert(Scenario scenario, HttpContext context, ScenarioAssertionException ex) + { + var statusCode = context.Response.StatusCode; + if(statusCode < 200 || statusCode >= 300) + { + ex.Add($"Expected a status code between 200 and 299, but was {statusCode}"); + ex.ReadBody(context); + } + } + } +} diff --git a/src/Alba/ScenarioExpectationsExtensions.cs b/src/Alba/ScenarioExpectationsExtensions.cs index 58517321..4a46239e 100644 --- a/src/Alba/ScenarioExpectationsExtensions.cs +++ b/src/Alba/ScenarioExpectationsExtensions.cs @@ -50,6 +50,16 @@ public static Scenario StatusCodeShouldBeOk(this Scenario scenario) return scenario.StatusCodeShouldBe(HttpStatusCode.OK); } + /// + /// Assert tha the Http Status Code is between 200 and 299 + /// + /// + /// + public static Scenario StatusCodeShouldBeSuccess(this Scenario scenario) + { + return scenario.AssertThat(new StatusCodeSuccessAssertion()); + } + /// /// Assert that the content-type header value of the Http response /// matches the expected value