create migrations table via built-in migration
This commit is contained in:
@@ -12,11 +12,12 @@ public class DatabaseOptions {
|
||||
protected final String password;
|
||||
|
||||
protected final String migrationsPackage;
|
||||
protected final String migrationsTableName;
|
||||
|
||||
protected final String host;
|
||||
protected final String database;
|
||||
|
||||
public DatabaseOptions(String url, String user, String password, String migrationsPackage) {
|
||||
public DatabaseOptions(String url, String user, String password, String migrationsPackage, String migrationsTableName) {
|
||||
this.url = url;
|
||||
this.user = user;
|
||||
this.password = password;
|
||||
@@ -24,6 +25,7 @@ public class DatabaseOptions {
|
||||
host = extractHost(url);
|
||||
database = extractDatabase(url);
|
||||
this.migrationsPackage = migrationsPackage;
|
||||
this.migrationsTableName = migrationsTableName == null || migrationsTableName.isBlank() ? "__jef_migration_log" : migrationsTableName;
|
||||
}
|
||||
|
||||
private static String extractHost(String url) {
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
package jef.platform.base.migration;
|
||||
|
||||
import jef.model.migration.Migration;
|
||||
import jef.model.migration.MigrationBuilder;
|
||||
import jef.model.migration.operation.AddFieldOperation;
|
||||
import jef.platform.base.SqlTypeMapper;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@AllArgsConstructor
|
||||
@EqualsAndHashCode//needed for test
|
||||
public class M00010101000000_MigrationsLogTableMigration implements Migration {
|
||||
private final SqlTypeMapper typeMapper;
|
||||
private final String tableName;
|
||||
|
||||
@Override
|
||||
public void up(MigrationBuilder migrationBuilder) {//TODO add timestamp later
|
||||
migrationBuilder.addTable(tableName, List.of(
|
||||
new AddFieldOperation.Builder(tableName, "migration").notNull(true).sqlType(typeMapper.map(String.class.getName()).orElseThrow()),
|
||||
new AddFieldOperation.Builder(tableName, "version").notNull(true).sqlType(typeMapper.map(String.class.getName()).orElseThrow())
|
||||
));
|
||||
migrationBuilder.addUniqueKey("U_" + tableName + "_migration", tableName, List.of("migration"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void down(MigrationBuilder migrationBuilder) {
|
||||
migrationBuilder.dropConstraint("U_" + tableName + "_migration", tableName);
|
||||
migrationBuilder.dropTable(tableName);
|
||||
}
|
||||
}
|
||||
@@ -121,7 +121,9 @@ public abstract class MigrationApplier {
|
||||
|
||||
protected abstract boolean migrationsTableExists() throws SQLException;
|
||||
|
||||
protected abstract void createMigrationsTable() throws SQLException;//TODO use a hardcoded migration
|
||||
protected void createMigrationsTable() throws MigrationException {
|
||||
applyMigration(new M00010101000000_MigrationsLogTableMigration(sqlPlatform.getTypeMapper(), options.getMigrationsTableName()));
|
||||
}
|
||||
|
||||
protected abstract List<String> getAppliedMigrations() throws SQLException;//TODO dbset to load later
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ public class NullMigrationApplier extends MigrationApplier {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void createMigrationsTable() throws SQLException {
|
||||
protected void createMigrationsTable() throws MigrationException {
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -6,6 +6,7 @@ import jef.model.migration.MigrationBuilder;
|
||||
import jef.model.migration.operation.MigrationOperation;
|
||||
import jef.platform.SqlPlatform;
|
||||
import jef.platform.base.DatabaseOptions;
|
||||
import jef.platform.base.SqlTypeMapper;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
@@ -347,5 +348,52 @@ class MigrationApplierTest {
|
||||
|
||||
|
||||
//assert
|
||||
|
||||
}//TODO after function rewrite
|
||||
|
||||
@Test
|
||||
void createMigrationsTable_success() throws MigrationException {
|
||||
//setup
|
||||
var mapper = mock(SqlTypeMapper.class);
|
||||
doReturn(mapper).when(platform).getTypeMapper();
|
||||
|
||||
var migrationTableName = "migrationtable";
|
||||
doReturn(migrationTableName).when(options).getMigrationsTableName();
|
||||
doNothing().when(applier).applyMigration(new M00010101000000_MigrationsLogTableMigration(mapper, migrationTableName));
|
||||
|
||||
//test
|
||||
applier.createMigrationsTable();
|
||||
|
||||
//assert
|
||||
verify(applier, times(1)).createMigrationsTable();
|
||||
verify(platform, times(1)).getTypeMapper();
|
||||
verify(options, times(1)).getMigrationsTableName();
|
||||
verify(applier, times(1)).applyMigration(new M00010101000000_MigrationsLogTableMigration(mapper, migrationTableName));
|
||||
verifyNoMoreInteractions(allMocks);
|
||||
}
|
||||
|
||||
@Test
|
||||
void createMigrationsTable_applyMigrationThrowsMigrationException() throws MigrationException {
|
||||
//setup
|
||||
var mapper = mock(SqlTypeMapper.class);
|
||||
doReturn(mapper).when(platform).getTypeMapper();
|
||||
|
||||
var migrationTableName = "migrationtable";
|
||||
doReturn(migrationTableName).when(options).getMigrationsTableName();
|
||||
|
||||
var exception = new MigrationException("reason");
|
||||
doThrow(exception).when(applier).applyMigration(new M00010101000000_MigrationsLogTableMigration(mapper, migrationTableName));
|
||||
|
||||
//test
|
||||
var thrown = assertThrows(MigrationException.class, () -> applier.createMigrationsTable());
|
||||
|
||||
//assert
|
||||
assertSame(exception, thrown);
|
||||
|
||||
verify(applier, times(1)).createMigrationsTable();
|
||||
verify(platform, times(1)).getTypeMapper();
|
||||
verify(options, times(1)).getMigrationsTableName();
|
||||
verify(applier, times(1)).applyMigration(new M00010101000000_MigrationsLogTableMigration(mapper, migrationTableName));
|
||||
verifyNoMoreInteractions(allMocks);
|
||||
}
|
||||
}
|
||||
@@ -44,7 +44,7 @@ class NullMigrationApplierTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
void createMigrationsTable() throws SQLException {
|
||||
void createMigrationsTable() throws MigrationException {
|
||||
NullMigrationApplier.INSTANCE.createMigrationsTable();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user