From 6fa220307bcbb6e4a74671f3f0949dcbe81366c1 Mon Sep 17 00:00:00 2001
From: Oleg <olsh.me@gmail.com>
Date: Sun, 2 Apr 2023 15:47:48 +0300
Subject: [PATCH] Fix adding relative reminder. Fixes #24

---
 .../Services/ReminersServiceTests.cs          | 43 +++++++++++++++----
 .../Services/UsersServiceTests.cs             |  2 +-
 src/Todoist.Net/Models/BaseEntity.cs          |  6 ++-
 src/Todoist.Net/Models/Reminder.cs            |  2 +-
 src/Todoist.Net/Models/ReminderType.cs        |  2 +-
 src/Todoist.Net/Models/UserInfo.cs            |  2 +-
 6 files changed, 44 insertions(+), 13 deletions(-)

diff --git a/src/Todoist.Net.Tests/Services/ReminersServiceTests.cs b/src/Todoist.Net.Tests/Services/ReminersServiceTests.cs
index a0ae773..bf3d8e6 100644
--- a/src/Todoist.Net.Tests/Services/ReminersServiceTests.cs
+++ b/src/Todoist.Net.Tests/Services/ReminersServiceTests.cs
@@ -1,5 +1,6 @@
 using System;
 using System.Linq;
+using System.Threading.Tasks;
 
 using Todoist.Net.Models;
 using Todoist.Net.Tests.Extensions;
@@ -21,25 +22,51 @@ public ReminersServiceTests(ITestOutputHelper outputHelper)
         }
 
         [Fact]
-        public void CreateDelete_Success()
+        public async Task CreateDelete_Success()
         {
             var client = TodoistClientFactory.Create(_outputHelper);
 
             var transaction = client.CreateTransaction();
 
-            var itemId = transaction.Items.AddAsync(new Item("Temp")).Result;
+            var itemId = await transaction.Items.AddAsync(new Item("Temp")).ConfigureAwait(false);
             var reminderId =
-                transaction.Reminders.AddAsync(new Reminder(itemId) { DueDate = new DueDate(DateTime.UtcNow.AddDays(1)) }).Result;
-            transaction.CommitAsync().Wait();
+                await transaction.Reminders.AddAsync(new Reminder(itemId) { DueDate = new DueDate(DateTime.UtcNow.AddDays(1)) }).ConfigureAwait(false);
+            await transaction.CommitAsync().ConfigureAwait(false);
 
-            var reminders = client.Reminders.GetAsync().Result;
+            var reminders = await client.Reminders.GetAsync().ConfigureAwait(false);
             Assert.True(reminders.Any());
 
-            var reminderInfo = client.Reminders.GetAsync(reminderId).Result;
+            var reminderInfo = await client.Reminders.GetAsync(reminderId).ConfigureAwait(false);
             Assert.True(reminderInfo != null);
 
-            client.Reminders.DeleteAsync(reminderInfo.Reminder.Id).Wait();
-            client.Items.DeleteAsync(itemId);
+            await client.Reminders.DeleteAsync(reminderInfo.Reminder.Id).ConfigureAwait(false);
+            await client.Items.DeleteAsync(itemId);
+        }
+
+        [Fact]
+        public async Task AddRelativeReminder_Success()
+        {
+            var client = TodoistClientFactory.Create(_outputHelper);
+
+            var item = new Item("Test")
+            {
+                DueDate = new DueDate(DateTime.UtcNow.AddDays(1))
+            };
+
+            var taskId = await client.Items.AddAsync(item).ConfigureAwait(false);
+
+            var user = await client.Users.GetCurrentAsync().ConfigureAwait(false);
+            var reminder = new Reminder(taskId)
+            {
+                MinuteOffset = 60,
+                NotifyUid = user.Id
+            };
+
+            var reminderId = await client.Reminders.AddAsync(reminder).ConfigureAwait(false);
+
+            Assert.NotNull(reminderId.PersistentId);
+
+            await client.Items.DeleteAsync(item.Id);
         }
     }
 }
diff --git a/src/Todoist.Net.Tests/Services/UsersServiceTests.cs b/src/Todoist.Net.Tests/Services/UsersServiceTests.cs
index 14f1c1a..fc61602 100644
--- a/src/Todoist.Net.Tests/Services/UsersServiceTests.cs
+++ b/src/Todoist.Net.Tests/Services/UsersServiceTests.cs
@@ -28,7 +28,7 @@ public async Task GetCurrentAsync_Success()
             var user = await client.Users.GetCurrentAsync();
 
             Assert.NotNull(user);
-            Assert.True(user.Id > 0);
+            Assert.NotNull(user.Id);
         }
 
         [Fact]
diff --git a/src/Todoist.Net/Models/BaseEntity.cs b/src/Todoist.Net/Models/BaseEntity.cs
index 942a537..076f462 100644
--- a/src/Todoist.Net/Models/BaseEntity.cs
+++ b/src/Todoist.Net/Models/BaseEntity.cs
@@ -25,7 +25,11 @@ internal BaseEntity()
         [JsonProperty("id")]
         public ComplexId Id { get; set; }
 
-        internal bool ShouldSerializeId()
+        /// <summary>
+        /// Checks if the Id property should be serialized.
+        /// </summary>
+        /// <returns><c>True</c> if the property should be serialized, <c>false</c> otherwise.</returns>
+        public bool ShouldSerializeId()
         {
             return !Id.IsEmpty;
         }
diff --git a/src/Todoist.Net/Models/Reminder.cs b/src/Todoist.Net/Models/Reminder.cs
index f24ce63..2379879 100644
--- a/src/Todoist.Net/Models/Reminder.cs
+++ b/src/Todoist.Net/Models/Reminder.cs
@@ -63,7 +63,7 @@ internal Reminder()
         /// <value>The mm offset.</value>
         /// <remarks>The relative time in minutes before the due date of the item, in which the reminder should be triggered.
         /// Note, that the item should have a due date set in order to add a relative reminder.</remarks>
-        [JsonProperty("mm_offset")]
+        [JsonProperty("minute_offset")]
         public long? MinuteOffset { get; set; }
 
         /// <summary>
diff --git a/src/Todoist.Net/Models/ReminderType.cs b/src/Todoist.Net/Models/ReminderType.cs
index 586e82f..1112c0d 100644
--- a/src/Todoist.Net/Models/ReminderType.cs
+++ b/src/Todoist.Net/Models/ReminderType.cs
@@ -34,6 +34,6 @@ private ReminderType(string value)
         /// </summary>
         /// <value>The relative.</value>
         /// <remarks>For a time-based reminder specified in minutes from now.</remarks>
-        public static ReminderType Relative { get; } = new ReminderType("relative ");
+        public static ReminderType Relative { get; } = new ReminderType("relative");
     }
 }
diff --git a/src/Todoist.Net/Models/UserInfo.cs b/src/Todoist.Net/Models/UserInfo.cs
index 8791696..42f11d2 100644
--- a/src/Todoist.Net/Models/UserInfo.cs
+++ b/src/Todoist.Net/Models/UserInfo.cs
@@ -82,7 +82,7 @@ internal UserInfo()
         /// </summary>
         /// <value>The identifier.</value>
         [JsonProperty("id")]
-        public int Id { get; internal set; }
+        public string Id { get; internal set; }
 
         /// <summary>
         /// Gets the image identifier.