Ejemplo n.º 1
0
        public void GetActionsReportInScreen_Bug_25919()
        {
            var section  = Entity.Get <NavSection>("test:25919_section");
            var workflow = Entity.Get <Workflow>("test:25919_workflow");
            var report   = Entity.Get <ReadiNow.Model.Report>("test:25919_report");
            var screen   = Entity.Get <StructureControlOnForm>("test:25919_screen");

            section.Should().NotBeNull("Section should exist in Test Solution.");
            workflow.Should().NotBeNull("Workflow should exist in Test Solution.");
            report.Should().NotBeNull("Report should exist in Test Solution.");
            screen.Should().NotBeNull("Screen should exist in Test Solution.");
            screen.ContainedControlsOnForm.Should().NotBeNull().And.NotBeEmpty();
            screen.ContainedControlsOnForm.Count.Should().Be(1);

            var ctrl = screen.ContainedControlsOnForm.First();

            var aaronWitte = Entity.Get("test:aaronWitte");

            aaronWitte.Should().NotBeNull("AAAAAAAAAAAAAAARRROOOOOOOOOOOONNNN!!!!");

            var svc = new ActionService();

            svc.FlushCaches();

            var request1 = new ActionRequestExtended
            {
                LastSelectedResourceId = aaronWitte.Id,
                SelectedResourceIds    = new[] { aaronWitte.Id },
                ReportId = report.Id
            };

            var result1 = svc.GetActions(request1);

            result1.Should().NotBeNull();
            result1.Actions.Should().NotBeNull().And.NotBeEmpty();
            result1.Actions.Count(a => a.Name == "Log Test Person").Should().Be(1);

            var request2 = new ActionRequestExtended
            {
                LastSelectedResourceId = aaronWitte.Id,
                SelectedResourceIds    = new [] { aaronWitte.Id },
                ReportId        = report.Id,
                HostResourceIds = new [] { ctrl.Id }
            };

            var result2 = svc.GetActions(request2);

            result2.Should().NotBeNull();
            result2.Actions.Should().NotBeNull().And.NotBeEmpty();
            result2.Actions.Count.Should().Be(result1.Actions.Count - 1);
            result2.Actions.Count(a => a.Name == "Log Test Person").Should().Be(0);
        }
Ejemplo n.º 2
0
        public void GetActionsSingleSelectedResource( )
        {
            // arrange
            var resource = Entity.Create <Resource>();

            resource.Save( );

            var request = new ActionRequestExtended
            {
                LastSelectedResourceId = resource.Id,
                SelectedResourceIds    = new[] { resource.Id }
            };

            var svc = new ActionService( );

            svc.FlushCaches();

            // act
            var result = svc.GetActions(request);

            // assert
            result.Should().NotBeNull();

            request.SelectedResources.Should().NotBeNull().And.NotBeEmpty();
            request.SelectedResources.Count().Should().Be(1);
            request.SelectedResources.Should().Contain(r => r.Id == resource.Id);
            request.LastSelectedResource.Id.Should().Be(resource.Id);
            request.SelectedResourceTypes.Should().NotBeNull().And.NotBeEmpty();
            foreach (EntityType t in resource.EntityTypes)
            {
                var type = request.SelectedResourceTypes.FirstOrDefault(a => a.Id == t.Id);
                type.Should().NotBeNull();
                if (type == null)
                {
                    continue;
                }
                type.Alias.Should().Be(t.Alias);
                type.TenantId.Should().Be(t.TenantId);
            }

            result.Actions.Should().NotBeNull();
            RemovePowerTools(result);

            result.Actions.Count.Should().Be(3);
            result.Actions[0].Name.Should().Be("View 'Resource'");   // View
            result.Actions[0].Order.Should().Be(10);
            result.Actions[1].Name.Should().Be("Edit 'Resource'");   // Edit
            result.Actions[1].Order.Should().Be(20);
            result.Actions[2].Name.Should().Be("Delete 'Resource'"); // Delete
            result.Actions[2].Order.Should().Be(30);
        }
Ejemplo n.º 3
0
        public HttpResponseMessage <ActionMenuState> Menu([FromBody] ActionRequest request)
        {
            if (request == null)
            {
                throw new WebArgumentNullException("request");
            }

            using (Profiler.Measure("ActionController.Menu"))
            {
                var             padded   = new ActionRequestExtended(request);
                ActionMenuState response = ActionServiceImpl.GetActionsMenuState(padded);
                return(new HttpResponseMessage <ActionMenuState>(response));
            }
        }
Ejemplo n.º 4
0
        public void GetActionsMultipleSelectedResources()
        {
            // arrange
            var resource1 = Entity.Create <Resource>();
            var resource2 = Entity.Create <Resource>();

            resource1.Save( );
            resource2.Save( );

            var svc = new ActionService( );

            svc.FlushCaches();


            var request = new ActionRequestExtended
            {
                LastSelectedResourceId = resource2.Id,
                SelectedResourceIds    = new[] { resource1.Id, resource2.Id }
            };

            // act
            var result = svc.GetActions(request);

            // assert
            result.Should().NotBeNull();

            request.SelectedResources.Should().NotBeNull().And.NotBeEmpty();
            request.SelectedResources.Count().Should().Be(2);
            request.SelectedResources.Should().Contain(r => r.Id == resource1.Id);
            request.SelectedResources.Should().Contain(r => r.Id == resource2.Id);
            request.LastSelectedResource.Should().NotBeNull();
            request.SelectedResourceTypes.Should().NotBeNull().And.NotBeEmpty();
            foreach (EntityType t in resource1.EntityTypes)
            {
                var type = request.SelectedResourceTypes.FirstOrDefault(a => a.Id == t.Id);
                type.Should().NotBeNull();
                if (type == null)
                {
                    continue;
                }
                type.Alias.Should().Be(t.Alias);
                type.TenantId.Should().Be(t.TenantId);
            }

            result.Actions.Should().NotBeNull();
            result.Actions.Count.Should().Be(1);
            result.Actions[0].Name.Should().Be("Delete selected"); // Multi-delete
            result.Actions[0].Order.Should().Be(30);
        }
