package net.codjo.broadcast.server;
import fakedb.FakeResultSet;
import java.io.File;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import net.codjo.broadcast.common.Context;
import net.codjo.broadcast.common.Preferences;
import net.codjo.broadcast.common.PreferencesForTesting;
import net.codjo.broadcast.common.PreferencesManager;
import net.codjo.broadcast.common.columns.FileColumnGenerator;
import net.codjo.database.common.api.JdbcFixture;
import net.codjo.datagen.DatagenFixture;
import net.codjo.sql.builder.FieldInfo;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static java.math.BigDecimal.valueOf;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
*
*/
public class FileColumnHomeTest {
private static final DatagenFixture DATAGEN = new DatagenFixture(BroadcasterHomeTest.class);
private static final int CONTENT_ID = 1000;
private static final int FILE_ID = 1000;
private static final int SECTION_ID = 1000;
private Connection connection;
private FileColumnHome fileColumnHome;
private JdbcFixture jdbc = JdbcFixture.newFixture();
private PreferencesManager prefManager;
private Preferences preference = new PreferencesForTesting();
@Test
public void test_buildFieldInfo() throws Exception {
ResultSet rs = new FakeResultSet(new Object[][]{
{"COLUMN_NUMBER", "DB_FIELD_NAME", "DB_TABLE_NAME"},
{new Integer("10"), "CODE", "AP_VALUATION_TYPE as VALUATION_FRE_VALUATION_TY_REF"},
{new Integer("70"), "VALUATION_DATE", "AP_FUND_PRICE"},
{new Integer("20"), "LABEL", "AP_COMMERCIAL as FUND_TYPE_COMMERCIAL_REF"},
{new Integer("30"), "SICOVAM_CODE", "AP_PORTFOLIO_CODIFICATION"},
{new Integer("40"), "LABEL", "AP_PORTFOLIO_CODIFICATION"},
{new Integer("50"), "CODE", "AP_LEGAL as MASTER_SON_LEGAL_REF"},
{new Integer("60"), "NET_FUND_PRICE", "AP_FUND_PRICE"},
{new Integer("80"), "PERF_YTD", "#COMPUTED_VL"},
{new Integer("90"), "NET_DIVIDEND", "AP_DIVIDEND"},
{new Integer("100"), "CODE", "AP_VALUATION_TYPE as BALANCE_CURRE_VALUATION_TY_REF"},
{new Integer("110"), "DIVIDEND_DATE", "AP_DIVIDEND"},
{new Integer("120"), "LABEL", "AP_COMMERCIAL as RISK_LEVEL_COMMERCIAL_REF"}
}).getStub();
Map<FieldInfo, FieldInfo> map = new HashMap<FieldInfo, FieldInfo>();
for (int i = 0; i < 12; i++) {
rs.next();
fileColumnHome.buildFieldInfo(map, rs);
}
assertEquals(12, map.size());
}
@Test
public void test_loadFileColumns() throws Exception {
Statement statement = connection.createStatement();
// Creation de la section
insertSection(statement, SECTION_ID);
initDataCols(statement, SECTION_ID);
// Creation du fichier
insertIntoFile(statement, FILE_ID, "File_TestTU");
insertIntoFileContent(statement, FILE_ID, SECTION_ID, CONTENT_ID);
//chargement des colonnes
FileColumnGenerator[] cols =
fileColumnHome.loadFileColumns(connection, valueOf(CONTENT_ID), preference, new Context());
//v�rification du contenu
FieldInfo info = cols[0].getFieldInfo();
assertEquals("ligne 1 string (COL)", "DB_FIELD_NAME", info.getDBFieldName());
assertEquals("ligne 1 string (TABLE)", prefManager.getColumnsTableName(), info.getDBTableName());
info = cols[1].getFieldInfo();
assertEquals("ligne 2 number (COL)", "COLUMNS_ID", info.getDBFieldName());
assertEquals("ligne 2 number (TABLE)", prefManager.getColumnsTableName(), info.getDBTableName());
info = cols[2].getFieldInfo();
assertEquals("ligne 3 date (COL)(COMPUTED)", "DATE_HEURE", info.getDBFieldName());
assertEquals("ligne 3 date (TABLE)(COMPUTED)",
preference.getComputedTableName(),
info.getDBTableName());
info = cols[3].getFieldInfo();
assertEquals("ligne 4 date (COL)(COMPUTED)", "DATE_HEURE", info.getDBFieldName());
assertEquals("ligne 4 date (TABLE)(COMPUTED)",
preference.getComputedTableName(),
info.getDBTableName());
assertTrue("Verifie que le HOME detecte que Les 2 colonnes utilisent le meme FI",
cols[2].getFieldInfo() == cols[3].getFieldInfo());
}
@BeforeClass
public static void setUpGlobal() throws Exception {
DATAGEN.doSetUp();
DATAGEN.generate();
}
@AfterClass
public static void tearDownGlobal() throws Exception {
DATAGEN.doTearDown();
}
@Before
public void setUp() throws Exception {
jdbc.doSetUp();
jdbc.advanced().dropAllObjects();
create("PM_BROADCAST_FILES");
create("PM_BROADCAST_FILE_CONTENTS");
create("PM_BROADCAST_SECTION");
create("PM_BROADCAST_COLUMNS");
prefManager = new PreferencesManager("PM_BROADCAST_FILES",
"PM_BROADCAST_FILE_CONTENTS",
"PM_BROADCAST_SECTION",
"PM_BROADCAST_COLUMNS",
Collections.<String, Object>emptyMap());
prefManager.addPreferences(preference);
connection = jdbc.getConnection();
connection.setAutoCommit(false);
fileColumnHome = new FileColumnHome();
fileColumnHome.init(connection, prefManager);
}
@After
public void tearDown() throws Exception {
jdbc.doTearDown();
}
private void initDataCols(Statement stmt, int sectionID)
throws SQLException {
//column string
stmt.executeUpdate("insert into " + prefManager.getColumnsTableName()
+ " (COLUMNS_ID, SECTION_ID, DB_TABLE_NAME, DB_FIELD_NAME, COLUMN_NAME,"
+ " RIGHT_COLUMN_PADDING, PADDING_CARACTER, COLUMN_DATE_FORMAT,COLUMN_NUMBER,"
+ " BREAK_FIELD)"
+ " values(1, " + sectionID + ",'PM_BROADCAST_COLUMNS','DB_FIELD_NAME','Champ'"
+ ", 0, null,null,1,1)");
//column number
stmt.executeUpdate("insert into " + prefManager.getColumnsTableName()
+ " (COLUMNS_ID, SECTION_ID, DB_TABLE_NAME, DB_FIELD_NAME, COLUMN_NAME,"
+ " RIGHT_COLUMN_PADDING, PADDING_CARACTER, COLUMN_DATE_FORMAT,COLUMN_NUMBER,"
+ " COLUMN_NUMBER_FORMAT, BREAK_FIELD)"
+ " values(2, " + sectionID + ",'PM_BROADCAST_COLUMNS','COLUMNS_ID','Id'"
+ ", 0, null,null,3, '0',1)");
//column date : COMPUTED
stmt.executeUpdate("insert into " + prefManager.getColumnsTableName()
+ " (COLUMNS_ID, SECTION_ID," + " DB_TABLE_NAME, DB_FIELD_NAME, COLUMN_NAME,"
+ " RIGHT_COLUMN_PADDING, PADDING_CARACTER, COLUMN_DATE_FORMAT,COLUMN_NUMBER,"
+ " BREAK_FIELD)"
+ " values(3, " + sectionID + ",'" + preference.getComputedTableName() + "'"
+ ",'DATE_HEURE','Date de g�n�ration'" + ", 1, ' ','dd-mm-yy',4,0)");
// Insertion une deuxieme fois de (column date : COMPUTED) pour verifier
// la gestion des FieldInfo
stmt.executeUpdate("insert into " + prefManager.getColumnsTableName()
+ " (COLUMNS_ID, SECTION_ID," + " DB_TABLE_NAME, DB_FIELD_NAME, COLUMN_NAME,"
+ " RIGHT_COLUMN_PADDING, PADDING_CARACTER, COLUMN_DATE_FORMAT,COLUMN_NUMBER,"
+ " BREAK_FIELD)"
+ " values(4, " + sectionID + ",'" + preference.getComputedTableName() + "'"
+ ",'DATE_HEURE','Date de g�n�ration'" + ", 1, ' ','dd-mm-yy',5,0)");
}
private void insertIntoFile(Statement stmt, int id, String fileName) throws Exception {
stmt.executeUpdate("insert into " + prefManager.getFileTableName() + " values ("
+ id + ", '" + fileName + "', 'GCP', '.', 0, null, 1"
+ ",'NONE', 0, null, 0 )");
}
private void insertIntoFileContent(Statement stmt, int fileId, int sectionId, int contentId)
throws Exception {
int position = (fileId + contentId);
stmt.executeUpdate("insert into " + prefManager.getFileContentsTableName()
+ " values (" + contentId + "," + fileId + "," + sectionId + "," + position
+ ", 0, null, null, 0 )");
}
private void insertSection(Statement stmt, int sectionId) throws Exception {
stmt.executeUpdate("insert into " + prefManager.getSectionTableName()
+ " ( SECTION_ID, SELECTION_ID, FAMILY, FIXED_LENGTH, DECIMAL_SEPARATOR)"
+ " values(" + sectionId + ", 0, 'TestTU', 0 , '.')");
}
private void create(String tableName) {
jdbc.advanced().executeCreateTableScriptFile(new File(DATAGEN.getSqlPath(), tableName + ".tab"));
}
}