From 056d43f4d6fef8d4e0698259ee802d5245a734be Mon Sep 17 00:00:00 2001 From: Tobias Klika Date: Sun, 2 Feb 2014 12:37:37 +0100 Subject: [PATCH] fix IEnumerable issue in parameter converter --- UptimeSharp.Tests/MonitorsTest.cs | 16 ++++----- UptimeSharp.Tests/TestsBase.cs | 18 +--------- UptimeSharp/Components/Monitor.cs | 33 ++++++++++++++----- UptimeSharp/Models/Monitor.cs | 2 +- UptimeSharp/Models/Parameters/Parameters.cs | 9 ++--- .../Models/Parameters/RetrieveParameters.cs | 2 +- .../Models/Response/AddAlertResonse.cs | 7 ++-- .../Models/Response/AddMonitorResponse.cs | 20 +++++++++++ UptimeSharp/UptimeClient.cs | 3 +- UptimeSharp/UptimeSharp.csproj | 1 + UptimeSharp/Utilities/JsonExtensions.cs | 17 ++++++++++ 11 files changed, 83 insertions(+), 45 deletions(-) create mode 100644 UptimeSharp/Models/Response/AddMonitorResponse.cs diff --git a/UptimeSharp.Tests/MonitorsTest.cs b/UptimeSharp.Tests/MonitorsTest.cs index 0cccde2..2ee74ea 100644 --- a/UptimeSharp.Tests/MonitorsTest.cs +++ b/UptimeSharp.Tests/MonitorsTest.cs @@ -14,7 +14,7 @@ namespace UptimeSharp.Tests [Fact] public async void AddHTTPMonitor() { - Assert.True(await client.AddMonitor( + Assert.NotNull(await client.AddMonitor( name: "test_1", target: "http://test1.com" )); @@ -24,7 +24,7 @@ namespace UptimeSharp.Tests [Fact] public async Task AddKeywordMonitor() { - Assert.True(await client.AddMonitor( + Assert.NotNull(await client.AddMonitor( name: "test_2", target: "http://test2.com", type: Models.Type.Keyword, @@ -37,7 +37,7 @@ namespace UptimeSharp.Tests [Fact] public async Task AddPingMonitor() { - Assert.True(await client.AddMonitor( + Assert.NotNull(await client.AddMonitor( name: "test_3", target: "http://test3.com", type: Models.Type.Ping @@ -48,7 +48,7 @@ namespace UptimeSharp.Tests [Fact] public async Task AddPortMonitor() { - Assert.True(await client.AddMonitor( + Assert.NotNull(await client.AddMonitor( name: "test_4", target: "127.0.0.1", type: Models.Type.Port, @@ -82,10 +82,10 @@ namespace UptimeSharp.Tests [Fact] public async Task ModifyAMonitor() { - Assert.True(await client.AddMonitor( - name: "test_6", - target: "http://test6.com" - )); + //Assert.NotNull(await client.AddMonitor( + // name: "test_6", + // target: "http://test6.com" + //)); List items = await client.GetMonitors(); Monitor monitor = items.SingleOrDefault(item => item.Name == "test_6"); diff --git a/UptimeSharp.Tests/TestsBase.cs b/UptimeSharp.Tests/TestsBase.cs index 0bb563c..3380a86 100644 --- a/UptimeSharp.Tests/TestsBase.cs +++ b/UptimeSharp.Tests/TestsBase.cs @@ -1,7 +1,5 @@ using System; -using System.Collections.Generic; using System.Threading.Tasks; -using UptimeSharp.Models; using Xunit; namespace UptimeSharp.Tests @@ -10,9 +8,6 @@ namespace UptimeSharp.Tests { protected UptimeClient client; - protected List alertsToDelete = new List(); - protected List monitorsToDelete = new List(); - // this API key is associated with the test account uptimesharp@outlook.com // please don't abuse it and create your own if you want to test the project! protected string APIKey = "u97240-a24c634b3b84f1af602628e8"; @@ -26,18 +21,7 @@ namespace UptimeSharp.Tests // teardown - public async void Dispose() - { - List monitors = await client.GetMonitors(); - alertsToDelete.ForEach(async id => - { - await client.DeleteAlert(id.ToString()); - }); - monitors.ForEach(async id => - { - await client.DeleteMonitor(id); - }); - } + public void Dispose() { } // async throws diff --git a/UptimeSharp/Components/Monitor.cs b/UptimeSharp/Components/Monitor.cs index 291f56f..8a9e65c 100644 --- a/UptimeSharp/Components/Monitor.cs +++ b/UptimeSharp/Components/Monitor.cs @@ -15,7 +15,7 @@ namespace UptimeSharp /// /// Retrieves specified monitors from UptimeRobot /// - /// The monitor i ds. + /// The monitor IDs. /// The custom uptime ratio. /// if set to true [show log]. /// if set to true [show alerts]. @@ -25,7 +25,7 @@ namespace UptimeSharp /// /// public async Task> GetMonitors( - int[] monitorIDs = null, + string[] monitorIDs = null, float[] customUptimeRatio = null, bool showLog = false, bool showAlerts = true, @@ -58,13 +58,14 @@ namespace UptimeSharp /// /// public async Task GetMonitor( - int monitorId, + string monitorId, float[] customUptimeRatio = null, bool showLog = false, bool showAlerts = true, CancellationToken cancellationToken = default(CancellationToken)) { - List monitors = await GetMonitors(new int[] { monitorId }, customUptimeRatio, showLog, showAlerts, cancellationToken); + + List monitors = await GetMonitors(new string[] { monitorId }, customUptimeRatio, showLog, showAlerts, cancellationToken); return monitors != null && monitors.Count > 0 ? monitors[0] : null; } @@ -78,11 +79,11 @@ namespace UptimeSharp /// Success state /// /// - public async Task DeleteMonitor(int monitorId, CancellationToken cancellationToken = default(CancellationToken)) + public async Task DeleteMonitor(string monitorId, CancellationToken cancellationToken = default(CancellationToken)) { return (await Request("getMonitors", cancellationToken, new Dictionary() { - { "monitorID", monitorId.ToString() } + { "monitorID", monitorId } })).Success; } @@ -116,10 +117,10 @@ namespace UptimeSharp /// The HTTP password. /// The cancellation token. /// - /// Success state + /// New Monitor (without details) /// /// - public async Task AddMonitor( + public async Task AddMonitor( string name, string target, Type type = Type.HTTP, @@ -146,7 +147,21 @@ namespace UptimeSharp HTTPUsername = HTTPUsername }; - return (await Request("newMonitor", cancellationToken, parameters.Convert())).Success; + Models.Monitor monitor = (await Request("newMonitor", cancellationToken, parameters.Convert())).Monitor; + + if (monitor != null) + { + monitor.Name = name; + monitor.Type = type; + monitor.Subtype = subtype; + monitor.Port = port; + monitor.KeywordType = keywordType; + monitor.KeywordValue = keywordValue; + monitor.HTTPPassword = HTTPPassword; + monitor.HTTPUsername = HTTPUsername; + } + + return monitor; } diff --git a/UptimeSharp/Models/Monitor.cs b/UptimeSharp/Models/Monitor.cs index b1f525d..ee9e97a 100644 --- a/UptimeSharp/Models/Monitor.cs +++ b/UptimeSharp/Models/Monitor.cs @@ -20,7 +20,7 @@ namespace UptimeSharp.Models /// The ID. /// [JsonProperty("id")] - public int ID { get; set; } + public string ID { get; set; } /// /// Gets or sets the name. diff --git a/UptimeSharp/Models/Parameters/Parameters.cs b/UptimeSharp/Models/Parameters/Parameters.cs index 94c77f0..ebe7acd 100644 --- a/UptimeSharp/Models/Parameters/Parameters.cs +++ b/UptimeSharp/Models/Parameters/Parameters.cs @@ -39,12 +39,13 @@ namespace UptimeSharp.Models continue; } - // convert array to comma-seperated list - if (value is Array && (value as Array).Length > 0) + // empty array + if (value is Array && (value as Array).Length == 0) { - value = String.Join("-", value); + continue; } - else if (value is IEnumerable && value.GetType().GetElementType() == typeof(string)) + // convert array to comma-seperated list + else if (value is IEnumerable) { value = String.Join("-", ((IEnumerable)value).Cast().Select(x => x.ToString()).ToArray()); } diff --git a/UptimeSharp/Models/Parameters/RetrieveParameters.cs b/UptimeSharp/Models/Parameters/RetrieveParameters.cs index 5d83e04..69d8aa9 100644 --- a/UptimeSharp/Models/Parameters/RetrieveParameters.cs +++ b/UptimeSharp/Models/Parameters/RetrieveParameters.cs @@ -16,7 +16,7 @@ namespace UptimeSharp.Models /// The monitors. /// [DataMember(Name = "monitors")] - public int[] Monitors { get; set; } + public string[] Monitors { get; set; } /// /// Defines the number of days to calculate the uptime ratio diff --git a/UptimeSharp/Models/Response/AddAlertResonse.cs b/UptimeSharp/Models/Response/AddAlertResonse.cs index 28424f5..e16b4fc 100644 --- a/UptimeSharp/Models/Response/AddAlertResonse.cs +++ b/UptimeSharp/Models/Response/AddAlertResonse.cs @@ -3,17 +3,16 @@ namespace UptimeSharp.Models { /// - /// Alert Response + /// Add Alert Response /// [JsonObject] internal class AddAlertResponse : Response { /// - /// Gets or sets the item dictionary. - /// The list is 2 layers deep, so this one is necessary :-/ + /// Gets or sets the alert. /// /// - /// The item dictionary. + /// The alert. /// [JsonProperty("alertcontact")] public Alert Alert { get; set; } diff --git a/UptimeSharp/Models/Response/AddMonitorResponse.cs b/UptimeSharp/Models/Response/AddMonitorResponse.cs new file mode 100644 index 0000000..f7962db --- /dev/null +++ b/UptimeSharp/Models/Response/AddMonitorResponse.cs @@ -0,0 +1,20 @@ +using Newtonsoft.Json; + +namespace UptimeSharp.Models +{ + /// + /// Add Monitor Response + /// + [JsonObject] + internal class AddMonitorResponse : Response + { + /// + /// Gets or sets the monitor. + /// + /// + /// The monitor. + /// + [JsonProperty("monitor")] + public Monitor Monitor { get; set; } + } +} diff --git a/UptimeSharp/UptimeClient.cs b/UptimeSharp/UptimeClient.cs index bad6a06..1cd6142 100644 --- a/UptimeSharp/UptimeClient.cs +++ b/UptimeSharp/UptimeClient.cs @@ -168,7 +168,8 @@ namespace UptimeSharp { new BoolConverter(), new UnixDateTimeConverter(), - new UriConverter() + new UriConverter(), + new EnumConverter() } } ); diff --git a/UptimeSharp/UptimeSharp.csproj b/UptimeSharp/UptimeSharp.csproj index bba1181..86e0dc4 100644 --- a/UptimeSharp/UptimeSharp.csproj +++ b/UptimeSharp/UptimeSharp.csproj @@ -49,6 +49,7 @@ + diff --git a/UptimeSharp/Utilities/JsonExtensions.cs b/UptimeSharp/Utilities/JsonExtensions.cs index a73a51d..98b3547 100644 --- a/UptimeSharp/Utilities/JsonExtensions.cs +++ b/UptimeSharp/Utilities/JsonExtensions.cs @@ -77,4 +77,21 @@ namespace UptimeSharp return objectType.Equals(typeof(Uri)); } } + + + + public class EnumConverter : StringEnumConverter + { + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + string value = reader.Value.ToString(); + + if (String.IsNullOrEmpty(value)) + { + return Enum.ToObject(objectType, 0); + } + + return base.ReadJson(reader, objectType, existingValue, serializer); + } + } }