Ejemplo n.º 5
0
        public HttpResponseMessage <ActionResponse> Post([FromBody] ActionRequest request)
        {
            if (request == null)
            {
                throw new WebArgumentNullException("request");
            }

            using (Profiler.Measure("ActionController.Post"))
            {
                var padded = new ActionRequestExtended(request);

                var tz = TimeZoneHelper.SydneyTimeZoneName;
                if (Request.Headers.Contains("tz"))
                {
                    tz = Request.Headers.GetValues("tz").First();
                }
                padded.TimeZone = tz;

                ActionResponse response = ActionServiceImpl.GetActions(padded);
                return(new HttpResponseMessage <ActionResponse>(response));
            }
        }
Ejemplo n.º 6
0
        public void Test_GetActions(string reportKey, string selectName, string[] expectedActionKeys)
        {
            ActionResponse response;

            var testObject = SetupGrandDesign();
            var request    = new ActionRequestExtended(new ActionRequest
            {
                ReportId             = testObject.Reports[reportKey].Id,
                ActionDisplayContext = ActionContext.All
            });

            var svc = new ActionService();

            svc.FlushCaches();

            using (new SetUser(testObject.Accounts["administrator"]))
            {
                response = svc.GetActions(request);
            }

            response.Should().NotBeNull();

            var expectedActions = testObject.Actions
                                  .Where(a => expectedActionKeys.Contains(a.Key))
                                  .Select(a => a.Value)
                                  .Union(testObject.SelectActions(selectName)
                                         .Where(s => expectedActionKeys.Contains(s.Name))).ToList();

            var actions = response.Actions.Where(a => !a.Name.StartsWith("Debug '")).ToList();

            actions.ShouldAllBeEquivalentTo(expectedActions, options => options
                                            .Excluding(o => o.Id)
                                            .Excluding(o => o.EntityId)
                                            .Excluding(o => o.Alias)
                                            .Excluding(o => o.AdditionalData)
                                            .Excluding(o => o.RequiresPermissions)
                                            .Excluding(o => o.RequiresParentPermissions));
        }
Ejemplo n.º 7
0
        public void GetFormActionsForConfigMode()
        {
            // Should fetch actions associated with person type (only workflow and document generation type actions are fetched in form actions)
            var personType = Entity.Get <Definition>("core:person");

            var request = new ActionRequestExtended
            {
                EntityTypeId         = personType.Id,
                FormId               = personType.DefaultEditForm.Id,
                ActionDisplayContext = ActionContext.All
            };

            var svc = new ActionService();

            svc.FlushCaches();

            var result = svc.GetFormActionsMenuState(request);

            result.Should().NotBeNull();
            result.Actions.Should().NotBeNull().And.NotBeEmpty();
            result.Actions.Count.Should().Be(2);
            result.Actions.Count(a => a.Name == "Assign Data to App").Should().Be(1);
            result.Actions.Count(a => a.Name == "Person Name Update").Should().Be(1);
        }
