Esempio n. 1
0
        public async Task GetDatabaseAsync_SkipsInitializationWhenDisabled()
        {
            // Arrange
            var services = new ServiceCollection();
            var provider = services.BuildServiceProvider();

            var database = GetDatabase();
            var options  = Mock.Of <IOptionsMonitor <OpenIddictMongoDbOptions> >(
                mock => mock.CurrentValue == new OpenIddictMongoDbOptions
            {
                Database = database.Object,
                DisableInitialization = true
            });

            var context = new OpenIddictMongoDbContext(options, provider);

            // Act
            await context.GetDatabaseAsync(CancellationToken.None);

            // Assert
            database.Verify(mock => mock.GetCollection <OpenIddictApplication>(It.IsAny <string>(), It.IsAny <MongoCollectionSettings>()), Times.Never());
            database.Verify(mock => mock.GetCollection <OpenIddictAuthorization>(It.IsAny <string>(), It.IsAny <MongoCollectionSettings>()), Times.Never());
            database.Verify(mock => mock.GetCollection <OpenIddictScope>(It.IsAny <string>(), It.IsAny <MongoCollectionSettings>()), Times.Never());
            database.Verify(mock => mock.GetCollection <OpenIddictToken>(It.IsAny <string>(), It.IsAny <MongoCollectionSettings>()), Times.Never());
        }
Esempio n. 2
0
        public async Task GetDatabaseAsync_ThrowsAnExceptionWhenDatabaseCannotBeFound()
        {
            // Arrange
            var services = new ServiceCollection();
            var provider = services.BuildServiceProvider();

            var database = GetDatabase();
            var options  = Mock.Of <IOptionsMonitor <OpenIddictMongoDbOptions> >(
                mock => mock.CurrentValue == new OpenIddictMongoDbOptions
            {
                Database = null
            });

            var context = new OpenIddictMongoDbContext(options, provider);

            // Act and assert
            var exception = await Assert.ThrowsAsync <InvalidOperationException>(async delegate
            {
                await context.GetDatabaseAsync(CancellationToken.None);
            });

            Assert.Equal(new StringBuilder()
                         .AppendLine("No suitable MongoDB database service can be found.")
                         .Append("To configure the OpenIddict MongoDB stores to use a specific database, use ")
                         .Append("'services.AddOpenIddict().AddCore().UseMongoDb().UseDatabase()' or register an ")
                         .Append("'IMongoDatabase' in the dependency injection container in 'ConfigureServices()'.")
                         .ToString(), exception.Message);
        }
Esempio n. 3
0
        public async Task GetDatabaseAsync_ThrowsAnExceptionForConcurrentCallsWhenInitializationTimesOut()
        {
            // Arrange
            var services = new ServiceCollection();
            var provider = services.BuildServiceProvider();

            var manager = new Mock <IMongoIndexManager <OpenIddictApplication> >();

            manager.Setup(mock => mock.CreateManyAsync(It.IsAny <IEnumerable <CreateIndexModel <OpenIddictApplication> > >(), It.IsAny <CancellationToken>()))
            .Returns(async delegate
            {
                await Task.Delay(TimeSpan.FromMilliseconds(1000));
                return(new[] { string.Empty });
            });

            var collection = new Mock <IMongoCollection <OpenIddictApplication> >();

            collection.SetupGet(mock => mock.Indexes)
            .Returns(manager.Object);

            var database = GetDatabase();

            database.Setup(mock => mock.GetCollection <OpenIddictApplication>(It.IsAny <string>(), It.IsAny <MongoCollectionSettings>()))
            .Returns(collection.Object);

            var options = Mock.Of <IOptionsMonitor <OpenIddictMongoDbOptions> >(
                mock => mock.CurrentValue == new OpenIddictMongoDbOptions
            {
                Database = database.Object,
                InitializationTimeout = TimeSpan.FromMilliseconds(50)
            });

            var context = new OpenIddictMongoDbContext(options, provider);

            // Act and assert
            var exception = await Assert.ThrowsAsync <InvalidOperationException>(delegate
            {
                return(Task.WhenAll(
                           context.GetDatabaseAsync(CancellationToken.None).AsTask(),
                           context.GetDatabaseAsync(CancellationToken.None).AsTask(),
                           context.GetDatabaseAsync(CancellationToken.None).AsTask(),
                           context.GetDatabaseAsync(CancellationToken.None).AsTask()));
            });

            Assert.Equal(new StringBuilder()
                         .AppendLine("The MongoDB database couldn't be initialized within a reasonable timeframe.")
                         .Append("Make sure that the MongoDB server is ready and accepts connections from this machine or use ")
                         .Append("'services.AddOpenIddict().AddCore().UseMongoDb().SetInitializationTimeout()' to adjust the timeout.")
                         .ToString(), exception.Message);
        }
