/*
 * JdbcRecordReaderTest.java
 * Copyright (C) 2008 Cyber Beans Corporation. All rights reserved.
 */
package jp.co.cybec.cb3.accessor.dbaccess;

import jp.co.cybec.cb3.accessor.dbaccess.DBAccessorImpl;
import jp.co.cybec.cb3.accessor.dbaccess.DBQueryParameterMap;
import jp.co.cybec.cb3.accessor.dbaccess.DBRecordReader;
import jp.co.cybec.cb3.accessor.dbaccess.JdbcRecordReader;
import jp.co.cybec.cb3.mock.accessor.MockResultSet;
import junit.framework.Assert;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.dao.DataAccessException;

/**
 *
 * JdbcRecordReaderクラスのテストケース
 * @author Lijuan Sun
 */
public class JdbcRecordReaderTest{

	// 変数を初期化する
	ApplicationContext context = null;
	DBAccessorImpl dbaccessTmp;
	DBQueryParameterMap parameter = null;

	// 設定ファイルパース
	private static String[] CONTEXT_XML_PATH = new String[] {
			"jp/co/cybec/cb3/accessor/dbaccess/TestDBAccessConfig.xml",
			"datasourceContext.xml",
	};

	@Before
	public void setup(){

		// クラスをインスタンスする
		context = new ClassPathXmlApplicationContext(CONTEXT_XML_PATH);
		dbaccessTmp = (DBAccessorImpl) context.getBean("dbAccessorImpl");
		// 設定ファイルを読み込む
		dbaccessTmp.initialize("jp/co/cybec/cb3/accessor/dbaccess/dbaccessConfig.xml");
		// テーブルをクリアする
		dbaccessTmp.delete("delete1");
		// パラメータを設定する
		parameter = new DBQueryParameterMap();
		parameter.put("EMP_NAME", "abcde");
		parameter.put("EMP_CELLULAR_PHONE", "123456789");
		parameter.put("EMP_BIRTH", "19800101");
		parameter.put("EMP_SEX", "1");
	}

	@After
	public void tearDown(){
		// リリース
		dbaccessTmp.release();
	}

	/**
	 * {@link jp.co.cybec.cb3.accessor.dbaccess.JdbcRecordReader} のためのテスト・メソッド。
	 * 正常取得場合
	 */
	@Test
	public void testNextRecord01() {

		 try{
			 // パラメータを設定する
			parameter.put("EMP_CODE", "tst01");
			// データをインサートする
			dbaccessTmp.insert("insert1", parameter);
			// データを取得する
			DBRecordReader recordReader = dbaccessTmp.select("select1", parameter);
			// 結果をチェックする
			Assert.assertNotNull(recordReader);
			Assert.assertNotNull(recordReader.nextRecord());
		 } catch (DataAccessException e) {
			e.printStackTrace();
			Assert.fail("テスト失敗");
		}
	}

	/**
	 * {@link jp.co.cybec.cb3.accessor.dbaccess.JdbcRecordReader} のためのテスト・メソッド。
	 * null場合
	 */
	@Test
	public void testNextRecord02() {

		 try{
			 // パラメータを設定する
			parameter.put("EMP_CODE", "tst01");
			// データをインサートする
			dbaccessTmp.insert("insert1", parameter);
			parameter.clear();
			parameter.put("EMP_CODE", "002");
			// データを取得する
			DBRecordReader recordReader = dbaccessTmp.select("select1", parameter);
			// 結果をチェックする
			Assert.assertNull(recordReader.nextRecord());

		 } catch (DataAccessException e) {
			e.printStackTrace();
			Assert.fail("テスト失敗");
		}
	}

	/**
	 * {@link jp.co.cybec.cb3.accessor.dbaccess.JdbcRecordReader} のためのテスト・メソッド。
	 * エラー発生場合
	 */
	@Test
	public void testNextRecord03() {

		 try{
			 MockResultSet rs = new MockResultSet();
			 DBQueryParameterMap parameter = new DBQueryParameterMap();
			 parameter.put("key", "value");
			 JdbcRecordReader recordReader = new JdbcRecordReader(rs, "SELECT * FROM DUMMY", parameter);
			 recordReader.nextRecord();
			 // 例外が発生しなかった場合、テスト失敗。
			 Assert.fail();
		 } catch(Exception e){
			 System.out.println(e.getMessage());
			 if (!(e instanceof DataAccessException)){
				 Assert.fail("テスト失敗");
			 }
		 }
	}
}
