private async Task <Realm> GetQueryBasedRealm(bool openAsync, [CallerMemberName] string realmPath = null)
        {
            var user = await SyncTestHelpers.GetUserAsync();

            var config = new QueryBasedSyncConfiguration(SyncTestHelpers.RealmUri($"~/{realmPath}_{openAsync}"), user, Guid.NewGuid().ToString())
            {
                ObjectClasses = new[] { typeof(ObjectA), typeof(ObjectB), typeof(ObjectC) }
            };

            using (var original = GetRealm(config))
            {
                original.Write(() =>
                {
                    for (var i = 0; i < 10; i++)
                    {
                        var a = original.Add(new ObjectA
                        {
                            StringValue = "A #" + i,
                            IntValue    = i,
                            B           = new ObjectB
                            {
                                StringValue = "B #" + i,
                                BoolValue   = i % 2 == 0,
                            }
                        });

                        original.Add(new ObjectC
                        {
                            IntValue = i,
                            B        = a.B
                        });
                    }
                });

                await SyncTestHelpers.WaitForUploadAsync(original);
            }

            try
            {
                Realm.DeleteRealm(config);
            }
            catch
            {
            }

            config = new QueryBasedSyncConfiguration(config.ServerUri, config.User, config.DatabasePath + "_partial")
            {
                ObjectClasses = config.ObjectClasses
            };

            // We test both `GetInstance` and `GetInstanceAsync` to guard against regressions:
            // https://github.com/realm/realm-dotnet/issues/1814
            var result = await GetRealmAsync(config, openAsync).Timeout(5000);

            Assert.That(result.All <ObjectB>().Count(), Is.EqualTo(0));
            Assert.That(result.All <ObjectA>().Count(), Is.EqualTo(0));

            return(result);
        }
        private async Task <Realm> GetQueryBasedRealm(Action <QueryBasedSyncConfiguration> setupConfig = null, [CallerMemberName] string realmPath = null)
        {
            SyncTestHelpers.RequiresRos();

            var user = await SyncTestHelpers.GetUserAsync();

            var config = new QueryBasedSyncConfiguration(SyncTestHelpers.RealmUri($"~/{realmPath}"), user, Guid.NewGuid().ToString())
            {
                ObjectClasses = new[] { typeof(ObjectA), typeof(ObjectB) }
            };

            setupConfig?.Invoke(config);

            using (var original = GetRealm(config))
            {
                original.Write(() =>
                {
                    for (var i = 0; i < 10; i++)
                    {
                        original.Add(new ObjectA
                        {
                            StringValue = "A #" + i,
                            IntValue    = i,
                            B           = new ObjectB
                            {
                                StringValue = "B #" + i,
                                BoolValue   = i % 2 == 0,
                            }
                        });
                    }
                });

                await GetSession(original).WaitForUploadAsync();
            }

            try
            {
                Realm.DeleteRealm(config);
            }
            catch
            {
            }

            config = new QueryBasedSyncConfiguration(config.ServerUri, config.User, config.DatabasePath + "_partial")
            {
                ObjectClasses = config.ObjectClasses
            };

            var result = GetRealm(config);

            await GetSession(result).WaitForDownloadAsync();

            Assert.That(result.All <ObjectB>().Count(), Is.EqualTo(0));
            Assert.That(result.All <ObjectA>().Count(), Is.EqualTo(0));

            return(result);
        }
        private Realm GetRealm(User user, Uri uri)
        {
            var config = new QueryBasedSyncConfiguration(uri, user, Guid.NewGuid().ToString())
            {
                ObjectClasses = new[] { typeof(ObjectWithPermissions) }
            };

            return(GetRealm(config));
        }
        public void DefaultConfiguration_WhenOneUserLoggedIn_ShouldWork(string userScheme, string realmScheme)
        {
            TestHelpers.RunAsyncTest(async() =>
            {
                await SyncTestHelpers.GetFakeUserAsync(scheme: userScheme);

                var config = new QueryBasedSyncConfiguration();
                Assert.That(!config.IsFullSync);
                Assert.That(config.ServerUri.Scheme, Is.EqualTo(realmScheme));
                Assert.That(config.ServerUri.Segments, Is.EqualTo(new[] { "/", "default" }));
            });
        }
        private async Task <Uri> CreateRealm(Action <Realm> assignRoles = null, bool addObjects = true)
        {
            var uri   = SyncTestHelpers.RealmUri(Guid.NewGuid().ToString());
            var admin = await SyncTestHelpers.GetAdminUserAsync();

            var config = new QueryBasedSyncConfiguration(uri, admin)
            {
                ObjectClasses = new[] { typeof(ObjectWithPermissions) }
            };

            using (var realm = GetRealm(config))
            {
                var objects      = realm.All <ObjectWithPermissions>();
                var subscription = await SubscribeToObjectsAsync(realm);

                if (addObjects)
                {
                    Assert.That(subscription.Results.Count(), Is.EqualTo(0));
                    AddObjectsToRealm(realm, new[] { 1, 2, 3 });

                    await SyncTestHelpers.WaitForSyncAsync(realm);

                    Assert.That(subscription.Results.Count(), Is.EqualTo(3));
                }

                if (assignRoles != null)
                {
                    realm.Write(() =>
                    {
                        assignRoles(realm);
                    });
                }

                await SyncTestHelpers.WaitForSyncAsync(realm);
            }

            return(uri);
        }