Esempio n. 4
0
        public async Task GetDatabaseAsync_FailedInvocationDoesNotPreventFutureInvocations()
        {
            // Arrange
            var services = new ServiceCollection();
            var provider = services.BuildServiceProvider();

            var count = 0;

            var collection = new Mock <IMongoCollection <OpenIddictApplication> >();

            collection.SetupGet(mock => mock.Indexes)
            .Returns(Mock.Of <IMongoIndexManager <OpenIddictApplication> >());

            var database = GetDatabase();

            database.Setup(mock => mock.GetCollection <OpenIddictApplication>(It.IsAny <string>(), It.IsAny <MongoCollectionSettings>()))
            .Callback(() => count++)
            .Returns(delegate
            {
                if (count == 1)
                {
                    throw new Exception();
                }

                return(collection.Object);
            });

            var options = Mock.Of <IOptionsMonitor <OpenIddictMongoDbOptions> >(
                mock => mock.CurrentValue == new OpenIddictMongoDbOptions
            {
                Database = database.Object
            });

            var context = new OpenIddictMongoDbContext(options, provider);

            // Act and assert
            await Assert.ThrowsAsync <Exception>(async() => await context.GetDatabaseAsync(CancellationToken.None));

            Assert.Same(database.Object, await context.GetDatabaseAsync(CancellationToken.None));

            database.Verify(mock => mock.GetCollection <OpenIddictApplication>(It.IsAny <string>(), It.IsAny <MongoCollectionSettings>()), Times.Exactly(2));
            database.Verify(mock => mock.GetCollection <OpenIddictAuthorization>(It.IsAny <string>(), It.IsAny <MongoCollectionSettings>()), Times.Once());
            database.Verify(mock => mock.GetCollection <OpenIddictScope>(It.IsAny <string>(), It.IsAny <MongoCollectionSettings>()), Times.Once());
            database.Verify(mock => mock.GetCollection <OpenIddictToken>(It.IsAny <string>(), It.IsAny <MongoCollectionSettings>()), Times.Once());
        }
Esempio n. 5
0
    public async Task GetDatabaseAsync_ThrowsAnExceptionForCanceledToken()
    {
        // Arrange
        var services = new ServiceCollection();
        var provider = services.BuildServiceProvider();

        var options = Mock.Of <IOptionsMonitor <OpenIddictMongoDbOptions> >();
        var token   = new CancellationToken(canceled: true);

        var context = new OpenIddictMongoDbContext(options, provider);

        // Act and assert
        var exception = await Assert.ThrowsAsync <TaskCanceledException>(async delegate
        {
            await context.GetDatabaseAsync(token);
        });

        Assert.Equal(token, exception.CancellationToken);
    }
Esempio n. 6
0
        public async Task GetDatabaseAsync_ThrowsAnExceptionForNullOptions()
        {
            // Arrange
            var services = new ServiceCollection();
            var provider = services.BuildServiceProvider();

            var database = GetDatabase();
            var options  = Mock.Of <IOptionsMonitor <OpenIddictMongoDbOptions> >();

            var context = new OpenIddictMongoDbContext(options, provider);

            // Act and assert
            var exception = await Assert.ThrowsAsync <InvalidOperationException>(async delegate
            {
                await context.GetDatabaseAsync(CancellationToken.None);
            });

            Assert.Equal("The OpenIddict MongoDB options cannot be retrieved.", exception.Message);
        }
Esempio n. 7
0
    public async Task GetDatabaseAsync_PrefersDatabaseRegisteredInOptionsToDatabaseRegisteredInDependencyInjectionContainer()
    {
        // Arrange
        var services = new ServiceCollection();

        services.AddSingleton(Mock.Of <IMongoDatabase>());

        var provider = services.BuildServiceProvider();

        var database = Mock.Of <IMongoDatabase>();
        var options  = Mock.Of <IOptionsMonitor <OpenIddictMongoDbOptions> >(
            mock => mock.CurrentValue == new OpenIddictMongoDbOptions
        {
            Database = database
        });

        var context = new OpenIddictMongoDbContext(options, provider);

        // Act and assert
        Assert.Same(database, await context.GetDatabaseAsync(CancellationToken.None));
    }
Esempio n. 8
0
    public async Task GetDatabaseAsync_ThrowsAnExceptionWhenDatabaseCannotBeFound()
    {
        // Arrange
        var services = new ServiceCollection();
        var provider = services.BuildServiceProvider();

        var options = Mock.Of <IOptionsMonitor <OpenIddictMongoDbOptions> >(
            mock => mock.CurrentValue == new OpenIddictMongoDbOptions
        {
            Database = null
        });

        var context = new OpenIddictMongoDbContext(options, provider);

        // Act and assert
        var exception = await Assert.ThrowsAsync <InvalidOperationException>(async delegate
        {
            await context.GetDatabaseAsync(CancellationToken.None);
        });

        Assert.Equal(SR.GetResourceString(SR.ID0262), exception.Message);
    }
        public async Task GetDatabaseAsync_ReturnsCachedDatabase()
        {
            // Arrange
            var services = new ServiceCollection();
            var provider = services.BuildServiceProvider();

            var database = GetDatabase();
            var options  = Mock.Of <IOptionsMonitor <OpenIddictMongoDbOptions> >(
                mock => mock.CurrentValue == new OpenIddictMongoDbOptions
            {
                Database = database.Object
            });

            var context = new OpenIddictMongoDbContext(options, provider);

            // Act and assert
            Assert.Same(database.Object, await context.GetDatabaseAsync(CancellationToken.None));
            Assert.Same(database.Object, await context.GetDatabaseAsync(CancellationToken.None));

            database.Verify(mock => mock.GetCollection <OpenIddictApplication>(It.IsAny <string>(), It.IsAny <MongoCollectionSettings>()), Times.Once());
            database.Verify(mock => mock.GetCollection <OpenIddictScope>(It.IsAny <string>(), It.IsAny <MongoCollectionSettings>()), Times.Once());
            database.Verify(mock => mock.GetCollection <OpenIddictToken>(It.IsAny <string>(), It.IsAny <MongoCollectionSettings>()), Times.Once());
        }