public async Task GetThumbnailInfoAsync_RequestTest() { var handler = new HttpMessageHandlerMock(); handler.Enqueue(x => { Assert.Equal(HttpMethod.Get, x.Method); Assert.Equal("https://api.tumblr.com/v2/blog/hoge.tumblr.com/posts", x.RequestUri.GetLeftPart(UriPartial.Path)); var query = HttpUtility.ParseQueryString(x.RequestUri.Query); Assert.Equal(ApplicationSettings.TumblrConsumerKey, query["api_key"]); Assert.Equal("1234567", query["id"]); return new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(@"{ ""meta"": { ""status"": 200, ""msg"": ""OK"" }, ""response"": { ""blog"": { }, ""posts"": { } } }"), }; }); using (var http = new HttpClient(handler)) { var service = new Tumblr(http); var url = "http://hoge.tumblr.com/post/1234567/tetetete"; var thumb = await service.GetThumbnailInfoAsync(url, null, CancellationToken.None) .ConfigureAwait(false); } Assert.Equal(0, handler.QueueCount); }
public async Task GetAsync_Test() { using (var mockHandler = new HttpMessageHandlerMock()) using (var http = new HttpClient(mockHandler)) using (var apiConnection = new TwitterApiConnection("", "")) { apiConnection.http = http; mockHandler.Enqueue(x => { Assert.Equal(HttpMethod.Get, x.Method); Assert.Equal("https://api.twitter.com/1.1/hoge/tetete.json", x.RequestUri.GetLeftPart(UriPartial.Path)); var query = HttpUtility.ParseQueryString(x.RequestUri.Query); Assert.Equal("1111", query["aaaa"]); Assert.Equal("2222", query["bbbb"]); return new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent("\"hogehoge\""), }; }); var endpoint = new Uri("hoge/tetete.json", UriKind.Relative); var param = new Dictionary<string, string> { ["aaaa"] = "1111", ["bbbb"] = "2222", }; var result = await apiConnection.GetAsync<string>(endpoint, param, endpointName: "/hoge/tetete") .ConfigureAwait(false); Assert.Equal("hogehoge", result); Assert.Equal(0, mockHandler.QueueCount); } }
public async Task TranslateAsync_Test() { using (var mockHandler = new HttpMessageHandlerMock()) using (var http = new HttpClient(mockHandler)) { var mock = new Mock<MicrosoftTranslatorApi>(http); mock.Setup(x => x.GetAccessTokenAsync()) .ReturnsAsync(Tuple.Create("1234abcd", TimeSpan.FromSeconds(1000))); var translateApi = mock.Object; mockHandler.Enqueue(x => { Assert.Equal(HttpMethod.Get, x.Method); Assert.Equal(MicrosoftTranslatorApi.TranslateEndpoint.AbsoluteUri, x.RequestUri.GetLeftPart(UriPartial.Path)); var query = HttpUtility.ParseQueryString(x.RequestUri.Query); Assert.Equal("hogehoge", query["text"]); Assert.Equal("ja", query["to"]); Assert.Equal("en", query["from"]); return new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent("ほげほげ"), }; }); var result = await translateApi.TranslateAsync("hogehoge", langTo: "ja", langFrom: "en") .ConfigureAwait(false); Assert.Equal("ほげほげ", result); mock.Verify(x => x.GetAccessTokenAsync(), Times.Once()); Assert.Equal(0, mockHandler.QueueCount); } }
public async Task GetThumbnailInfoAsync_RequestWithSignatureTest() { var handler = new HttpMessageHandlerMock(); using (var http = new HttpClient(handler)) { var service = new FoursquareCheckin(http); handler.Enqueue(x => { Assert.Equal(HttpMethod.Get, x.Method); Assert.Equal("https://api.foursquare.com/v2/checkins/xxxxxxxx", x.RequestUri.GetLeftPart(UriPartial.Path)); var query = HttpUtility.ParseQueryString(x.RequestUri.Query); Assert.Equal(ApplicationSettings.FoursquareClientId, query["client_id"]); Assert.Equal(ApplicationSettings.FoursquareClientSecret, query["client_secret"]); Assert.NotNull(query["v"]); Assert.Equal("aaaaaaa", query["signature"]); // リクエストに対するテストなのでレスポンスは適当に返す return new HttpResponseMessage(HttpStatusCode.NotFound); }); var post = new PostClass { PostGeo = new PostClass.StatusGeo { }, }; var thumb = await service.GetThumbnailInfoAsync( "https://foursquare.com/hogehoge/checkin/xxxxxxxx?s=aaaaaaa", post, CancellationToken.None); Assert.Equal(0, handler.QueueCount); } }
public async Task MoveFile_ReturnsSuccess() { var httpHandlerMock = new HttpMessageHandlerMock(); var httpClient = new HttpClient(httpHandlerMock); httpHandlerMock.SendAsyncFunc = (request, cancellationToken) => Task.FromResult( new HttpResponseMessage { StatusCode = HttpStatusCode.OK, Content = new StringContent(string.Empty) }); var egnyteClient = new EgnyteClient("token", "acme", httpClient); var isSucccess = await egnyteClient.Files.MoveFileOrFolder("pathFrom", "pathTo"); var requestMessage = httpHandlerMock.GetHttpRequestMessage(); var content = httpHandlerMock.GetRequestContentAsString(); Assert.IsTrue(isSucccess); Assert.AreEqual("https://acme.egnyte.com/pubapi/v1/fs/pathFrom", requestMessage.RequestUri.ToString()); Assert.AreEqual("{\"action\": \"move\", \"destination\": \"/pathTo\"}", content); }
public async Task GetAllSensorsAsync_InvalidJson() { string response = "{abc}"; HttpStatusCode statusCode = HttpStatusCode.OK; var messageHandlerMock = new HttpMessageHandlerMock(response, statusCode); var httpClient = new HttpClient(messageHandlerMock); var clientFactory = Substitute.For <IHttpClientFactory>(); clientFactory.CreateClient().Returns(httpClient); var optionsMonitor = Substitute.For <IOptionsMonitor <HueOptions> >(); var hueOptions = new HueOptions() { BridgeIP = "192.168.0.5", BridgePort = 0, UserKey = "abc123" }; optionsMonitor.CurrentValue.Returns(hueOptions); var hueSensorProvider = new HueSensorProvider(clientFactory, optionsMonitor); var sensors = await hueSensorProvider.GetAllSensorsAsync(); Assert.Empty(sensors); }
public async Task GetAllSensorsAsync_Successful() { string response = "{\"1\":{\"state\":{\"daylight\":true,\"lastupdated\":\"2020-08-19T04:52:00\"},\"config\":{\"on\":true,\"configured\":true,\"sunriseoffset\":30,\"sunsetoffset\":-30},\"name\":\"Daylight\",\"type\":\"Daylight\",\"modelid\":\"PHDL00\",\"manufacturername\":\"Signify Netherlands B.V.\",\"swversion\":\"1.0\"},\"5\":{\"state\":{\"status\":0,\"lastupdated\":\"2019-04-05T05:25:00\"},\"config\":{\"on\":true,\"reachable\":true},\"name\":\"Licht-Status\",\"type\":\"CLIPGenericStatus\",\"modelid\":\"Model 2015\",\"manufacturername\":\"all 4 hue\",\"swversion\":\"1.0\",\"uniqueid\":\"PFHS-LIGHT-STATE\",\"recycle\":false},\"6\":{\"state\":{\"temperature\":2382,\"lastupdated\":\"2020-08-19T10:28:19\"},\"swupdate\":{\"state\":\"noupdates\",\"lastinstall\":\"2019-03-12T13:27:46\"},\"config\":{\"on\":true,\"battery\":60,\"reachable\":true,\"alert\":\"none\",\"ledindication\":false,\"usertest\":false,\"pending\":[]},\"name\":\"Hue temperature sensor 1\",\"type\":\"ZLLTemperature\",\"modelid\":\"SML001\",\"manufacturername\":\"Signify Netherlands B.V.\",\"productname\":\"Hue temperature sensor\",\"swversion\":\"6.1.1.27575\",\"uniqueid\":\"00:17:88:01:03:28:3e:d2-02-0402\",\"capabilities\":{\"certified\":true,\"primary\":false}},\"7\":{\"state\":{\"presence\":false,\"lastupdated\":\"2020-08-19T09:38:46\"},\"swupdate\":{\"state\":\"noupdates\",\"lastinstall\":\"2019-03-12T13:27:46\"},\"config\":{\"on\":true,\"battery\":60,\"reachable\":true,\"alert\":\"none\",\"ledindication\":false,\"usertest\":false,\"sensitivity\":2,\"sensitivitymax\":2,\"pending\":[]},\"name\":\"Flur Sensor\",\"type\":\"ZLLPresence\",\"modelid\":\"SML001\",\"manufacturername\":\"Signify Netherlands B.V.\",\"productname\":\"Hue motion sensor\",\"swversion\":\"6.1.1.27575\",\"uniqueid\":\"00:17:88:01:03:28:3e:d2-02-0406\",\"capabilities\":{\"certified\":true,\"primary\":true}},\"8\":{\"state\":{\"lightlevel\":4225,\"dark\":true,\"daylight\":false,\"lastupdated\":\"2020-08-19T10:28:41\"},\"swupdate\":{\"state\":\"noupdates\",\"lastinstall\":\"2019-03-12T13:27:46\"},\"config\":{\"on\":true,\"battery\":60,\"reachable\":true,\"alert\":\"none\",\"tholddark\":16000,\"tholdoffset\":7000,\"ledindication\":false,\"usertest\":false,\"pending\":[]},\"name\":\"Hue ambient light sensor 1\",\"type\":\"ZLLLightLevel\",\"modelid\":\"SML001\",\"manufacturername\":\"Signify Netherlands B.V.\",\"productname\":\"Hue ambient light sensor\",\"swversion\":\"6.1.1.27575\",\"uniqueid\":\"00:17:88:01:03:28:3e:d2-02-0400\",\"capabilities\":{\"certified\":true,\"primary\":false}},\"9\":{\"state\":{\"status\":0,\"lastupdated\":\"2020-08-19T09:39:31\"},\"config\":{\"on\":true,\"reachable\":true},\"name\":\"MotionSensor 7.Companion\",\"type\":\"CLIPGenericStatus\",\"modelid\":\"PHA_STATE\",\"manufacturername\":\"Philips\",\"swversion\":\"1.0\",\"uniqueid\":\"MotionSensor 7.Companion\",\"recycle\":true}}"; HttpStatusCode statusCode = HttpStatusCode.OK; var messageHandlerMock = new HttpMessageHandlerMock(response, statusCode); var httpClient = new HttpClient(messageHandlerMock); var clientFactory = Substitute.For <IHttpClientFactory>(); clientFactory.CreateClient().Returns(httpClient); var optionsMonitor = Substitute.For <IOptionsMonitor <HueOptions> >(); var hueOptions = new HueOptions() { BridgeIP = "192.168.0.5", BridgePort = 0, UserKey = "abc123" }; optionsMonitor.CurrentValue.Returns(hueOptions); var hueSensorProvider = new HueSensorProvider(clientFactory, optionsMonitor); var sensors = await hueSensorProvider.GetAllSensorsAsync(); Assert.Equal(6, sensors.Count); }
public async Task GetTemperatureSensorByIdAsync_HttpError() { string response = "{\"state\":{\"temperature\":2354,\"lastupdated\":\"2020-08-19T10:43:17\"},\"swupdate\":{\"state\":\"noupdates\",\"lastinstall\":\"2019-03-12T13:27:46\"},\"config\":{\"on\":true,\"battery\":60,\"reachable\":true,\"alert\":\"none\",\"ledindication\":false,\"usertest\":false,\"pending\":[]},\"name\":\"Hue temperature sensor 1\",\"type\":\"ZLLTemperature\",\"modelid\":\"SML001\",\"manufacturername\":\"Signify Netherlands B.V.\",\"productname\":\"Hue temperature sensor\",\"swversion\":\"6.1.1.27575\",\"uniqueid\":\"00:17:88:01:03:28:3e:d2-02-0402\",\"capabilities\":{\"certified\":true,\"primary\":false}}"; HttpStatusCode statusCode = HttpStatusCode.NotFound; var messageHandlerMock = new HttpMessageHandlerMock(response, statusCode); var httpClient = new HttpClient(messageHandlerMock); var clientFactory = Substitute.For <IHttpClientFactory>(); clientFactory.CreateClient().Returns(httpClient); var optionsMonitor = Substitute.For <IOptionsMonitor <HueOptions> >(); var hueOptions = new HueOptions() { BridgeIP = "192.168.0.5", BridgePort = 0, UserKey = "abc123" }; optionsMonitor.CurrentValue.Returns(hueOptions); var hueSensorProvider = new HueSensorProvider(clientFactory, optionsMonitor); var sensor = await hueSensorProvider.GetSensorByIdAsync(6); Assert.Null(sensor); }
public async Task GetTemperatureSensorByIdAsync_IdNotExisting() { string response = "[{\"error\":{\"type\":3,\"address\":\"/sensors/60\",\"description\":\"resource, /sensors/60, not available\"}}]"; HttpStatusCode statusCode = HttpStatusCode.OK; var messageHandlerMock = new HttpMessageHandlerMock(response, statusCode); var httpClient = new HttpClient(messageHandlerMock); var clientFactory = Substitute.For <IHttpClientFactory>(); clientFactory.CreateClient().Returns(httpClient); var optionsMonitor = Substitute.For <IOptionsMonitor <HueOptions> >(); var hueOptions = new HueOptions() { BridgeIP = "192.168.0.5", BridgePort = 0, UserKey = "abc123" }; optionsMonitor.CurrentValue.Returns(hueOptions); var hueSensorProvider = new HueSensorProvider(clientFactory, optionsMonitor); var sensor = await hueSensorProvider.GetTemperatureSensorByIdAsync(60); Assert.Null(sensor); }
public async Task GetThumbnailInfoAsync_CustomHostnameRequestTest() { var handler = new HttpMessageHandlerMock(); handler.Enqueue(x => { Assert.Equal(HttpMethod.Get, x.Method); Assert.Equal("https://api.tumblr.com/v2/blog/tumblr.example.com/posts", x.RequestUri.GetLeftPart(UriPartial.Path)); var query = HttpUtility.ParseQueryString(x.RequestUri.Query); Assert.Equal(ApplicationSettings.TumblrConsumerKey, query["api_key"]); Assert.Equal("1234567", query["id"]); return(new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(@"{ ""meta"": { ""status"": 200, ""msg"": ""OK"" }, ""response"": { ""blog"": { }, ""posts"": { } } }"), }); }); using (var http = new HttpClient(handler)) { var service = new Tumblr(http); // Tumblrのカスタムドメイン名を使ってるっぽいURL var url = "http://tumblr.example.com/post/1234567/tetetete"; await service.GetThumbnailInfoAsync(url, new PostClass(), CancellationToken.None) .ConfigureAwait(false); } Assert.Equal(0, handler.QueueCount); }
public void SetResponse(HttpResponseMessage response) { HttpMessageHandler = new HttpMessageHandlerMock(response); }
public void Send_SameMessage () { var mh = new HttpMessageHandlerMock (); var client = new HttpClient (mh); var request = new HttpRequestMessage (HttpMethod.Get, "http://xamarin.com"); mh.OnSend = l => { return new HttpResponseMessage (); }; client.Send (request); try { client.Send (request); } catch (InvalidOperationException) { } }
public void Send_Timeout () { var mh = new HttpMessageHandlerMock (); var client = new HttpClient (mh); client.Timeout = TimeSpan.FromMilliseconds (100); var request = new HttpRequestMessage (HttpMethod.Get, "http://xamarin.com"); var response = new HttpResponseMessage (); mh.OnSendFull = (l, c) => { Assert.IsTrue (c.WaitHandle.WaitOne (500), "#2"); return Task.FromResult (response); }; Assert.AreEqual (response, client.SendAsync (request).Result, "#1"); }
public MockHttpClientFactory(HttpStatusCode responseStatusCode) { HttpMessageHandler = new HttpMessageHandlerMock(new HttpResponseMessage(responseStatusCode)); }
public async Task ListLinksV2_ReturnsSuccess() { var httpHandlerMock = new HttpMessageHandlerMock(); var httpClient = new HttpClient(httpHandlerMock); httpHandlerMock.SendAsyncFunc = (request, cancellationToken) => Task.FromResult( new HttpResponseMessage { StatusCode = HttpStatusCode.OK, Content = new StringContent( ListLinksResponseContent, Encoding.UTF8, "application/json") }); var egnyteClient = new EgnyteClient("token", "acme", httpClient); var linksList = await egnyteClient.Links.ListLinksV2(); var requestMessage = httpHandlerMock.GetHttpRequestMessage(); Assert.AreEqual( "https://acme.egnyte.com/pubapi/v2/links", requestMessage.RequestUri.ToString()); Assert.AreEqual(2, linksList.Count); var firstLink = linksList.Links.First(); Assert.AreEqual("ebb76829-06b0-4e32-bec1-f7fea5b00311", firstLink.ResourceId); Assert.AreEqual("/Shared/MikTests/xbox.png", firstLink.Path); Assert.AreEqual(LinkType.File, firstLink.Type); Assert.AreEqual(LinkAccessibility.Anyone, firstLink.Accessibility); Assert.AreEqual(ProtectionType.None, firstLink.Protection); Assert.AreEqual(1, firstLink.Recipients.Count); Assert.AreEqual("*****@*****.**", firstLink.Recipients.First()); Assert.AreEqual(false, firstLink.Notify); Assert.AreEqual("https://test.egnyte.com/dl/PLeklqtBWN", firstLink.Url); Assert.AreEqual("PLeklqtBWN", firstLink.Id); Assert.AreEqual(false, firstLink.LinkToCurrent); Assert.AreEqual(new DateTime(2016, 01, 28, 6, 01, 17, DateTimeKind.Utc).ToLocalTime(), firstLink.CreationDate); Assert.AreEqual("mik", firstLink.CreatedBy); Assert.AreEqual(default(DateTime), firstLink.ExpiryDate); Assert.AreEqual(0, firstLink.ExpiryClicks); var secondLink = linksList.Links[1]; Assert.AreEqual("ebb76829-06b0-4e32-bec1-f7fea5b00311", secondLink.ResourceId); Assert.AreEqual("/Shared/MikTests/xbox2.png", secondLink.Path); Assert.AreEqual(LinkType.File, secondLink.Type); Assert.AreEqual(LinkAccessibility.Anyone, secondLink.Accessibility); Assert.AreEqual(ProtectionType.None, secondLink.Protection); Assert.AreEqual(1, secondLink.Recipients.Count); Assert.AreEqual("*****@*****.**", secondLink.Recipients.First()); Assert.AreEqual(false, secondLink.Notify); Assert.AreEqual("https://test.egnyte.com/dl/jKI7Lx9VPE", secondLink.Url); Assert.AreEqual("PLeklqtBWN", firstLink.Id); Assert.AreEqual(false, secondLink.LinkToCurrent); Assert.AreEqual(new DateTime(2016, 01, 28, 6, 01, 17, DateTimeKind.Utc).ToLocalTime(), secondLink.CreationDate); Assert.AreEqual("mik", secondLink.CreatedBy); Assert.AreEqual(new DateTime(2020, 01, 28, 6, 01, 17, DateTimeKind.Utc).ToLocalTime(), secondLink.ExpiryDate); Assert.AreEqual(6, secondLink.ExpiryClicks); }
public void CancelPendingRequests () { var mh = new HttpMessageHandlerMock (); var client = new HttpClient (mh); var request = new HttpRequestMessage (HttpMethod.Get, "http://xamarin.com"); var mre = new ManualResetEvent (false); mh.OnSendFull = (l, c) => { mre.Set (); Assert.IsTrue (c.WaitHandle.WaitOne (1000), "#20"); Assert.IsTrue (c.IsCancellationRequested, "#21"); mre.Set (); return Task.FromResult (new HttpResponseMessage ()); }; var t = Task.Factory.StartNew (() => { client.SendAsync (request).Wait (WaitTimeout); }); Assert.IsTrue (mre.WaitOne (500), "#1"); mre.Reset (); client.CancelPendingRequests (); Assert.IsTrue (t.Wait (500), "#2"); request = new HttpRequestMessage (HttpMethod.Get, "http://xamarin.com"); mh.OnSendFull = (l, c) => { Assert.IsFalse (c.IsCancellationRequested, "#30"); return Task.FromResult (new HttpResponseMessage ()); }; client.SendAsync (request).Wait (WaitTimeout); }
public void Send () { var mh = new HttpMessageHandlerMock (); var client = new HttpClient (mh); client.BaseAddress = new Uri ("http://xamarin.com"); var request = new HttpRequestMessage (); var response = new HttpResponseMessage (); mh.OnSend = l => { Assert.AreEqual (l, request, "#2"); Assert.AreEqual (client.BaseAddress, l.RequestUri, "#2"); return Task.FromResult (response); }; Assert.AreEqual (response, client.SendAsync (request).Result, "#1"); }
public void Send_SameMessage () { var mh = new HttpMessageHandlerMock (); var client = new HttpClient (mh); var request = new HttpRequestMessage (HttpMethod.Get, "http://xamarin.com"); mh.OnSend = l => Task.FromResult (new HttpResponseMessage ()); client.SendAsync (request).Wait (WaitTimeout); try { client.SendAsync (request).Wait (WaitTimeout); Assert.Fail ("#1"); } catch (InvalidOperationException) { } }
private void ResetMessageHandler() { _httpMessageHandler = new HttpMessageHandlerMock(); _httpMessageHandler.WithReturnContent(new LoginResponseStub()); _session.WithHandler(_httpMessageHandler.Build()); }
public async Task PostJsonAsync_Test() { using (var mockHandler = new HttpMessageHandlerMock()) using (var http = new HttpClient(mockHandler)) using (var apiConnection = new TwitterApiConnection("", "")) { apiConnection.http = http; mockHandler.Enqueue(async x => { Assert.Equal(HttpMethod.Post, x.Method); Assert.Equal("https://api.twitter.com/1.1/hoge/tetete.json", x.RequestUri.AbsoluteUri); Assert.Equal("application/json; charset=utf-8", x.Content.Headers.ContentType.ToString()); var body = await x.Content.ReadAsStringAsync() .ConfigureAwait(false); Assert.Equal("{\"aaaa\": 1111}", body); return new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent("\"hogehoge\""), }; }); var endpoint = new Uri("hoge/tetete.json", UriKind.Relative); await apiConnection.PostJsonAsync(endpoint, "{\"aaaa\": 1111}") .ConfigureAwait(false); Assert.Equal(0, mockHandler.QueueCount); } }
public async Task When_Using_Custom_Fails_Returns_Sets_Error_Information_In_Value() { var simulatedDevice = new SimulatedDevice(TestDeviceInfo.CreateABPDevice(1, gatewayID: ServerGatewayID)); var loRaDevice = CreateLoRaDevice(simulatedDevice); loRaDevice.SensorDecoder = "http://customdecoder/test1"; // message will be sent LoRaDeviceTelemetry loRaDeviceTelemetry = null; LoRaDeviceClient.Setup(x => x.SendEventAsync(It.IsNotNull <LoRaDeviceTelemetry>(), null)) .Callback <LoRaDeviceTelemetry, Dictionary <string, string> >((t, _) => loRaDeviceTelemetry = t) .ReturnsAsync(true); // C2D message will be checked LoRaDeviceClient.Setup(x => x.ReceiveAsync(It.IsNotNull <TimeSpan>())) .ReturnsAsync((Message)null); using var cache = EmptyMemoryCache(); using var loraDeviceCache = CreateDeviceCache(loRaDevice); using var deviceRegistry = new LoRaDeviceRegistry(ServerConfiguration, cache, LoRaDeviceApi.Object, LoRaDeviceFactory, loraDeviceCache); // Send to message processor using var messageDispatcher = new MessageDispatcher( ServerConfiguration, deviceRegistry, FrameCounterUpdateStrategyProvider); using var httpMessageHandler = new HttpMessageHandlerMock(); httpMessageHandler.SetupHandler((r) => { return(new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest) { Content = new StringContent("my error", Encoding.UTF8, "application/json"), }); }); using var httpClient = new HttpClient(httpMessageHandler); PayloadDecoder.SetDecoder(new LoRaPayloadDecoder(httpClient)); // sends unconfirmed message var unconfirmedMessagePayload = simulatedDevice.CreateUnconfirmedDataUpMessage("1", fcnt: 1); using var request = CreateWaitableRequest(unconfirmedMessagePayload); messageDispatcher.DispatchRequest(request); Assert.True(await request.WaitCompleteAsync()); Assert.NotNull(loRaDeviceTelemetry); var rawPayload = Convert.ToBase64String(Encoding.UTF8.GetBytes("1")); Assert.Equal(rawPayload, loRaDeviceTelemetry.Rawdata); Assert.IsType <DecodingFailedPayload>(loRaDeviceTelemetry.Data); var decodedPayload = (DecodingFailedPayload)loRaDeviceTelemetry.Data; Assert.Equal("SensorDecoderModule 'http://customdecoder/test1?devEUI=0000000000000001&fport=1&payload=MQ%3d%3d' returned bad request.", decodedPayload.Error); Assert.Equal("my error", decodedPayload.ErrorDetail); // Validate json var actualJsonTelemetry = JsonConvert.SerializeObject(loRaDeviceTelemetry, Formatting.None); var expectedTelemetryJson = $"{{\"time\":100000,\"tmms\":100000,\"freq\":868.3,\"chan\":2,\"rfch\":1,\"modu\":\"LoRa\",\"datr\":\"SF10BW125\",\"rssi\":2.0,\"lsnr\":0.1,\"data\":{{\"error\":\"SensorDecoderModule 'http://customdecoder/test1?devEUI=0000000000000001&fport=1&payload=MQ%3d%3d' returned bad request.\",\"errorDetail\":\"my error\"}},\"port\":1,\"fcnt\":1,\"edgets\":{loRaDeviceTelemetry.Edgets},\"rawdata\":\"{ rawPayload}\",\"eui\":\"0000000000000001\",\"gatewayid\":\"test-gateway\",\"stationeui\":\"0000000000000000\"}}"; Assert.Equal(expectedTelemetryJson, actualJsonTelemetry); LoRaDeviceApi.VerifyAll(); LoRaDeviceClient.VerifyAll(); }
public async Task GetAccessTokenAsync_Test() { using (var mockHandler = new HttpMessageHandlerMock()) using (var http = new HttpClient(mockHandler)) { var translateApi = new MicrosoftTranslatorApi(http); mockHandler.Enqueue(async x => { Assert.Equal(HttpMethod.Post, x.Method); Assert.Equal(MicrosoftTranslatorApi.OAuthEndpoint, x.RequestUri); var body = await x.Content.ReadAsStringAsync() .ConfigureAwait(false); var query = HttpUtility.ParseQueryString(body); Assert.Equal("client_credentials", query["grant_type"]); Assert.Equal(ApplicationSettings.AzureClientId, query["client_id"]); Assert.Equal(ApplicationSettings.AzureClientSecret, query["client_secret"]); Assert.Equal("http://api.microsofttranslator.com", query["scope"]); return new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(@" { ""access_token"": ""12345acbde"", ""token_type"": ""bearer"", ""expires_in"": 3600 }"), }; }); var result = await translateApi.GetAccessTokenAsync() .ConfigureAwait(false); var expectedToken = Tuple.Create(@"12345acbde", TimeSpan.FromSeconds(3600)); Assert.Equal(expectedToken, result); Assert.Equal(0, mockHandler.QueueCount); } }
public async Task When_Resent_Message_Using_Custom_Decoder_Returns_Complex_Object_Should_Send_Decoded_Value() { var simulatedDevice = new SimulatedDevice(TestDeviceInfo.CreateABPDevice(1, gatewayID: ServerGatewayID)); var loRaDevice = CreateLoRaDevice(simulatedDevice); loRaDevice.SensorDecoder = "http://customdecoder/test1"; // message will be sent LoRaDeviceTelemetry loRaDeviceTelemetry = null; _ = LoRaDeviceClient.Setup(x => x.SendEventAsync(It.IsNotNull <LoRaDeviceTelemetry>(), null)) .Callback <LoRaDeviceTelemetry, Dictionary <string, string> >((t, _) => loRaDeviceTelemetry = t) .ReturnsAsync(true); _ = LoRaDeviceClient.Setup(x => x.UpdateReportedPropertiesAsync(It.IsAny <TwinCollection>(), It.IsAny <CancellationToken>())).ReturnsAsync(true); // C2D message will be checked // LoRaDeviceClient.Setup(x => x.ReceiveAsync(It.IsNotNull<TimeSpan>())) // .ReturnsAsync((Message)null); using var cache = EmptyMemoryCache(); using var loraDeviceCache = CreateDeviceCache(loRaDevice); using var deviceRegistry = new LoRaDeviceRegistry(ServerConfiguration, cache, LoRaDeviceApi.Object, LoRaDeviceFactory, loraDeviceCache); // Send to message processor using var messageDispatcher = new MessageDispatcher( ServerConfiguration, deviceRegistry, FrameCounterUpdateStrategyProvider); var decodedObject = new { temp = 10, humidity = 22.1, text = "abc", cloudToDeviceMessage = new { test = 1 } }; using var httpMessageHandler = new HttpMessageHandlerMock(); _ = httpMessageHandler.SetupHandler((r) => { return(new HttpResponseMessage(System.Net.HttpStatusCode.OK) { Content = new StringContent(JsonConvert.SerializeObject(decodedObject), Encoding.UTF8, "application/json"), }); }); using var httpClient = new HttpClient(httpMessageHandler); PayloadDecoder.SetDecoder(new LoRaPayloadDecoder(httpClient)); // sends confirmed message var confirmedMessagePayload = simulatedDevice.CreateConfirmedDataUpMessage("1", fcnt: 10); using var request = CreateWaitableRequest(confirmedMessagePayload); messageDispatcher.DispatchRequest(request); Assert.True(await request.WaitCompleteAsync()); Assert.NotNull(request.ResponseDownlink); Assert.NotNull(loRaDeviceTelemetry); var rawPayload = Convert.ToBase64String(Encoding.UTF8.GetBytes("1")); Assert.Equal(rawPayload, loRaDeviceTelemetry.Rawdata); // Validate json var actualJsonTelemetry = JsonConvert.SerializeObject(loRaDeviceTelemetry, Formatting.None); var expectedTelemetryJson = $"{{\"time\":100000,\"tmms\":100000,\"freq\":868.3,\"chan\":2,\"rfch\":1,\"modu\":\"LoRa\",\"datr\":\"SF10BW125\",\"rssi\":2.0,\"lsnr\":0.1,\"data\":{{\"temp\":10,\"humidity\":22.1,\"text\":\"abc\"}},\"port\":1,\"fcnt\":10,\"edgets\":{loRaDeviceTelemetry.Edgets},\"rawdata\":\"{rawPayload}\",\"eui\":\"0000000000000001\",\"gatewayid\":\"test-gateway\",\"stationeui\":\"0000000000000000\"}}"; Assert.Equal(expectedTelemetryJson, actualJsonTelemetry); // send a second confirmed message with same fcnt to simulate using var request2 = CreateWaitableRequest(confirmedMessagePayload); messageDispatcher.DispatchRequest(request2); Assert.True(await request2.WaitCompleteAsync()); Assert.NotNull(request2.ResponseDownlink); Assert.NotNull(loRaDeviceTelemetry); var rawPayload2 = Convert.ToBase64String(Encoding.UTF8.GetBytes("1")); Assert.Equal(rawPayload2, loRaDeviceTelemetry.Rawdata); LoRaDeviceClient.Verify(x => x.SendEventAsync(It.IsNotNull <LoRaDeviceTelemetry>(), null), Times.Exactly(2)); LoRaDeviceApi.VerifyAll(); LoRaDeviceClient.VerifyAll(); }
public void Send_InvalidHandler () { var mh = new HttpMessageHandlerMock (); var client = new HttpClient (mh); client.BaseAddress = new Uri ("http://xamarin.com"); var request = new HttpRequestMessage (); mh.OnSend = l => { Assert.AreEqual (l, request, "#1"); return null; }; try { client.Send (request); Assert.Fail ("#2"); } catch (InvalidOperationException) { } }
public async Task PostLazyAsync_MultipartTest() { using (var mockHandler = new HttpMessageHandlerMock()) using (var http = new HttpClient(mockHandler)) using (var apiConnection = new TwitterApiConnection("", "")) { apiConnection.httpUpload = http; using (var image = TestUtils.CreateDummyImage()) using (var media = new MemoryImageMediaItem(image)) { mockHandler.Enqueue(async x => { Assert.Equal(HttpMethod.Post, x.Method); Assert.Equal("https://api.twitter.com/1.1/hoge/tetete.json", x.RequestUri.AbsoluteUri); Assert.IsType <MultipartFormDataContent>(x.Content); var boundary = x.Content.Headers.ContentType.Parameters.Cast <NameValueHeaderValue>() .First(y => y.Name == "boundary").Value; // 前後のダブルクオーテーションを除去 boundary = boundary.Substring(1, boundary.Length - 2); var expectedText = $"--{boundary}\r\n" + "Content-Type: text/plain; charset=utf-8\r\n" + "Content-Disposition: form-data; name=aaaa\r\n" + "\r\n" + "1111\r\n" + $"--{boundary}\r\n" + "Content-Type: text/plain; charset=utf-8\r\n" + "Content-Disposition: form-data; name=bbbb\r\n" + "\r\n" + "2222\r\n" + $"--{boundary}\r\n" + $"Content-Disposition: form-data; name=media1; filename={media.Name}; filename*=utf-8''{media.Name}\r\n" + "\r\n"; var expected = Encoding.UTF8.GetBytes(expectedText) .Concat(image.Stream.ToArray()) .Concat(Encoding.UTF8.GetBytes($"\r\n--{boundary}--\r\n")); Assert.Equal(expected, await x.Content.ReadAsByteArrayAsync().ConfigureAwait(false)); return(new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent("\"hogehoge\""), }); }); var endpoint = new Uri("hoge/tetete.json", UriKind.Relative); var param = new Dictionary <string, string> { ["aaaa"] = "1111", ["bbbb"] = "2222", }; var mediaParam = new Dictionary <string, IMediaItem> { ["media1"] = media, }; var result = await apiConnection.PostLazyAsync <string>(endpoint, param, mediaParam) .ConfigureAwait(false); Assert.Equal("hogehoge", await result.LoadJsonAsync() .ConfigureAwait(false)); Assert.Equal(0, mockHandler.QueueCount); } } }
public async Task GetThumbnailInfoAsync_GeoLocatedTweetTest() { var handler = new HttpMessageHandlerMock(); using (var http = new HttpClient(handler)) { var service = new FoursquareCheckin(http); handler.Enqueue(x => { // このリクエストは実行されないはず Assert.True(false); return new HttpResponseMessage(HttpStatusCode.NotFound); }); // 既にジオタグが付いているツイートに対しては何もしない var post = new PostClass { PostGeo = new PostClass.StatusGeo { Lat = 34.35067978344854, Lng = 134.04693603515625, }, }; var thumb = await service.GetThumbnailInfoAsync( "https://foursquare.com/hogehoge/checkin/xxxxxxxx?s=aaaaaaa", post, CancellationToken.None); Assert.Equal(1, handler.QueueCount); } }
public async Task GetAsync_UpdateRateLimitTest() { using (var mockHandler = new HttpMessageHandlerMock()) using (var http = new HttpClient(mockHandler)) using (var apiConnection = new TwitterApiConnection("", "")) { apiConnection.http = http; mockHandler.Enqueue(x => { Assert.Equal(HttpMethod.Get, x.Method); Assert.Equal("https://api.twitter.com/1.1/hoge/tetete.json", x.RequestUri.GetLeftPart(UriPartial.Path)); return new HttpResponseMessage(HttpStatusCode.OK) { Headers = { { "X-Rate-Limit-Limit", "150" }, { "X-Rate-Limit-Remaining", "100" }, { "X-Rate-Limit-Reset", "1356998400" }, { "X-Access-Level", "read-write-directmessages" }, }, Content = new StringContent("\"hogehoge\""), }; }); var apiStatus = new TwitterApiStatus(); MyCommon.TwitterApiInfo = apiStatus; var endpoint = new Uri("hoge/tetete.json", UriKind.Relative); await apiConnection.GetAsync<string>(endpoint, null, endpointName: "/hoge/tetete") .ConfigureAwait(false); Assert.Equal(apiStatus.AccessLevel, TwitterApiAccessLevel.ReadWriteAndDirectMessage); Assert.Equal(apiStatus.AccessLimit["/hoge/tetete"], new ApiLimit(150, 100, new DateTime(2013, 1, 1, 0, 0, 0, DateTimeKind.Utc).ToLocalTime())); Assert.Equal(0, mockHandler.QueueCount); } }
public async Task GetAsync_ErrorStatusTest() { using (var mockHandler = new HttpMessageHandlerMock()) using (var http = new HttpClient(mockHandler)) using (var apiConnection = new TwitterApiConnection("", "")) { apiConnection.http = http; mockHandler.Enqueue(x => { return new HttpResponseMessage(HttpStatusCode.BadGateway) { Content = new StringContent("### Invalid JSON Response ###"), }; }); var endpoint = new Uri("hoge/tetete.json", UriKind.Relative); var exception = await Assert.ThrowsAsync<TwitterApiException>(() => apiConnection.GetAsync<string>(endpoint, null, endpointName: "/hoge/tetete")) .ConfigureAwait(false); // エラーレスポンスの読み込みに失敗した場合はステータスコードをそのままメッセージに使用する Assert.Equal("BadGateway", exception.Message); Assert.Null(exception.ErrorResponse); Assert.Equal(0, mockHandler.QueueCount); } }
public void Send_BaseAddress () { var mh = new HttpMessageHandlerMock (); var client = new HttpClient (mh); client.BaseAddress = new Uri ("http://localhost/"); var response = new HttpResponseMessage (); mh.OnSend = l => { Assert.AreEqual ("http://localhost/relative", l.RequestUri.ToString (), "#2"); return Task.FromResult (response); }; Assert.AreEqual (response, client.GetAsync ("relative").Result, "#1"); Assert.AreEqual (response, client.GetAsync ("/relative").Result, "#2"); }
public async Task GetAsync_ErrorJsonTest() { using (var mockHandler = new HttpMessageHandlerMock()) using (var http = new HttpClient(mockHandler)) using (var apiConnection = new TwitterApiConnection("", "")) { apiConnection.http = http; mockHandler.Enqueue(x => { return new HttpResponseMessage(HttpStatusCode.Forbidden) { Content = new StringContent("{\"errors\":[{\"code\":187,\"message\":\"Status is a duplicate.\"}]}"), }; }); var endpoint = new Uri("hoge/tetete.json", UriKind.Relative); var exception = await Assert.ThrowsAsync<TwitterApiException>(() => apiConnection.GetAsync<string>(endpoint, null, endpointName: "/hoge/tetete")) .ConfigureAwait(false); // エラーレスポンスの JSON に含まれるエラーコードに基づいてメッセージを出力する Assert.Equal("DuplicateStatus", exception.Message); Assert.Equal(TwitterErrorCode.DuplicateStatus, exception.ErrorResponse.Errors[0].Code); Assert.Equal("Status is a duplicate.", exception.ErrorResponse.Errors[0].Message); Assert.Equal(0, mockHandler.QueueCount); } }
public void CancelPendingRequests_BeforeSend () { var ct = new CancellationTokenSource (); ct.Cancel (); var rr = CancellationTokenSource.CreateLinkedTokenSource (new CancellationToken (), ct.Token); var mh = new HttpMessageHandlerMock (); var client = new HttpClient (mh); var request = new HttpRequestMessage (HttpMethod.Get, "http://xamarin.com"); client.CancelPendingRequests (); mh.OnSendFull = (l, c) => { Assert.IsFalse (c.IsCancellationRequested, "#30"); return Task.FromResult (new HttpResponseMessage ()); }; client.SendAsync (request).Wait (WaitTimeout); request = new HttpRequestMessage (HttpMethod.Get, "http://xamarin.com"); client.SendAsync (request).Wait (WaitTimeout); }
public async Task GetStreamAsync_Test() { using (var mockHandler = new HttpMessageHandlerMock()) using (var http = new HttpClient(mockHandler)) using (var apiConnection = new TwitterApiConnection("", "")) using (var image = TestUtils.CreateDummyImage()) { apiConnection.http = http; mockHandler.Enqueue(x => { Assert.Equal(HttpMethod.Get, x.Method); Assert.Equal("https://api.twitter.com/1.1/hoge/tetete.json", x.RequestUri.GetLeftPart(UriPartial.Path)); var query = HttpUtility.ParseQueryString(x.RequestUri.Query); Assert.Equal("1111", query["aaaa"]); Assert.Equal("2222", query["bbbb"]); return new HttpResponseMessage(HttpStatusCode.OK) { Content = new ByteArrayContent(image.Stream.ToArray()), }; }); var endpoint = new Uri("hoge/tetete.json", UriKind.Relative); var param = new Dictionary<string, string> { ["aaaa"] = "1111", ["bbbb"] = "2222", }; var stream = await apiConnection.GetStreamAsync(endpoint, param) .ConfigureAwait(false); using (var memoryStream = new MemoryStream()) { // 内容の比較のために MemoryStream にコピー await stream.CopyToAsync(memoryStream).ConfigureAwait(false); Assert.Equal(image.Stream.ToArray(), memoryStream.ToArray()); } Assert.Equal(0, mockHandler.QueueCount); } }
public void Send_DefaultRequestHeaders () { var mh = new HttpMessageHandlerMock (); var client = new HttpClient (mh); client.DefaultRequestHeaders.Referrer = new Uri ("http://google.com"); var request = new HttpRequestMessage (HttpMethod.Get, "http://xamarin.com"); var response = new HttpResponseMessage (); mh.OnSend = l => { Assert.AreEqual (client.DefaultRequestHeaders.Referrer, l.Headers.Referrer, "#2"); Assert.IsNotNull (l.Headers.Referrer, "#3"); return Task.FromResult (response); }; Assert.AreEqual (response, client.SendAsync (request).Result, "#1"); }
public async Task PostLazyAsync_Test() { using (var mockHandler = new HttpMessageHandlerMock()) using (var http = new HttpClient(mockHandler)) using (var apiConnection = new TwitterApiConnection("", "")) { apiConnection.http = http; mockHandler.Enqueue(async x => { Assert.Equal(HttpMethod.Post, x.Method); Assert.Equal("https://api.twitter.com/1.1/hoge/tetete.json", x.RequestUri.AbsoluteUri); var body = await x.Content.ReadAsStringAsync() .ConfigureAwait(false); var query = HttpUtility.ParseQueryString(body); Assert.Equal("1111", query["aaaa"]); Assert.Equal("2222", query["bbbb"]); return new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent("\"hogehoge\""), }; }); var endpoint = new Uri("hoge/tetete.json", UriKind.Relative); var param = new Dictionary<string, string> { ["aaaa"] = "1111", ["bbbb"] = "2222", }; var result = await apiConnection.PostLazyAsync<string>(endpoint, param) .ConfigureAwait(false); Assert.Equal("hogehoge", await result.LoadJsonAsync() .ConfigureAwait(false)); Assert.Equal(0, mockHandler.QueueCount); } }
public void Send_InvalidHandler () { var mh = new HttpMessageHandlerMock (); var client = new HttpClient (mh); client.BaseAddress = new Uri ("http://xamarin.com"); var request = new HttpRequestMessage (); mh.OnSend = l => { Assert.AreEqual (l, request, "#1"); return null; }; try { // Broken by design client.SendAsync (request).Wait (WaitTimeout); Assert.Fail ("#2"); } catch (Exception) { } }
public async Task PostLazyAsync_MultipartTest() { using (var mockHandler = new HttpMessageHandlerMock()) using (var http = new HttpClient(mockHandler)) using (var apiConnection = new TwitterApiConnection("", "")) { apiConnection.httpUpload = http; using (var image = TestUtils.CreateDummyImage()) using (var media = new MemoryImageMediaItem(image)) { mockHandler.Enqueue(async x => { Assert.Equal(HttpMethod.Post, x.Method); Assert.Equal("https://api.twitter.com/1.1/hoge/tetete.json", x.RequestUri.AbsoluteUri); Assert.IsType<MultipartFormDataContent>(x.Content); var boundary = x.Content.Headers.ContentType.Parameters.Cast<NameValueHeaderValue>() .First(y => y.Name == "boundary").Value; // 前後のダブルクオーテーションを除去 boundary = boundary.Substring(1, boundary.Length - 2); var expectedText = $"--{boundary}\r\n" + "Content-Type: text/plain; charset=utf-8\r\n" + "Content-Disposition: form-data; name=aaaa\r\n" + "\r\n" + "1111\r\n"+ $"--{boundary}\r\n" + "Content-Type: text/plain; charset=utf-8\r\n" + "Content-Disposition: form-data; name=bbbb\r\n" + "\r\n" + "2222\r\n" + $"--{boundary}\r\n" + $"Content-Disposition: form-data; name=media1; filename={media.Name}; filename*=utf-8''{media.Name}\r\n" + "\r\n"; var expected = Encoding.UTF8.GetBytes(expectedText) .Concat(image.Stream.ToArray()) .Concat(Encoding.UTF8.GetBytes($"\r\n--{boundary}--\r\n")); Assert.Equal(expected, await x.Content.ReadAsByteArrayAsync().ConfigureAwait(false)); return new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent("\"hogehoge\""), }; }); var endpoint = new Uri("hoge/tetete.json", UriKind.Relative); var param = new Dictionary<string, string> { ["aaaa"] = "1111", ["bbbb"] = "2222", }; var mediaParam = new Dictionary<string, IMediaItem> { ["media1"] = media, }; var result = await apiConnection.PostLazyAsync<string>(endpoint, param, mediaParam) .ConfigureAwait(false); Assert.Equal("hogehoge", await result.LoadJsonAsync() .ConfigureAwait(false)); Assert.Equal(0, mockHandler.QueueCount); } } }
public async Task ListFileOrFolder_ReturnsCorrectFolder() { var httpHandlerMock = new HttpMessageHandlerMock(); var httpClient = new HttpClient(httpHandlerMock); httpHandlerMock.SendAsyncFunc = (request, cancellationToken) => Task.FromResult( new HttpResponseMessage { StatusCode = HttpStatusCode.OK, Content = new StringContent(ListFolderResponse) }); var egnyteClient = new EgnyteClient("token", "acme", httpClient); var result = await egnyteClient.Files.ListFileOrFolder("path"); Assert.AreEqual(true, result.IsFolder); Assert.NotNull(result.AsFolder); Assert.AreEqual(null, result.AsFile); var folderMetadata = result.AsFolder; Assert.AreEqual("Documents", folderMetadata.Name); Assert.AreEqual(new DateTime(2016, 7, 7, 18, 15, 9), folderMetadata.LastModified); Assert.AreEqual(1, folderMetadata.Count); Assert.AreEqual(2, folderMetadata.Offset); Assert.AreEqual("/Shared/Documents", folderMetadata.Path); Assert.AreEqual("f3066c91-245c-446d-85ac-bfb88196e4e8", folderMetadata.FolderId); Assert.AreEqual(18, folderMetadata.TotalCount); Assert.AreEqual("files_folders", folderMetadata.PublicLinks); Assert.AreEqual(true, folderMetadata.RestrictMoveDelete); Assert.AreEqual(2, folderMetadata.AllowedFileLinkTypes.Length); Assert.AreEqual("domain", folderMetadata.AllowedFileLinkTypes[0]); Assert.AreEqual("recipients", folderMetadata.AllowedFileLinkTypes[1]); Assert.AreEqual(2, folderMetadata.AllowedFolderLinkTypes.Length); Assert.AreEqual("anyone", folderMetadata.AllowedFolderLinkTypes[0]); Assert.AreEqual("password", folderMetadata.AllowedFolderLinkTypes[1]); Assert.AreEqual(1, folderMetadata.Files.Count); Assert.AreEqual("checksum1", folderMetadata.Files[0].Checksum); Assert.AreEqual("/Shared/Documents/nice_image.jpg", folderMetadata.Files[0].Path); Assert.AreEqual("nice_image.jpg", folderMetadata.Files[0].Name); Assert.AreEqual(true, folderMetadata.Files[0].Locked); Assert.AreEqual("8d0ee165-fafe-4da8-aea4-4dda4dc7440b", folderMetadata.Files[0].EntryId); Assert.AreEqual("f882c636-4a2b-49af-a29c-2ec6507a2a1f", folderMetadata.Files[0].GroupId); Assert.AreEqual(new DateTime(2015, 4, 14, 9, 25, 21), folderMetadata.Files[0].LastModified); Assert.AreEqual("mik", folderMetadata.Files[0].UploadedBy); Assert.AreEqual(2, folderMetadata.Files[0].NumberOfVersions); Assert.AreEqual(2, folderMetadata.Folders.Count); Assert.AreEqual("Test", folderMetadata.Folders[0].Name); Assert.AreEqual(new DateTime(2016, 7, 7, 18, 16, 49), folderMetadata.Folders[0].LastModified); Assert.AreEqual("/Shared/Documents/Test", folderMetadata.Folders[0].Path); Assert.AreEqual("6a1c7f21-874e-44d0-9360-ca09eacf8553", folderMetadata.Folders[0].FolderId); Assert.AreEqual(2, folderMetadata.Folders[0].AllowedFileLinkTypes.Length); Assert.AreEqual("domain", folderMetadata.Folders[0].AllowedFileLinkTypes[0]); Assert.AreEqual("recipients", folderMetadata.Folders[0].AllowedFileLinkTypes[1]); Assert.AreEqual(2, folderMetadata.Folders[0].AllowedFolderLinkTypes.Length); Assert.AreEqual("anyone", folderMetadata.Folders[0].AllowedFolderLinkTypes[0]); Assert.AreEqual("password", folderMetadata.Folders[0].AllowedFolderLinkTypes[1]); Assert.AreEqual("Articles", folderMetadata.Folders[1].Name); Assert.AreEqual(new DateTime(2016, 7, 7, 18, 18, 29), folderMetadata.Folders[1].LastModified); Assert.AreEqual("/Shared/Documents/Articles", folderMetadata.Folders[1].Path); Assert.AreEqual("429b22bf-a111-4f7d-8460-58223db92817", folderMetadata.Folders[1].FolderId); Assert.AreEqual(2, folderMetadata.Folders[1].AllowedFileLinkTypes.Length); Assert.AreEqual("domain", folderMetadata.Folders[1].AllowedFileLinkTypes[0]); Assert.AreEqual("recipients", folderMetadata.Folders[1].AllowedFileLinkTypes[1]); Assert.AreEqual(2, folderMetadata.Folders[1].AllowedFolderLinkTypes.Length); Assert.AreEqual("anyone", folderMetadata.Folders[1].AllowedFolderLinkTypes[0]); Assert.AreEqual("password", folderMetadata.Folders[1].AllowedFolderLinkTypes[1]); var requestMessage = httpHandlerMock.GetHttpRequestMessage(); Assert.AreEqual( "https://acme.egnyte.com/pubapi/v1/fs/path?list_content=True&allowed_link_types=False", requestMessage.RequestUri.ToString()); }
public async Task PostLazyAsync_Multipart_NullTest() { using (var mockHandler = new HttpMessageHandlerMock()) using (var http = new HttpClient(mockHandler)) using (var apiConnection = new TwitterApiConnection("", "")) { apiConnection.httpUpload = http; mockHandler.Enqueue(async x => { Assert.Equal(HttpMethod.Post, x.Method); Assert.Equal("https://api.twitter.com/1.1/hoge/tetete.json", x.RequestUri.AbsoluteUri); Assert.IsType<MultipartFormDataContent>(x.Content); var boundary = x.Content.Headers.ContentType.Parameters.Cast<NameValueHeaderValue>() .First(y => y.Name == "boundary").Value; // 前後のダブルクオーテーションを除去 boundary = boundary.Substring(1, boundary.Length - 2); var expectedText = $"--{boundary}\r\n" + $"\r\n--{boundary}--\r\n"; var expected = Encoding.UTF8.GetBytes(expectedText); Assert.Equal(expected, await x.Content.ReadAsByteArrayAsync().ConfigureAwait(false)); return new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent("\"hogehoge\""), }; }); var endpoint = new Uri("hoge/tetete.json", UriKind.Relative); var result = await apiConnection.PostLazyAsync<string>(endpoint, param: null, media: null) .ConfigureAwait(false); Assert.Equal("hogehoge", await result.LoadJsonAsync() .ConfigureAwait(false)); Assert.Equal(0, mockHandler.QueueCount); } }