public void TestCreateClient()
        {
            // Arrange
            string testURL = "http://test.org:8080/api/";
            string testAPIKey = "test12345";

            Mock<IHttpClient> httpClient = SetupClient(testURL, testAPIKey);

            // Act
            KegbotHttpRESTClient client = new KegbotHttpRESTClient(testURL, testAPIKey, httpClient.Object);

            // Assert
            httpClient.VerifyAll();
        }
        public static async Task testStuff()
        {
            HttpClientWrapper httpClient = new HttpClientWrapper(new HttpClient());

            KegbotHttpRESTClient c = new KegbotHttpRESTClient("http://192.168.1.101:30080/api/", "5b94a95f58e4e371c8ee4c466740e2cc", httpClient);

            try
            {
                User adminUser = await c.GetUser("admin");

                List<Drink> adminDrinks = await c.GetUserDrinks("admin");

                //List<Drink> allDrinks = await c.GetDrinks();

                List<Keg> allKegs = await c.GetKegs();

                foreach(Keg k in allKegs)
                {
                    Keg k1 = await c.GetKeg(k.Id);

                    List<Drink> k1Drinks = await c.GetKegDrinks(k.Id);

                    List<Session> k1Sessions = await c.GetKegSessions(k.Id);
                }

                List<KegTap> taps = await c.GetTaps();

                foreach(KegTap t in taps)
                {
                    KegTap k = await c.GetTap(t.MeterName);


                        RecordedDrink rd = await c.RecordDrink(t.MeterName, 0, 568.26, "admin", null, null, null, "test");

                        Drink d = await c.GetDrink(rd.Id);

                        //bool success = await c.CancelDrink(d.Id, false);

                }
            }
            catch (KegbotAPIException e)
            {
                
            }

        }
        public async Task TestGetTapErrorResponse()
        {
            // Arrange
            string testURL = "http://test.org:8080/api/";
            string getURL = "taps/test_tap";
            string testAPIKey = "test12345";
            string tapName = "test_tap";
            HttpResponseMessage responseMessage = new HttpResponseMessage(HttpStatusCode.NotFound);

            ErrorResponse payload = new ErrorResponse();
            payload.MetaData = new Meta() { Result = "error" };
            payload.Error = new Error() { Code = "NotFoundError", Message = "No KegTap matches the given query."};
            string content = JsonConvert.SerializeObject(payload);

            Mock<IHttpClient> httpClient = SetupClient(testURL, testAPIKey);

            responseMessage.Content = new StringContent(content, System.Text.Encoding.UTF8, "application/json");

            httpClient.Setup(c => c.GetAsync(It.Is<string>(s => s == getURL))).Returns(Task.FromResult(responseMessage)).Verifiable();

            KegbotHttpRESTClient client = new KegbotHttpRESTClient(testURL, testAPIKey, httpClient.Object);

            // Act
            try
            {
                KegTap k = await client.GetTap(tapName);
            }
            catch (KegbotAPIException e)
            {
                // Assert
                Assert.IsNotNull(e.Error);
                Assert.AreEqual(e.Error.Code.ToString(), payload.Error.Code);
                Assert.AreEqual(e.Error.Message.ToString(), payload.Error.Message);
            }

            httpClient.VerifyAll();
        }
        public async Task TestRecordDrinkErrorResponse()
        {
            // Arrange
            string testURL = "http://test.org:8080/api/";
            string putURL = "taps/1";
            string testAPIKey = "test12345";
            string tap = "1";
            int ticks = 2;
            int volume = 3;
            string username = "******";
            int pourTime = 4; 
            int now = 5;
            int duration = 6;
            string shout = "test";

            HttpResponseMessage responseMessage = new HttpResponseMessage(HttpStatusCode.InternalServerError);

            ErrorResponse payload = new ErrorResponse();
            payload.MetaData = new Meta() { Result = "error" };
            payload.Error = new Error() { Code = "ServerError", Message = "Something bad happened!" };
            string content = JsonConvert.SerializeObject(payload);

            Mock<IHttpClient> httpClient = SetupClient(testURL, testAPIKey);

            responseMessage.Content = new StringContent(content, System.Text.Encoding.UTF8, "application/json");

            httpClient.Setup(c => c.PostAsync(It.Is<string>(s => s == putURL),It.IsAny<HttpContent>())).Returns(Task.FromResult(responseMessage)).Verifiable();

            KegbotHttpRESTClient client = new KegbotHttpRESTClient(testURL, testAPIKey, httpClient.Object);

            // Act
            try
            {
                RecordedDrink drink = await client.RecordDrink(tap, ticks, volume, username, pourTime, now, duration, shout);
            }
            catch (KegbotAPIException e)
            {
                // Assert
                Assert.IsNotNull(e.Error);
                Assert.AreEqual(e.Error.Code.ToString(), payload.Error.Code);
                Assert.AreEqual(e.Error.Message.ToString(), payload.Error.Message);
            }

            httpClient.VerifyAll();
        }
        public async Task TestRecordDrinkMissingNow()
        {
            // Arrange
            string testURL = "http://test.org:8080/api/";
            string testAPIKey = "test12345";
            string tap = "1";
            int ticks = 2;
            int volume = 3;
            string username = "******";
            int pourTime = 4;
            int? now = null;
            int duration = 6;
            string shout = "test";

            HttpResponseMessage responseMessage = new HttpResponseMessage(HttpStatusCode.InternalServerError);

            Mock<IHttpClient> httpClient = SetupClient(testURL, testAPIKey);

            KegbotHttpRESTClient client = new KegbotHttpRESTClient(testURL, testAPIKey, httpClient.Object);

            // Act
            try
            {
                RecordedDrink drink = await client.RecordDrink(tap, ticks, volume, username, pourTime, now, duration, shout);
            }
            catch (ArgumentNullException e)
            {
                // Assert
                Assert.AreEqual(e.ParamName , "now");
            }

            httpClient.VerifyAll();
        }
        public async Task TestGetUserDrinksErrorResponse()
        {
            // Arrange
            string testURL = "http://test.org:8080/api/";
            string getURL = "users/test_user/drinks";
            string testAPIKey = "test12345";
            string userName = "******";

            HttpResponseMessage responseMessage = new HttpResponseMessage(HttpStatusCode.InternalServerError);

            ErrorResponse payload = new ErrorResponse();
            payload.MetaData = new Meta() { Result = "error" };
            payload.Error = new Error() { Code = "ServerError", Message = "Something bad happened!" };
            string content = JsonConvert.SerializeObject(payload);

            Mock<IHttpClient> httpClient = SetupClient(testURL, testAPIKey);

            responseMessage.Content = new StringContent(content, System.Text.Encoding.UTF8, "application/json");

            httpClient.Setup(c => c.GetAsync(It.Is<string>(s => s == getURL))).Returns(Task.FromResult(responseMessage)).Verifiable();

            KegbotHttpRESTClient client = new KegbotHttpRESTClient(testURL, testAPIKey, httpClient.Object);

            // Act
            try
            {
                List<Drink> drinks = await client.GetUserDrinks(userName);
            }
            catch (KegbotAPIException e)
            {
                // Assert
                Assert.IsNotNull(e.Error);
                Assert.AreEqual(e.Error.Code.ToString(), payload.Error.Code);
                Assert.AreEqual(e.Error.Message.ToString(), payload.Error.Message);
            }

            httpClient.VerifyAll();
        }
        public async Task TestGetUserDrinksSuccess()
        {
            // Arrange
            string testURL = "http://test.org:8080/api/";
            string getURL = "users/test_user/drinks";
            string testAPIKey = "test12345";
            string userName = "******";

            HttpResponseMessage responseMessage = new HttpResponseMessage(HttpStatusCode.OK);

            DrinksPayload payload = new DrinksPayload();
            payload.MetaData = new Meta() { Result = "ok" };
            payload.Drinks = new List<Drink>();
            payload.Drinks.Add(new Drink());
            payload.Drinks.Add(new Drink());

            string content = JsonConvert.SerializeObject(payload);

            responseMessage.Content = new StringContent(content, System.Text.Encoding.UTF8, "application/json");

            Mock<IHttpClient> httpClient = SetupClient(testURL, testAPIKey);

            httpClient.Setup(c => c.GetAsync(It.Is<string>(s => s == getURL))).Returns(Task.FromResult(responseMessage)).Verifiable();

            KegbotHttpRESTClient client = new KegbotHttpRESTClient(testURL, testAPIKey, httpClient.Object);

            // Act
            List<Drink> drinks = await client.GetUserDrinks(userName);

            // Assert
            Assert.AreEqual(payload.Drinks.Count, drinks.Count);

            for (int i = 0; i < drinks.Count; i++)
            {
                Assert.AreEqual(drinks[i], payload.Drinks[i]);
            }

            httpClient.VerifyAll();
        }
        public async Task TestGetUserSuccess()
        {
            // Arrange
            string testURL = "http://test.org:8080/api/";
            string getURL = "users/test_user";
            string testAPIKey = "test12345";
            string userName = "******";
            HttpResponseMessage responseMessage = new HttpResponseMessage(HttpStatusCode.OK);

            UserPayload payload = new UserPayload();
            payload.MetaData = new Meta() { Result = "ok" };
            payload.User = new User();
            string content = JsonConvert.SerializeObject(payload);

            responseMessage.Content = new StringContent(content, System.Text.Encoding.UTF8, "application/json");

            Mock<IHttpClient> httpClient = SetupClient(testURL, testAPIKey);

            httpClient.Setup(c => c.GetAsync(It.Is<string>(s => s == getURL))).Returns(Task.FromResult(responseMessage)).Verifiable();

            KegbotHttpRESTClient client = new KegbotHttpRESTClient(testURL, testAPIKey, httpClient.Object);

            // Act
            User u = await client.GetUser(userName);

            // Assert
            Assert.AreEqual(payload.User, u);

            httpClient.VerifyAll();
        }