Пример #1
0
        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);
            }
        }
Пример #4
0
        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);
            }
        }
Пример #5
0
        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);
        }
Пример #10
0
        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);
        }
Пример #11
0
 public void SetResponse(HttpResponseMessage response)
 {
     HttpMessageHandler = new HttpMessageHandlerMock(response);
 }
Пример #12
0
		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) {
			}
		}
Пример #13
0
		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");
		}
Пример #14
0
 public MockHttpClientFactory(HttpStatusCode responseStatusCode)
 {
     HttpMessageHandler = new HttpMessageHandlerMock(new HttpResponseMessage(responseStatusCode));
 }
Пример #15
0
        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);
        }
Пример #16
0
		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);
		}
Пример #17
0
		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");
		}
Пример #18
0
 public void SetResponse(HttpResponseMessage response)
 {
     HttpMessageHandler = new HttpMessageHandlerMock(response);
 }
Пример #19
0
		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) {
			}
		}
Пример #20
0
 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();
        }
Пример #25
0
		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) {
			}
		}
Пример #26
0
        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);
                            }
                    }
        }
Пример #27
0
        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);
            }
        }
Пример #29
0
 public MockHttpClientFactory(HttpStatusCode responseStatusCode)
 {
     HttpMessageHandler = new HttpMessageHandlerMock(new HttpResponseMessage(responseStatusCode));
 }
        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);
            }
        }
Пример #31
0
		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);
            }
        }
Пример #33
0
		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);
            }
        }
Пример #35
0
		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);
            }
        }
Пример #37
0
		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);
            }
        }