예제 #1
0
        public void UpdateModelViaUpdate_NotAllFieldsAreUpdated()
        {
            var ef  = _contextFunc();
            var obj = new DbSyncObject
            {
                Id   = Guid.NewGuid().ToString(),
                Text = "123"
            };

            ef.DbSyncObjects.Add(obj);
            ef.SaveChanges();

            var date = DateTimeOffset.Now.AddMilliseconds(1);

            Thread.Sleep(3);
            obj.Text = "456";
            ef.SaveChanges();

            var result = _controller.Download(new DownloadDataRequest
            {
                LastChangeTime = new Dictionary <string, DateTimeOffset> {
                    { "all", date }
                },
                Types = new[] { nameof(DbSyncObject) },
            }, _user);

            result.ChangedObjects.Select(x => x.MobilePrimaryKey).Should().BeEquivalentTo(obj.Id);
            result.ChangedObjects[0].SerializedObject.Should().NotContainEquivalentOf($"\"{nameof(DbSyncObject.Id)}\"");
            result.ChangedObjects[0].SerializedObject.Should().NotContainEquivalentOf($"\"{nameof(DbSyncObject.MobilePrimaryKey)}\"");
            result.ChangedObjects[0].SerializedObject.Should().NotContainEquivalentOf($"\"{nameof(DbSyncObject.Tags)}\"");
            result.ChangedObjects[0].SerializedObject.Should().ContainEquivalentOf($"\"{nameof(DbSyncObject.Text)}\"");

            DateTime.UtcNow.Subtract(result.LastChange["all"].DateTime).Should().BeLessThan(TimeSpan.FromSeconds(1));
        }
예제 #2
0
        public void SomeData_WithOldNewerTime_DoReturn()
        {
            var ef  = _contextFunc();
            var obj = new DbSyncObject
            {
                Id   = Guid.NewGuid().ToString(),
                Text = "123"
            };

            ef.DbSyncObjects.Add(obj);
            ef.SaveChanges();

            var result = _controller.Download(new DownloadDataRequest()
            {
                LastChangeTime = new Dictionary <string, DateTimeOffset>()
                {
                    { "all", new DateTimeOffset(DateTime.Now.AddDays(-2)) }
                },
                Types = new[] { nameof(DbSyncObject) },
            }, _user);

            result.ChangedObjects.Select(x => x.MobilePrimaryKey).Should().BeEquivalentTo(obj.Id);

            DateTime.UtcNow.Subtract(result.LastChange["all"].DateTime).Should().BeLessThan(TimeSpan.FromSeconds(1));
        }
예제 #3
0
        public void UpdateData()
        {
            // Arrange
            _syncContextFunc().SyncStatusServerObjects.Count().Should().Be(0);

            var db             = _contextFunc();
            var objectToUpdate = new DbSyncObject
            {
                Id   = Guid.NewGuid().ToString(),
                Text = "asd"
            };

            db.DbSyncObjects.Add(objectToUpdate);
            db.SaveChanges();

            // Act
            Thread.Sleep(1);
            objectToUpdate.Text = "qwe";
            db.SaveChanges();

            // Assert
            _syncContextFunc().SyncStatusServerObjects.Count().Should().Be(1);
            var syncObject = _syncContextFunc().SyncStatusServerObjects.ToList()[0];
            var textChange = syncObject.ColumnChangeDates["Text"];
            var idChange   = syncObject.ColumnChangeDates["Id"];
            var tagsChange = syncObject.ColumnChangeDates["Tags"];

            idChange.Should().Be(tagsChange);
            textChange.Should().BeAfter(idChange);
        }
예제 #4
0
        public void Delete()
        {
            var ef  = _contextFunc();
            var obj = new DbSyncObject
            {
                Id   = "2",
                Text = "123"
            };

            ef.DbSyncObjects.Add(obj);
            ef.SaveChanges();
            Thread.Sleep(2);

            var time = DateTimeOffset.Now;

            Thread.Sleep(2);
            ef.DbSyncObjects.Remove(obj);
            ef.SaveChanges();

            var result = _controller.Download(new DownloadDataRequest
            {
                LastChangeTime = new Dictionary <string, DateTimeOffset> {
                    { "all", time }
                },
                Types = new[] { nameof(DbSyncObject) },
            }, _user);

            string.Join(", ", result.ChangedObjects)
            .Should().BeEquivalentTo("Type: DbSyncObject, Key: 2, Deleted");
        }
