// Path: src/test/java/salarycalculation/matchers/RecordNotFoundExceptionMatcher.java
// public static RecordNotFoundExceptionMatcher isClass(Class<?> expectEntityClass) {
//     return new RecordNotFoundExceptionMatcher(expectEntityClass, null, null);
// }
// 
// Path: src/test/java/salarycalculation/matchers/RecordNotFoundExceptionMatcher.java
// public static RecordNotFoundExceptionMatcher isKey(Object expectKey) {
//     return new RecordNotFoundExceptionMatcher(null, expectKey, null);
// }
// 
// Path: src/main/java/salarycalculation/database/model/OrganizationRecord.java
// public class OrganizationRecord {
// 
//     /** 組織コード */
//     private String code;
// 
//     /** 組織名 */
//     private String name;
// 
//     /**
//      * 組織コードを取得する。
//      *
//      * @return 組織コード
//      */
//     public String getCode() {
//         return code;
//     }
// 
//     /**
//      * 組織コードを設定する。
//      *
//      * @param code 組織コード
//      */
//     public void setCode(String code) {
//         this.code = code;
//     }
// 
//     /**
//      * 組織名を取得する。
//      *
//      * @return 組織名
//      */
//     public String getName() {
//         return name;
//     }
// 
//     /**
//      * 組織名を設定する。
//      *
//      * @param name 組織名
//      */
//     public void setName(String name) {
//         this.name = name;
//     }
// }
// 
// Path: src/test/java/salarycalculation/dbsetup/OrganizationSetupSupport.java
// public interface OrganizationSetupSupport {
// 
//     default Operation organizationInsert() {
//         Operation organization = insertInto("organization").columns("code", "name")
//                                                            .values("DEV1", "開発部1")
//                                                            .values("DEV2", "開発部2")
//                                                            .values("DEV3", "開発部3")
//                                                            .values("DEV", "開発部").build();
//         return organization;
//     }
// }


import static com.ninja_squad.dbsetup.Operations.deleteAllFrom;
import static com.ninja_squad.dbsetup.Operations.sequenceOf;
import static com.ninja_squad.dbsetup.destination.DriverManagerDestination.with;
import static org.assertj.core.api.Assertions.assertThat;
import static salarycalculation.matchers.RecordNotFoundExceptionMatcher.isClass;
import static salarycalculation.matchers.RecordNotFoundExceptionMatcher.isKey;
import java.sql.Connection;
import java.sql.DriverManager;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.mockito.internal.util.reflection.Whitebox;
import com.ninja_squad.dbsetup.DbSetup;
import com.ninja_squad.dbsetup.DbSetupTracker;
import com.ninja_squad.dbsetup.operation.Operation;
import salarycalculation.database.model.OrganizationRecord;
import salarycalculation.dbsetup.OrganizationSetupSupport;
import salarycalculation.exception.RecordNotFoundException;
package salarycalculation.database;






/**
 * {@link OrganizationDao}に対するテストクラス。
 *
 * @author naotake
 */
public class OrganizationDaoTest implements OrganizationSetupSupport {

    private OrganizationDao testee;
    private static DbSetupTracker dbSetupTracker = new DbSetupTracker();

    @Rule
    public ExpectedException expect = ExpectedException.none();

    /**
     * 事前処理。
     */
    @Before
    public void setUp() throws Exception {
        testee = new OrganizationDao();

        String url = "jdbc:h2:./data/salary_calculation_test";
        Connection connection = DriverManager.getConnection(url, "sa", "");
        Whitebox.setInternalState(testee, "connection", connection);

        // 事前データの準備
        Operation truncate = deleteAllFrom("work", "employee", "role", "capability", "organization");
        Operation organization = organizationInsert();

        // 事前データ投入
        dbSetupTracker.launchIfNecessary(new DbSetup(with("jdbc:h2:./data/salary_calculation_test", "sa", ""),
                                                     sequenceOf(truncate, organization)));
    }

    @Test
    public void 組織コードに一致した組織を取得できること() {
        dbSetupTracker.skipNextLaunch();

        OrganizationRecord actual = testee.get("DEV1");
        assertThat(actual.getCode()).isEqualTo("DEV1");
        assertThat(actual.getName()).isEqualTo("開発部1");
    }

