public void ImportNew ()
        {
            RunAsync (async delegate {
                var projectData = await DataStore.PutAsync (new ProjectData () {
                    RemoteId = 1,
                    ModifiedAt = new DateTime (2014, 1, 2),
                });
                var userData = await DataStore.PutAsync (new UserData () {
                    RemoteId = 2,
                    ModifiedAt = new DateTime (2014, 1, 3),
                });
                var projectUserJson = new ProjectUserJson () {
                    Id = 2,
                    ProjectId = 1,
                    UserId = 2,
                    ModifiedAt = new DateTime (2014, 1, 3),
                };

                var projectUserData = await DataStore.ExecuteInTransactionAsync (ctx => converter.Import (ctx, projectUserJson));
                Assert.AreNotEqual (Guid.Empty, projectUserData.Id);
                Assert.AreEqual (2, projectUserData.RemoteId);
                Assert.AreEqual (new DateTime (2014, 1, 3), projectUserData.ModifiedAt);
                Assert.AreEqual (projectData.Id, projectUserData.ProjectId);
                Assert.AreEqual (userData.Id, projectUserData.UserId);
                Assert.IsFalse (projectUserData.IsDirty);
                Assert.IsFalse (projectUserData.RemoteRejected);
                Assert.IsNull (projectUserData.DeletedAt);
            });
        }
        public void ImportPastDeleted ()
        {
            RunAsync (async delegate {
                var projectData = await DataStore.PutAsync (new ProjectData () {
                    RemoteId = 1,
                    ModifiedAt = new DateTime (2014, 1, 2),
                });
                var userData = await DataStore.PutAsync (new UserData () {
                    RemoteId = 2,
                    ModifiedAt = new DateTime (2014, 1, 3),
                });
                var projectUserData = await DataStore.PutAsync (new ProjectUserData () {
                    RemoteId = 2,
                    ProjectId = projectData.Id,
                    UserId = userData.Id,
                    ModifiedAt = new DateTime (2014, 1, 3),
                });

                var projectUserJson = new ProjectUserJson () {
                    Id = 2,
                    DeletedAt = new DateTime (2014, 1, 2),
                };

                var ret = await DataStore.ExecuteInTransactionAsync (ctx => converter.Import (ctx, projectUserJson));
                Assert.IsNull (ret);

                var rows = await DataStore.Table<ProjectUserData> ().Where (m => m.Id == projectUserData.Id).ToListAsync ();
                Assert.That (rows, Has.Exactly (0).Count);
            });
        }
        public void ImportUpdatedKeepDirtyLocal ()
        {
            RunAsync (async delegate {
                var projectData = await DataStore.PutAsync (new ProjectData () {
                    RemoteId = 1,
                    ModifiedAt = new DateTime (2014, 1, 2),
                });
                var userData = await DataStore.PutAsync (new UserData () {
                    RemoteId = 2,
                    ModifiedAt = new DateTime (2014, 1, 3),
                });
                var projectUserData = await DataStore.PutAsync (new ProjectUserData () {
                    RemoteId = 2,
                    ProjectId = Guid.Empty,
                    UserId = Guid.Empty,
                    ModifiedAt = new DateTime (2014, 1, 2, 10, 0, 0, DateTimeKind.Utc),
                    IsDirty = true,
                });
                var projectUserJson = new ProjectUserJson () {
                    Id = 2,
                    ProjectId = 1,
                    UserId = 2,
                    ModifiedAt = new DateTime (2014, 1, 2, 10, 0, 0, DateTimeKind.Utc).ToLocalTime (),
                };

                projectUserData = await DataStore.ExecuteInTransactionAsync (ctx => converter.Import (ctx, projectUserJson));
                Assert.AreEqual (Guid.Empty, projectUserData.ProjectId);
                Assert.AreEqual (new DateTime (2014, 1, 2, 10, 0, 0, DateTimeKind.Utc), projectUserData.ModifiedAt);
            });
        }
        public void ImportMissingProjectAndUser ()
        {
            RunAsync (async delegate {
                var projectUserJson = new ProjectUserJson () {
                    Id = 2,
                    ProjectId = 1,
                    UserId = 2,
                    ModifiedAt = new DateTime (2014, 1, 3),
                };

                var projectUserData = await DataStore.ExecuteInTransactionAsync (ctx => converter.Import (ctx, projectUserJson));
                Assert.AreNotEqual (Guid.Empty, projectUserData.ProjectId);
                Assert.AreNotEqual (Guid.Empty, projectUserData.UserId);

                var projectRows = await DataStore.Table<ProjectData> ().Where (m => m.Id == projectUserData.ProjectId).ToListAsync ();
                var projectData = projectRows.FirstOrDefault ();
                Assert.IsNotNull (projectData);
                Assert.IsNotNull (projectData.RemoteId);
                Assert.AreEqual (DateTime.MinValue, projectData.ModifiedAt);

                var userRows = await DataStore.Table<UserData> ().Where (m => m.Id == projectUserData.UserId).ToListAsync ();
                var userData = userRows.FirstOrDefault ();
                Assert.IsNotNull (userData);
                Assert.IsNotNull (userData.RemoteId);
                Assert.AreEqual (DateTime.MinValue, userData.ModifiedAt);
            });
        }
        public void ImportUpdated ()
        {
            RunAsync (async delegate {
                var projectData = await DataStore.PutAsync (new ProjectData () {
                    RemoteId = 1,
                    ModifiedAt = new DateTime (2014, 1, 2),
                });
                var userData = await DataStore.PutAsync (new UserData () {
                    RemoteId = 2,
                    ModifiedAt = new DateTime (2014, 1, 3),
                });
                var projectUserData = await DataStore.PutAsync (new ProjectUserData () {
                    RemoteId = 2,
                    ProjectId = Guid.Empty,
                    UserId = Guid.Empty,
                    ModifiedAt = new DateTime (2014, 1, 2, 10, 0, 0, DateTimeKind.Utc),
                });
                var projectUserJson = new ProjectUserJson () {
                    Id = 2,
                    ProjectId = 1,
                    UserId = 2,
                    ModifiedAt = new DateTime (2014, 1, 2, 10, 1, 0, DateTimeKind.Utc).ToLocalTime (), // JSON deserialized to local
                };

                projectUserData = await DataStore.ExecuteInTransactionAsync (ctx => converter.Import (ctx, projectUserJson));
                Assert.AreNotEqual (Guid.Empty, projectUserData.Id);
                Assert.AreEqual (2, projectUserData.RemoteId);
                Assert.AreEqual (new DateTime (2014, 1, 2, 10, 1, 0, DateTimeKind.Utc), projectUserData.ModifiedAt);
                Assert.AreEqual (projectData.Id, projectUserData.ProjectId);
                Assert.AreEqual (userData.Id, projectUserData.UserId);
                Assert.IsFalse (projectUserData.IsDirty);
                Assert.IsFalse (projectUserData.RemoteRejected);
                Assert.IsNull (projectUserData.DeletedAt);
            });

            // Warn the user that the test result might be invalid
            if (TimeZone.CurrentTimeZone.GetUtcOffset (DateTime.Now).TotalMinutes >= 0) {
                Assert.Inconclusive ("The test machine timezone should be set to GTM-1 or less to test datetime comparison.");
            }
        }