PageRenderTime 64ms CodeModel.GetById 38ms RepoModel.GetById 1ms app.codeStats 0ms

/server/sonar-db-dao/src/test/java/org/sonar/db/DbSessionImplTest.java

https://github.com/SonarSource/sonarqube
Java | 266 lines | 222 code | 24 blank | 20 comment | 2 complexity | aac688988924608e66a2512cc06ec72b MD5 | raw file
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2022 SonarSource SA
  4. * mailto:info AT sonarsource DOT com
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 3 of the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public License
  17. * along with this program; if not, write to the Free Software Foundation,
  18. * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19. */
  20. package org.sonar.db;
  21. import java.util.ArrayList;
  22. import java.util.HashMap;
  23. import java.util.List;
  24. import java.util.Map;
  25. import java.util.Random;
  26. import java.util.function.Consumer;
  27. import java.util.function.Function;
  28. import org.apache.ibatis.cursor.Cursor;
  29. import org.apache.ibatis.executor.BatchResult;
  30. import org.apache.ibatis.session.Configuration;
  31. import org.apache.ibatis.session.ResultHandler;
  32. import org.apache.ibatis.session.RowBounds;
  33. import org.apache.ibatis.session.SqlSession;
  34. import org.junit.Test;
  35. import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic;
  36. import static org.assertj.core.api.Assertions.assertThat;
  37. import static org.mockito.Mockito.mock;
  38. import static org.mockito.Mockito.reset;
  39. import static org.mockito.Mockito.verify;
  40. import static org.mockito.Mockito.verifyNoMoreInteractions;
  41. import static org.mockito.Mockito.when;
  42. public class DbSessionImplTest {
  43. private SqlSession sqlSessionMock = mock(SqlSession.class);
  44. private DbSessionImpl underTest = new DbSessionImpl(sqlSessionMock);
  45. @Test
  46. public void all_methods_to_wrapped_SqlSession() {
  47. Random random = new Random();
  48. boolean randomBoolean = random.nextBoolean();
  49. int randomInt = random.nextInt(200);
  50. String randomStatement = randomAlphabetic(10);
  51. Object randomParameter = new Object();
  52. Cursor<Object> mockCursor = mock(Cursor.class);
  53. RowBounds rowBounds = new RowBounds();
  54. Object randomObject = new Object();
  55. List<Object> randomList = new ArrayList<>();
  56. Map<Object, Object> randomMap = new HashMap<>();
  57. String randomMapKey = randomAlphabetic(10);
  58. ResultHandler randomResultHandler = resultContext -> {
  59. // don't care
  60. };
  61. List<BatchResult> randomBatchResults = new ArrayList<>();
  62. Configuration randomConfiguration = new Configuration();
  63. verifyDelegation(DbSessionImpl::commit, s -> verify(s).commit());
  64. verifyDelegation(t -> t.commit(randomBoolean), s -> verify(s).commit(randomBoolean));
  65. verifyDelegation(
  66. sqlSession -> when(sqlSession.selectCursor(randomStatement)).thenReturn(mockCursor),
  67. dbSession -> dbSession.selectCursor(randomStatement),
  68. sqlSession -> {
  69. verify(sqlSession).selectCursor(randomStatement);
  70. return mockCursor;
  71. });
  72. verifyDelegation(
  73. sqlSession -> when(sqlSession.selectCursor(randomStatement, randomParameter)).thenReturn(mockCursor),
  74. dbSession -> dbSession.selectCursor(randomStatement, randomParameter),
  75. sqlSession -> {
  76. verify(sqlSessionMock).selectCursor(randomStatement, randomParameter);
  77. return mockCursor;
  78. });
  79. verifyDelegation(
  80. sqlSession -> when(sqlSession.selectCursor(randomStatement, randomParameter, rowBounds)).thenReturn(mockCursor),
  81. dbSession -> dbSession.selectCursor(randomStatement, randomParameter, rowBounds),
  82. sqlSession -> {
  83. verify(sqlSessionMock).selectCursor(randomStatement, randomParameter, rowBounds);
  84. return mockCursor;
  85. });
  86. verifyDelegation(
  87. sqlSession -> when(sqlSession.selectOne(randomStatement)).thenReturn(randomObject),
  88. dbSession -> dbSession.selectOne(randomStatement),
  89. sqlSession -> {
  90. verify(sqlSession).selectOne(randomStatement);
  91. return randomObject;
  92. });
  93. verifyDelegation(
  94. sqlSession -> when(sqlSession.selectOne(randomStatement, randomParameter)).thenReturn(randomObject),
  95. dbSession -> dbSession.selectOne(randomStatement, randomParameter),
  96. sqlSession -> {
  97. verify(sqlSessionMock).selectOne(randomStatement, randomParameter);
  98. return randomObject;
  99. });
  100. verifyDelegation(
  101. sqlSession -> when(sqlSession.selectList(randomStatement)).thenReturn(randomList),
  102. dbSession -> dbSession.selectList(randomStatement),
  103. sqlSession -> {
  104. verify(sqlSession).selectList(randomStatement);
  105. return randomList;
  106. });
  107. verifyDelegation(
  108. sqlSession -> when(sqlSession.selectList(randomStatement, randomParameter)).thenReturn(randomList),
  109. dbSession -> dbSession.selectList(randomStatement, randomParameter),
  110. sqlSession -> {
  111. verify(sqlSessionMock).selectList(randomStatement, randomParameter);
  112. return randomList;
  113. });
  114. verifyDelegation(
  115. sqlSession -> when(sqlSession.selectList(randomStatement, randomParameter, rowBounds)).thenReturn(randomList),
  116. dbSession -> dbSession.selectList(randomStatement, randomParameter, rowBounds),
  117. sqlSession -> {
  118. verify(sqlSessionMock).selectList(randomStatement, randomParameter, rowBounds);
  119. return randomList;
  120. });
  121. verifyDelegation(
  122. sqlSession -> when(sqlSession.selectMap(randomStatement, randomMapKey)).thenReturn(randomMap),
  123. dbSession -> dbSession.selectMap(randomStatement, randomMapKey),
  124. sqlSession -> {
  125. verify(sqlSession).selectMap(randomStatement, randomMapKey);
  126. return randomMap;
  127. });
  128. verifyDelegation(
  129. sqlSession -> when(sqlSession.selectMap(randomStatement, randomParameter, randomMapKey)).thenReturn(randomMap),
  130. dbSession -> dbSession.selectMap(randomStatement, randomParameter, randomMapKey),
  131. sqlSession -> {
  132. verify(sqlSessionMock).selectMap(randomStatement, randomParameter, randomMapKey);
  133. return randomMap;
  134. });
  135. verifyDelegation(
  136. sqlSession -> when(sqlSession.selectMap(randomStatement, randomParameter, randomMapKey, rowBounds)).thenReturn(randomMap),
  137. dbSession -> dbSession.selectMap(randomStatement, randomParameter, randomMapKey, rowBounds),
  138. sqlSession -> {
  139. verify(sqlSessionMock).selectMap(randomStatement, randomParameter, randomMapKey, rowBounds);
  140. return randomMap;
  141. });
  142. verifyDelegation(
  143. dbSession -> dbSession.select(randomStatement, randomResultHandler),
  144. sqlSession -> verify(sqlSessionMock).select(randomStatement, randomResultHandler));
  145. verifyDelegation(
  146. dbSession -> dbSession.select(randomStatement, randomParameter, randomResultHandler),
  147. sqlSession -> verify(sqlSession).select(randomStatement, randomParameter, randomResultHandler));
  148. verifyDelegation(
  149. dbSession -> dbSession.select(randomStatement, randomParameter, rowBounds, randomResultHandler),
  150. sqlSession -> verify(sqlSessionMock).select(randomStatement, randomParameter, rowBounds, randomResultHandler));
  151. verifyDelegation(
  152. sqlSession -> when(sqlSession.insert(randomStatement)).thenReturn(randomInt),
  153. dbSession -> dbSession.insert(randomStatement),
  154. sqlSession -> {
  155. verify(sqlSession).insert(randomStatement);
  156. return randomInt;
  157. });
  158. verifyDelegation(
  159. sqlSession -> when(sqlSession.insert(randomStatement, randomParameter)).thenReturn(randomInt),
  160. dbSession -> dbSession.insert(randomStatement, randomParameter),
  161. sqlSession -> {
  162. verify(sqlSessionMock).insert(randomStatement, randomParameter);
  163. return randomInt;
  164. });
  165. verifyDelegation(
  166. sqlSession -> when(sqlSession.update(randomStatement)).thenReturn(randomInt),
  167. dbSession -> dbSession.update(randomStatement),
  168. sqlSession -> {
  169. verify(sqlSession).update(randomStatement);
  170. return randomInt;
  171. });
  172. verifyDelegation(
  173. sqlSession -> when(sqlSession.update(randomStatement, randomParameter)).thenReturn(randomInt),
  174. dbSession -> dbSession.update(randomStatement, randomParameter),
  175. sqlSession -> {
  176. verify(sqlSessionMock).update(randomStatement, randomParameter);
  177. return randomInt;
  178. });
  179. verifyDelegation(
  180. sqlSession -> when(sqlSession.delete(randomStatement)).thenReturn(randomInt),
  181. dbSession -> dbSession.delete(randomStatement),
  182. sqlSession -> {
  183. verify(sqlSession).delete(randomStatement);
  184. return randomInt;
  185. });
  186. verifyDelegation(
  187. sqlSession -> when(sqlSession.delete(randomStatement, randomParameter)).thenReturn(randomInt),
  188. dbSession -> dbSession.delete(randomStatement, randomParameter),
  189. sqlSession -> {
  190. verify(sqlSessionMock).delete(randomStatement, randomParameter);
  191. return randomInt;
  192. });
  193. verifyDelegation(DbSessionImpl::rollback, s -> verify(s).rollback());
  194. verifyDelegation(t -> t.rollback(randomBoolean), s -> verify(s).rollback(randomBoolean));
  195. verifyDelegation(
  196. sqlSession -> when(sqlSession.flushStatements()).thenReturn(randomBatchResults),
  197. DbSessionImpl::flushStatements,
  198. sqlSession -> {
  199. verify(sqlSession).flushStatements();
  200. return randomBatchResults;
  201. });
  202. verifyDelegation(DbSessionImpl::close, s -> verify(s).close());
  203. verifyDelegation(DbSessionImpl::clearCache, s -> verify(s).clearCache());
  204. verifyDelegation(
  205. sqlSession -> when(sqlSession.getConfiguration()).thenReturn(randomConfiguration),
  206. DbSessionImpl::getConfiguration,
  207. sqlSession -> {
  208. verify(sqlSession).getConfiguration();
  209. return randomConfiguration;
  210. });
  211. verifyDelegation(
  212. sqlSession -> when(sqlSession.getMapper(DbSessionImplTest.class)).thenReturn(DbSessionImplTest.this),
  213. dbSession -> dbSession.getMapper(DbSessionImplTest.class),
  214. sqlSession -> {
  215. verify(sqlSession).getMapper(DbSessionImplTest.class);
  216. return DbSessionImplTest.this;
  217. });
  218. verifyDelegation(DbSessionImpl::getConnection, s -> verify(s).getConnection());
  219. }
  220. @Test
  221. public void getSqlSession_returns_wrapped_SqlSession_object() {
  222. assertThat(underTest.getSqlSession()).isSameAs(sqlSessionMock);
  223. }
  224. private void verifyDelegation(Consumer<DbSessionImpl> t, Consumer<SqlSession> s) {
  225. reset(sqlSessionMock);
  226. t.accept(underTest);
  227. s.accept(sqlSessionMock);
  228. verifyNoMoreInteractions(sqlSessionMock);
  229. }
  230. private <T> void verifyDelegation(Consumer<SqlSession> prepare, Function<DbSessionImpl, T> t, Function<SqlSession, T> s) {
  231. reset(sqlSessionMock);
  232. prepare.accept(sqlSessionMock);
  233. T value = t.apply(underTest);
  234. T expected = s.apply(sqlSessionMock);
  235. verifyNoMoreInteractions(sqlSessionMock);
  236. if (expected instanceof Number) {
  237. assertThat(value).isEqualTo(expected);
  238. } else {
  239. assertThat(value).isSameAs(expected);
  240. }
  241. }
  242. }