View Javadoc
1   /*
2    *    Copyright 2009-2022 the original author or authors.
3    *
4    *    Licensed under the Apache License, Version 2.0 (the "License");
5    *    you may not use this file except in compliance with the License.
6    *    You may obtain a copy of the License at
7    *
8    *       https://www.apache.org/licenses/LICENSE-2.0
9    *
10   *    Unless required by applicable law or agreed to in writing, software
11   *    distributed under the License is distributed on an "AS IS" BASIS,
12   *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *    See the License for the specific language governing permissions and
14   *    limitations under the License.
15   */
16  package org.apache.ibatis.submitted.permissions;
17  
18  import java.io.Reader;
19  import java.util.List;
20  
21  import org.apache.ibatis.BaseDataTest;
22  import org.apache.ibatis.io.Resources;
23  import org.apache.ibatis.session.SqlSession;
24  import org.apache.ibatis.session.SqlSessionFactory;
25  import org.apache.ibatis.session.SqlSessionFactoryBuilder;
26  import org.junit.jupiter.api.Assertions;
27  import org.junit.jupiter.api.BeforeAll;
28  import org.junit.jupiter.api.Test;
29  
30  class PermissionsTest {
31  
32    private static SqlSessionFactory sqlSessionFactory;
33  
34    @BeforeAll
35    static void setUp() throws Exception {
36      // create a SqlSessionFactory
37      try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/permissions/mybatis-config.xml")) {
38        sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
39      }
40  
41      // populate in-memory database
42      BaseDataTest.runScript(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(),
43          "org/apache/ibatis/submitted/permissions/CreateDB.sql");
44    }
45  
46    @Test // see issue #168
47    void checkNestedResultMapLoop() {
48      try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
49        final PermissionsMapper mapper = sqlSession.getMapper(PermissionsMapper.class);
50  
51        final List<Resource> resources = mapper.getResources();
52        Assertions.assertEquals(2, resources.size());
53  
54        final Resource firstResource = resources.get(0);
55        final List<Principal> principalPermissions = firstResource.getPrincipals();
56        Assertions.assertEquals(1, principalPermissions.size());
57  
58        final Principal firstPrincipal = principalPermissions.get(0);
59        final List<Permission> permissions = firstPrincipal.getPermissions();
60        Assertions.assertEquals(2, permissions.size());
61  
62        final Permission firstPermission = firstPrincipal.getPermissions().get(0);
63        Assertions.assertSame(firstResource, firstPermission.getResource());
64        final Permission secondPermission = firstPrincipal.getPermissions().get(1);
65        Assertions.assertSame(firstResource, secondPermission.getResource());
66      }
67    }
68  
69    @Test
70    void checkNestedSelectLoop() {
71      try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
72        final PermissionsMapper mapper = sqlSession.getMapper(PermissionsMapper.class);
73  
74        final List<Resource> resources = mapper.getResource("read");
75        Assertions.assertEquals(1, resources.size());
76  
77        final Resource firstResource = resources.get(0);
78        final List<Principal> principalPermissions = firstResource.getPrincipals();
79        Assertions.assertEquals(1, principalPermissions.size());
80  
81        final Principal firstPrincipal = principalPermissions.get(0);
82        final List<Permission> permissions = firstPrincipal.getPermissions();
83        Assertions.assertEquals(4, permissions.size());
84  
85        boolean readFound = false;
86        for (Permission permission : permissions) {
87          if ("read".equals(permission.getPermission())) {
88            Assertions.assertSame(firstResource, permission.getResource());
89            readFound = true;
90          }
91        }
92  
93        if (!readFound) {
94          Assertions.fail();
95        }
96      }
97    }
98  
99  }