예제 #5
0
        public void KnownType_Saved1()
        {
            _contextFunc().DbSyncObjects.Count().Should().Be(0);

            var controller   = new RealmiusServerProcessor(new ShareEverythingConfiguration(_contextFunc, typeof(DbSyncObject)));
            var objectToSave = new DbSyncObject()
            {
                Text = "123123123",
                Id   = Guid.NewGuid().ToString()
            };
            var result = controller.Upload(new UploadDataRequest()
            {
                ChangeNotifications =
                {
                    new UploadRequestItem()
                    {
                        Type             = "DbSyncObject",
                        PrimaryKey       = objectToSave.MobilePrimaryKey,
                        SerializedObject = JsonConvert.SerializeObject(objectToSave),
                    }
                }
            }, null);

            result.Results.Count.Should().Be(1);
            CheckNoError(result);
            result.Results[0].MobilePrimaryKey.Should().Be(objectToSave.MobilePrimaryKey);

            _contextFunc().DbSyncObjects.Count().Should().Be(1);
        }
        public void Attach_DeletedObject()
        {
            var time = DateTimeOffset.UtcNow;

            Thread.Sleep(10);

            var db  = _contextFunc();
            var obj = new DbSyncObject
            {
                Id   = "2",
                Text = "x",
                Tags = "c"
            };

            db.DbSyncObjects.Add(obj);
            db.SaveChanges();

            db.CreateSyncStatusContext().SyncStatusServerObjects.Count().Should().Be(1);

            db.EnableSyncTracking = false;
            db.DbSyncObjects.Remove(obj);
            db.SaveChanges();


            var res = _processor.Download(
                new DownloadDataRequest
            {
                Types = new[]
                {
                    nameof(DbSyncObject)
                },
                LastChangeTime = new Dictionary <string, DateTimeOffset> {
                    { "all", time }
                },
            }, _user);

            string.Join(", ", res.ChangedObjects)
            .Should().BeEquivalentTo("Type: DbSyncObject, Key: 2, SerializedObject: { \"Text\": \"x\", \"Tags\": \"c\", \"Id\": \"2\"}");

            db.AttachDeletedObject(nameof(DbSyncObject), "2");
            var res2 = _processor.Download(
                new DownloadDataRequest
            {
                Types = new[]
                {
                    nameof(DbSyncObject)
                },
                LastChangeTime = new Dictionary <string, DateTimeOffset>()
                {
                    { "all", time }
                },
            }, _user);

            string.Join(", ", res2.ChangedObjects)
            .Should().BeEquivalentTo("Type: DbSyncObject, Key: 2, Deleted");
        }
        public void Attach_UpdatedObject()
        {
            var db  = _contextFunc();
            var obj = new DbSyncObject
            {
                Id   = "2",
                Text = "x",
                Tags = "c",
            };

            db.DbSyncObjects.Add(obj);
            db.SaveChanges();

            Thread.Sleep(10);
            db.CreateSyncStatusContext().SyncStatusServerObjects.Count().Should().Be(1);

            db.EnableSyncTracking = false;
            obj.Text = "qwe";
            db.SaveChanges();

            var res = _processor.Download(
                new DownloadDataRequest()
            {
                Types = new[]
                {
                    nameof(DbSyncObject)
                },
                LastChangeTime = DateTimeOffset.MinValue.ToDictionary(),
            }, _user);

            string.Join(", ", res.ChangedObjects)
            .Should().BeEquivalentTo("Type: DbSyncObject, Key: 2, SerializedObject: { \"Text\": \"x\", \"Tags\": \"c\", \"Id\": \"2\"}");

            db.AttachObject(nameof(DbSyncObject), "2");
            db.CreateSyncStatusContext().SyncStatusServerObjects.Count().Should().Be(1);
            var syncStatus = db.CreateSyncStatusContext().SyncStatusServerObjects.First();

            syncStatus.ColumnChangeDates[nameof(obj.Text)].Should()
            .BeAfter(syncStatus.ColumnChangeDates[nameof(obj.Tags)]);

            var res2 = _processor.Download(
                new DownloadDataRequest()
            {
                Types = new[]
                {
                    nameof(DbSyncObject)
                }
            }, _user);

            string.Join(", ", res2.ChangedObjects)
            .Should().BeEquivalentTo("Type: DbSyncObject, Key: 2, SerializedObject: { \"Text\": \"qwe\", \"Tags\": \"c\", \"Id\": \"2\"}");
        }
