public async Task Get_OptionalRouteParameter_ItCanBeOmitted() { using var sut = new ApiStub(); sut.Get( "/testget/{arg:string?}", (req, args) => "testresponse"); sut.Start(); var result = await httpClient.GetAsync( new UriBuilder(new Uri(sut.Address)) { Path = "/testget" }.Uri); Assert.Equal(HttpStatusCode.OK, result.StatusCode); var resultString = await result.Content.ReadAsStringAsync(); Assert.Equal("testresponse", resultString); }
public async Task Get_RouteParameterWithDefaultValue_DefaultValueReturned() { using var sut = new ApiStub(); sut.Get( "/testget/{arg:string=apple}", (req, args) => $"testresponse arg: {args.Route.arg}"); sut.Start(); var result = await httpClient.GetAsync( new UriBuilder(new Uri(sut.Address)) { Path = "/testget" }.Uri); Assert.Equal(HttpStatusCode.OK, result.StatusCode); var resultString = await result.Content.ReadAsStringAsync(); Assert.Equal("testresponse arg: apple", resultString); }
public async Task Get_MultipleRouteAndQueryParameters_AllParameterAvailable() { using var sut = new ApiStub(); sut.Get( "/testget/{arg1}/part/{arg2}", (req, args) => $"testresponse arg1: {args.Route.arg1} arg2: {args.Route.arg2} qarg1: {args.Query.qarg1} qarg2: {args.Query.qarg2}"); sut.Start(); var result = await httpClient.GetAsync( new UriBuilder(new Uri(sut.Address)) { Path = "/testget/orange/part/apple", Query = "?qarg1=melon&qarg2=pear" }.Uri); Assert.Equal(HttpStatusCode.OK, result.StatusCode); var resultString = await result.Content.ReadAsStringAsync(); Assert.Equal("testresponse arg1: orange arg2: apple qarg1: melon qarg2: pear", resultString); }
public async Task Get_CalledQueryString_QueryParameterAvailable() { using var sut = new ApiStub(); sut.Get( "/testget", (req, args) => $"testresponse arg: {args.Query.myArg}"); sut.Start(); var result = await httpClient.GetAsync( new UriBuilder(new Uri(sut.Address)) { Path = "/testget", Query = "?myArg=orange" }.Uri); Assert.Equal(HttpStatusCode.OK, result.StatusCode); var resultString = await result.Content.ReadAsStringAsync(); Assert.Equal("testresponse arg: orange", resultString); }
public async Task Get_CalledSetupRoute_RouteDataAvailable() { using var sut = new ApiStub(); sut.Get( "/testget/{myArg}", (req, args) => $"testresponse arg: {args.Route.myArg}"); sut.Start(); var result = await httpClient.GetAsync( new UriBuilder(new Uri(sut.Address)) { Path = "/testget/orange" }.Uri); Assert.Equal(HttpStatusCode.OK, result.StatusCode); var resultString = await result.Content.ReadAsStringAsync(); Assert.Equal("testresponse arg: orange", resultString); }
public void NetatmoUnitCurrentReadingDataCouldNoBeRead() { string responseText = "{ \"access_token\":\"544cf4071c7759831d94cdf9|fcb30814afbffd0e39381e74fe38a59a\",\"refresh_token\":\"544cf4071c7759831d94cdf9|2b2c270c1208e8f67d3bd3891e395e1a\",\"scope\":[\"read_station\"],\"expires_in\":10800,\"expire_in\":10800}"; //string deviceResponse = File.ReadAllText(fileDir + "netatmodeviceresponse.json"); string deviceResponse = netatmoData; ApiStub apiNetatmoStub = new ApiStub(); apiNetatmoStub.Post( "/oauth2/token", (request, args) => { return(responseText); } ); apiNetatmoStub.Get( "/api/devicelist", (request, response) => { return(deviceResponse); } ); string responseReading = null; apiNetatmoStub.Get( "/api/getmeasure", (request, args) => { return(responseReading); } ); apiNetatmoStub.Start(); AppKeyConfig configs = new AppKeyConfig(); configs.NetatmoHost = apiNetatmoStub.Address; ClimateItem actualReading = netatmoUnit.CurrentReading(configs); Assert.Null(actualReading); }
public async Task IfAccept_CustomNotMatchinAcceptCondition_NotFoundReturned() { using (var sut = new ApiStub()) { sut.Get("/testget", (req, args) => "testresponse") .IfAccept(accept => accept.Contains("does not contain")); sut.Start(); var requestMessage = new HttpRequestMessage(HttpMethod.Get, new UriBuilder(new Uri(sut.Address)) { Path = "/testget" }.Uri); requestMessage.Headers.Add("Accept", "custom/stubbery"); var result = await httpClient.SendAsync(requestMessage); Assert.Equal(HttpStatusCode.NotFound, result.StatusCode); } }
public async Task Post_BodyPassed_BodyAvailable() { using var sut = new ApiStub(); sut.Post( "/testpost", (req, args) => $"testresponse body: {args.Body.ReadAsString()}"); sut.Start(); var result = await httpClient.PostAsync( new UriBuilder(new Uri(sut.Address)) { Path = "/testpost" }.Uri, new StringContent("orange")); Assert.Equal(HttpStatusCode.OK, result.StatusCode); var resultString = await result.Content.ReadAsStringAsync(); Assert.Equal("testresponse body: orange", resultString); }
public async Task Put_CalledSetupRouteWithFluentMethod_SetupResponseReturned() { using var sut = new ApiStub(); sut.Put() .IfRoute("/testput") .Response((req, args) => "testresponse"); sut.Start(); var result = await httpClient.PutAsync( new UriBuilder(new Uri(sut.Address)) { Path = "/testput" }.Uri, new StringContent("")); Assert.Equal(HttpStatusCode.OK, result.StatusCode); var resultString = await result.Content.ReadAsStringAsync(); Assert.Equal("testresponse", resultString); }
public async Task IfHeaders_CustomTwoHeaderConditionsAndHeadersNotPresent_NotFoundReturned() { using var sut = new ApiStub(); sut .Get("/testget", (req, args) => "testresponse") .IfHeaders(headers => headers["HeaderTest1"] == "headerValue1" && headers["HeaderTest2"] == "headerValue2"); sut.Start(); var requestMessage = new HttpRequestMessage(HttpMethod.Get, new UriBuilder(new Uri(sut.Address)) { Path = "/testget" }.Uri); requestMessage.Headers.Add("HeaderTest1", "headerValue1"); var result = await httpClient.SendAsync(requestMessage); Assert.Equal(HttpStatusCode.NotFound, result.StatusCode); }
public async Task IfContentType_CustomNotMatchingFunc_NotFoundReturned() { using var sut = new ApiStub(); sut.Post("/testget", (req, args) => "testresponse") .IfContentType(contentType => contentType.Contains("does not contain")); sut.Start(); var requestMessage = new HttpRequestMessage(HttpMethod.Post, new UriBuilder(new Uri(sut.Address)) { Path = "/testget" }.Uri) { Content = new StringContent("", Encoding.UTF8, "custom/stubbery") }; var result = await httpClient.SendAsync(requestMessage); Assert.Equal(HttpStatusCode.NotFound, result.StatusCode); }
public void NibeUnit_Refresh_NotOk() { ApiStub apiNibeStub = new ApiStub(); apiNibeStub.Request(HttpMethod.Post). IfRoute("/oauth/token"). Response((request, args) => { return("{ Error, Not Authorized}"); } ).StatusCode(StatusCodes.Status401Unauthorized); apiNibeStub.Start(); AppKeyConfig configs = new AppKeyConfig(); configs.NibeHost = apiNibeStub.Address; NibeAuth res = nibeUnit.Refresh(configs); Assert.Null(res); }
public async Task ResponseBody_BodySet_BodyReturned_ActionResultResponse() { using var sut = new ApiStub(); using var ms = new MemoryStream(); await ms.WriteAsync(Encoding.UTF8.GetBytes("Test File Data")); ms.Position = 0; sut.Get("/testget", (req, args) => new FileStreamResult(ms, "text/plain")); sut.Start(); var result = await httpClient.GetAsync(new UriBuilder(new Uri(sut.Address)) { Path = "/testget" }.Uri); var resultContentType = result.Content.Headers.ContentType.MediaType; var resultFileData = await result.Content.ReadAsStringAsync(); Assert.Equal("text/plain", resultContentType); Assert.Equal("Test File Data", resultFileData); }
public void Returns_Remote_Config_Value_From_Http_Scheme_Json_File() { using (var apiStub = new ApiStub()) { apiStub.Get( "/Group-Command.json", (req, args) => @"{ ""HystrixCommandEnabled"": true, ""CommandTimeoutInMilliseconds"":12345, ""CircuitBreakerForcedOpen"":false, ""CircuitBreakerForcedClosed"":false, ""CircuitBreakerErrorThresholdPercentage"":50, ""CircuitBreakerSleepWindowInMilliseconds"":5000, ""CircuitBreakerRequestVolumeThreshold"":20, ""MetricsHealthSnapshotIntervalInMilliseconds"":500, ""MetricsRollingStatisticalWindowInMilliseconds"":10000, ""MetricsRollingStatisticalWindowBuckets"":10, ""MetricsRollingPercentileEnabled"":true, ""MetricsRollingPercentileWindowInMilliseconds"":60000, ""MetricsRollingPercentileWindowBuckets"":6, ""MetricsRollingPercentileBucketSize"":100 }"); apiStub.Start(); var options = new HystrixJsonConfigurationSourceOptions { BaseLocation = apiStub.Address, LocationPattern = "{0}-{1}.json" }; var commandIdentifier = new HystrixCommandIdentifier("Group", "Command"); var configurationService = new HystrixJsonConfigConfigurationService(commandIdentifier, options); // Act var value = configurationService.GetCommandTimeoutInMilliseconds(); Assert.Equal(12345, value); } }
public void NibeUnit_GetReadingWithAccessCode_Is_NotSuccessful() { //string reading = "[{\"parameterId\":40004,\"name\":\"outdoor_temperature\",\"title\":\"outdoor temp.\",\"designation\":\"BT1\",\"unit\":\"°C\",\"displayValue\":\"2.7°C\",\"rawValue\":27},{\"parameterId\":40033,\"name\":\"indoor_temperature\",\"title\":\"room temperature\",\"designation\":\"BT50\",\"unit\":\"°C\",\"displayValue\":\"22.7°C\",\"rawValue\":227}]"; ApiStub apiNibeStub = new ApiStub(); apiNibeStub.Request(HttpMethod.Post). IfRoute("/oauth/token"). Response((request, args) => { return("{ Error, Not Authorized}"); } ).StatusCode(StatusCodes.Status401Unauthorized); apiNibeStub.Start(); AppKeyConfig configs = new AppKeyConfig(); configs.NibeHost = apiNibeStub.Address; ClimateItem item = nibeUnit.GetReadingWithAccessCode("12345", configs); Assert.Null(item); }
public async Task IfHeader_OneHeaderConditionAndHeaderPresentWithWrongValue_NotFoundReturned() { using var sut = new ApiStub(); sut.Get( "/testget", (req, args) => "testresponse") .IfHeader("HeaderTest", "headerValue"); sut.Start(); var requestMessage = new HttpRequestMessage(HttpMethod.Get, new UriBuilder(new Uri(sut.Address)) { Path = "/testget" }.Uri); requestMessage.Headers.Add("HeaderTest", "wrongValue"); var result = await httpClient.SendAsync(requestMessage); Assert.Equal(HttpStatusCode.NotFound, result.StatusCode); }
public CountyTests() { postcodeApiStub = new ApiStub(); postcodeApiStub.Get( "/postcodes/{postcode}", (request, args) => { if (args.Route.postcode == "postcodeOk") { return("{ \"status\": 200, \"result\": { \"admin_county\": \"CountyName\" } }"); } if (args.Route.postcode == "postcodeNotFound") { return("{ \"status\": 404 }"); } return("{ \"status\": 500 }"); }); postcodeApiStub.Start(); var hostingEnv = CreateHostingEnvironment(); var loggerFactory = new LoggerFactory(); var startup = new Startup(hostingEnv); server = new TestServer(new WebHostBuilder() .Configure(app => startup.Configure(app, hostingEnv, loggerFactory)) .ConfigureServices( services => { startup.ConfigureServices(services); // Replace the real api URL with the stub. startup.Configuration["PostCodeApiUrl"] = postcodeApiStub.Address; })); }
/// <summary> /// Constructor /// </summary> /// <param name="port">The Port to host the stub on</param> /// <param name="useDefaultResponses">Add the default YNAB stub responses</param> public YnabApiStub(int?port = null, bool useDefaultResponses = true) { _stub = new ApiStub(); if (port.HasValue) { _stub.Port = port; } // Read in default configurations if (useDefaultResponses) { foreach (var fileName in Directory.GetFiles("stub-responses")) { using (var reader = new StreamReader(fileName)) { var endpoint = fileName.Substring(fileName.IndexOf("\\") + 1).Split(".")[0]; endpoint = endpoint.Replace("__", "/"); var content = reader.ReadToEnd(); _stub.Get( $"/{endpoint}", (req, args) => { return(content); } ) .AddDefaultHeaders(); } var postEndpoint = "budgets/14235236-8085-4cf6-9fa6-92c34ed44b0c/transactions"; _stub.Post( $"/{postEndpoint}", (req, args) => { return("{\"data\":{\"transaction_ids\":[\"013a8128-d78f-42ff-a59e-633a4c75253e\"],\"transaction\":{\"id\":\"013a8128-d78f-42ff-a59e-633a4c75253e\",\"date\":\"2019-09-04\",\"amount\":100,\"memo\":\"TEST\",\"cleared\":\"cleared\",\"approved\":true,\"flag_color\":\"red\",\"account_id\":\"09c21bf0-8bd0-4b7b-b158-4fe2df899991\",\"account_name\":\"Checking Account\",\"payee_id\":\"51b1c8ad-f51e-4782-a0dc-f1b2b2cadd61\",\"payee_name\":\"Starting Balance\",\"category_id\":\"6e6c1877-6fa7-461a-8f5f-0aadf361f8cd\",\"category_name\":\"Immediate Income SubCategory\",\"transfer_account_id\":null,\"transfer_transaction_id\":null,\"matched_transaction_id\":null,\"import_id\":null,\"deleted\":false,\"subtransactions\":[]},\"server_knowledge\":174}}"); } ); } } _stub.Start(); }
public async Task MultiplePosts_OneMatch_DoesntHangConnectionOnLinux() { var largeText = new string('a', 6000); using var sut = new ApiStub(); sut.Post("/", (req, args) => "testresponse1"); sut.Start(); for (var i = 0; i < 5; i++) { var postContent = new StringContent(largeText, Encoding.UTF8, "text/plain"); var result = await httpClient.PostAsync(sut.Address, postContent); Assert.Equal(HttpStatusCode.OK, result.StatusCode); var resultString = await result.Content.ReadAsStringAsync(); Assert.Equal("testresponse1", resultString); } }
public void NetatmoUnitLoginFailDueToSetDevice() { string responseText = "{ \"access_token\":\"544cf4071c7759831d94cdf9|fcb30814afbffd0e39381e74fe38a59a\",\"refresh_token\":\"544cf4071c7759831d94cdf9|2b2c270c1208e8f67d3bd3891e395e1a\",\"scope\":[\"read_station\"],\"expires_in\":10800,\"expire_in\":10800}"; ApiStub apiNetatmoStub = new ApiStub(); apiNetatmoStub.Post( "/oauth2/token", (request, args) => { return(responseText); } ); apiNetatmoStub.Start(); AppKeyConfig configs = new AppKeyConfig(); configs.NetatmoHost = apiNetatmoStub.Address; Exception ex = Assert.Throws <Exception>(() => netatmoUnit.init(configs)); Assert.Equal("Could not set device and module", ex.Message); }
private TestServer StartApiUnderTest(ApiStub userApiStub = null) { var host = WebHost.CreateDefaultBuilder() .UseStartup <Startup>(); if (userApiStub != null) { host.ConfigureAppConfiguration((ctx, b) => { b.Add(new MemoryConfigurationSource { InitialData = new Dictionary <string, string> { // Replace the real api URL with the stub. ["UserApiUrl"] = userApiStub.Address } }); }); } var server = new TestServer(host); return(server); }
public async Task IfAccept_AcceptEqual_ResultReturned() { using (var sut = new ApiStub()) { sut.Get("/testget", (req, args) => "testresponse") .IfAccept("custom/stubbery"); sut.Start(); var requestMessage = new HttpRequestMessage(HttpMethod.Get, new UriBuilder(new Uri(sut.Address)) { Path = "/testget" }.Uri); requestMessage.Headers.Add("Accept", "custom/stubbery"); var result = await httpClient.SendAsync(requestMessage); var resultString = await result.Content.ReadAsStringAsync(); Assert.Equal(HttpStatusCode.OK, result.StatusCode); Assert.Equal("testresponse", resultString); } }
public async Task MultipleSetups_OnlyOneMatch_TheMatchingReturned() { using var sut = new ApiStub(); sut.Post("/testget1/{arg1}", (req, args) => $"testresponse,{args.Route.arg2}") .IfHeader("Header1", "TestValue1") .IfHeader("Header2", "TestValue2") .IfContentType("custom/stubbery") .IfAccept("custom/accept") .IfRoute("/testget2/{arg2}") .StatusCode(StatusCodes.Status300MultipleChoices) .Header("ResponseHeader1", "ResponseValue1") .Header("ResponseHeader2", "ResponseValue2"); sut.Start(); var requestMessage = new HttpRequestMessage(HttpMethod.Post, new UriBuilder(new Uri(sut.Address)) { Path = "/testget2/argValue" }.Uri); requestMessage.Headers.Add("Header1", "TestValue1"); requestMessage.Headers.Add("Header2", "TestValue2"); requestMessage.Content = new StringContent("", Encoding.UTF8, "custom/stubbery"); requestMessage.Headers.Add("Accept", "custom/accept"); var result = await httpClient.SendAsync(requestMessage); Assert.Equal(HttpStatusCode.MultipleChoices, result.StatusCode); var resultString = await result.Content.ReadAsStringAsync(); Assert.Equal("testresponse,argValue", resultString); Assert.Equal("ResponseValue1", result.Headers.GetValues("ResponseHeader1").First()); Assert.Equal("ResponseValue2", result.Headers.GetValues("ResponseHeader2").First()); }
public async Task IfContentType_ContentTypeEqual_ResultReturned() { using var sut = new ApiStub(); sut.Post("/testget", (req, args) => "testresponse") .IfContentType("custom/stubbery"); sut.Start(); var requestMessage = new HttpRequestMessage(HttpMethod.Post, new UriBuilder(new Uri(sut.Address)) { Path = "/testget" }.Uri) { Content = new StringContent("", Encoding.UTF8, "custom/stubbery") }; var result = await httpClient.SendAsync(requestMessage); var resultString = await result.Content.ReadAsStringAsync(); Assert.Equal(HttpStatusCode.OK, result.StatusCode); Assert.Equal("testresponse", resultString); }
public void NibeUnit_CurrentReading_Is_SuccessfulWithAccessCode() { string reading = "[{\"parameterId\":40004,\"name\":\"outdoor_temperature\",\"title\":\"outdoor temp.\",\"designation\":\"BT1\",\"unit\":\"°C\",\"displayValue\":\"2.7°C\",\"rawValue\":27},{\"parameterId\":40033,\"name\":\"indoor_temperature\",\"title\":\"room temperature\",\"designation\":\"BT50\",\"unit\":\"°C\",\"displayValue\":\"22.7°C\",\"rawValue\":227}]"; ApiStub apiNibeStub = new ApiStub(); apiNibeStub.Get( "/api/v1/systems/27401/parameters", (request, args) => { return(reading); } ); apiNibeStub.Start(); AppKeyConfig configs = new AppKeyConfig(); configs.NibeHost = apiNibeStub.Address; ClimateItem item = nibeUnit.CurrentReading(configs); Assert.NotNull(item); Assert.Equal(item.IndoorValue, "22.7"); Assert.Equal(item.OutdoorValue, "2.7"); }
public async Task IfHeader_OneHeaderConditionAndHeaderPresent_ResponseReturned() { using var sut = new ApiStub(); sut.Get( "/testget", (req, args) => "testresponse") .IfHeader("HeaderTest", "headerValue"); sut.Start(); var requestMessage = new HttpRequestMessage(HttpMethod.Get, new UriBuilder(new Uri(sut.Address)) { Path = "/testget" }.Uri); requestMessage.Headers.Add("HeaderTest", "headerValue"); var result = await httpClient.SendAsync(requestMessage); var resultString = await result.Content.ReadAsStringAsync(); Assert.Equal("testresponse", resultString); }
public async Task IfHeaders_CustomTwoHeaderConditionsAndBothHeadersPresent_ResponseReturned() { using (var sut = new ApiStub()) { sut .Get("/testget", (req, args) => "testresponse") .IfHeaders(headers => headers["HeaderTest1"] == "headerValue1" && headers["HeaderTest2"] == "headerValue2"); sut.Start(); var requestMessage = new HttpRequestMessage(HttpMethod.Get, new UriBuilder(new Uri(sut.Address)) { Path = "/testget" }.Uri); requestMessage.Headers.Add("HeaderTest1", "headerValue1"); requestMessage.Headers.Add("HeaderTest2", "headerValue2"); var result = await httpClient.SendAsync(requestMessage); var resultString = await result.Content.ReadAsStringAsync(); Assert.Equal("testresponse", resultString); } }
public void NetatmoUnitLoginFailDueToLogin() { //string deviceResponse = File.ReadAllText(fileDir + "netatmodeviceresponse.json"); string deviceResponse = netatmoData; ApiStub apiNetatmoStub = new ApiStub(); apiNetatmoStub.Get( "/api/devicelist", (request, response) => { return(deviceResponse); } ); apiNetatmoStub.Start(); AppKeyConfig configs = new AppKeyConfig(); configs.NetatmoHost = apiNetatmoStub.Address; Exception ex = Assert.Throws <Exception>(() => netatmoUnit.init(configs)); Assert.Equal("Could not login, response: ", ex.Message); }
public void Address_NotStarted_Exception() { var sut = new ApiStub(); Assert.Throws <InvalidOperationException>(() => sut.Address); }
public void ResponseBody_NullPassed_ArgumentNullException() { using var sut = new ApiStub(); Assert.Throws <ArgumentNullException>(() => sut.Get().Response(null)); }