public void Test_CheckTypeAccess_SingleSpecificType(bool grant)
        {
            var entityType = Entity.Create <EntityType>();

            entityType.Save();

            var userAccount = Entity.Create <UserAccount>();

            userAccount.Save();

            IDictionary <SubjectPermissionTuple, IList <AccessRuleQuery> > rules = new Dictionary <SubjectPermissionTuple, IList <AccessRuleQuery> >();

            if (grant)
            {
                rules.Add(new SubjectPermissionTuple(userAccount.Id, Permissions.Create.Id),
                          new List <AccessRuleQuery> {
                    new AccessRuleQuery(100, 101, entityType.Id, new StructuredQuery(), false)
                });
            }

            var mockRepo = new MockRepository(MockBehavior.Strict);
            var accessQueryFactoryMock = mockRepo.Create <IAccessRuleQueryFactory>();

            accessQueryFactoryMock.Setup(f => f.GetQueries()).Returns(rules);

            var checker = new SystemEntityAccessControlChecker(new UserRoleRepository(), new SystemAccessRuleQueryRepository(accessQueryFactoryMock.Object),
                                                               new EntityTypeRepository());

            var entityTypes = new [] { entityType };

            Assert.AreEqual(grant, checker.CheckTypeAccess(entityTypes, Permissions.Create, userAccount)[entityType.Id], "CheckTypeAccess returned incorrect result");
        }
        public void Test_Creation()
        {
            SystemEntityAccessControlChecker entityAccessControlChecker;

            entityAccessControlChecker = null;
            Assert.That(() => entityAccessControlChecker = new SystemEntityAccessControlChecker(), Throws.Nothing);
            Assert.That(entityAccessControlChecker, Has.Property("RoleRepository").Not.Null);
            Assert.That(entityAccessControlChecker, Has.Property("QueryRepository").Not.Null);
            Assert.That(entityAccessControlChecker, Has.Property("EntityTypeRepository").Not.Null);
        }
        public void Test_CheckTypeAccess_CreateSingleInheritedType(bool grant)
        {
            var derivedEntityType = new EntityType {
                Name = "Derived Type " + Guid.NewGuid()
            };

            derivedEntityType.Save();

            var baseEntityType = new EntityType {
                Name = "Base Type " + Guid.NewGuid()
            };

            baseEntityType.DerivedTypes.Add(derivedEntityType);
            baseEntityType.Save();

            var userAccount = Entity.Create <UserAccount>();

            userAccount.Save();

            IDictionary <SubjectPermissionTuple, IList <AccessRuleQuery> > rules = new Dictionary <SubjectPermissionTuple, IList <AccessRuleQuery> >();

            if (grant)
            {
                // Grant access to base type
                rules.Add(new SubjectPermissionTuple(userAccount.Id, Permissions.Create.Id),
                          new List <AccessRuleQuery> {
                    new AccessRuleQuery(100, 101, baseEntityType.Id, new StructuredQuery(), false)
                });
            }

            var mockRepo = new MockRepository(MockBehavior.Strict);
            var accessQueryFactoryMock = mockRepo.Create <IAccessRuleQueryFactory>();

            accessQueryFactoryMock.Setup(f => f.GetQueries()).Returns(rules);

            var checker = new SystemEntityAccessControlChecker(new UserRoleRepository(), new SystemAccessRuleQueryRepository(accessQueryFactoryMock.Object),
                                                               new EntityTypeRepository());

            // Check derived type

            var derivedEntityTypes = new [] { derivedEntityType };
            var baseEntityTypes    = new [] { baseEntityType };

            Assert.AreEqual(grant, checker.CheckTypeAccess(derivedEntityTypes, Permissions.Create, userAccount)[derivedEntityType.Id], "CheckTypeAccess returned incorrect result");
            Assert.AreEqual(grant, checker.CheckTypeAccess(baseEntityTypes, Permissions.Create, userAccount)[baseEntityType.Id], "CheckTypeAccess returned incorrect result");
        }