Ejemplo n.º 8
0
        public void Test_Filter_ActionRequiresParentModifyAccess(string parentEntityPermissions, string childEntityPermissions)
        {
            SecurityActionMenuItemFilter securityActionMenuItemFilter;
            UserAccount userAccount;
            EntityType  parentEntityType;
            EntityType  childEntityType;
            IEntity     parentEntity;
            IEntity     childEntity;

            const string viewResourceActionAlias       = "console:viewResourceAction";
            const string editResourceActionAlias       = "console:editResourceAction";
            const string deleteResourceActionAlias     = "console:deleteResourceAction";
            const string addRelationshipActionAlias    = "console:addRelationshipAction";
            const string removeRelationshipActionAlias = "console:removeRelationshipAction";

            var splitParentEntityPermissions = parentEntityPermissions.Split(new[] { ',' },
                                                                             StringSplitOptions.RemoveEmptyEntries);

            var splitChildEntityPermissions = childEntityPermissions.Split(new[] { ',' },
                                                                           StringSplitOptions.RemoveEmptyEntries);


            userAccount      = new UserAccount();
            userAccount.Name = "Test user " + Guid.NewGuid();
            userAccount.Save();

            // parent
            parentEntityType = new EntityType();
            parentEntityType.Inherits.Add(UserResource.UserResource_Type);
            parentEntityType.Save();

            parentEntity = Entity.Create(new EntityRef(parentEntityType));
            parentEntity.SetField("core:name", "A"); // "A" so it will match the access rule
            parentEntity.Save();

            // related child entity
            childEntityType = new EntityType();
            childEntityType.Inherits.Add(UserResource.UserResource_Type);
            childEntityType.Save();

            childEntity = Entity.Create(new EntityRef(childEntityType));
            childEntity.SetField("core:name", "B"); // "B" so it will match the access rule
            childEntity.Save();

            // grant accesses
            // parent entity
            new AccessRuleFactory().AddAllowByQuery(
                userAccount.As <Subject>(),
                parentEntityType.As <SecurableEntity>(),
                splitParentEntityPermissions.Select(s => new EntityRef(s)),
                TestQueries.EntitiesWithNameA().ToReport());

            // child entity
            new AccessRuleFactory().AddAllowByQuery(
                userAccount.As <Subject>(),
                childEntityType.As <SecurableEntity>(),
                splitChildEntityPermissions.Select(s => new EntityRef(s)),
                TestQueries.EntitiesWithNameB().ToReport());

            // actions
            var dummyRequest = new ActionRequestExtended();
            Func <ActionRequestExtended, ActionMenuItem, ActionTargetInfo> dummyHandler = (a, i) => new ActionTargetInfo();
            var actions = new List <ActionMenuItemInfo>();

            foreach (string menuItemAlias in new[]
            {
                viewResourceActionAlias,
                editResourceActionAlias,
                addRelationshipActionAlias,
                removeRelationshipActionAlias,
                deleteResourceActionAlias,
            })
            {
                actions.Add(Entity.Get <ActionMenuItem>(menuItemAlias).ToInfo(dummyRequest, null, dummyHandler));
            }

            actions.Add(new ActionMenuItemInfo
            {
                EntityId        = childEntityType.Id,
                HtmlActionState = "createForm",
                IsNew           = true
            });

            // filter actions
            using (new SetUser(userAccount))
            {
                securityActionMenuItemFilter = new SecurityActionMenuItemFilter();
                securityActionMenuItemFilter.Filter(parentEntity.Id, new[] { childEntity.Id }, actions);
            }

            // checks
            if (splitParentEntityPermissions.Contains("core:read") && splitParentEntityPermissions.Contains("core:modify"))
            {
                Assert.That(actions, Has.Exactly(1).Property("Alias").EqualTo(addRelationshipActionAlias), "Missing add relationship resource action");
                Assert.That(actions, Has.Exactly(1).Property("Alias").EqualTo(removeRelationshipActionAlias), "Missing remove relationship resource action");

                // child create
                if (splitChildEntityPermissions.Contains("core:create"))
                {
                    Assert.That(actions, Has.Exactly(1).Property("HtmlActionState").EqualTo("createForm"), "Missing create resource action");
                }
                else
                {
                    Assert.That(actions, Has.None.Property("HtmlActionState").EqualTo("createForm"), "Create resource action should not be available");
                }

                // child read
                if (splitChildEntityPermissions.Contains("core:read"))
                {
                    Assert.That(actions, Has.Exactly(1).Property("Alias").EqualTo(viewResourceActionAlias), "Missing view resource action");
                }
                else
                {
                    Assert.That(actions, Has.None.Property("Alias").EqualTo(viewResourceActionAlias), "View resource action should not be available");
                }

                // child modify
                if (splitChildEntityPermissions.Contains("core:modify"))
                {
                    Assert.That(actions, Has.Exactly(1).Property("Alias").EqualTo(editResourceActionAlias), "Missing edit resource action");
                }
                else
                {
                    Assert.That(actions, Has.None.Property("Alias").EqualTo(editResourceActionAlias), "Edit resource action should not be available");
                }

                // child delete
                if (splitChildEntityPermissions.Contains("core:delete"))
                {
                    Assert.That(actions, Has.Exactly(1).Property("Alias").EqualTo(deleteResourceActionAlias), "Missing delete resource action");
                }
                else
                {
                    Assert.That(actions, Has.None.Property("Alias").EqualTo(deleteResourceActionAlias), "Delete resource action should not be available");
                }
            }
            else if (splitParentEntityPermissions.Contains("core:read") && !splitParentEntityPermissions.Contains("core:modify"))
            {
                Assert.That(actions, Has.None.Property("Alias").EqualTo(addRelationshipActionAlias), "Add relationship action should not be available");
                Assert.That(actions, Has.None.Property("Alias").EqualTo(removeRelationshipActionAlias), "Remove relationship action should not be available");

                // child create
                Assert.That(actions, Has.None.Property("HtmlActionState").EqualTo("createForm"), "Create resource action should not be available");

                // child read
                if (splitChildEntityPermissions.Contains("core:read"))
                {
                    Assert.That(actions, Has.Exactly(1).Property("Alias").EqualTo(viewResourceActionAlias), "Missing view resource action");
                }
                else
                {
                    Assert.That(actions, Has.None.Property("Alias").EqualTo(viewResourceActionAlias), "View resource action should not be available");
                }

                // child modify
                if (splitChildEntityPermissions.Contains("core:modify"))
                {
                    Assert.That(actions, Has.Exactly(1).Property("Alias").EqualTo(editResourceActionAlias), "Missing edit resource action");
                }
                else
                {
                    Assert.That(actions, Has.None.Property("Alias").EqualTo(editResourceActionAlias), "Edit resource action should not be available");
                }

                // child delete
                Assert.That(actions, Has.None.Property("Alias").EqualTo(deleteResourceActionAlias), "Delete resource action should not be available");
            }
        }
