org.sonar.db.DbSessionImplTest.java Source code

Java tutorial

Introduction

Here is the source code for org.sonar.db.DbSessionImplTest.java

Source

/*
 * SonarQube
 * Copyright (C) 2009-2018 SonarSource SA
 * mailto:info AT sonarsource DOT com
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
package org.sonar.db;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.function.Consumer;
import java.util.function.Function;
import org.apache.ibatis.cursor.Cursor;
import org.apache.ibatis.executor.BatchResult;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;

public class DbSessionImplTest {
    private SqlSession sqlSessionMock = mock(SqlSession.class);

    private DbSessionImpl underTest = new DbSessionImpl(sqlSessionMock);

    @Test
    public void all_methods_to_wrapped_SqlSession() {
        Random random = new Random();
        boolean randomBoolean = random.nextBoolean();
        int randomInt = random.nextInt(200);
        String randomStatement = randomAlphabetic(10);
        Object randomParameter = new Object();
        Cursor<Object> mockCursor = mock(Cursor.class);
        RowBounds rowBounds = new RowBounds();
        Object randomObject = new Object();
        List<Object> randomList = new ArrayList<>();
        Map<Object, Object> randomMap = new HashMap<>();
        String randomMapKey = randomAlphabetic(10);
        ResultHandler randomResultHandler = resultContext -> {
            // don't care
        };
        List<BatchResult> randomBatchResults = new ArrayList<>();
        Configuration randomConfiguration = new Configuration();

        verifyDelegation(DbSessionImpl::commit, s -> verify(s).commit());
        verifyDelegation(t -> t.commit(randomBoolean), s -> verify(s).commit(randomBoolean));

        verifyDelegation(sqlSession -> when(sqlSession.selectCursor(randomStatement)).thenReturn(mockCursor),
                dbSession -> dbSession.selectCursor(randomStatement), sqlSession -> {
                    verify(sqlSession).selectCursor(randomStatement);
                    return mockCursor;
                });
        verifyDelegation(
                sqlSession -> when(sqlSession.selectCursor(randomStatement, randomParameter))
                        .thenReturn(mockCursor),
                dbSession -> dbSession.selectCursor(randomStatement, randomParameter), sqlSession -> {
                    verify(sqlSessionMock).selectCursor(randomStatement, randomParameter);
                    return mockCursor;
                });
        verifyDelegation(
                sqlSession -> when(sqlSession.selectCursor(randomStatement, randomParameter, rowBounds))
                        .thenReturn(mockCursor),
                dbSession -> dbSession.selectCursor(randomStatement, randomParameter, rowBounds), sqlSession -> {
                    verify(sqlSessionMock).selectCursor(randomStatement, randomParameter, rowBounds);
                    return mockCursor;
                });

        verifyDelegation(sqlSession -> when(sqlSession.selectOne(randomStatement)).thenReturn(randomObject),
                dbSession -> dbSession.selectOne(randomStatement), sqlSession -> {
                    verify(sqlSession).selectOne(randomStatement);
                    return randomObject;
                });
        verifyDelegation(
                sqlSession -> when(sqlSession.selectOne(randomStatement, randomParameter)).thenReturn(randomObject),
                dbSession -> dbSession.selectOne(randomStatement, randomParameter), sqlSession -> {
                    verify(sqlSessionMock).selectOne(randomStatement, randomParameter);
                    return randomObject;
                });

        verifyDelegation(sqlSession -> when(sqlSession.selectList(randomStatement)).thenReturn(randomList),
                dbSession -> dbSession.selectList(randomStatement), sqlSession -> {
                    verify(sqlSession).selectList(randomStatement);
                    return randomList;
                });
        verifyDelegation(
                sqlSession -> when(sqlSession.selectList(randomStatement, randomParameter)).thenReturn(randomList),
                dbSession -> dbSession.selectList(randomStatement, randomParameter), sqlSession -> {
                    verify(sqlSessionMock).selectList(randomStatement, randomParameter);
                    return randomList;
                });
        verifyDelegation(
                sqlSession -> when(sqlSession.selectList(randomStatement, randomParameter, rowBounds))
                        .thenReturn(randomList),
                dbSession -> dbSession.selectList(randomStatement, randomParameter, rowBounds), sqlSession -> {
                    verify(sqlSessionMock).selectList(randomStatement, randomParameter, rowBounds);
                    return randomList;
                });

        verifyDelegation(
                sqlSession -> when(sqlSession.selectMap(randomStatement, randomMapKey)).thenReturn(randomMap),
                dbSession -> dbSession.selectMap(randomStatement, randomMapKey), sqlSession -> {
                    verify(sqlSession).selectMap(randomStatement, randomMapKey);
                    return randomMap;
                });
        verifyDelegation(
                sqlSession -> when(sqlSession.selectMap(randomStatement, randomParameter, randomMapKey))
                        .thenReturn(randomMap),
                dbSession -> dbSession.selectMap(randomStatement, randomParameter, randomMapKey), sqlSession -> {
                    verify(sqlSessionMock).selectMap(randomStatement, randomParameter, randomMapKey);
                    return randomMap;
                });
        verifyDelegation(
                sqlSession -> when(sqlSession.selectMap(randomStatement, randomParameter, randomMapKey, rowBounds))
                        .thenReturn(randomMap),
                dbSession -> dbSession.selectMap(randomStatement, randomParameter, randomMapKey, rowBounds),
                sqlSession -> {
                    verify(sqlSessionMock).selectMap(randomStatement, randomParameter, randomMapKey, rowBounds);
                    return randomMap;
                });

        verifyDelegation(dbSession -> dbSession.select(randomStatement, randomResultHandler),
                sqlSession -> verify(sqlSessionMock).select(randomStatement, randomResultHandler));
        verifyDelegation(dbSession -> dbSession.select(randomStatement, randomParameter, randomResultHandler),
                sqlSession -> verify(sqlSession).select(randomStatement, randomParameter, randomResultHandler));
        verifyDelegation(
                dbSession -> dbSession.select(randomStatement, randomParameter, rowBounds, randomResultHandler),
                sqlSession -> verify(sqlSessionMock).select(randomStatement, randomParameter, rowBounds,
                        randomResultHandler));

        verifyDelegation(sqlSession -> when(sqlSession.insert(randomStatement)).thenReturn(randomInt),
                dbSession -> dbSession.insert(randomStatement), sqlSession -> {
                    verify(sqlSession).insert(randomStatement);
                    return randomInt;
                });
        verifyDelegation(
                sqlSession -> when(sqlSession.insert(randomStatement, randomParameter)).thenReturn(randomInt),
                dbSession -> dbSession.insert(randomStatement, randomParameter), sqlSession -> {
                    verify(sqlSessionMock).insert(randomStatement, randomParameter);
                    return randomInt;
                });

        verifyDelegation(sqlSession -> when(sqlSession.update(randomStatement)).thenReturn(randomInt),
                dbSession -> dbSession.update(randomStatement), sqlSession -> {
                    verify(sqlSession).update(randomStatement);
                    return randomInt;
                });
        verifyDelegation(
                sqlSession -> when(sqlSession.update(randomStatement, randomParameter)).thenReturn(randomInt),
                dbSession -> dbSession.update(randomStatement, randomParameter), sqlSession -> {
                    verify(sqlSessionMock).update(randomStatement, randomParameter);
                    return randomInt;
                });

        verifyDelegation(sqlSession -> when(sqlSession.delete(randomStatement)).thenReturn(randomInt),
                dbSession -> dbSession.delete(randomStatement), sqlSession -> {
                    verify(sqlSession).delete(randomStatement);
                    return randomInt;
                });
        verifyDelegation(
                sqlSession -> when(sqlSession.delete(randomStatement, randomParameter)).thenReturn(randomInt),
                dbSession -> dbSession.delete(randomStatement, randomParameter), sqlSession -> {
                    verify(sqlSessionMock).delete(randomStatement, randomParameter);
                    return randomInt;
                });

        verifyDelegation(DbSessionImpl::rollback, s -> verify(s).rollback());
        verifyDelegation(t -> t.rollback(randomBoolean), s -> verify(s).rollback(randomBoolean));

        verifyDelegation(sqlSession -> when(sqlSession.flushStatements()).thenReturn(randomBatchResults),
                DbSessionImpl::flushStatements, sqlSession -> {
                    verify(sqlSession).flushStatements();
                    return randomBatchResults;
                });

        verifyDelegation(DbSessionImpl::close, s -> verify(s).close());

        verifyDelegation(DbSessionImpl::clearCache, s -> verify(s).clearCache());

        verifyDelegation(sqlSession -> when(sqlSession.getConfiguration()).thenReturn(randomConfiguration),
                DbSessionImpl::getConfiguration, sqlSession -> {
                    verify(sqlSession).getConfiguration();
                    return randomConfiguration;
                });

        verifyDelegation(
                sqlSession -> when(sqlSession.getMapper(DbSessionImplTest.class))
                        .thenReturn(DbSessionImplTest.this),
                dbSession -> dbSession.getMapper(DbSessionImplTest.class), sqlSession -> {
                    verify(sqlSession).getMapper(DbSessionImplTest.class);
                    return DbSessionImplTest.this;
                });

        verifyDelegation(DbSessionImpl::getConnection, s -> verify(s).getConnection());
    }

    @Test
    public void getSqlSession_returns_wrapped_SqlSession_object() {
        assertThat(underTest.getSqlSession()).isSameAs(sqlSessionMock);
    }

    private void verifyDelegation(Consumer<DbSessionImpl> t, Consumer<SqlSession> s) {
        reset(sqlSessionMock);
        t.accept(underTest);
        s.accept(sqlSessionMock);
        verifyNoMoreInteractions(sqlSessionMock);
    }

    private <T> void verifyDelegation(Consumer<SqlSession> prepare, Function<DbSessionImpl, T> t,
            Function<SqlSession, T> s) {
        reset(sqlSessionMock);
        prepare.accept(sqlSessionMock);
        T value = t.apply(underTest);
        T expected = s.apply(sqlSessionMock);
        verifyNoMoreInteractions(sqlSessionMock);
        if (expected instanceof Number) {
            assertThat(value).isEqualTo(expected);
        } else {
            assertThat(value).isSameAs(expected);
        }
    }
}