public static IAccount CreateAccount(IInternalSyncDataStore dataStoreSync, string accountsHref, IAccount account, Action<AccountCreationOptionsBuilder> creationOptionsAction)
        {
            var builder = new AccountCreationOptionsBuilder();
            creationOptionsAction(builder);
            var options = builder.Build();

            return dataStoreSync.Create(accountsHref, account, options);
        }
        public static Task<IAccount> CreateAccountAsync(IInternalAsyncDataStore dataStore, string accountsHref, IAccount account, Action<AccountCreationOptionsBuilder> creationOptionsAction, CancellationToken cancellationToken)
        {
            var builder = new AccountCreationOptionsBuilder();
            creationOptionsAction(builder);
            var options = builder.Build();

            return dataStore.CreateAsync(accountsHref, account, options, cancellationToken);
        }
        private async Task AddObjectsToTenantAsync()
        {
            // Get client and tenant
            var client = TestClients.GetSAuthc1Client();

            var tenant = await client.GetCurrentTenantAsync();
            tenant.ShouldNotBe(null);
            tenant.Href.ShouldNotBeNullOrEmpty();
            this.TenantHref = tenant.Href;

            // Create applications
            try
            {
                // Create and verify applications
                var applicationsToCreate = this.testData.GetTestApplications(client);
                var applicationCreationTasks = applicationsToCreate.Select(app =>
                    tenant.CreateApplicationAsync(app, opt => opt.CreateDirectory = false));
                var resultingApplications = await Task.WhenAll(applicationCreationTasks);
                resultingApplications.ShouldNotContain(x => string.IsNullOrEmpty(x.Href));

                // Add them all to the teardown list
                this.CreatedApplicationHrefs.AddRange(resultingApplications.Select(x => x.Href));

                // Grab the one marked as primary
                this.PrimaryApplicationHref = resultingApplications.Where(x => x.Name.Contains("primary")).Single().Href;
            }
            catch (Exception e)
            {
                await this.RemoveObjectsFromTenantAsync();
                throw new ApplicationException("Could not create applications", e);
            }

            // Create organizations
            IOrganization primaryOrganization = null;
            try
            {
                var orgsToCreate = this.testData.GetTestOrganizations(client);
                var orgCreationTasks = orgsToCreate.Select(o =>
                    tenant.CreateOrganizationAsync(o, opt => opt.CreateDirectory = true));
                var resultingOrgs = await Task.WhenAll(orgCreationTasks);
                resultingOrgs.ShouldNotContain(x => string.IsNullOrEmpty(x.Href));

                // Verify that directories were created, too
                var getDirectoryTasks = resultingOrgs.Select(x => x.GetDefaultAccountStoreAsync());
                var resultingDirectories = await Task.WhenAll(getDirectoryTasks);
                resultingDirectories.ShouldNotContain(x => string.IsNullOrEmpty(x.Href));

                // Add them all to the teardown list
                this.CreatedOrganizationHrefs.AddRange(resultingOrgs.Select(x => x.Href));
                this.CreatedDirectoryHrefs.AddRange(resultingDirectories.Select(x => x.Href));

                // Grab the one marked as primary
                primaryOrganization = resultingOrgs.Where(x => x.Name.Contains("primary")).Single();
                this.PrimaryOrganizationHref = primaryOrganization.Href;
                this.PrimaryOrganizationNameKey = primaryOrganization.NameKey;
                this.PrimaryDirectoryHref = (await primaryOrganization.GetDefaultAccountStoreAsync()).Href;
            }
            catch (Exception e)
            {
                await this.RemoveObjectsFromTenantAsync();
                throw new ApplicationException("Could not create organizations", e);
            }

            // Add primary organization to primary application as an account store
            var primaryApplication = await client.GetResourceAsync<IApplication>(this.PrimaryApplicationHref);
            var mapping = client.Instantiate<IApplicationAccountStoreMapping>()
                .SetAccountStore(primaryOrganization)
                .SetApplication(primaryApplication)
                .SetDefaultAccountStore(true)
                .SetDefaultGroupStore(true);
            await primaryApplication.CreateAccountStoreMappingAsync(mapping);

            // Create accounts in primary organization
            try
            {
                var accountsToCreate = this.testData.GetTestAccounts(client);
                var createOptions = new AccountCreationOptionsBuilder()
                {
                    RegistrationWorkflowEnabled = false
                }.Build();

                var accountCreationTasks = accountsToCreate.Select(acct =>
                    primaryOrganization.CreateAccountAsync(acct, createOptions));

                var resultingAccounts = await Task.WhenAll(accountCreationTasks);
                this.CreatedAccountHrefs.AddRange(resultingAccounts.Select(x => x.Href));
            }
            catch (Exception e)
            {
                await this.RemoveObjectsFromTenantAsync();
                throw new ApplicationException("Could not create accounts", e);
            }

            // Create groups
            try
            {
                var groupsToCreate = this.testData.GetTestGroups(client);
                var groupCreationTasks = groupsToCreate.Select(g =>
                    primaryOrganization.CreateGroupAsync(g));

                var resultingGroups = await Task.WhenAll(groupCreationTasks);
                this.CreatedGroupHrefs.AddRange(resultingGroups.Select(x => x.Href));

                this.PrimaryGroupHref = resultingGroups.Where(x => x.Name.Contains("primary")).Single().Href;
            }
            catch (Exception e)
            {
                await this.RemoveObjectsFromTenantAsync();
                throw new ApplicationException("Could not create groups", e);
            }

            // Add some accounts to groups
            try
            {
                var luke = await primaryApplication.GetAccounts()
                    .Where(x => x.Email.StartsWith("lskywalker"))
                    .SingleAsync();
                await luke.AddGroupAsync(this.PrimaryGroupHref);

                // Stash an account for easy access
                this.PrimaryAccountHref = luke.Href;
            }
            catch (Exception e)
            {
                await this.RemoveObjectsFromTenantAsync();
                throw new ApplicationException("Could not add accounts to groups", e);
            }
        }
            public async Task Create_with_all_options()
            {
                var optionsBuilder = new AccountCreationOptionsBuilder();
                optionsBuilder.RegistrationWorkflowEnabled = true;
                optionsBuilder.ResponseOptions.Expand(x => x.GetGroups(0, 10));
                var options = optionsBuilder.Build();

                await this.VerifyThat(options, resultsInQueryString: "?expand=groups(offset:0,limit:10)&registrationWorkflowEnabled=true");
            }
            public async Task Create_with_response_options()
            {
                var optionsBuilder = new AccountCreationOptionsBuilder();
                optionsBuilder.ResponseOptions.Expand(x => x.GetCustomData());
                var options = optionsBuilder.Build();

                await this.VerifyThat(options, resultsInQueryString: "?expand=customData");
            }
            public async Task Create_with_workflow_override_disabled()
            {
                var options = new AccountCreationOptionsBuilder()
                {
                    RegistrationWorkflowEnabled = false
                }.Build();

                await this.VerifyThat(options, resultsInQueryString: "?registrationWorkflowEnabled=false");
            }
            public async Task Create_without_workflow_option()
            {
                var options = new AccountCreationOptionsBuilder()
                {
                }.Build();

                await this.VerifyThat(options, resultsInQueryString: string.Empty);
            }