예제 #8
0
        public void EF_CheckAndProcessCanRetrieveUnmodifiedEntityFromDatabase()
        {
            var db  = _contextFunc();
            var obj = new DbSyncObject()
            {
                Id   = "123",
                Text = "asd"
            };

            db.DbSyncObjects.Add(obj);
            db.SaveChanges();

            var db2  = _contextFunc();
            var obj2 = db2.DbSyncObjects.Find("123");

            obj2.Text = "zxc";
            var obj2Entry = db2.Entry(obj2);
            var m01       = obj2Entry.Property("Text").IsModified;
            var m02       = obj2Entry.Property("Tags").IsModified;

            obj2Entry.State = EntityState.Detached;


            var obj3 = db2.DbSyncObjects.Find("123");

            obj3.Text.Should().Be("asd");

            try
            {
                obj2Entry.State = EntityState.Modified;
            }
            catch (InvalidOperationException)
            {
                db2.Entry(obj3).State = EntityState.Detached;
                obj2Entry.State       = EntityState.Modified;
            }

            var entry = db2.ChangeTracker.Entries().First();
            var m1    = entry.Property("Text").IsModified;
            var m2    = entry.Property("Tags").IsModified;

            db2.SaveChanges();

            var db3  = _contextFunc();
            var obj4 = db3.DbSyncObjects.Find("123");

            obj4.Text.Should().Be("zxc");
        }
예제 #9
0
        public void Deleted()
        {
            _contextFunc().DbSyncObjects.Count().Should().Be(0);

            var controller   = new RealmiusServerProcessor(new ShareEverythingConfiguration(_contextFunc, typeof(DbSyncObject)));
            var objectToSave = new DbSyncObject()
            {
                Text = "123123123",
                Id   = Guid.NewGuid().ToString()
            };
            var db = _contextFunc();

            db.DbSyncObjects.Add(objectToSave);
            db.SaveChanges();

            Func <DownloadDataResponse> getDownloaded = () => controller.Download(new DownloadDataRequest()
            {
                Types = new[] { nameof(DbSyncObject) },
            }, new { });
            var downloaded1 = getDownloaded();

            downloaded1.ChangedObjects.Count.Should().Be(1);

            var result = controller.Upload(new UploadDataRequest()
            {
                ChangeNotifications =
                {
                    new UploadRequestItem()
                    {
                        Type             = nameof(DbSyncObject),
                        PrimaryKey       = objectToSave.MobilePrimaryKey,
                        SerializedObject = "",
                        IsDeleted        = true,
                    }
                }
            }, null);

            CheckNoError(result);
            _contextFunc().DbSyncObjects.Find(objectToSave.Id).Should().BeNull();

            var downloaded2 = getDownloaded();

            downloaded2.ChangedObjects.Count.Should().Be(0); //deleted items should not be downloaded during initial DB download
        }
예제 #10
0
        public void Download_AlreadyDownloadedDataIsNotReturned()
        {
            var ef  = _contextFunc();
            var obj = new DbSyncObject
            {
                Id   = Guid.NewGuid().ToString(),
                Text = "123"
            };

            ef.DbSyncObjects.Add(obj);
            ef.SaveChanges();

            var result = _controller.Download(new DownloadDataRequest
            {
                LastChangeTime = new Dictionary <string, DateTimeOffset> {
                    { "all", new DateTimeOffset(DateTime.Now.AddDays(-2)) }
                },

                Types = new[] { nameof(DbSyncObject) },
            }, _user);

            result.ChangedObjects.Count.Should().Be(1);

            var result2 = _controller.Download(new DownloadDataRequest()
            {
                LastChangeTime = result.LastChange,
                Types          = new[] { nameof(DbSyncObject) },
            }, _user);

            result2.ChangedObjects.Count.Should().Be(0);

            Thread.Sleep(10);
            obj.Text = "rty";
            ef.SaveChanges();

            var result3 = _controller.Download(new DownloadDataRequest()
            {
                LastChangeTime = result2.LastChange,
                Types          = new[] { nameof(DbSyncObject) },
            }, _user);

            result3.ChangedObjects.Count.Should().Be(1);
        }
