package de.westnordost.streetcomplete.data.osm.persist; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteStatement; import java.util.ArrayList; import de.westnordost.streetcomplete.data.AndroidDbTestCase; import de.westnordost.osmapi.map.data.Element; import static org.mockito.Mockito.*; public class AOsmElementDaoTest extends AndroidDbTestCase { private static final String TABLE_NAME = "test"; private static final String ID_COL = "id"; private static final String VERSION_COL = "version"; private static final String TESTDB = "testdb.db"; private TestOsmElementDao dao; private SQLiteOpenHelper dbHelper; public AOsmElementDaoTest() { super(TESTDB); } @Override public void setUp() { super.setUp(); dbHelper = new TestDbHelper(getContext()); dao = new TestOsmElementDao(dbHelper); } @Override public void tearDown() { // first close, then call super (= delete database) to avoid warning dbHelper.close(); super.tearDown(); } public void testPutGet() { dao.put(createElement(6,1)); assertEquals(6,dao.get(6).getId()); assertEquals(1,dao.get(6).getVersion()); } public void testPutAll() { ArrayList<Element> elements = new ArrayList<>(); elements.add(createElement(1,2)); elements.add(createElement(2,2)); dao.putAll(elements); assertNotNull(dao.get(1)); assertNotNull(dao.get(2)); } public void testPutOverwrite() { dao.put(createElement(6,0)); dao.put(createElement(6,5)); assertEquals(5,dao.get(6).getVersion()); } public void testGetNull() { assertNull(dao.get(6)); } public void testDelete() { dao.put(createElement(6,0)); dao.delete(6); assertNull(dao.get(6)); } private class TestDbHelper extends SQLiteOpenHelper { public TestDbHelper(Context context) { super(context, TESTDB, null, 1); } @Override public void onCreate(SQLiteDatabase db) { // the AOsmElementDao is tied to the quest table... but we only need the id and type db.execSQL("CREATE TABLE " + OsmQuestTable.NAME + " (" + OsmQuestTable.Columns.ELEMENT_ID + " int NOT NULL, " + OsmQuestTable.Columns.ELEMENT_TYPE + " varchar(255) NOT NULL " + ");"); db.execSQL("INSERT INTO "+OsmQuestTable.NAME + " (" + OsmQuestTable.Columns.ELEMENT_ID + ", " + OsmQuestTable.Columns.ELEMENT_TYPE + ") VALUES " + "(1, \""+Element.Type.NODE.name()+"\");"); db.execSQL("CREATE TABLE "+TABLE_NAME+" ( " + ID_COL+" int PRIMARY KEY, " + VERSION_COL+" int);"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } } private class TestOsmElementDao extends AOsmElementDao<Element> { public TestOsmElementDao(SQLiteOpenHelper dbHelper) { super(dbHelper); } @Override protected String getElementTypeName() { return Element.Type.NODE.name(); } @Override protected String getTableName() { return TABLE_NAME; } @Override protected String getIdColumnName() { return ID_COL; } @Override protected void executeInsert(Element e) { SQLiteDatabase db = dbHelper.getWritableDatabase(); SQLiteStatement insert = db.compileStatement( "INSERT OR REPLACE INTO " + TABLE_NAME + "("+ID_COL+","+VERSION_COL+") VALUES (?,?)"); insert.bindLong(1, e.getId()); insert.bindLong(2, e.getVersion()); insert.executeInsert(); } @Override protected Element createObjectFrom(Cursor cursor) { return createElement(cursor.getLong(0), cursor.getInt(1)); } } private Element createElement(long id, int version) { Element element = mock(Element.class); when(element.getId()).thenReturn(id); when(element.getVersion()).thenReturn(version); return element; } }