Ejemplo n.º 9
0
        public void Test_GetActions_Security_ReadModifyDelete(string permissionAliases)
        {
            ActionRequestExtended actionRequest;
            ActionResponse        response;
            Report                     peopleReport;
            UserAccount                userAccount;
            Person                     person;
            ActionMenuItem             viewActionMenuItem;
            ActionMenuItem             editActionMenuItem;
            ActionMenuItem             deleteActionMenuItem;
            IList <ActionMenuItemInfo> flattenedResults;

            string[] splitPermissionAliases;

            splitPermissionAliases = permissionAliases.Split(',');

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

            person = Entity.Create <Person>();
            person.Save();

            viewActionMenuItem = Entity.Get <ActionMenuItem>("console:viewResourceAction");
            Assert.That(viewActionMenuItem, Is.Not.Null, "No view menu item");
            editActionMenuItem = Entity.Get <ActionMenuItem>("console:editResourceAction");
            Assert.That(editActionMenuItem, Is.Not.Null, "No edit menu item");
            deleteActionMenuItem = Entity.Get <ActionMenuItem>("console:deleteResourceAction");
            Assert.That(deleteActionMenuItem, Is.Not.Null, "No delete menu item");

            if (!string.IsNullOrWhiteSpace(permissionAliases))
            {
                new AccessRuleFactory().AddAllowByQuery(
                    userAccount.As <Subject>(),
                    Entity.Get <SecurableEntity>(Entity.Get <EntityType>("core:person")),
                    splitPermissionAliases.Select(pa => new EntityRef(pa)),
                    TestQueries.Entities().ToReport());
            }

            peopleReport = Entity.GetByName <Report>("People").FirstOrDefault();
            Assert.That(peopleReport, Is.Not.Null, "No People report");

            actionRequest = new ActionRequestExtended
            {
                SelectedResourceIds    = new[] { person.Id },
                LastSelectedResourceId = person.Id,
                CellSelectedResourceId = -1,
                ReportId             = peopleReport.Id,
                HostResourceIds      = new long[0],
                HostTypeIds          = new List <long>(),
                AdditionalData       = new Dictionary <string, object>(),
                ActionDisplayContext = ActionContext.ActionsMenu
            };

            using (new SetUser(userAccount))
            {
                response = new ActionService().GetActions(actionRequest);
            }

            flattenedResults = response.Actions.SelectMany(Flatten).ToList();

            Assert.That(flattenedResults,
                        Has.Exactly(splitPermissionAliases.Contains("read") ? 1 : 0).Property("Id").EqualTo(viewActionMenuItem.Id),
                        "View menu incorrect");
            Assert.That(flattenedResults,
                        Has.Exactly(splitPermissionAliases.Contains("read") && splitPermissionAliases.Contains("modify") ? 1 : 0).Property("Id").EqualTo(editActionMenuItem.Id),
                        "Edit menu incorrect");
            Assert.That(flattenedResults,
                        Has.Exactly(splitPermissionAliases.Contains("read") && splitPermissionAliases.Contains("delete") ? 1 : 0).Property("Id").EqualTo(deleteActionMenuItem.Id),
                        "Delete menu incorrect");
        }
Ejemplo n.º 10
0
        public void Test_GetActions_Security_MultipleSelection(string entity1Name, string entity2Name, bool expectedResult)
        {
            ActionRequestExtended actionRequest;
            ActionResponse        response;
            Report                     report;
            UserAccount                userAccount;
            ActionMenuItem             deleteActionMenuItem;
            IList <ActionMenuItemInfo> flattenedResults;
            EntityType                 entityType;
            IEntity                    entity1;
            IEntity                    entity2;

            entityType = Entity.Create <EntityType>();
            entityType.Inherits.Add(UserResource.UserResource_Type);
            entityType.Save();

            entity1 = Entity.Create(entityType);
            entity1.SetField("core:name", entity1Name);
            entity1.Save();

            entity2 = Entity.Create(entityType);
            entity2.SetField("core:name", entity2Name);
            entity2.Save();

            userAccount      = Entity.Create <UserAccount>();
            userAccount.Name = "Action service test " + Guid.NewGuid( ).ToString( );
            userAccount.Save();

            new AccessRuleFactory( ).AddAllowReadQuery(
                userAccount.As <Subject>( ),
                Entity.Get <SecurableEntity>(Entity.Get <EntityType>("core:report")),
                TestQueries.Entities(new EntityRef("core:report")).ToReport( ));

            deleteActionMenuItem = Entity.Get <ActionMenuItem>("console:deleteResourceAction");
            Assert.That(deleteActionMenuItem, Is.Not.Null, "No delete menu item");

            new AccessRuleFactory().AddAllowByQuery(
                userAccount.As <Subject>(),
                entityType.As <SecurableEntity>(),
                new [] { Permissions.Read, Permissions.Delete },
                TestQueries.EntitiesWithNameA(entityType).ToReport());

            report = TestQueries.EntitiesWithNameA(entityType).ToReport();
            report.Save();

            actionRequest = new ActionRequestExtended
            {
                SelectedResourceIds    = new[] { entity1.Id, entity2.Id },
                LastSelectedResourceId = entity1.Id,
                CellSelectedResourceId = -1,
                ReportId             = report.Id,
                HostResourceIds      = new long[0],
                HostTypeIds          = new List <long>(),
                AdditionalData       = new Dictionary <string, object>(),
                ActionDisplayContext = ActionContext.ContextMenu
            };

            using (new SetUser(userAccount))
            {
                response = new ActionService().GetActions(actionRequest);
            }

            flattenedResults = response.Actions.SelectMany(Flatten).ToList();

            Assert.That(flattenedResults,
                        Has.Exactly(expectedResult ? 1 : 0).Property("Id").EqualTo(deleteActionMenuItem.Id),
                        "Delete menu incorrect");
        }
