import org.dbunit.Assertion;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.QueryDataSet;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ITable;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.File;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Date;
import java.sql.DriverManager;

import junit.framework.TestCase;


public class AcceptOrderBeanTest extends TestCase{

    public  AcceptOrderBeanTest(String name){
        super(name);
    }

    private File file;

    private Connection getConnection() throws Exception{
        Class.forName("org.postgresql.Driver");
        Connection connection=DriverManager.getConnection("jdbc:postgresql:Training.dbunit","postgres","");
        return connection;
    }

    /*
     * テストの準備を行う。
     * Accept_Orderテーブルのデータのバックアップを取る。
     * その後、全てのデータを削除し、テストデータを投入する。
     */
    protected void setUp() {
	IDatabaseConnection connection =null;
	try{
	    super.setUp();
	    Connection conn=getConnection();
	    connection
		=new DatabaseConnection(conn);
	    
	    //現状のバックアップを取得
	    QueryDataSet partialDataSet = new QueryDataSet(connection);
	    partialDataSet.addTable("ACCEPT_ORDER");
	    file=File.createTempFile("accept",".xml");
	    FlatXmlDataSet.write(partialDataSet,
				 new FileOutputStream(file));

	    //テストデータを投入する
	    IDataSet dataSet
		= new  FlatXmlDataSet( new FileInputStream("accept_order_test_data.xml"));
	    DatabaseOperation.CLEAN_INSERT.execute(connection,dataSet);

	}catch(Exception e){
	    e.printStackTrace();
	}finally{
	    try{
		if(connection!=null) connection.close();
	    }catch(SQLException e){}
	}
    }
    
    /*
     * テストの後かたづけを行う。
     * Accept_Orderテーブルのバックアップデータをリストアする。
     */
    protected void tearDown() throws Exception{

	IDatabaseConnection connection =null;
	try{
	    super.tearDown();
	    Connection conn=getConnection();
	    connection
		=new DatabaseConnection(conn);

	    IDataSet dataSet
		= new  FlatXmlDataSet(file);
	    DatabaseOperation.CLEAN_INSERT.execute(connection,dataSet);
	    
	}catch(Exception e){
	    e.printStackTrace();
	}finally{
	    try{
		if(connection!=null) connection.close();
	    }catch(SQLException e){}
	}

    }

    public void testLoadByO_num() throws Exception{
	//loadByO_numメソッドを実行
        AcceptOrderBean order=new AcceptOrderBean();
        order.loadByO_num("5001");

	//実行結果を確認

	//取得したAcceptOrderBeanの配列は「文字列」で比較する。

 
	assertEquals("accept_date=2004-01-01","accept_date="+order.getAccept_date());
        assertEquals("c_num=1000","c_num="+order.getC_num());
	assertEquals("dc_rate=5","dc_rate="+order.getDc_rate());
        assertEquals("employee=101","employee="+order.getEmployee());
        assertEquals("o_num=5001","o_num="+order.getO_num());
	assertEquals("option_price=30","option_price="+order.getOption_price());
        assertEquals("p_num=501","p_num="+order.getP_num());

    }



    public void testStore() throws Exception{

	//storeメソッドの実行
	AcceptOrderBean order=new AcceptOrderBean();
	order.setO_num("5004");
	order.setC_num("1004");
	order.setP_num("501");
	order.setDc_rate(20);
	order.setOption_price(400);
	order.setEmployee("101");
	order.setAccept_date(Date.valueOf("2004-01-03"));

	order.store();

	//実行結果を検証する
	IDatabaseConnection connection=null;
	try{
	    // accept_orderテーブルの状態を確認
	    Connection conn=getConnection();
	    connection  =new DatabaseConnection(conn);
	    
	    IDataSet databaseDataSet = connection.createDataSet();
	    ITable actualTable = databaseDataSet.getTable("accept_order");
	    
	    // 期待されるデータを取得
	    IDataSet expectedDataSet
		= new FlatXmlDataSet(new FileInputStream("accept_order_test_data2.xml"));
	    ITable expectedTable = expectedDataSet.getTable("accept_order");
	    
	    // 比較する
	    Assertion.assertEquals(expectedTable, actualTable);
	}finally{
	    if(connection!=null) connection.close();
	}

    }

    public void testDelete() throws Exception{

	//deleteメソッドを実行
	AcceptOrderBean order=new AcceptOrderBean();
	order.setO_num("5003");
	order.delete();

	//実行結果を確認
	IDatabaseConnection connection=null;
	try{
	    // accept_orderテーブルの状態を確認
	    Connection conn=getConnection();
	    connection
		=new DatabaseConnection(conn);
	    
	    IDataSet databaseDataSet = connection.createDataSet();
	    ITable actualTable = databaseDataSet.getTable("accept_order");
	    
	    // あるべき姿を確認
	    IDataSet expectedDataSet
		= new FlatXmlDataSet(new FileInputStream("accept_order_test_data3.xml"));
	    ITable expectedTable = expectedDataSet.getTable("accept_order");
	    
	    //比較する
	    Assertion.assertEquals(expectedTable, actualTable);
	}finally{
	    if(connection!=null) connection.close();
	}
    }

}
