public void Default_parser_is_replaced()
        {
            const string fakeUrl          = "https://api.tfl.gov.uk/fake";
            const string fakeJsonResponse = "fake json response";
            const string fakeRoadId       = "fakeRoadId";
            const string fakeDisplayName  = "fake display name";
            const string fakeSeverity     = "fake severity";
            const string fakeDescription  = "fake description";

            string FakeResourceReader(Uri _) => fakeJsonResponse;

            var fakeRoadStatus = new RoadStatus(fakeRoadId, fakeDisplayName, fakeSeverity, fakeDescription);

            RoadStatusResult FakeParser(string _) => new RoadStatusResult(fakeRoadStatus);

            var reader =
                new RoadStatusReader(fakeUrl)
                .ParseWith(FakeParser)
                .GetWith(FakeResourceReader);

            var result = reader.GetResult(fakeRoadId);

            Assert.Equal(ExitCodes.Success, result.Status);
            Assert.Equal(fakeRoadId, result.Road.Id);
            Assert.Equal(fakeDisplayName, result.Road.DisplayName);
            Assert.Equal(fakeSeverity, result.Road.StatusSeverity);
            Assert.Equal(fakeDescription, result.Road.StatusSeverityDescription);
        }
        public void Random_error_throws_handled_exception()
        {
            const string fakeUrl          = "https://api.tfl.gov.uk/fake";
            const string fakeRoadId       = "fakeRoadId";
            const string fakeErrorMessage = "fake error message";

            string FakeResourceReader(Uri _) => throw new Exception(fakeErrorMessage);

            var reader =
                new RoadStatusReader(fakeUrl)
                .GetWith(FakeResourceReader);

            var result = reader.GetResult(fakeRoadId);

            Assert.Equal(ExitCodes.Unexpected, result.Status);
            Assert.Equal(fakeErrorMessage, result.ErrorMessage);
            Assert.Null(result.Road?.Id);
        }
        public void Road_not_found_throws_handled_web_exception()
        {
            const string fakeUrl          = "https://api.tfl.gov.uk/fake";
            const string fakeRoadId       = "fakeRoadId";
            const string fakeErrorMessage = "fake error message";

            string FakeResourceReader(Uri _) => throw new WebException(fakeErrorMessage);
            HttpStatusCode?GetHttpStatusCode(WebException _) => HttpStatusCode.NotFound;

            RoadStatusReader.WebExceptionToHttpStatusCode = GetHttpStatusCode;

            var reader =
                new RoadStatusReader(fakeUrl)
                .GetWith(FakeResourceReader);

            var result = reader.GetResult(fakeRoadId);

            Assert.Equal(ExitCodes.InvalidRoad, result.Status);
            Assert.Equal(fakeErrorMessage, result.ErrorMessage);
            Assert.Equal(fakeRoadId, result.Road.Id);
        }