public void Test_GetQueries(bool nullPerm, bool nullTypes)
        {
            CachingQueryRepository  repository;
            Mock <IQueryRepository> mockRepository;
            const long testSubjectId    = 1;
            EntityRef  testPermission   = nullPerm ? null : new EntityRef(2);
            long       testPermissionId = nullPerm ? -1 : testPermission.Id;

            long[] entities = nullTypes ? null : new long[] { 3, 4 };
            IEnumerable <AccessRuleQuery> expectedResult = new AccessRuleQuery[0];

            mockRepository = new Mock <IQueryRepository>(MockBehavior.Strict);
            mockRepository.Setup(mr => mr.GetQueries(testSubjectId, testPermission, entities))
            .Returns(() => expectedResult);

            repository = new CachingQueryRepository(mockRepository.Object);

            Assert.That(repository.GetQueries(1, testPermission, entities),
                        Is.EqualTo(expectedResult));
            Assert.That(repository.Cache,
                        Has.Exactly(1).Property("Key").EqualTo(new SubjectPermissionTypesTuple(testSubjectId, testPermissionId, entities))
                        .And.Property("Value").EqualTo(expectedResult));
            Assert.That(repository.GetQueries(1, testPermission, entities),
                        Is.EqualTo(expectedResult));
            Assert.That(repository.Cache,
                        Has.Exactly(1).Property("Key").EqualTo(new SubjectPermissionTypesTuple(testSubjectId, testPermissionId, entities))
                        .And.Property("Value").EqualTo(expectedResult));

            mockRepository.VerifyAll();
        }
        public void Test_Creation()
        {
            CachingQueryRepository  repository;
            Mock <IQueryRepository> mockRepository;

            mockRepository = new Mock <IQueryRepository>(MockBehavior.Strict);

            repository = new CachingQueryRepository(mockRepository.Object);

            mockRepository.VerifyAll();
            Assert.That(repository, Has.Property("Cache").Count.EqualTo(0));
            Assert.That(repository, Has.Property("Repository").EqualTo(mockRepository.Object));
        }
        public void Test_Clear()
        {
            CachingQueryRepository  repository;
            Mock <IQueryRepository> mockRepository;
            const long testSubjectId  = 1;
            EntityRef  testPermission = new EntityRef(2);

            long[] entities = new long[] { 3, 4 };
            IEnumerable <AccessRuleQuery> expectedResult = new [] { new AccessRuleQuery(1, 1, 1, new StructuredQuery(), false) };

            mockRepository = new Mock <IQueryRepository>(MockBehavior.Strict);
            mockRepository.Setup(mr => mr.GetQueries(testSubjectId, testPermission, entities))
            .Returns(() => expectedResult);

            repository = new CachingQueryRepository(mockRepository.Object);
            repository.GetQueries(1, testPermission, entities);

            // Sanity check
            Assert.That(repository.Cache, Has.Property("Count").Positive, "Not cached");

            repository.Clear();

            Assert.That(repository.Cache, Has.Property("Count").EqualTo(0), "Not cleared");
        }