Implemented a framework for testing database migrations. Unfortunately, I am
not filled with ideas on how to programmatically verify that the primary key migration I've just created a test for is actually working. I can visually inspect the logging output, but that's not useful for catching potential future regressions.
This commit is contained in:
@@ -0,0 +1,113 @@
|
|||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// Depot library - a Java relational persistence library
|
||||||
|
// Copyright (C) 2006-2010 Michael Bayne and Pär Winzell
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or modify it
|
||||||
|
// under the terms of the GNU Lesser General Public License as published
|
||||||
|
// by the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
package com.samskivert.depot;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import com.samskivert.jdbc.DatabaseLiaison;
|
||||||
|
import com.samskivert.util.RandomUtil;
|
||||||
|
|
||||||
|
import com.samskivert.depot.annotation.Id;
|
||||||
|
import com.samskivert.depot.impl.Modifier;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests various migrations.
|
||||||
|
*/
|
||||||
|
public class MigrationTest extends TestBase
|
||||||
|
{
|
||||||
|
public static class PKMigrationRecord extends PersistentRecord
|
||||||
|
{
|
||||||
|
public static final int SCHEMA_VERSION = 2;
|
||||||
|
@Id public int id;
|
||||||
|
/* @Id removed */ public String stringId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPKMigration ()
|
||||||
|
{
|
||||||
|
PersistenceContext pctx = createPersistenceContext("pkmig", PK_DUMP);
|
||||||
|
executeSQL(pctx, PK_INIT); // now that the schema is created, we can populate
|
||||||
|
DepotRepository repo = createRepository(pctx, PKMigrationRecord.class);
|
||||||
|
// trigger the execution of the migrations
|
||||||
|
pctx.initializeRepositories(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Test
|
||||||
|
public void generateDatabaseDump ()
|
||||||
|
{
|
||||||
|
PersistenceContext pctx = createPersistenceContext();
|
||||||
|
DepotRepository repo = createRepository(pctx, PKMigrationRecord.class);
|
||||||
|
|
||||||
|
for (int ii = 1; ii <= 5; ii++) {
|
||||||
|
PKMigrationRecord record = new PKMigrationRecord();
|
||||||
|
record.id = ii;
|
||||||
|
record.stringId = ""+ii;
|
||||||
|
repo.insert(record);
|
||||||
|
}
|
||||||
|
|
||||||
|
executeSQL(pctx, "script 'dump.sql'");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void executeSQL (PersistenceContext ctx, final String sql)
|
||||||
|
{
|
||||||
|
ctx.invoke(new Modifier.Simple() {
|
||||||
|
protected String createQuery (DatabaseLiaison liaison) {
|
||||||
|
return sql;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected DepotRepository createRepository (
|
||||||
|
PersistenceContext pctx, final Class<? extends PersistentRecord> pclass)
|
||||||
|
{
|
||||||
|
return new DepotRepository(pctx) {
|
||||||
|
@Override
|
||||||
|
protected void getManagedRecords (Set<Class<? extends PersistentRecord>> classes) {
|
||||||
|
classes.add(pclass);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static final String[] PK_DUMP = {
|
||||||
|
"CREATE MEMORY TABLE PUBLIC.\"DepotSchemaVersion\"(" +
|
||||||
|
"\"persistentClass\" VARCHAR(255) NOT NULL PRIMARY KEY," +
|
||||||
|
"\"version\" INTEGER NOT NULL," +
|
||||||
|
"\"migratingVersion\" INTEGER NOT NULL," +
|
||||||
|
"UNIQUE(\"persistentClass\"))",
|
||||||
|
|
||||||
|
"CREATE MEMORY TABLE PUBLIC.\"MigrationTest$PKMigrationRecord\"(" +
|
||||||
|
"\"id\" INTEGER DEFAULT 0 NOT NULL," +
|
||||||
|
"\"stringId\" VARCHAR(255) NOT NULL," +
|
||||||
|
"PRIMARY KEY(\"id\",\"stringId\"))",
|
||||||
|
|
||||||
|
"INSERT INTO \"DepotSchemaVersion\" VALUES('MigrationTest$PKMigrationRecord',1,0)"
|
||||||
|
};
|
||||||
|
|
||||||
|
protected static final String PK_INIT =
|
||||||
|
"INSERT INTO \"MigrationTest$PKMigrationRecord\" VALUES(1,'1')\n" +
|
||||||
|
"INSERT INTO \"MigrationTest$PKMigrationRecord\" VALUES(2,'2')\n" +
|
||||||
|
"INSERT INTO \"MigrationTest$PKMigrationRecord\" VALUES(3,'3')\n" +
|
||||||
|
"INSERT INTO \"MigrationTest$PKMigrationRecord\" VALUES(4,'4')\n" +
|
||||||
|
"INSERT INTO \"MigrationTest$PKMigrationRecord\" VALUES(5,'5')\n";
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user