예제 #11
0
        public void UpdateModelViaAttachToContext_NotAllFieldsAreUpdated()
        {
            var ef  = _contextFunc();
            var obj = new DbSyncObject
            {
                Id   = Guid.NewGuid().ToString(),
                Text = "123"
            };

            ef.DbSyncObjects.Add(obj);
            ef.SaveChanges();

            var date = DateTimeOffset.Now.AddMilliseconds(1);

            Thread.Sleep(3);

            var ef2  = _contextFunc();
            var obj2 = new DbSyncObject
            {
                Id   = obj.Id,
                Text = "123456"
            };

            ef2.Entry(obj2).State = EntityState.Modified;
            ef2.SaveChanges();

            var result = _controller.Download(new DownloadDataRequest()
            {
                LastChangeTime = new Dictionary <string, DateTimeOffset>()
                {
                    { "all", date }
                },
                Types = new[] { nameof(DbSyncObject) },
            }, _user);

            result.ChangedObjects.Select(x => x.MobilePrimaryKey).Should().BeEquivalentTo(new[] { obj.Id });
            //result.ChangedObjects.Select(x => x.SerializedObject).Should().BeEquivalentTo(""{\r\n  \"Text\": \"123456\",\r\n  \"Tags\": null,\r\n  \"Id\": \"b3586bfb-6e34-4daa-95c1-ddbeb02b4006\"\r\n}"");
            result.ChangedObjects[0].SerializedObject.Should().NotContainEquivalentOf($"\"{nameof(DbSyncObject.Id)}\"");
            result.ChangedObjects[0].SerializedObject.Should().NotContainEquivalentOf($"\"{nameof(DbSyncObject.Tags)}\"");
            result.ChangedObjects[0].SerializedObject.Should().ContainEquivalentOf($"\"{nameof(DbSyncObject.Text)}\"");

            DateTime.UtcNow.Subtract(result.LastChange["all"].DateTime).Should().BeLessThan(TimeSpan.FromSeconds(1));
        }
예제 #12
0
        public void AddData()
        {
            // Arrange
            _syncContextFunc().SyncStatusServerObjects.Count().Should().Be(0);

            var db          = _contextFunc();
            var objectToAdd = new DbSyncObject
            {
                Id   = Guid.NewGuid().ToString(),
                Text = "TestText"
            };

            // Act
            db.DbSyncObjects.Add(objectToAdd);
            db.SaveChanges();

            // Assert
            _syncContextFunc().SyncStatusServerObjects.Count().Should().Be(1);
            var syncObject = _syncContextFunc().SyncStatusServerObjects.First();
            var res        = JsonConvert.DeserializeObject <DbSyncObject>(syncObject.FullObjectAsJson);

            res.MobilePrimaryKey.Should().Be(objectToAdd.Id);
            res.Text.Should().Be("TestText");
        }
예제 #13
0
        public void Upload_Delete_UploadAgain()
        {
            var controller = new RealmiusServerProcessor(new ShareEverythingConfiguration(_contextFunc, typeof(DbSyncObject)));
            Func <DownloadDataResponse> getDownloaded = () => controller.Download(new DownloadDataRequest()
            {
                Types = new[] { nameof(DbSyncObject) },
            }, new { });
            Func <string> dataToCompare = () =>
            {
                var data = getDownloaded();
                return(string.Join(", ", data.ChangedObjects.Select(x => $"{x.IsDeleted}")));
            };


            var objectToSave = new DbSyncObject()
            {
                Text = "123123123",
                Id   = Guid.NewGuid().ToString()
            };
            var result1 = controller.Upload(new UploadDataRequest()
            {
                ChangeNotifications =
                {
                    new UploadRequestItem()
                    {
                        Type             = nameof(DbSyncObject),
                        PrimaryKey       = objectToSave.MobilePrimaryKey,
                        SerializedObject = JsonConvert.SerializeObject(objectToSave),
                        //IsDeleted = true,
                    }
                }
            }, null);

            dataToCompare().Should().BeEquivalentTo("False");

            var result2 = controller.Upload(new UploadDataRequest()
            {
                ChangeNotifications =
                {
                    new UploadRequestItem()
                    {
                        Type             = nameof(DbSyncObject),
                        PrimaryKey       = objectToSave.MobilePrimaryKey,
                        SerializedObject = "",
                        IsDeleted        = true,
                    }
                }
            }, null);

            //dataToCompare().Should().BeEquivalentTo("True");

            objectToSave.Text = "zxc";
            var result3 = controller.Upload(new UploadDataRequest()
            {
                ChangeNotifications =
                {
                    new UploadRequestItem()
                    {
                        Type             = nameof(DbSyncObject),
                        PrimaryKey       = objectToSave.MobilePrimaryKey,
                        SerializedObject = JsonConvert.SerializeObject(objectToSave),
                        IsDeleted        = false,
                    }
                }
            }, null);

            dataToCompare().Should().BeEquivalentTo("False");
        }