public async Task CanAccess_MasterApiKey_ListOf_CommandsSent_TakeOne_AndView_Details()
        {
            try
            {
                var targetCommandId = string.Empty;
                using (var client = new M2XClient(_masterKey))
                {
                    var retrieveCommandsResult = await client.Commands();

                    Assert.IsNotNull(retrieveCommandsResult);
                    Assert.IsFalse(retrieveCommandsResult.Error);
                    Assert.IsFalse(retrieveCommandsResult.ServerError);
                    Assert.IsNull(retrieveCommandsResult.WebError);
                    Assert.IsFalse(string.IsNullOrWhiteSpace(retrieveCommandsResult.Raw));

                    var commandData = JsonConvert.DeserializeObject <ApiResponseForCommandSearch>(retrieveCommandsResult.Raw);
                    if (!commandData.commands.Any())
                    {
                        Assert.Fail("There are no commands to view. Please send one using the appropriate test or create one manually before trying again.");
                    }
                    targetCommandId = commandData.commands.First().id;
                }


                using (var client = new M2XClient(_masterKey))
                {
                    var result = await client.CommandDetails(targetCommandId);

                    Assert.IsNotNull(result);
                    Assert.IsFalse(result.Error);
                    Assert.IsFalse(result.ServerError);
                    Assert.IsNull(result.WebError);
                    Assert.IsFalse(string.IsNullOrWhiteSpace(result.Raw));

                    var commandDetail = JsonConvert.DeserializeObject <ApiResponseForCommandDetail>(result.Raw);
                    Assert.IsNotNull(commandDetail);
                    Assert.IsNotNull(commandDetail.data);
                    Assert.IsNotNull(commandDetail.deliveries);
                    Assert.AreNotEqual(default(DateTime), commandDetail.sent_at);
                }
            }
            catch (Exception)
            {
                DestroyTestDevice();
                throw;
            }
        }
        public async Task CanAccess_MasterApiKey_ListOf_CommandsSent_NoFilters()
        {
            try
            {
                using (var client = new M2XClient(_masterKey))
                {
                    var result = await client.Commands();

                    Assert.IsNotNull(result);
                    Assert.IsFalse(result.Error);
                    Assert.IsFalse(result.ServerError);
                    Assert.IsNull(result.WebError);
                    Assert.IsFalse(string.IsNullOrWhiteSpace(result.Raw));
                    ProcessCommandSearchResult(result.Raw, null);
                }
            }
            catch (Exception)
            {
                DestroyTestDevice();
                throw;
            }
        }
        public async Task CanAccess_MasterApiKey_ListOf_CommandsSent_WithFilters()
        {
            try
            {
                using (var client = new M2XClient(_masterKey))
                {
                    foreach (var filter in new[] { "limit", "page", "dir|desc", "dir|asc", "start", "end", "name" })
                    {
                        M2XResponse result = null;
                        switch (filter)
                        {
                        case "limit":
                            result = await client.Commands(new { limit = 2 });

                            break;

                        case "page":
                            result = await client.Commands(new { page = 1 });

                            break;

                        case "dir|desc":
                            result = await client.Commands(new { dir = "desc" });

                            break;

                        case "dir|asc":
                            result = await client.Commands(new { dir = "asc" });

                            break;

                        case "start":
                            result = await client.Commands(new { start = DateTime.UtcNow.AddMinutes(-60).ToString(Constants.ISO8601_DateStartFormat) });

                            break;

                        case "end":
                            result = await client.Commands(new { end = DateTime.UtcNow.AddMinutes(-10).ToString(Constants.ISO8601_DateStartFormat) });

                            break;

                        case "name":
                            result = await client.Commands(new { name = "PHONE_HOME" });

                            break;
                        }

                        Assert.IsNotNull(result);
                        Assert.IsFalse(result.Error);
                        Assert.IsFalse(result.ServerError);
                        Assert.IsNull(result.WebError);
                        Assert.IsFalse(string.IsNullOrWhiteSpace(result.Raw));
                        ProcessCommandSearchResult(result.Raw, null);
                    }
                }
            }
            catch (Exception)
            {
                DestroyTestDevice();
                throw;
            }
        }
        public async Task CanAccess_MasterApiKey_AndSendCommands_ToSingleDevice_AndDevice_MarksCommand_AsRejected()
        {
            try
            {
                var commandName = "PHONE_HOME";
                using (var client = new M2XClient(_masterKey))
                {
                    var sendCommandParms = new StringBuilder($"{{ ");
                    sendCommandParms.Append($"\"name\": \"{commandName}\"");
                    sendCommandParms.Append($", ");
                    sendCommandParms.Append($"\"data\": {{ \"server_url\": \"https://m2x.att.com\" }}");
                    sendCommandParms.Append($", ");
                    sendCommandParms.Append($"\"targets\": {{ \"devices\": [\"{_testDevice.id}\"] }}");
                    sendCommandParms.Append($" }}");

                    var result = await client.SendCommand(sendCommandParms.ToString());

                    Assert.IsNotNull(result);
                    Assert.IsFalse(result.Error);
                    Assert.IsFalse(result.ServerError);
                    Assert.IsNull(result.WebError);
                    Assert.IsFalse(string.IsNullOrWhiteSpace(result.Raw));
                    Assert.AreEqual(Constants.M2X_Response_Success_Accepted, result.Raw);
                }

                System.Threading.Thread.Sleep(1000);
                var targetCommandId = string.Empty;
                using (var client = new M2XClient(_masterKey))
                {
                    var device = client.Device(_testDevice.id);
                    var result = await device.Commands();

                    Assert.IsNotNull(result);
                    Assert.IsFalse(result.Error);
                    Assert.IsFalse(result.ServerError);
                    Assert.IsNull(result.WebError);
                    Assert.IsFalse(string.IsNullOrWhiteSpace(result.Raw));
                    var commandData = JsonConvert.DeserializeObject <ApiResponseForCommandSearch>(result.Raw);
                    Assert.IsNotNull(commandData);
                    targetCommandId = commandData.commands.All(a => a.status_counts == null)
                                                ? commandData.commands.First().id
                                                : commandData.commands.First(f => f.status_counts.processed == 0 && f.status_counts.rejected == 0 && f.status_counts.pending > 0).id;
                }

                System.Threading.Thread.Sleep(500);
                using (var client = new M2XClient(_masterKey))
                {
                    var device       = client.Device(_testDevice.id);
                    var processParms = $"{{ \"reason\": \"Because I Can!\" }}";
                    var result       = await device.RejectCommand(targetCommandId, processParms);

                    Assert.IsNotNull(result);
                    Assert.IsFalse(result.Error);
                    Assert.IsFalse(result.ServerError);
                    Assert.IsNull(result.WebError);
                    Assert.IsTrue(string.IsNullOrWhiteSpace(result.Raw));
                }

                System.Threading.Thread.Sleep(500);
                using (var client = new M2XClient(_masterKey))
                {
                    var result = await client.Commands();

                    Assert.IsNotNull(result);
                    Assert.IsFalse(result.Error);
                    Assert.IsFalse(result.ServerError);
                    Assert.IsNull(result.WebError);
                    Assert.IsFalse(string.IsNullOrWhiteSpace(result.Raw));
                    ProcessCommandSearchResultFindTargetCommandAndCheckStatus(result.Raw, _testDevice.id, targetCommandId, "rejected");
                }
            }
            catch (Exception ex)
            {
                DestroyTestDevice();
                throw;
            }
        }