public async void UnexpectedExceptionThrownByRedisDuringRemove()
        {
            // Given
            var connectionMultplexerMock = new Mock <IConnectionMultiplexer>();
            var configuration            = new ConcurrentRequestLimiterConfiguration();
            var loggerMock = new Mock <ILogger <RedisConcurrentRequestsManager> >();

            connectionMultplexerMock.Setup(mock => mock.GetDatabase(
                                               Moq.It.IsAny <int>(),
                                               Moq.It.IsAny <object>()))
            .Throws <Exception>();

            var manager = new RedisConcurrentRequestsManager(
                connectionMultplexerMock.Object,
                configuration,
                loggerMock.Object);

            // When a request is removed
            var result = await manager.RemoveAsync(
                Guid.NewGuid().ToString(),
                Guid.NewGuid().ToString());

            // Then it should log a warning
            loggerMock.Verify(mock => mock.Log(
                                  LogLevel.Warning,
                                  Moq.It.IsAny <EventId>(),
                                  Moq.It.IsAny <FormattedLogValues>(),
                                  Moq.It.IsAny <Exception>(),
                                  Moq.It.IsAny <Func <object, Exception, string> >()));

            // And it should return false
            result.Should().BeFalse();
        }
        public async void RequestIsNotRemoved()
        {
            // Given
            var connectionMultplexerMock = new Mock <IConnectionMultiplexer>();
            var databaseMock             = new Mock <IDatabase>();
            var configuration            = new ConcurrentRequestLimiterConfiguration();
            var loggerMock = new Mock <ILogger <RedisConcurrentRequestsManager> >();

            databaseMock.Setup(mock => mock.SortedSetRemoveAsync(
                                   Moq.It.IsAny <RedisKey>(),
                                   Moq.It.IsAny <RedisValue>(),
                                   Moq.It.IsAny <CommandFlags>()))
            .ReturnsAsync(false);

            connectionMultplexerMock.Setup(mock => mock.GetDatabase(
                                               Moq.It.IsAny <int>(),
                                               Moq.It.IsAny <object>()))
            .Returns(databaseMock.Object);

            var manager = new RedisConcurrentRequestsManager(
                connectionMultplexerMock.Object,
                configuration,
                loggerMock.Object);

            // When a request is removed
            var result = await manager.RemoveAsync(
                Guid.NewGuid().ToString(),
                Guid.NewGuid().ToString());

            // Then it should log a debug message
            loggerMock.Verify(mock => mock.Log(
                                  LogLevel.Debug,
                                  Moq.It.IsAny <EventId>(),
                                  Moq.It.IsAny <FormattedLogValues>(),
                                  Moq.It.IsAny <Exception>(),
                                  Moq.It.IsAny <Func <object, Exception, string> >()));

            // And it should return false
            result.Should().BeFalse();
        }