package liquibase.sqlgenerator.core;

import static org.junit.Assert.assertEquals;
import liquibase.database.Database;
import liquibase.database.core.MSSQLDatabase;
import liquibase.sql.Sql;
import liquibase.statement.core.UpdateStatement;
import liquibase.structure.core.Column;

import org.junit.Test;

public class UpdateGeneratorTest {
    @Test
    public void testGenerateSqlWithParamPlaceholders() {
        // given
        Database database = new MSSQLDatabase();
        UpdateStatement statement = new UpdateStatement(null, null, "DATABASECHANGELOG")
                .addNewColumnValue("MD5SUM", "7:e27bf9c0c2313160ef960a15d44ced47")
                .setWhereClause(
                        database.escapeObjectName("ID", Column.class) + " = ? " +
                        "AND " + database.escapeObjectName("AUTHOR", Column.class) + " = ? " +
                        "AND " + database.escapeObjectName("FILENAME", Column.class) + " = ?")
                .addWhereParameters(
                        "SYPA: AUTO_START tüüp INT -> TEXT, vaartus 0 00 17 * * ?",
                        "martin",
                        "db/changelog.xml");
        UpdateGenerator generator = new UpdateGenerator();

        // when
        Sql[] sqls = generator.generateSql(statement, database, null);

        // then
        assertEquals(
                "UPDATE [DATABASECHANGELOG] " +
                "SET [MD5SUM] = '7:e27bf9c0c2313160ef960a15d44ced47' " +
                "WHERE [ID] = N'SYPA: AUTO_START tüüp INT -> TEXT, vaartus 0 00 17 * * ?' " +
                "AND [AUTHOR] = 'martin' " +
                "AND [FILENAME] = 'db/changelog.xml'",
                sqls[0].toSql());
    }

    @Test
    public void testGenerateSqlWithNameValuePlaceholderPairs() {
        // given
        Database database = new MSSQLDatabase();
        UpdateStatement statement = new UpdateStatement(null, null, "DATABASECHANGELOG")
                .addNewColumnValue("MD5SUM", "7:e27bf9c0c2313160ef960a15d44ced47")
                .setWhereClause(":name = :value AND :name = :value AND :name = :value")
                .addWhereColumnName("ID")
                .addWhereColumnName("AUTHOR")
                .addWhereColumnName("FILENAME")
                .addWhereParameters(
                        "SYPA: AUTO_START tüüp INT -> TEXT, vaartus 0 00 17 * * ?",
                        "martin",
                        "db/changelog.xml");
        UpdateGenerator generator = new UpdateGenerator();

        // when
        Sql[] sqls = generator.generateSql(statement, database, null);

        // then
        assertEquals(
                "UPDATE [DATABASECHANGELOG] " +
                "SET [MD5SUM] = '7:e27bf9c0c2313160ef960a15d44ced47' " +
                "WHERE [ID] = N'SYPA: AUTO_START tüüp INT -> TEXT, vaartus 0 00 17 * * ?' " +
                "AND [AUTHOR] = 'martin' " +
                "AND [FILENAME] = 'db/changelog.xml'",
                sqls[0].toSql());
    }

////    @Test
////    public void addNewColumnValue_nullValue() throws Exception {
////        new DatabaseTestTemplate().testOnAllDatabases(new DatabaseTest() {
////
////            public void performTest(Database database) {
////                UpdateStatement statement = new UpdateStatement(null, TABLE_NAME);
////                statement.addNewColumnValue(COLUMN_NAME, null);
////
////                assertEquals("UPDATE " + database.escapeTableName(null, TABLE_NAME) + " SET " + database.escapeColumnName(null, TABLE_NAME, COLUMN_NAME) + " = NULL", statement.getSqlStatement(database));
////            }
////        });
////    }
//
//    @Test
//    public void execute_altSchema() throws Exception {
//        new DatabaseTestTemplate().testOnAvailableDatabases(new SqlStatementDatabaseTest(TestContext.ALT_SCHEMA,
//                new UpdateStatement(TestContext.ALT_SCHEMA, TABLE_NAME)
//                        .addNewColumnValue(COLUMN_NAME, null)) {
//            protected void preExecuteAssert(DatabaseSnapshotGenerator snapshot) {
//                //nothing to test
//            }
//
//            protected void postExecuteAssert(DatabaseSnapshotGenerator snapshot) {
//                //nothing to test
//            }
//        });
//    }

}