    @Test
    public void 存在しない組織コードを指定した場合に例外が送出されること() {
        dbSetupTracker.skipNextLaunch();

// Path: src/test/java/salarycalculation/matchers/RecordNotFoundExceptionMatcher.java
// public static RecordNotFoundExceptionMatcher isClass(Class<?> expectEntityClass) {
//     return new RecordNotFoundExceptionMatcher(expectEntityClass, null, null);
// }
// 
// Path: src/test/java/salarycalculation/matchers/RecordNotFoundExceptionMatcher.java
// public static RecordNotFoundExceptionMatcher isKey(Object expectKey) {
//     return new RecordNotFoundExceptionMatcher(null, expectKey, null);
// }
// 
// Path: src/main/java/salarycalculation/database/model/OrganizationRecord.java
// public class OrganizationRecord {
// 
//     /** 組織コード */
//     private String code;
// 
//     /** 組織名 */
//     private String name;
// 
//     /**
//      * 組織コードを取得する。
//      *
//      * @return 組織コード
//      */
//     public String getCode() {
//         return code;
//     }
// 
//     /**
//      * 組織コードを設定する。
//      *
//      * @param code 組織コード
//      */
//     public void setCode(String code) {
//         this.code = code;
//     }
// 
//     /**
//      * 組織名を取得する。
//      *
//      * @return 組織名
//      */
//     public String getName() {
//         return name;
//     }
// 
//     /**
//      * 組織名を設定する。
//      *
//      * @param name 組織名
//      */
//     public void setName(String name) {
//         this.name = name;
//     }
// }
// 
// Path: src/test/java/salarycalculation/dbsetup/OrganizationSetupSupport.java
// public interface OrganizationSetupSupport {
// 
//     default Operation organizationInsert() {
//         Operation organization = insertInto("organization").columns("code", "name")
//                                                            .values("DEV1", "開発部1")
//                                                            .values("DEV2", "開発部2")
//                                                            .values("DEV3", "開発部3")
//                                                            .values("DEV", "開発部").build();
//         return organization;
//     }
// }


// Path: src/test/java/salarycalculation/database/OrganizationDaoTest.java
import static com.ninja_squad.dbsetup.Operations.deleteAllFrom;
import static com.ninja_squad.dbsetup.Operations.sequenceOf;
import static com.ninja_squad.dbsetup.destination.DriverManagerDestination.with;
import static org.assertj.core.api.Assertions.assertThat;
import static salarycalculation.matchers.RecordNotFoundExceptionMatcher.isClass;
import static salarycalculation.matchers.RecordNotFoundExceptionMatcher.isKey;
import java.sql.Connection;
import java.sql.DriverManager;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.mockito.internal.util.reflection.Whitebox;
import com.ninja_squad.dbsetup.DbSetup;
import com.ninja_squad.dbsetup.DbSetupTracker;
import com.ninja_squad.dbsetup.operation.Operation;
import salarycalculation.database.model.OrganizationRecord;
import salarycalculation.dbsetup.OrganizationSetupSupport;
import salarycalculation.exception.RecordNotFoundException;

package salarycalculation.database;






/**
 * {@link OrganizationDao}に対するテストクラス。
 *
 * @author naotake
 */
public class OrganizationDaoTest implements OrganizationSetupSupport {

    private OrganizationDao testee;
    private static DbSetupTracker dbSetupTracker = new DbSetupTracker();

    @Rule
    public ExpectedException expect = ExpectedException.none();

    /**
     * 事前処理。
     */
    @Before
    public void setUp() throws Exception {
        testee = new OrganizationDao();

        String url = "jdbc:h2:./data/salary_calculation_test";
        Connection connection = DriverManager.getConnection(url, "sa", "");
        Whitebox.setInternalState(testee, "connection", connection);

        // 事前データの準備
        Operation truncate = deleteAllFrom("work", "employee", "role", "capability", "organization");
        Operation organization = organizationInsert();

        // 事前データ投入
        dbSetupTracker.launchIfNecessary(new DbSetup(with("jdbc:h2:./data/salary_calculation_test", "sa", ""),
                                                     sequenceOf(truncate, organization)));
    }

    @Test
    public void 組織コードに一致した組織を取得できること() {
        dbSetupTracker.skipNextLaunch();

        OrganizationRecord actual = testee.get("DEV1");
        assertThat(actual.getCode()).isEqualTo("DEV1");
        assertThat(actual.getName()).isEqualTo("開発部1");
    }

    @Test
    public void 存在しない組織コードを指定した場合に例外が送出されること() {
        dbSetupTracker.skipNextLaunch();

        expect.expect(RecordNotFoundException.class);