From db47297e660414ae9dcbc56a09784fae2755f0b9 Mon Sep 17 00:00:00 2001 From: Julian Hyde Date: Tue, 6 Jul 2010 23:50:04 -0800 Subject: [PATCH] MONDRIAN: Test cases for user-defined roles in parent-child hierarchies. [git-p4: depot-paths = "//open/mondrian-release/3.2/": change = 13739] --- .../main/mondrian/test/AccessControlTest.java | 96 +++++++++++++++++++ .../test/ParentChildHierarchyTest.java | 36 +++++++ 2 files changed, 132 insertions(+) diff --git a/testsrc/main/mondrian/test/AccessControlTest.java b/testsrc/main/mondrian/test/AccessControlTest.java index 248573a63f..8043000d7c 100644 --- a/testsrc/main/mondrian/test/AccessControlTest.java +++ b/testsrc/main/mondrian/test/AccessControlTest.java @@ -1282,6 +1282,60 @@ public void testPartialRollupParentChildHierarchy() { checkQuery(testContext, mdx2); } + public void testParentChildUserDefinedRole() + { + TestContext testContext = getTestContext().withCube("HR"); + + final Connection connection = testContext.getConnection(); + final Role savedRole = connection.getRole(); + try { + // Run queries as top-level employee. + connection.setRole( + new PeopleRole( + savedRole, connection.getSchema(), "Sheri Nowmer")); + testContext.assertExprReturns( + "[Employees].Members.Count", + "1,156"); + + // Level 2 employee + connection.setRole( + new PeopleRole( + savedRole, connection.getSchema(), "Derrick Whelply")); + testContext.assertExprReturns( + "[Employees].Members.Count", + "605"); + testContext.assertAxisReturns( + "Head([Employees].Members, 4)," + + "Tail([Employees].Members, 2)", + "[Employees].[All Employees]\n" + + "[Employees].[Sheri Nowmer]\n" + + "[Employees].[Sheri Nowmer].[Derrick Whelply]\n" + + "[Employees].[Sheri Nowmer].[Derrick Whelply].[Beverly Baker]\n" + + "[Employees].[Sheri Nowmer].[Derrick Whelply].[Laurie Borges].[Ed Young].[Gregory Whiting].[Merrill Steel]\n" + + "[Employees].[Sheri Nowmer].[Derrick Whelply].[Laurie Borges].[Ed Young].[Gregory Whiting].[Melissa Marple]"); + + // Leaf employee + connection.setRole( + new PeopleRole( + savedRole, connection.getSchema(), "Ann Weyerhaeuser")); + testContext.assertExprReturns( + "[Employees].Members.Count", + "7"); + testContext.assertAxisReturns( + "[Employees].Members", + "[Employees].[All Employees]\n" + + "[Employees].[Sheri Nowmer]\n" + + "[Employees].[Sheri Nowmer].[Derrick Whelply]\n" + + "[Employees].[Sheri Nowmer].[Derrick Whelply].[Laurie Borges]\n" + + "[Employees].[Sheri Nowmer].[Derrick Whelply].[Laurie Borges].[Cody Goldey]\n" + + "[Employees].[Sheri Nowmer].[Derrick Whelply].[Laurie Borges].[Cody Goldey].[Shanay Steelman]\n" + + "[Employees].[Sheri Nowmer].[Derrick Whelply].[Laurie Borges].[Cody Goldey].[Shanay Steelman].[Ann Weyerhaeuser]"); + + } finally { + connection.setRole(savedRole); + } + } + /** * Test case for * BISERVER-1574, @@ -1957,6 +2011,48 @@ private void checkCalcMemberLevel(TestContext testContext) { assertEquals("Foo", member2.getName()); assertEquals("Store City", member2.getLevel().getName()); } + + // ~ Inner classes ========================================================= + + public static class PeopleRole extends DelegatingRole { + private final String repName; + + public PeopleRole(Role role, Schema schema, String repName) { + super(((RoleImpl)role).makeMutableClone()); + this.repName = repName; + defineGrantsForUser(schema); + } + + private void defineGrantsForUser(Schema schema) { + RoleImpl role = (RoleImpl)this.role; + role.grant(schema, Access.NONE); + + Cube cube = schema.lookupCube("HR", true); + role.grant(cube, Access.ALL); + + Hierarchy hierarchy = cube.lookupHierarchy( + new Id.Segment("Employees", Id.Quoting.QUOTED), false); + + Level[] levels = hierarchy.getLevels(); + Level topLevel = levels[1]; + + role.grant(hierarchy, Access.CUSTOM, null, null, RollupPolicy.FULL); + role.grant(hierarchy.getAllMember(), Access.NONE); + + boolean foundMember = false; + + List members = + schema.getSchemaReader().getLevelMembers(topLevel, true); + + for (Member member : members) { + if (member.getUniqueName().contains("[" + repName + "]")){ + foundMember = true; + role.grant(member, Access.ALL); + } + } + assertTrue(foundMember); + } + } } // End AccessControlTest.java diff --git a/testsrc/main/mondrian/test/ParentChildHierarchyTest.java b/testsrc/main/mondrian/test/ParentChildHierarchyTest.java index b3056905a0..60065bde04 100644 --- a/testsrc/main/mondrian/test/ParentChildHierarchyTest.java +++ b/testsrc/main/mondrian/test/ParentChildHierarchyTest.java @@ -15,6 +15,8 @@ import mondrian.olap.*; import mondrian.util.Bug; +import java.util.List; + /** * ParentChildHierarchyTest tests parent-child hierarchies. * @@ -1222,6 +1224,40 @@ public void testClosureVsNoClosure() { testClosureContext.assertQueryReturns(mdx, expected); testNoClosureContext.assertQueryReturns(mdx, expected); } + + public void testSchemaReaderLevelMembers() + { + final SchemaReader schemaReader = + TestContext.instance().getConnection().getSchemaReader(); + int found = 0; + for (Cube cube : schemaReader.getCubes()) { + if (!cube.getName().equals("HR")) { + continue; + } + for (Dimension dimension : schemaReader.getCubeDimensions(cube)) { + for (Hierarchy hierarchy + : schemaReader.getDimensionHierarchies(dimension)) + { + if (!hierarchy.getName().equals("Employees")) { + continue; + } + ++found; + final Level level = hierarchy.getLevels()[1]; + assertEquals("Employee Id", level.getName()); + final List memberList = + schemaReader.getLevelMembers(level, true); + assertEquals(1155, memberList.size()); + assertEquals( + "[Employees].[Sheri Nowmer]", + memberList.get(0).getUniqueName()); + assertEquals( + "[Employees].[Sheri Nowmer].[Derrick Whelply]", + memberList.get(1).getUniqueName()); + } + } + } + assertEquals(1, found); + } } // End ParentChildHierarchyTest.java