Пример #1
0
        public void NavigationCanReadWrite()
        {
            IMenuDefinition[] menus;
            ISubMenuDefinition[] subMenus;
            var navigationService = new StubNavigationService();
            IServiceBus serviceBus;

            InitializeSecurityContext(navigationService, out menus, out subMenus, out serviceBus);

            var projectManagerService = (StubProjectManagerService)serviceBus.Get<IProjectManagerService>();

            var root = XDocument.Load(Path.Combine(TestContext.DeploymentDirectory, "RolesAccessTestsData.xml")).Root;

            foreach (var testcase in root.Elements("TestCase"))
            {
                var menuCode = testcase.Attribute("Menu").Value;
                var subMenuCode = testcase.Attribute("SubMenu").Value;
                var userRoles = testcase.Element("User").Elements("Role").Select(r => r.Value).ToArray();
                var userProjectRoles = testcase.Element("Project").Elements("Role").Select(r => r.Value).ToArray();
                var expectedIsEnabled = bool.Parse(testcase.Element("IsEnabled").Value);
                var expectedCanRead = bool.Parse(testcase.Element("CanRead").Value);
                var expectedCanWrite = bool.Parse(testcase.Element("CanWrite").Value);
                var hasRealizedLockedScenario = bool.Parse(testcase.Element("Project").Element("HasRealizedLockedScenario").Value);

                var subMenuDefinition = subMenus.First(smd => smd.Code == subMenuCode && smd.ParentCode == menuCode);

                var modelUser = new KProcess.Ksmed.Models.User
                {
                    Username = "******",
                };
                modelUser.RoleCodes.AddRange(userRoles);

                Security.SecurityContext.CurrentUser = new Security.User(modelUser);

                navigationService.IsProjectSecurityContext = subMenuDefinition.IsSecurityProjectContext;
                navigationService.ProjectRoles = userProjectRoles;

                projectManagerService.HasRealizedLockedScenario = hasRealizedLockedScenario;

                bool hasTryShowBeenCalled = false;

                Assert.AreEqual(expectedIsEnabled, subMenuDefinition.IsEnabledDelegate());

                navigationService.TryShowCallback = () =>
                {
                    hasTryShowBeenCalled = true;

                    Assert.AreEqual(expectedCanRead, navigationService.CanRead, string.Format("Expected CanRead faux : \r\n{0}", testcase.ToString()));
                    Assert.AreEqual(expectedCanWrite, navigationService.CanWrite, string.Format("Expected CanWrite faux : \r\n{0}", testcase.ToString()));
                };

                subMenuDefinition.Action(serviceBus);

                Assert.IsTrue(hasTryShowBeenCalled);

            }
        }
Пример #2
0
        private void InitializeSecurityContext(StubNavigationService navigationService, out IMenuDefinition[] menus, out ISubMenuDefinition[] subMenus, out IServiceBus serviceBus)
        {
            // N'importer que les IMenuDefinition et ISubMenuDefinition

            var menuDeftype = typeof(IMenuDefinition);
            var subMenuDeftype = typeof(ISubMenuDefinition);

            var assembly = typeof(KProcess.Ksmed.Presentation.Shell.Controller).Assembly;

            // Rechercher les types qui les implémentent
            var menuTypes = assembly.GetTypes().Where(t => t.GetInterface(menuDeftype.FullName) != null || t.GetInterface(subMenuDeftype.FullName) != null).ToArray();


            // Composer MEF
            var container = new CompositionContainer(
                new AggregateCatalog(
                    new TypeCatalog(menuTypes),
                    new TypeCatalog(
                        typeof(IServiceBus), typeof(ServiceBus),
                        typeof(IEventBus), typeof(EventBus)
                        )));
            CompositionBatch batch = new CompositionBatch();
            batch.AddPart(this);
            batch.AddExportedValue<CompositionContainer>(container);
            //IoC.RegisterInstance<CompositionContainer>(_container);
            container.Compose(batch);

            menus = container.GetExports<IMenuDefinition>().Select(l => l.Value).ToArray();
            subMenus = container.GetExports<ISubMenuDefinition>().Select(l => l.Value).ToArray();

            foreach (var menu in menus)
            {
                menu.Initialize();
            }


            var rolesReadAuthorizations = new Dictionary<Type, string[]>();
            var rolesWriteAuthorizations = new Dictionary<Type, string[]>();
            var featuresReadAuthorizations = new Dictionary<Type, short[]>();
            var featuresWriteAuthorizations = new Dictionary<Type, short[]>();
            var customReadAuthorizations = new Dictionary<Type, Func<string, bool>>();
            var customWriteAuthorizations = new Dictionary<Type, Func<string, bool>>();
            var accessProjectContext = new Dictionary<Type, bool>();

            foreach (var subMenu in subMenus)
            {
                subMenu.Initialize();
                rolesReadAuthorizations[subMenu.ViewModelType] = subMenu.RolesCanRead;
                rolesWriteAuthorizations[subMenu.ViewModelType] = subMenu.RolesCanWrite;
                featuresReadAuthorizations[subMenu.ViewModelType] = subMenu.FeaturesCanRead;
                featuresWriteAuthorizations[subMenu.ViewModelType] = subMenu.FeaturesCanWrite;
                customReadAuthorizations[subMenu.ViewModelType] = subMenu.CustomCanRead;
                customWriteAuthorizations[subMenu.ViewModelType] = subMenu.CustomCanWrite;
                accessProjectContext[subMenu.ViewModelType] = subMenu.IsSecurityProjectContext;
            }

            Security.SecurityContext.RegisterAuthorizations(
                rolesReadAuthorizations,
                rolesWriteAuthorizations,
                featuresReadAuthorizations,
                featuresWriteAuthorizations,
                customReadAuthorizations,
                customWriteAuthorizations);

            serviceBus = container.GetExport<IServiceBus>().Value;
            serviceBus.Register<INavigationService>(navigationService);
            serviceBus.Register<IProjectManagerService>(new StubProjectManagerService());

        }