public void CreateService_UsesServiceFactory()
        {
            // Arange
            var serviceMock = new Mock <IRedisService>(MockBehavior.Strict);

            var factoryMock = new Mock <IRedisServiceFactory>(MockBehavior.Strict);

            factoryMock.Setup(m => m.CreateService(It.IsAny <string>()))
            .Returns <string>((connectionString) =>
            {
                return(serviceMock.Object);
            });

            var config = InitializeConfig("Default");

            config.RedisServiceFactory = factoryMock.Object;

            var attribute = new RedisAttribute("channel");

            // Act
            var service = config.CreateService(attribute);

            // Assert
            factoryMock.Verify(f => f.CreateService("Default"), Times.Once());
        }
        public Task <IBinding> TryCreateAsync(BindingProviderContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            ParameterInfo  parameter = context.Parameter;
            RedisAttribute attribute = parameter.GetCustomAttribute <RedisAttribute>(inherit: false);

            if (attribute == null)
            {
                return(Task.FromResult <IBinding>(null));
            }

            IArgumentBinding <RedisEntity> argumentBinding = Provider.TryCreate(parameter);

            if (argumentBinding == null)
            {
                throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture,
                                                                  "Can't bind to type '{0}'.", parameter.ParameterType));
            }

            var account = RedisAccount.CreateDbFromConnectionString(_config.ConnectionString);

            IBinding binding = new RedisBinding(parameter.Name, argumentBinding, account, attribute, context, _trace);

            return(Task.FromResult(binding));
        }
        public static IContainer Initialize()
        {
            var container = new Container(x =>
            {
                x.Scan(scan =>
                {
                    scan.TheCallingAssembly();
                    scan.WithDefaultConventions();
                    scan.Assembly("JonDJones.Core");
                    scan.Assembly("JonDJones.Com.Interfaces");
                });

                x.For <IWebsiteDependencies>().Use <WebsiteDependencies>();

                x.ForConcreteType <RedisAttribute>()
                .Configure.Setter <IWebsiteDependencies>()
                .Is(new WebsiteDependencies());
                x.Policies.SetAllProperties(y => y.OfType <IWebsiteDependencies>());
            });

            var target = new RedisAttribute();

            container.BuildUp(target);

            return(container);
        }
        public async Task IncrementValue_ConnectionInConfig_KeyInAttribute_OperationInAttribute_By10_Increments10()
        {
            var config = new RedisExtensionConfigProvider()
            {
                Connection = "localhost:3679",
            };

            var attr = new RedisAttribute()
            {
                Key = "myKey",
                RedisItemOperation = RedisItemOperation.IncrementValue,
            };

            var redisDatabase = new RedisDatabaseMock();

            var connectionManager = new Mock <IRedisDatabaseManager>();

            connectionManager.Setup(x => x.GetDatabase("localhost:3679", -1))
            .Returns(redisDatabase);

            var target = new RedisItemAsyncCollector(config, attr, connectionManager.Object);
            await target.AddAsync(new RedisItem()
            {
                IncrementValue = 10
            });

            await target.FlushAsync();

            connectionManager.VerifyAll();

            var actual = redisDatabase.StringGet("myKey");

            Assert.Equal(10, (long)actual);
        }
        public RedisBinding(string parameterName, IArgumentBinding <RedisEntity> argumentBinding,
                            RedisAccount account, RedisAttribute attribute, BindingProviderContext context, TraceWriter trace)
        {
            _parameterName   = parameterName;
            _argumentBinding = argumentBinding;
            _account         = account;
            _attribute       = attribute;
            _mode            = attribute.Mode;

            _channelOrKeyPath = BindingTemplate.FromString(attribute.ChannelOrKey);
            _trace            = trace;
        }
        public RedisBinding(string parameterName, IArgumentBinding<RedisEntity> argumentBinding,
            RedisAccount account, RedisAttribute attribute, BindingProviderContext context, TraceWriter trace)
        {
            _parameterName = parameterName;
            _argumentBinding = argumentBinding;
            _account = account;
            _attribute = attribute;
            _mode = attribute.Mode;

            _channelOrKeyPath = BindingTemplate.FromString(attribute.ChannelOrKey);
            _trace = trace;
        }
        public void Constructor_ChannelName()
        {
            // Arrange
            string channelName = "Channel9";

            // Act
            RedisAttribute attribute = new RedisAttribute(channelName);

            // Assert
            Assert.Equal(channelName, attribute.ChannelOrKey);
            Assert.Equal(Mode.PubSub, attribute.Mode);
            Assert.Null(attribute.ConnectionStringSetting);
        }
        public void Constructor_ChannelAndMode()
        {
            // Arrange
            string channelName = "Channel9";
            Mode   mode        = Mode.Cache;

            // Act
            RedisAttribute attribute = new RedisAttribute(channelName, mode);

            // Assert
            Assert.Equal(channelName, attribute.ChannelOrKey);
            Assert.Equal(mode, attribute.Mode);
            Assert.Null(attribute.ConnectionStringSetting);
        }
        public async Task ListLeftPush_ConnectionInConfig_KeyInAttribute_OperationInAttribute_AddsItemToStartOfList()
        {
            var config = new RedisExtensionConfigProvider()
            {
                Connection = "localhost:3679",
            };

            var attr = new RedisAttribute()
            {
                Key = "myKey",
                RedisItemOperation = RedisItemOperation.ListLeftPush,
            };

            var redisDatabase = new RedisDatabaseMock();

            var connectionManager = new Mock <IRedisDatabaseManager>();

            connectionManager.Setup(x => x.GetDatabase("localhost:3679", -1))
            .Returns(redisDatabase);

            var target = new RedisItemAsyncCollector(config, attr, connectionManager.Object);
            await target.AddAsync(new RedisItem()
            {
                TextValue = "second value"
            });

            await target.AddAsync(new RedisItem()
            {
                TextValue = "first value"
            });

            await target.FlushAsync();

            connectionManager.VerifyAll();

            var actual = redisDatabase.ListRange("myKey", 0);

            Assert.NotNull(actual);
            Assert.Equal(2, actual.Length);
            Assert.Equal("first value", actual[0].ToString());
            Assert.Equal("second value", actual[1].ToString());
        }