Inheritance: ITranslationStore
        public void should_cache_by_culture()
        {
            var zh_CN = CultureInfo.GetCultureInfo("zh-CN");
            var nl_NL = CultureInfo.GetCultureInfo("nl-NL");

            var brandKey = EntityKey.Create<Brand>(15);

            var cnTranslation = CreateBrandTranslation(15, zh_CN, "Apple China");
            var nlTranslation = CreateBrandTranslation(15, nl_NL, "Apple Dutch");

            var underlyingStoreMock = new Mock<ITranslationStore>();
            underlyingStoreMock.Setup(it => it.Find(zh_CN, new[] { brandKey }))
                               .Returns(new[] { cnTranslation });

            underlyingStoreMock.Setup(it => it.Find(nl_NL, new[] { brandKey }))
                               .Returns(new[] { nlTranslation });

            var store = new CachedTranslactionStore(underlyingStoreMock.Object, new[] { typeof(Brand) });

            var translation = store.Find(zh_CN, brandKey);
            Assert.Equal("Apple China", translation.PropertyTranslations[0].TranslatedText);

            translation = store.Find(nl_NL, brandKey);
            Assert.Equal("Apple Dutch", translation.PropertyTranslations[0].TranslatedText);
        }
        public void can_cache_not_translated_items()
        {
            var zh_CN = CultureInfo.GetCultureInfo("zh-CN");
            var brandKeys = new[] { EntityKey.Create<Brand>(1), EntityKey.Create<Brand>(2) };
            var brandTranslations = new[] { CreateBrandTranslation(1, zh_CN, "Apple China"), null };

            var underlyingStoreMock = new Mock<ITranslationStore>();
            underlyingStoreMock.Setup(it => it.Find(zh_CN, brandKeys)).Returns(brandTranslations);

            var store = new CachedTranslactionStore(underlyingStoreMock.Object, new[] { typeof(Brand) });

            var actualResult = store.Find(zh_CN, brandKeys);
            Assert.NotNull(actualResult[0]);
            Assert.Equal("Apple China", actualResult[0].PropertyTranslations[0].TranslatedText);
            Assert.Null(actualResult[1]);

            actualResult = store.Find(zh_CN, brandKeys);
            Assert.NotNull(actualResult[0]);
            Assert.Equal("Apple China", actualResult[0].PropertyTranslations[0].TranslatedText);
            Assert.Null(actualResult[1]);

            underlyingStoreMock.Verify(it => it.Find(zh_CN, brandKeys), Times.Once());
        }
        public void should_combine_result_of_cached_and_uncached()
        {
            var zh_CN = CultureInfo.GetCultureInfo("zh-CN");
            var allTranslations = new[] {
                CreateBrandTranslation(1, zh_CN, "Apple Translated"),
                CreateBrandTranslation(2, zh_CN, "Dell Translated") ,
                CreateBrandTranslation(3, zh_CN, "Lenovo Translated")
            };

            var underlyingStoreMock = new Mock<ITranslationStore>();
            underlyingStoreMock.Setup(it => it.Find(zh_CN, It.IsAny<EntityKey[]>()))
                               .Returns<CultureInfo, EntityKey[]>((culture, keys) =>
                               {
                                   var result = new List<EntityTransaltion>();
                                   foreach (var key in keys)
                                   {
                                       result.Add(allTranslations.First(it => it.EntityKey.Equals(key)));
                                   }

                                   return result.ToArray();
                               });

            var store = new CachedTranslactionStore(underlyingStoreMock.Object, new[] { typeof(Brand) });

            var translations = store.Find(zh_CN, EntityKey.Create<Brand>(1), EntityKey.Create<Brand>(2));
            Assert.NotNull(translations[0]);
            Assert.NotNull(translations[1]);
            Assert.Equal("Apple Translated", translations[0].PropertyTranslations[0].TranslatedText);
            Assert.Equal("Dell Translated", translations[1].PropertyTranslations[0].TranslatedText);

            translations = store.Find(zh_CN, EntityKey.Create<Brand>(1), EntityKey.Create<Brand>(3));
            Assert.NotNull(translations[0]);
            Assert.NotNull(translations[1]);
            Assert.Equal("Apple Translated", translations[0].PropertyTranslations[0].TranslatedText);
            Assert.Equal("Lenovo Translated", translations[1].PropertyTranslations[0].TranslatedText);
        }
        public void should_refresh_cache_on_update()
        {
            var zh_CN = CultureInfo.GetCultureInfo("zh-CN");
            var translationsInDb = new [] { CreateBrandTranslation(1, zh_CN, "Translated Brand1") };

            var underlyingStoreMock = new Mock<ITranslationStore>();
            underlyingStoreMock.Setup(it => it.Find(zh_CN, new[] { EntityKey.Create<Brand>(1) }))
                               .Returns(translationsInDb);

            underlyingStoreMock.Setup(it => it.AddOrUpdate(zh_CN, EntityKey.Create<Brand>(1), It.IsAny<IEnumerable<PropertyTranslation>>()))
                               .Callback(() =>
                               {
                                   translationsInDb[0].PropertyTranslations[0].TranslatedText = "Translated Brand1 (Update)";
                               });

            var store = new CachedTranslactionStore(underlyingStoreMock.Object, new [] { typeof(Brand) });

            var translation = store.Find(zh_CN, EntityKey.Create<Brand>(1));
            Assert.Equal("Translated Brand1", translation.PropertyTranslations[0].TranslatedText);

            store.AddOrUpdate(zh_CN, EntityKey.Create<Brand>(1), new List<PropertyTranslation>
            {
                new PropertyTranslation("Name", "Brand1", "Translated Brand1 (Update)")
            });

            Assert.Equal("Translated Brand1 (Update)", translationsInDb[0].PropertyTranslations[0].TranslatedText);

            translation = store.Find(zh_CN, EntityKey.Create<Brand>(1));
            Assert.Equal("Translated Brand1 (Update)", translation.PropertyTranslations[0].TranslatedText);
        }
        public void should_only_cache_types_configured_to_be_cached()
        {
            var zh_CN = CultureInfo.GetCultureInfo("zh-CN");
            var underlyingStoreMock = new Mock<ITranslationStore>();
            underlyingStoreMock.Setup(it => it.Find(zh_CN, new[] { EntityKey.Create<Product>(1) }))
                               .Returns(new[] {
                                   new EntityTransaltion("zh-CN", EntityKey.Create<Product>(1), new List<PropertyTranslation>
                                   {
                                        new PropertyTranslation("Name", "Product1", "Translated Product1")
                                   })
                               });

            var store = new CachedTranslactionStore(underlyingStoreMock.Object, new[] { typeof(Brand) });

            store.Find(zh_CN, new[] { EntityKey.Create<Product>(1) });
            store.Find(zh_CN, new[] { EntityKey.Create<Product>(1) });

            underlyingStoreMock.Verify(it => it.Find(CultureInfo.GetCultureInfo("zh-CN"), new[] { EntityKey.Create<Product>(1) }), Times.Exactly(2));
        }
        public void should_fetch_from_underlying_store_if_not_cached()
        {
            var zh_CN = CultureInfo.GetCultureInfo("zh-CN");

            var underlyingStoreMock = new Mock<ITranslationStore>();
            underlyingStoreMock.Setup(it => it.Find(It.IsAny<CultureInfo>(), It.IsAny<EntityKey[]>()))
                               .Returns(new[] { CreateBrandTranslation(1, zh_CN, "Apple Translated") });

            var store = new CachedTranslactionStore(underlyingStoreMock.Object, new [] { typeof(Brand) });
            var translations = store.Find(zh_CN, new[] { EntityKey.Create<Brand>(1) });

            Assert.Equal(1, translations.Length);
            Assert.NotNull(translations[0]);
            Assert.Equal("Apple Translated", translations[0].PropertyTranslations[0].TranslatedText);

            underlyingStoreMock.Verify(it => it.Find(zh_CN, new[] { EntityKey.Create<Brand>(1) }), Times.Once());

            translations = store.Find(zh_CN, new[] { EntityKey.Create<Brand>(2) });

            underlyingStoreMock.Verify(it => it.Find(zh_CN, new[] { EntityKey.Create<Brand>(1) }), Times.Once());
            underlyingStoreMock.Verify(it => it.Find(zh_CN, new[] { EntityKey.Create<Brand>(2) }), Times.Once());
        }
        public void should_fetch_from_cache_on_second_find()
        {
            var zh_CN = CultureInfo.GetCultureInfo("zh-CN");

            var underlyingStoreMock = new Mock<ITranslationStore>();
            underlyingStoreMock.Setup(it => it.Find(It.IsAny<CultureInfo>(), It.IsAny<EntityKey[]>()))
                               .Returns(new[] { CreateBrandTranslation(1, zh_CN, "Apple Translated") });

            var store = new CachedTranslactionStore(underlyingStoreMock.Object, new[] { typeof(Brand) });
            var translations = store.Find(zh_CN, new[] { EntityKey.Create<Brand>(1) });

            underlyingStoreMock.Verify(it => it.Find(zh_CN, new[] { EntityKey.Create<Brand>(1) }), Times.Once());

            translations = store.Find(zh_CN, new[] { EntityKey.Create<Brand>(1) });

            underlyingStoreMock.Verify(it => it.Find(zh_CN, new[] { EntityKey.Create<Brand>(1) }), Times.Once());
        }