package com.todoroo.astrid.sync; import android.text.TextUtils; import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.Table; import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.sql.Query; import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.RemoteModelDao; import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.RemoteModel; import com.todoroo.astrid.data.TagData; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.tags.Astrid44SyncMigrator; import com.todoroo.astrid.tags.TagMetadata; public class Astrid44MigrationTest extends NewSyncTestCase { @Autowired private MetadataDao metadataDao; public void testAstrid44Migration() { setupOldDatabase(); new Astrid44SyncMigrator().performMigration(); assertAllModelsHaveRemoteId(); assertAllTagsHaveTagData(); assertAllMetadataHasAllFields(); } private void setupOldDatabase() { // Init 5 unsynced tasks and tags for (int i = 1; i <= 5; i++) { Task task = createTask("Task " + i); task.setValue(Task.REMOTE_ID, null); taskDao.save(task); TagData tag = createTagData("Tag " + i); tag.setValue(TagData.REMOTE_ID, null); tagDataDao.saveExisting(tag); } Metadata m = new Metadata(); m.setValue(Metadata.KEY, TagMetadata.KEY); m.setValue(Metadata.TASK, 1L); m.setValue(TagMetadata.TAG_NAME, "Tag 1"); metadataDao.createNew(m); m.clear(); m.setValue(Metadata.KEY, TagMetadata.KEY); m.setValue(Metadata.TASK, 2L); m.setValue(TagMetadata.TAG_NAME, "New tag"); metadataDao.createNew(m); m.clear(); m.setValue(Metadata.KEY, TagMetadata.KEY); m.setValue(Metadata.TASK, 3L); m.setValue(TagMetadata.TAG_NAME, "Tag 3"); metadataDao.createNew(m); m.clear(); m.setValue(Metadata.KEY, TagMetadata.KEY); m.setValue(Metadata.TASK, 3L); m.setValue(TagMetadata.TAG_NAME, "Tag 4"); metadataDao.createNew(m); m.clear(); m.setValue(Metadata.KEY, TagMetadata.KEY); m.setValue(Metadata.TASK, 5L); m.setValue(TagMetadata.TAG_NAME, "Tag 1"); metadataDao.createNew(m); m.clear(); m.setValue(Metadata.KEY, TagMetadata.KEY); m.setValue(Metadata.TASK, 5L); m.setValue(TagMetadata.TAG_NAME, "Tag 5"); metadataDao.createNew(m); m.setValue(Metadata.KEY, TagMetadata.KEY); m.setValue(Metadata.TASK, 5L); m.setValue(TagMetadata.TAG_NAME, "New tag 2"); metadataDao.createNew(m); // State (task: tags) // Task 1: Tag 1 // Task 2: New tag // Task 3: Tag 3, Tag 4 // Task 4: (nothing) // Task 5: Tag 5, New tag 2 } private void assertAllModelsHaveRemoteId() { assertRemoteIds(Task.TABLE, new Task(), taskDao, Task.ID, Task.REMOTE_ID); assertRemoteIds(TagData.TABLE, new TagData(), tagDataDao, TagData.ID, TagData.REMOTE_ID); } private void assertRemoteIds(Table table, TYPE instance, RemoteModelDao dao, Property... properties) { TodorooCursor cursor = dao.query(Query.select(properties).from(table)); try { for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { instance.clear(); instance.readPropertiesFromCursor(cursor); Long remoteId = instance.getValue(RemoteModel.REMOTE_ID_PROPERTY); if (remoteId == null || remoteId == 0) { fail(instance.getClass().getName() + instance.getId() + " didn't have a remote id"); } } } finally { cursor.close(); } } private void assertAllTagsHaveTagData() { for (int i = 1; i <= 5; i++) { String name = "Tag " + i; assertTagForName(name); } assertTagForName("New tag"); assertTagForName("New tag 2"); } private void assertTagForName(String name) { TodorooCursor tagData = tagDataDao.query(Query.select(TagData.NAME).where(TagData.NAME.eq(name))); try { assertEquals(tagData.getCount(), 1); } finally { tagData.close(); } } private void assertAllMetadataHasAllFields() { TodorooCursor tagMetadata = metadataDao.query(Query.select(Metadata.PROPERTIES) .where(MetadataCriteria.withKey(TagMetadata.KEY))); try { assertEquals(tagMetadata.getCount(), 7); Metadata m = new Metadata(); for (tagMetadata.moveToFirst(); !tagMetadata.isAfterLast(); tagMetadata.moveToNext()) { m.readFromCursor(tagMetadata); assertTrue(!TextUtils.isEmpty(m.getValue(TagMetadata.TAG_NAME))); assertTrue(m.getValue(TagMetadata.TASK_UUID) != 0); assertTrue(m.getValue(TagMetadata.TAG_UUID) != 0); } } finally { tagMetadata.close(); } } }