Ejemplo n.º 11
0
        [TestCase("API Endpoints", "API Resource Endpoint,API Spreadsheet Endpoint", true)] //#27489
        public void Test_GetActions_Security_Create(string reportName, string typeNames, bool admin)
        {
            ActionRequestExtended actionRequest;
            ActionResponse        response;
            Report      report;
            UserAccount userAccount;
            IList <ActionMenuItemInfo> flattenedResults;

            string[]        splitTypeNames;
            SecurableEntity securableEntity;

            splitTypeNames = typeNames.Split(',');

            userAccount      = Entity.Create <UserAccount>();
            userAccount.Name = "Action service test " + Guid.NewGuid( ).ToString( );
            userAccount.Save();

            new AccessRuleFactory( ).AddAllowReadQuery(
                userAccount.As <Subject>( ),
                Entity.Get <SecurableEntity>(Entity.Get <EntityType>("core:report")),
                TestQueries.Entities(new EntityRef("core:report")).ToReport( ));

            if (!string.IsNullOrWhiteSpace(typeNames))
            {
                foreach (string typeName in splitTypeNames)
                {
                    securableEntity = Entity.GetByName <SecurableEntity>(typeName).FirstOrDefault();
                    Assert.That(securableEntity, Is.Not.Null,
                                string.Format("{0} is not a type", typeName));

                    new AccessRuleFactory().AddAllowCreate(
                        userAccount.As <Subject>(),
                        securableEntity);
                }
            }

            report = Entity.GetByName <Report>(reportName).FirstOrDefault();
            Assert.That(report, Is.Not.Null, string.Format("{0} is not a report", reportName));

            actionRequest = new ActionRequestExtended
            {
                SelectedResourceIds    = new long[0],
                LastSelectedResourceId = 0,
                CellSelectedResourceId = -1,
                ReportId             = report.Id,
                HostResourceIds      = new long[0],
                HostTypeIds          = new List <long>(),
                AdditionalData       = new Dictionary <string, object>(),
                ActionDisplayContext = ActionContext.ActionsMenu
            };

            if (admin)
            {
                response = new ActionService( ).GetActions(actionRequest);
            }
            else
            {
                using (new SetUser(userAccount))
                {
                    response = new ActionService( ).GetActions(actionRequest);
                }
            }

            flattenedResults = response.Actions.SelectMany(Flatten).ToList();

            if (!string.IsNullOrWhiteSpace(typeNames))
            {
                foreach (string typeName in splitTypeNames)
                {
                    string expectState = typeName == "API Resource Endpoint" ? "resourceEndpointNew" : ActionService.CreateMenuItemActionState;

                    Assert.That(flattenedResults,
                                Has.Exactly(1).Property("HtmlActionState").EqualTo(expectState)
                                .And.Property("Name").EqualTo(typeName));
                }
            }
            else
            {
                Assert.That(flattenedResults,
                            Has.Exactly(0).Property("HtmlActionState").EqualTo(ActionService.CreateMenuItemActionState));
            }
        }
Ejemplo n.º 12
0
        public void GetActionsWithExpressionItems()
        {
            // arrange
            var scientistType = Entity.GetByName <EntityType>("Scientist").First();
            var bornField     = scientistType.GetAllFields().FirstOrDefault(f => f.Name == "Born");

            var scientist = Entity.Create(new EntityRef(scientistType));

            scientist.SetField("core:name", "Alex Engelhardt");
            scientist.SetField(new EntityRef(bornField), new DateTime(1977, 10, 24));
            scientist.Save();

            var alanTuring = Entity.GetByName <Resource>("Alan Turing").First();

            alanTuring.Should().NotBeNull();
            alanTuring.Id.Should().BeGreaterThan(0);

            var report = Entity.Create <ReadiNow.Model.Report>();
            var sb     = new ConsoleBehavior();
            var am     = new ActionMenu();

            var a = new ActionMenuItem
            {
                Name                     = "Test '%Resource%' Action",
                EmptySelectName          = "Test Expression Action",
                IsActionItem             = true,
                IsActionButton           = true,
                IsContextMenu            = true,
                AppliesToSelection       = true,
                ActionRequiresExpression = new ActionExpression
                {
                    ActionExpressionString   = "datediff(year, Born, [Alan].[Born]) = 0",
                    ActionExpressionEntities = new EntityCollection <NamedReference>
                    {
                        new NamedReference
                        {
                            Name             = "Alan",
                            ReferencedEntity = alanTuring
                        }
                    }
                }
            };

            am.MenuItems.Add(a);
            am.IncludeActionsAsButtons.Add(a);
            sb.BehaviorActionMenu    = am;
            report.SelectionBehavior = sb;
            report.Save();

            var svc = new ActionService();

            svc.FlushCaches();

            var request = new ActionRequestExtended
            {
                LastSelectedResourceId = scientist.Id,
                SelectedResourceIds    = new[] { scientist.Id },
                EntityTypeId           = scientistType.Id,
                ReportId        = report.Id,
                ReportBaseType  = scientistType,
                HostResourceIds = new long[0]
            };

            // act
            var result = svc.GetActions(request);

            // assert
            result.Should().NotBeNull();
            result.Actions.Should().NotBeNull();
            result.Actions.Count.Should().BeGreaterThan(0);

            var action = result.Actions.FirstOrDefault(i => i.Name == "Test 'Alex Engelhardt' Action");

            action.Should().NotBeNull();
            action.IsEnabled.Should().BeFalse();
            action.EntityId.Should().Be(scientist.Id);

            request.LastSelectedResourceId = alanTuring.Id;
            request.SelectedResourceIds    = new[] { alanTuring.Id };

            var result2 = svc.GetActions(request);

            result2.Should().NotBeNull();
            result2.Actions.Should().NotBeNull();
            result2.Actions.Count.Should().BeGreaterThan(0);

            var action2 = result2.Actions.FirstOrDefault(i => i.Name == "Test 'Alan Turing' Action");

            action2.Should().NotBeNull();
            action2.IsEnabled.Should().BeTrue();
            action2.EntityId.Should().Be(alanTuring.Id);
        }
