public void Can_Deserialize_ProblemDetails_With_Extensions()
        {
            // given
            var problem = New.ProblemDetails.ProblemDetailsWithExtensions();
            var json    = JsonProblemDetailsConverter.Serialize(problem);

            // when
            var actual = JsonProblemDetailsConverter.Deserialize(json);

            // then
            actual.Should().BeEquivalentTo(problem);
        }
        public void Can_Deserialize_Custom_ProblemDetails()
        {
            // given
            var problem = New.ProblemDetails.CustomProblemDetails();
            var json    = JsonProblemDetailsConverter.Serialize(problem);

            // when
            var actual = JsonProblemDetailsConverter.Deserialize <CustomProblemDetails>(json);

            // then
            actual.Should().BeEquivalentTo(problem);
        }
        public async Task <HttpResponseMessage> Of <T>(T problem)
            where T : Microsoft.AspNetCore.Mvc.ProblemDetails
        {
            var mockHttp = new MockHttpMessageHandler();
            var content  = JsonProblemDetailsConverter.Serialize(problem);

            mockHttp.When("https://whatever-url")
            .Respond(HttpStatusCode.BadRequest, HttpContentExtensions.ProblemDetailsMediaType, content);

            var request = new HttpRequestMessage(HttpMethod.Get, "https://whatever-url");

            return(await mockHttp.ToHttpClient().SendAsync(request));
        }
        public void Can_Serialize_Custom_ProblemDetails()
        {
            // given
            var problem = New.ProblemDetails.CustomProblemDetails();

            // when
            var actualJson = JsonProblemDetailsConverter.Serialize(problem);

            // then
            var expectedJson =
                $"{{\"stringField\":\"{problem.StringField}\",\"intField\":{problem.IntField},\"type\":\"{problem.Type}\","
                + $"\"title\":\"{problem.Title}\",\"status\":{problem.Status},\"detail\":\"{problem.Detail}\"}}";

            actualJson.Should().Be(expectedJson);
        }
        public void Can_Deserialize_ProblemDetails_With_Nested_Extensions()
        {
            // given
            var problem = New.ProblemDetails.ProblemDetailsWithExtensions();

            var json =
                $"{{\"type\":\"{problem.Type}\",\"title\":\"{problem.Title}\",\"status\":{problem.Status}" +
                $",\"detail\":\"{problem.Detail}\",\"intField\":{problem.Extensions["intField"]}" +
                $",\"extensions\":{{\"stringField\":\"{problem.Extensions["stringField"]}\"}}}}";

            // when
            var actual = JsonProblemDetailsConverter.Deserialize <MvcProblemDetails>(json);

            // then
            actual.Should().BeEquivalentTo(problem);
        }
        public void Can_Serialize_ProblemDetails_With_Extensions()
        {
            // given
            var problem = New.ProblemDetails.ProblemDetailsWithExtensions();

            // when
            var actualJson = JsonProblemDetailsConverter.Serialize(problem);

            // then
            var expectedJson =
                $"{{\"type\":\"{problem.Type}\",\"title\":\"{problem.Title}\",\"status\":{problem.Status}," +
                $"\"detail\":\"{problem.Detail}\",\"stringField\":\"{problem.Extensions["stringField"]}\"" +
                $",\"intField\":{problem.Extensions["intField"]}}}";

            actualJson.Should().Be(expectedJson);
        }
        public void Can_Serialize_ValidationProblemDetails()
        {
            // given
            var problem = New.ProblemDetails.ValidationProblemDetails();

            // when
            var actualJson = JsonProblemDetailsConverter.Serialize(problem);

            // then
            var validationJson =
                $"{{\"Reference\":[\"{problem.Errors["Reference"][0]}\"],\"AccountNumber\":[\"{problem.Errors["AccountNumber"][0]}\"]}}";
            var expectedJson =
                $"{{\"type\":\"{problem.Type}\",\"title\":\"{problem.Title}\",\"status\":{problem.Status}," +
                $"\"detail\":\"{problem.Detail}\",\"errors\":{validationJson}}}";

            actualJson.Should().Be(expectedJson);
        }
        public void Cannot_Fully_Deserialize_Custom_ProblemDetails_With_Extensions()
        {
            // given
            var problem = New.ProblemDetails.CustomProblemDetailsWithExtensions();
            var json    = JsonProblemDetailsConverter.Serialize(problem);

            // when
            var actual = JsonProblemDetailsConverter.Deserialize <CustomProblemDetails>(json);

            // then
            var expected = new CustomProblemDetails
            {
                IntField    = problem.IntField,
                StringField = problem.StringField
            };

            problem.CopyStandardFieldsTo(expected);
            actual.Should().BeEquivalentTo(expected);
        }
        public void Can_Deserialize_ProblemDetails_With_Extensions_To_CustomProblemDetails()
        {
            // given
            var problem = New.ProblemDetails.ProblemDetailsWithExtensions();
            var json    = JsonProblemDetailsConverter.Serialize(problem);

            // when
            var actual = JsonProblemDetailsConverter.Deserialize <CustomProblemDetails>(json);

            // then
            var expected = new CustomProblemDetails
            {
                IntField    = (int)problem.Extensions["intField"],
                StringField = (string)problem.Extensions["stringField"]
            };

            problem.CopyStandardFieldsTo(expected);
            actual.Should().BeEquivalentTo(expected);
        }