public void TestGetDiffUrlsWithCountry()
        {
            var apiConnection = new MainApiConnection(_apiConnectionSettings);

            var factory = Substitute.For <IHttpWebRequestFactory>();

            apiConnection.HttpWebRequestFactory = factory;

            var mainWebRequest = Substitute.For <IHttpWebRequest>();

            factory.Create("http://main_server/1/apps/secret/versions/13/diff_urls?country=PL").Returns(mainWebRequest);

            var webResponse = CreateSimpleWebResponse(
                "[{\"url\": \"http://first\", \"meta_url\": \"http://efg\", \"country\": \"PL\"}, " +
                "{\"url\": \"http://second\", \"meta_url\": \"http://efg\"}]");

            mainWebRequest.GetResponse().Returns(webResponse);

            var contentUrls = apiConnection.GetAppVersionDiffUrls("secret", 13, "PL");

            Assert.AreEqual(2, contentUrls.Length);
            Assert.AreEqual("http://first", contentUrls[0].Url);
            Assert.AreEqual("PL", contentUrls[0].Country);
            Assert.AreEqual(null, contentUrls[1].Country);
        }
        public void TestSingle()
        {
            var apiConnection = new MainApiConnection(_apiConnectionSettings)
            {
                HttpClient = Substitute.For <IHttpClient>()
            };

            AddResponseToClient(apiConnection.HttpClient, "http://main_server/path?query",
                                CreateSimpleWebResponse("test"));

            var apiResponse = apiConnection.GetResponse("/path", "query", CancellationToken.Empty);

            Assert.AreEqual("test", apiResponse.Body);
        }
        public void TestCustomPort()
        {
            _apiConnectionSettings.MainServer.Port = 81;
            var apiConnection = new MainApiConnection(_apiConnectionSettings)
            {
                HttpClient = Substitute.For <IHttpClient>()
            };

            AddResponseToClient(apiConnection.HttpClient, "http://main_server:81/path?query",
                                CreateSimpleWebResponse("test"));

            var apiResponse = apiConnection.GetResponse("/path", "query");

            Assert.AreEqual("test", apiResponse.Body);
        }
        // ReSharper disable once InconsistentNaming
        public void Test4XXException()
        {
            // any 4XX error from the main server should throw an ApiResponseException
            var apiConnection = new MainApiConnection(_apiConnectionSettings)
            {
                HttpClient = Substitute.For <IHttpClient>()
            };

            AddResponseToClient(apiConnection.HttpClient, "http://main_server/path?query",
                                CreateErrorResponse(HttpStatusCode.NotFound));

            Assert.Throws(
                Is.TypeOf <ApiResponseException>(),
                () => apiConnection.GetResponse("/path", "query", CancellationToken.Empty)
                );
        }
        public void TestGetDiffUrls()
        {
            var apiConnection = new MainApiConnection(_apiConnectionSettings)
            {
                HttpClient = Substitute.For <IHttpClient>()
            };

            AddResponseToClient(apiConnection.HttpClient, "http://main_server/1/apps/secret/versions/13/diff_urls",
                                CreateSimpleWebResponse(
                                    "[{\"url\": \"http://first\", \"meta_url\": \"http://efg\", \"country\": \"PL\"}, " +
                                    "{\"url\": \"http://second\", \"meta_url\": \"http://efg\"}]"));

            var contentUrls = apiConnection.GetAppVersionDiffUrls("secret", 13, null, null, CancellationToken.Empty);

            Assert.AreEqual(2, contentUrls.Length);
            Assert.AreEqual("http://first", contentUrls[0].Url);
            Assert.AreEqual("PL", contentUrls[0].Country);
            Assert.AreEqual(null, contentUrls[1].Country);
        }
        // ReSharper disable once InconsistentNaming
        public void Test5XXException()
        {
            // any 5XX error from the main server should throw an ApiConnectionException
            var apiConnection = new MainApiConnection(_apiConnectionSettings)
            {
                HttpClient = Substitute.For <IHttpClient>()
            };

            AddResponseToClient(apiConnection.HttpClient, "http://main_server/path?query",
                                CreateErrorResponse(HttpStatusCode.InternalServerError));

            var exception = (ApiConnectionException)Assert.Throws(
                Is.TypeOf <ApiConnectionException>(),
                () => apiConnection.GetResponse("/path", "query", CancellationToken.Empty)
                );

            Assert.IsTrue(exception.MainServerExceptions.Any());
            Assert.IsTrue(exception.CacheServersExceptions.Any());
        }
        public void TestApiCache500()
        {
            // test how connection will behave on 500 error
            var apiConnection = new MainApiConnection(_apiConnectionSettings)
            {
                HttpClient = Substitute.For <IHttpClient>()
            };

            // main
            AddResponseToClient(apiConnection.HttpClient, "http://main_server/path?query",
                                CreateErrorResponse(HttpStatusCode.InternalServerError));

            // cache
            AddResponseToClient(apiConnection.HttpClient, "http://cache_server_1/path?query",
                                CreateSimpleWebResponse("test"));

            var apiResponse = apiConnection.GetResponse("/path", "query", CancellationToken.Empty);

            Assert.AreEqual("test", apiResponse.Body);
        }
        // ReSharper disable once InconsistentNaming
        public void TestCache4XXException()
        {
            var apiConnection = new MainApiConnection(_apiConnectionSettings)
            {
                HttpClient = Substitute.For <IHttpClient>()
            };

            AddThrowToClient(apiConnection.HttpClient, "http://main_server/path?query",
                             new WebException("main-server"));
            AddThrowToClient(apiConnection.HttpClient, "http://cache_server_1/path?query",
                             new WebException("cache-server-1"));
            AddResponseToClient(apiConnection.HttpClient, "http://cache_server_2/path?query",
                                CreateErrorResponse(HttpStatusCode.NotFound));

            var exception = (ApiConnectionException)Assert.Throws(
                Is.TypeOf <ApiConnectionException>(),
                () => apiConnection.GetResponse("/path", "query", CancellationToken.Empty)
                );

            Assert.IsTrue(exception.MainServerExceptions.All(e => e.Message == "main-server"));
            Assert.IsTrue(exception.CacheServersExceptions.Any(e => e.Message == "cache-server-1"));
        }
        public void TestExceptions()
        {
            var apiConnection = new MainApiConnection(_apiConnectionSettings)
            {
                HttpClient = Substitute.For <IHttpClient>()
            };

            AddThrowToClient(apiConnection.HttpClient, "http://main_server/path?query",
                             new WebException("main-server"));
            AddThrowToClient(apiConnection.HttpClient, "http://cache_server_1/path?query",
                             new WebException("cache-server-1"));
            AddThrowToClient(apiConnection.HttpClient, "http://cache_server_2/path?query",
                             new WebException("cache-server-2"));

            var exception = (ApiConnectionException)Assert.Throws(
                Is.TypeOf <ApiConnectionException>(),
                () => apiConnection.GetResponse("/path", "query")
                );

            Assert.IsTrue(exception.MainServerExceptions.All(e => e.Message == "main-server"));
            Assert.IsTrue(exception.CacheServersExceptions.All(e =>
                                                               e.Message == "cache-server-1" || e.Message == "cache-server-2"));
        }
        public void TestErrorOnCache()
        {
            // Any code different than 200 on API cache should skip it
            var apiConnection = new MainApiConnection(_apiConnectionSettings)
            {
                HttpClient = Substitute.For <IHttpClient>()
            };

            // main
            AddResponseToClient(apiConnection.HttpClient, "http://main_server/path?query",
                                CreateErrorResponse(HttpStatusCode.BadGateway));

            // cache1
            AddResponseToClient(apiConnection.HttpClient, "http://cache_server_1/path?query",
                                CreateErrorResponse(HttpStatusCode.NotFound));

            // cache2
            AddResponseToClient(apiConnection.HttpClient, "http://cache_server_2/path?query",
                                CreateSimpleWebResponse("test"));

            var apiResponse = apiConnection.GetResponse("/path", "query", CancellationToken.Empty);

            Assert.AreEqual("test", apiResponse.Body);
        }