Ejemplo n.º 13
0
        public void GetActionsSuppressAllNewItems()
        {
            // arrange
            var testType1 = new EntityType {
                Name = "Test Type 1"
            };

            testType1.Inherits.Add(Entity.Get <EntityType>("core:definition"));
            testType1.Save();
            var testType2 = new EntityType {
                Name = "Test Type 2"
            };

            testType2.Inherits.Add(testType1);
            testType2.Save();

            var report = Entity.Create <ReadiNow.Model.Report>();

            report.ReportUsesDefinition = testType1;
            report.Save();

            var svc = new ActionService();

            svc.FlushCaches();

            var request = new ActionRequestExtended
            {
                ReportId             = report.Id,
                ReportBaseType       = report.ReportUsesDefinition,
                HostResourceIds      = new long[0],
                ActionDisplayContext = ActionContext.ActionsMenu
            };

            // act
            var result = svc.GetActions(request);

            // assert
            result.Should().NotBeNull();
            result.Actions.Should().NotBeNull();
            result.Actions.Count.Should().BeGreaterThan(0);

            var newMenu = result.Actions.FirstOrDefault(a => a.Name == "New");

            newMenu.Should().NotBeNull();
            newMenu.Children.Count.Should().Be(2);

            var t1 = newMenu.Children.FirstOrDefault(a => a.Name == "Test Type 1");

            t1.Should().NotBeNull();
            t1.IsNew.Should().BeTrue();
            t1.HtmlActionMethod.Should().Be("navigate");
            t1.HtmlActionState.Should().Be("createForm");
            t1.EntityId.Should().Be(testType1.Id);

            var t2 = newMenu.Children.FirstOrDefault(a => a.Name == "Test Type 2");

            t2.Should().NotBeNull();
            t2.IsNew.Should().BeTrue();
            t2.HtmlActionMethod.Should().Be("navigate");
            t2.HtmlActionState.Should().Be("createForm");
            t2.EntityId.Should().Be(testType2.Id);

            // suppress the news
            var rcb = new ConsoleBehavior();
            var am  = new ActionMenu {
                SuppressNewActions = true
            };

            rcb.BehaviorActionMenu         = am;
            report.ResourceConsoleBehavior = rcb;
            report.Save();

            svc.FlushCaches();

            var result2 = svc.GetActions(request);

            result2.Should().NotBeNull();
            result2.Actions.Should().NotBeNull();
            result2.Actions.Count.Should().BeGreaterThan(0);
            result2.Actions.Count(a => a.Name == "New").Should().Be(0);
        }
Ejemplo n.º 14
0
        public void GetFormActionsForForm()
        {
            var personType = Entity.Get <Definition>("core:person");
            var personForm = Entity.Get <CustomEditForm>(personType.DefaultEditForm.Id, true);

            // fetch action for the person type
            var request = new ActionRequestExtended
            {
                EntityTypeId         = personType.Id,
                FormId               = personType.DefaultEditForm.Id,
                ActionDisplayContext = ActionContext.All
            };

            var actionSvc = new ActionService();

            actionSvc.FlushCaches();

            var result = actionSvc.GetFormActionsMenuState(request);

            result.Should().NotBeNull();
            result.Actions.Should().NotBeNull().And.NotBeEmpty();
            result.Actions.Count.Should().Be(2);
            result.Actions.Count(a => a.Name == "Assign Data to App").Should().Be(1);
            result.Actions.Count(a => a.Name == "Person Name Update").Should().Be(1);

            // create new action item and assign it to the form
            // form action
            var actionInfo = result.Actions.Find(a => a.Name == "Person Name Update");
            var wf         = Entity.Get <Workflow>(actionInfo.EntityId);

            // create workflow action item
            var wfActionMenuItem = new WorkflowActionMenuItem
            {
                Name                     = actionInfo.Name,
                MenuIconUrl              = actionInfo.Icon,
                MenuOrder                = actionInfo.Order,
                IsActionButton           = actionInfo.IsButton,
                IsMenuSeparator          = actionInfo.IsSeparator,
                IsContextMenu            = actionInfo.IsContextMenu,
                IsActionItem             = actionInfo.IsMenu,
                IsSystem                 = actionInfo.IsSystem,
                AppliesToSelection       = true,
                AppliesToMultiSelection  = false,
                HtmlActionMethod         = actionInfo.HtmlActionMethod,
                HtmlActionState          = actionInfo.HtmlActionState,
                ActionMenuItemToWorkflow = wf
            };

            var cb = new ConsoleBehavior
            {
                Name = $"DeleteMe_PersonForm_rcb {DateTime.Now}",
                BehaviorActionMenu = new ActionMenu
                {
                    Name = $"DeleteMe_PersonForm_rcb_menu {DateTime.Now}",
                    IncludeActionsAsButtons = new EntityCollection <ActionMenuItem>()
                    {
                        (ActionMenuItem)wfActionMenuItem
                    },
                    MenuItems = new EntityCollection <ActionMenuItem>()
                    {
                        (ActionMenuItem)wfActionMenuItem
                    }
                }
            };

            personForm.ResourceConsoleBehavior = cb;
            personForm.Save();

            var formActionQuery = @"{ k:resourceConsoleBehavior }
                                        .k:behaviorActionMenu.{
                                            { k:menuItems, k:suppressedActions, k:includeActionsAsButtons }.{
                                                {   name, 
                                                    description,
                                                    k:menuIconUrl,
                                                    htmlActionState,
                                                    htmlActionMethod,
                                                    k:isActionButton,
                                                    k:appliesToSelection,
                                                    k:isMenuSeparator, 
                                                    k:menuOrder,
                                                    { isOfType }.{ alias,name },
                                                    { k:actionMenuItemToWorkflow }.{ name },
                                                    { k:actionMenuItemToReportTemplate }.{ name }
                                                }
                                            },
                                            { k:includeTypesForNewButtons, k:suppressedTypesForNewMenu }.id
                                    }";

            // fetch form actions and check there is only one action button assigned to the form
            var entitySvc = new EntityInfoService();

            EntityMemberRequest req = EntityRequestHelper.BuildRequest(formActionQuery);
            var result2             = entitySvc.GetEntityData(personForm.Id, req);

            result2.Should().NotBeNull();

            var rcb = result2.Relationships.Find(a => a.RelationshipTypeId.Alias == "resourceConsoleBehavior");

            rcb.Should().NotBeNull();

            var actionMenu = rcb.Entities.First().Relationships.Find(a => a.RelationshipTypeId.Alias == "behaviorActionMenu");

            actionMenu.Should().NotBeNull();

            var actionButtons = actionMenu.Entities.First().Relationships.Find(a => a.RelationshipTypeId.Alias == "includeActionsAsButtons");

            actionButtons.Should().NotBeNull();

            var nameValue = actionButtons.Entities.First().Fields.Find(f => f.FieldId.Alias == "name").Value.Value;

            nameValue.Should().Be("Person Name Update");


            // delete console behavior
            Entity.Delete(cb.Id);
        }
