public SucceedAPIsMockModule()
        {
            Post[BasePath + "objects"] = x => {
                TestUtils.AssertObjectEquals(TestUtils.CreateTestObject(), ObjectSerializer.DeserializeObject(NancyUtils.BodyAsString(this.Request)));
                return(201);
            };

            Put[BasePath + "objects"] = x => {
                List <SmartObject> objects = TestUtils.DeserializeObjects(NancyUtils.BodyAsString(this.Request));
                TestUtils.AssertObjectsEqual(TestUtils.CreateObjects(objects.Count <SmartObject>()), objects);

                List <Result> results = new List <Result>();
                foreach (SmartObject anObject in objects)
                {
                    results.Add(new Result(anObject.DeviceId, Result.ResultStates.Success, null));
                }

                return(JsonConvert.SerializeObject(results));
            };

            Put[BasePath + "objects/{deviceId}"] = x => {
                TestUtils.AssertObjectEquals(TestUtils.CreateObjectUpdateAttribute(), ObjectSerializer.DeserializeObject(NancyUtils.BodyAsString(this.Request)));
                Assert.AreEqual(TestUtils.DeviceId, (string)x.deviceId);
                return(200);
            };

            Delete[BasePath + "objects/{deviceId}"] = x => {
                Assert.AreEqual(TestUtils.DeviceId, (string)x.deviceId);
                return(200);
            };

            Get[BasePath + "objects/exists/{deviceId}"] = x => {
                var deviceId = (string)x.deviceId;
                Assert.AreEqual(TestUtils.DeviceId, deviceId);
                IDictionary <string, bool> result = new Dictionary <string, bool>()
                {
                    { deviceId, true }
                };
                return(JsonConvert.SerializeObject(result));
            };

            Post[BasePath + "owners"] = x => {
                TestUtils.AssertOwnerEquals(TestUtils.CreateTestOwner(), OwnerSerializer.DeserializeOwner(NancyUtils.BodyAsString(this.Request)));
                return(201);
            };

            Put[BasePath + "owners"] = x => {
                List <Owner> owners = TestUtils.DeserializeOwners(NancyUtils.BodyAsString(this.Request));
                TestUtils.AssertOwnersEqual(TestUtils.CreateOwners(owners.Count <Owner>()), owners);

                List <Result> results = new List <Result>();
                foreach (Owner owner in owners)
                {
                    results.Add(new Result(owner.Username, Result.ResultStates.Success, null));
                }

                return(JsonConvert.SerializeObject(results));
            };

            Put[BasePath + "owners/{username}"] = x => {
                TestUtils.AssertOwnerEquals(TestUtils.CreateOwnerUpdateAttribute(), OwnerSerializer.DeserializeOwner(NancyUtils.BodyAsString(this.Request)));
                Assert.AreEqual(TestUtils.Username, (string)x.username);
                return(200);
            };

            Put[BasePath + "owners/{username}/password"] = x => {
                Dictionary <string, string> body = JsonConvert.DeserializeObject <Dictionary <string, string> >(NancyUtils.BodyAsString(this.Request));
                Assert.IsTrue(body.ContainsKey("x_password"));
                String password = "";
                body.TryGetValue("x_password", out password);
                Assert.AreEqual(TestUtils.Password, password);
                Assert.AreEqual(TestUtils.Username, (string)x.username);
                return(200);
            };

            Post[BasePath + "owners/{username}/objects/{deviceId}/claim"] = x => {
                Assert.AreEqual(TestUtils.DeviceId, (string)x.deviceId);
                Assert.AreEqual(TestUtils.Username, (string)x.username);
                return(200);
            };

            Post[BasePath + "owners/{username}/objects/{deviceId}/unclaim"] = x => {
                Assert.AreEqual(TestUtils.DeviceId, (string)x.deviceId);
                Assert.AreEqual(TestUtils.Username, (string)x.username);
                return(200);
            };

            Delete[BasePath + "owners/{username}"] = x => {
                Assert.AreEqual(TestUtils.Username, (string)x.username);
                return(200);
            };

            Get[BasePath + "owners/exists/{username}"] = x => {
                string username = (string)x.username;
                Assert.AreEqual(TestUtils.Username, username);
                IDictionary <string, bool> result = new Dictionary <string, bool>()
                {
                    { username, true }
                };
                return(JsonConvert.SerializeObject(result));
            };

            Post[BasePath + "events"] = x => {
                bool reportResults = (bool)this.Request.Query["report_results"];

                Assert.AreEqual(true, reportResults);
                List <EventResult> results = TestUtils.EventsToSuccesfullResults(NancyUtils.BodyAsString(this.Request));
                return(JsonConvert.SerializeObject(results));
            };

            Get[BasePath + "events/exists/{eventId}"] = x => {
                IDictionary <string, bool> result = new Dictionary <string, bool>()
                {
                    { (string)x.eventId, true }
                };
                return(JsonConvert.SerializeObject(result));
            };

            Get[BasePath + "search/datasets"] = x => {
                return(JsonConvert.SerializeObject(TestUtils.CreateDatasets()));
            };

            Post[BasePath + "search/basic"] = x => {
                Assert.AreEqual(TestUtils.CreateQuery(), NancyUtils.BodyAsString(this.Request));
                return(TestUtils.CreateExpectedSearchResult());
            };

            // test HttpClient itself
            Post[BasePath + "compressed"] = x => {
                if (!NancyUtils.IsGzipCompressed(this.Request))
                {
                    return(FailedAPIsMockModule.badRequest());
                }

                if (!this.Request.Headers.AcceptEncoding.Contains("gzip"))
                {
                    return(FailedAPIsMockModule.badRequest());
                }

                var body = NancyUtils.BodyAsString(this.Request);
                if (body != TestJsonString)
                {
                    return(FailedAPIsMockModule.badRequest());
                }

                var data     = Encoding.UTF8.GetBytes(body);
                var response = new Response();
                response.Headers.Add("Content-Encoding", "gzip");
                response.Headers.Add("Content-Type", "application/json");
                response.Contents = stream =>
                {
                    using (var gz = new GZipStream(stream, CompressionMode.Compress))
                    {
                        gz.Write(data, 0, data.Length);
                        gz.Flush();
                    }
                };
                return(response);
            };

            Post[BasePath + "decompressed"] = x => {
                if (NancyUtils.IsGzipCompressed(this.Request))
                {
                    return(FailedAPIsMockModule.badRequest());
                }

                var body = NancyUtils.BodyAsString(this.Request);
                if (body != TestJsonString)
                {
                    return(FailedAPIsMockModule.badRequest());
                }

                return(TestJsonString);
            };

            Post[BasePath + "tokencheck"] = x => {
                return(this.Request.Headers.Authorization);
            };
        }
        public BatchAPIsMockModule()
        {
            Put[BasePath + "owners"] = x => {
                List <Owner> owners = TestUtils.DeserializeOwners(NancyUtils.BodyAsString(this.Request));
                CollectionAssert.AreEqual(TestUtils.CreateOwners(owners.Count <Owner>()), owners);

                int           counter = 0;
                List <Result> results = new List <Result>();
                foreach (Owner owner in owners)
                {
                    if (counter % 2 == 0)
                    {
                        results.Add(new Result(owner.Username, Result.ResultStates.Success, null));
                    }
                    else
                    {
                        results.Add(new Result(owner.Username, Result.ResultStates.Error, TestUtils.ErrorMessage));
                    }
                }

                var response = (Response)JsonConvert.SerializeObject(results);
                response.StatusCode  = HttpStatusCode.MultipleStatus;
                response.ContentType = "application/json";
                return(response);
            };

            Post[BasePath + "owners/exists"] = x => {
                List <string> usernames = JsonConvert.DeserializeObject <List <string> >(NancyUtils.BodyAsString(this.Request));

                List <Dictionary <string, bool> > results = new List <Dictionary <string, bool> >();

                int counter = 0;
                foreach (var username in usernames)
                {
                    results.Add(new Dictionary <string, bool>()
                    {
                        { username, counter % 2 == 0 ? true : false }
                    });
                    ++counter;
                }

                return(JsonConvert.SerializeObject(results));
            };

            Get[BasePath + "owners/exists/{username}"] = x => {
                var username = (string)x.username;
                Assert.AreEqual(TestUtils.Username, username);
                IDictionary <string, bool> result = new Dictionary <string, bool>()
                {
                    { username, false }
                };
                return(JsonConvert.SerializeObject(result));
            };

            Put[BasePath + "objects"] = x => {
                List <SmartObject> objects = TestUtils.DeserializeObjects(NancyUtils.BodyAsString(this.Request));
                CollectionAssert.AreEqual(TestUtils.CreateObjects(objects.Count <SmartObject>()), objects);

                int           counter = 0;
                List <Result> results = new List <Result>();
                foreach (SmartObject anObject in objects)
                {
                    if (counter % 2 == 0)
                    {
                        results.Add(new Result(anObject.DeviceId, Result.ResultStates.Success, null));
                    }
                    else
                    {
                        results.Add(new Result(anObject.DeviceId, Result.ResultStates.Error, TestUtils.ErrorMessage));
                    }
                }

                var response = (Response)JsonConvert.SerializeObject(results);
                response.StatusCode  = HttpStatusCode.MultipleStatus;
                response.ContentType = "application/json";
                return(response);
            };

            Post[BasePath + "objects/exists"] = x => {
                List <string> deviceIds = JsonConvert.DeserializeObject <List <string> >(NancyUtils.BodyAsString(this.Request));

                List <Dictionary <string, bool> > results = new List <Dictionary <string, bool> >();

                int counter = 0;
                foreach (var deviceId in deviceIds)
                {
                    results.Add(new Dictionary <string, bool>()
                    {
                        { deviceId, counter % 2 == 0 ? true : false }
                    });
                    ++counter;
                }

                return(JsonConvert.SerializeObject(results));
            };

            Get[BasePath + "objects/exists/{deviceId}"] = x => {
                string deviceId = (string)x.deviceId;
                Assert.AreEqual(TestUtils.DeviceId, deviceId);
                IDictionary <string, bool> result = new Dictionary <string, bool>()
                {
                    { deviceId, false }
                };
                return(JsonConvert.SerializeObject(result));
            };

            Post[BasePath + "events"] = x =>
            {
                List <EventResult> results = new List <EventResult>();
                int  i             = 0;
                bool eventIdExists = false;

                foreach (var jsonObject in JArray.Parse(NancyUtils.BodyAsString(this.Request)))
                {
                    JObject jsonObj = (JObject)jsonObject;
                    Guid    eventId;
                    JToken  eventIdProperty;

                    if (jsonObj.TryGetValue(TestUtils.EventIdProperty, out eventIdProperty))
                    {
                        eventId       = Guid.Parse((string)eventIdProperty);
                        eventIdExists = true;
                    }
                    else
                    {
                        eventId       = Guid.NewGuid();
                        eventIdExists = false;
                    }

                    //Pair result succeed, odd failed
                    if (eventIdExists)
                    {
                        results.Add(new EventResult(eventId, true, EventResult.ResultStates.conflict, null));
                    }
                    else if (i % 3 == 1)
                    {
                        results.Add(new EventResult(eventId, true, EventResult.ResultStates.success, null));
                    }
                    else if (i % 3 == 2)
                    {
                        results.Add(new EventResult(eventId, false, EventResult.ResultStates.error, "Event Failed"));
                    }
                    else
                    {
                        results.Add(new EventResult(eventId, false, EventResult.ResultStates.success, null));
                    }
                    i++;
                }

                var response = (Response)JsonConvert.SerializeObject(results);
                response.StatusCode  = HttpStatusCode.MultipleStatus;
                response.ContentType = "application/json";
                return(response);
            };

            Post[BasePath + "events/exists"] = x => {
                List <Guid> ids = JsonConvert.DeserializeObject <List <Guid> >(NancyUtils.BodyAsString(this.Request));

                List <Dictionary <Guid, bool> > results = new List <Dictionary <Guid, bool> >();

                int counter = 0;
                foreach (var id in ids)
                {
                    results.Add(new Dictionary <Guid, bool>()
                    {
                        { id, counter % 2 == 0 ? true : false }
                    });
                    ++counter;
                }

                return(JsonConvert.SerializeObject(results));
            };

            Get[BasePath + "events/exists/{eventId}"] = x => {
                IDictionary <string, bool> result = new Dictionary <string, bool>()
                {
                    { (string)x.eventId, false }
                };
                return(JsonConvert.SerializeObject(result));
            };
        }