package com.evancharlton.mileage.provider; import java.util.ArrayList; import java.util.Calendar; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.evancharlton.mileage.dao.Vehicle; import com.evancharlton.mileage.provider.tables.ContentTable; import com.evancharlton.mileage.provider.tables.VehiclesTable; import com.evancharlton.mileage.tests.TestCase; /** * Verifies that a database can be successfully upgraded from a previous version * of Mileage. All the database-creation code was pulled from the previous * versions, so it should be accurate. * */ public class DatabaseUpgraderTest extends TestCase { // version 1.X public void testUpgradeFromVersion1X_EmptyDatabase() { SQLiteDatabase db = createDatabaseForVersion(3); DatabaseUpgrader.upgradeDatabase(db); verifyDatabase(db); db.close(); } public void testUpgradeFromVersion1X_Vehicles() { SQLiteDatabase db = createDatabaseForVersion(3); verifyVehicles(db); db.close(); } // version 2.X public void testUpgradeFromVersion2X_EmptyDatabase() { SQLiteDatabase db = createDatabaseForVersion(4); DatabaseUpgrader.upgradeDatabase(db); verifyDatabase(db); db.close(); } public void testUpgradeFromVersion2X_Vehicles() { SQLiteDatabase db = createDatabaseForVersion(4); verifyVehicles(db); db.close(); } private void verifyVehicles(SQLiteDatabase db) { db.execSQL("INSERT INTO vehicles (make, model, year) VALUES ('make', 'model', '2345');"); db.execSQL("INSERT INTO vehicles (make, model, year, title) VALUES ('test_make', 'test_model', '1234', 'test_title')"); DatabaseUpgrader.upgradeDatabase(db); verifyDatabase(db); String[] columns = new String[] { Vehicle.MAKE, Vehicle.MODEL, Vehicle.TITLE, Vehicle.YEAR, Vehicle.VEHICLE_TYPE }; Cursor cursor = db.query(VehiclesTable.TABLE_NAME, columns, null, null, null, null, null); cursor.moveToLast(); assertEquals("test_make", cursor.getString(0)); assertEquals("test_model", cursor.getString(1)); assertEquals("test_title", cursor.getString(2)); assertEquals(1234, cursor.getLong(3)); assertEquals(1, cursor.getLong(4)); cursor.moveToPrevious(); assertEquals("make", cursor.getString(0)); assertEquals("model", cursor.getString(1)); assertEquals(2345, cursor.getLong(3)); assertEquals("2345 make model", cursor.getString(2)); cursor.close(); } private void verifyDatabase(SQLiteDatabase db) { assertEquals(FillUpsProvider.DATABASE_VERSION, db.getVersion()); Cursor cursor = db.query("sqlite_master", new String[] { "name" }, "type = ?", new String[] { "table" }, null, null, null); ArrayList<String> tables = new ArrayList<String>(); while (cursor.moveToNext()) { String tableName = cursor.getString(0); tables.add(tableName); assertFalse(tableName.startsWith("OLD_")); } for (ContentTable table : FillUpsProvider.TABLES) { assertTrue(tables.contains(table.getTableName())); } cursor.close(); } /** * Returns a database that matches <code>version</version> application's * schema. * * @param version database version * @return a database for that version of the application. */ private SQLiteDatabase createDatabaseForVersion(int version) { SQLiteDatabase db = SQLiteDatabase.create(null); db.setVersion(version); final StringBuilder sql = new StringBuilder(); if (version >= 3) { sql.append("CREATE TABLE fillups ("); sql.append("_id INTEGER PRIMARY KEY AUTOINCREMENT,"); sql.append("cost DOUBLE,"); sql.append("amount DOUBLE,"); sql.append("mileage DOUBLE,"); sql.append("vehicle_id INTEGER,"); sql.append("date INTEGER,"); sql.append("latitude DOUBLE,"); sql.append("longitude DOUBLE,"); sql.append("comment TEXT"); sql.append(");"); db.execSQL(sql.toString()); sql.setLength(0); sql.append("CREATE TABLE vehicles ("); sql.append("_id INTEGER PRIMARY KEY AUTOINCREMENT,"); sql.append("make TEXT,"); sql.append("model TEXT,"); sql.append("title TEXT,"); sql.append("year TEXT,"); sql.append("def INTEGER"); sql.append(");"); db.execSQL(sql.toString()); sql.setLength(0); sql.append("INSERT INTO vehicles (make, model, year, title, def)"); sql.append(" VALUES "); sql.append("('Make', 'Model', '"); sql.append(Calendar.getInstance().get(Calendar.YEAR)); sql.append("', 'Default Vehicle', '").append(System.currentTimeMillis()).append("');"); db.execSQL(sql.toString()); } if (version >= 4) { sql.setLength(0); sql.append("ALTER TABLE fillups ADD COLUMN ").append("is_partial INTEGER;"); db.execSQL(sql.toString()); sql.setLength(0); sql.append("ALTER TABLE fillups ADD COLUMN ").append("restart INTEGER;"); db.execSQL(sql.toString()); sql.setLength(0); sql.append("ALTER TABLE vehicles ADD COLUMN ").append("distance INTEGER DEFAULT -1;"); db.execSQL(sql.toString()); sql.setLength(0); sql.append("ALTER TABLE vehicles ADD COLUMN ").append("volume INTEGER DEFAULT -1;"); db.execSQL(sql.toString()); sql.setLength(0); sql.append("CREATE TABLE maintenance_intervals ("); sql.append("_id INTEGER PRIMARY KEY AUTOINCREMENT,"); sql.append("creation_date INTEGER,"); sql.append("creation_odometer DOUBLE,"); sql.append("description TEXT,"); sql.append("interval_distance DOUBLE,"); sql.append("interval_duration INTEGER,"); sql.append("vehicle_id INTEGER,"); sql.append("is_repeating INTEGER"); sql.append(");"); db.execSQL(sql.toString()); sql.setLength(0); sql.append("CREATE TABLE version ("); sql.append("version INTEGER"); sql.append(");"); db.execSQL(sql.toString()); } if (version >= 5) { } return db; } }