Ejemplo n.º 15
0
        public void GetActionsWithReportOnTabControlInForm()
        {
            // arrange
            var resource = Entity.Create <Resource>();
            var report   = Entity.Create <ReadiNow.Model.Report>();

            var testType1 = new EntityType {
                Name = "Test Type 1"
            };
            var testType2 = new EntityType {
                Name = "Test Type 2"
            };
            var testType1Form = new CustomEditForm {
                Name = "testType1Form", TypeToEditWithForm = testType1
            };
            var testType2Form = new CustomEditForm {
                Name = "testType2Form", TypeToEditWithForm = testType2
            };

            var tabControl = new TabRelationshipRenderControl {
                ResourceViewerConsoleForm = testType1Form
            };                                                                                                  // assign custom form to tab host control

            report.ResourceViewerConsoleForm     = testType2Form;                                               // assign custom form to the report
            tabControl.RelationshipDisplayReport = report;

            report.Save( );
            resource.Save( );
            testType1.Save( );
            testType2.Save( );
            testType1Form.Save( );
            testType2Form.Save( );
            tabControl.Save( );

            var svc = new ActionService( );

            svc.FlushCaches();

            var request = new ActionRequestExtended
            {
                LastSelectedResourceId = resource.Id,
                SelectedResourceIds    = new[] { resource.Id },
                HostResourceIds        = new[] { tabControl.Id },
                ReportId             = report.Id,
                ActionDisplayContext = ActionContext.QuickMenu
            };

            // act
            var result = svc.GetActions(request);

            // assert
            result.Should().NotBeNull();

            request.SelectedResources.Should().NotBeNull().And.NotBeEmpty();
            request.SelectedResources.Count().Should().Be(1);
            request.SelectedResources.Should().Contain(r => r.Id == resource.Id);
            request.LastSelectedResource.Should().NotBeNull();
            request.SelectedResourceTypes.Should().NotBeNull().And.NotBeEmpty();
            foreach (EntityType t in resource.EntityTypes)
            {
                var type = request.SelectedResourceTypes.FirstOrDefault(a => a.Id == t.Id);
                type.Should().NotBeNull();
                if (type == null)
                {
                    continue;
                }
                type.Alias.Should().Be(t.Alias);
                type.TenantId.Should().Be(t.TenantId);
            }


            result.Actions.Should().NotBeNull();
            RemovePowerTools(result);

            result.Actions.Count.Should().Be(8);

            result.Actions[0].Name.Should().Be("View 'Resource'"); // View
            result.Actions[0].Order.Should().Be(10);
            result.Actions[0].AdditionalData.Should().NotBeNull().And.NotBeEmpty();
            result.Actions[0].AdditionalData["CustomForm"].Should().Be(tabControl.ResourceViewerConsoleForm.Id);    // make sure the form is the one assigned to tab control, not the form assigned to report
            result.Actions[0].AdditionalData["CustomFormEditsTypeId"].Should().Be(testType1.Id);

            result.Actions[1].Name.Should().Be("Edit 'Resource'"); // Edit
            result.Actions[1].Order.Should().Be(20);
            result.Actions[1].AdditionalData.Should().NotBeNull().And.NotBeEmpty();
            result.Actions[1].AdditionalData["CustomForm"].Should().Be(tabControl.ResourceViewerConsoleForm.Id);
            result.Actions[1].AdditionalData["CustomFormEditsTypeId"].Should().Be(testType1.Id);

            result.Actions[2].Name.Should().Be("Link to Existing"); // Link
            result.Actions[2].Order.Should().Be(25);
            result.Actions[2].AdditionalData.Should().NotBeNull().And.NotBeEmpty();
            result.Actions[2].AdditionalData["CustomForm"].Should().Be(tabControl.ResourceViewerConsoleForm.Id);
            result.Actions[2].AdditionalData["CustomFormEditsTypeId"].Should().Be(testType1.Id);

            result.Actions[3].Name.Should().Be("Remove Link"); // Remove Link
            result.Actions[3].Order.Should().Be(26);
            result.Actions[3].AdditionalData.Should().NotBeNull().And.NotBeEmpty();
            result.Actions[3].AdditionalData["CustomForm"].Should().Be(tabControl.ResourceViewerConsoleForm.Id);
            result.Actions[3].AdditionalData["CustomFormEditsTypeId"].Should().Be(testType1.Id);

            result.Actions[4].Name.Should().Be("Delete 'Resource'"); // Delete
            result.Actions[4].Order.Should().Be(30);
            result.Actions[4].AdditionalData.Should().NotBeNull().And.NotBeEmpty();
            result.Actions[4].AdditionalData["CustomForm"].Should().Be(tabControl.ResourceViewerConsoleForm.Id);
            result.Actions[4].AdditionalData["CustomFormEditsTypeId"].Should().Be(testType1.Id);

            result.Actions[5].Name.Should().Be("Excel"); // Excel
            result.Actions[5].Order.Should().Be(500);
            result.Actions[5].AdditionalData.Should().NotBeNull().And.NotBeEmpty();
            result.Actions[5].AdditionalData["CustomForm"].Should().Be(tabControl.ResourceViewerConsoleForm.Id);
            result.Actions[5].AdditionalData["CustomFormEditsTypeId"].Should().Be(testType1.Id);

            result.Actions[6].Name.Should().Be("CSV"); // CSV
            result.Actions[6].Order.Should().Be(501);
            result.Actions[6].AdditionalData.Should().NotBeNull().And.NotBeEmpty();
            result.Actions[6].AdditionalData["CustomForm"].Should().Be(tabControl.ResourceViewerConsoleForm.Id);
            result.Actions[6].AdditionalData["CustomFormEditsTypeId"].Should().Be(testType1.Id);

            result.Actions[7].Name.Should().Be("Word"); // Word
            result.Actions[7].Order.Should().Be(502);
            result.Actions[7].AdditionalData.Should().NotBeNull().And.NotBeEmpty();
            result.Actions[7].AdditionalData["CustomForm"].Should().Be(tabControl.ResourceViewerConsoleForm.Id);
            result.Actions[7].AdditionalData["CustomFormEditsTypeId"].Should().Be(testType1.Id);
        }
Ejemplo n.º 16
0
        public void GetActionsWithReport()
        {
            // arrange
            var resource = Entity.Create <Resource>();

            resource.Save( );

            var report = Entity.Create <ReadiNow.Model.Report>( );

            report.ResourceViewerConsoleForm = new CustomEditForm();
            var typeToEditWithForm = new EntityType();

            report.ResourceViewerConsoleForm.TypeToEditWithForm = typeToEditWithForm;
            report.Save( );

            var svc = new ActionService( );

            svc.FlushCaches();


            var request = new ActionRequestExtended
            {
                LastSelectedResourceId = resource.Id,
                SelectedResourceIds    = new[] { resource.Id },
                ReportId = report.Id
            };

            // act
            var result = svc.GetActions(request);

            // assert
            result.Should().NotBeNull();

            request.SelectedResources.Should().NotBeNull().And.NotBeEmpty();
            request.SelectedResources.Count().Should().Be(1);
            request.SelectedResources.Should().Contain(r => r.Id == resource.Id);
            request.LastSelectedResource.Should().NotBeNull();
            request.SelectedResourceTypes.Should().NotBeNull().And.NotBeEmpty();
            foreach (EntityType t in resource.EntityTypes)
            {
                var type = request.SelectedResourceTypes.FirstOrDefault(a => a.Id == t.Id);
                type.Should().NotBeNull();
                if (type == null)
                {
                    continue;
                }
                type.Alias.Should().Be(t.Alias);
                type.TenantId.Should().Be(t.TenantId);
            }


            result.Actions.Should().NotBeNull();
            RemovePowerTools(result);

            result.Actions.Count.Should().Be(3);
            result.Actions[0].Name.Should().Be("View 'Resource'"); // View
            result.Actions[0].Order.Should().Be(10);
            result.Actions[0].AdditionalData.Should().NotBeNull().And.NotBeEmpty();
            result.Actions[0].AdditionalData["CustomForm"].Should().Be(report.ResourceViewerConsoleForm.Id);
            result.Actions[0].AdditionalData["CustomFormEditsTypeId"].Should().Be(typeToEditWithForm.Id);
            result.Actions[1].Name.Should().Be("Edit 'Resource'"); // Edit
            result.Actions[1].Order.Should().Be(20);
            result.Actions[1].AdditionalData.Should().NotBeNull().And.NotBeEmpty();
            result.Actions[1].AdditionalData["CustomForm"].Should().Be(report.ResourceViewerConsoleForm.Id);
            result.Actions[1].AdditionalData["CustomFormEditsTypeId"].Should().Be(typeToEditWithForm.Id);
            result.Actions[2].Name.Should().Be("Delete 'Resource'"); // Delete
            result.Actions[2].Order.Should().Be(30);
            result.Actions[2].AdditionalData.Should().NotBeNull().And.NotBeEmpty();
            result.Actions[2].AdditionalData["CustomForm"].Should().Be(report.ResourceViewerConsoleForm.Id);
            result.Actions[2].AdditionalData["CustomFormEditsTypeId"].Should().Be(typeToEditWithForm.Id);
        }