SQLiteDatabaseTest.java revision bdb2b1d336367115dee931221ea77fe1833607da
1package com.xtremelabs.robolectric.shadows;
2
3import android.content.ContentValues;
4import android.database.Cursor;
5import android.database.sqlite.SQLiteDatabase;
6import com.xtremelabs.robolectric.WithTestDefaultsRunner;
7import org.junit.After;
8import org.junit.Before;
9import org.junit.Test;
10import org.junit.runner.RunWith;
11
12import java.sql.ResultSet;
13import java.sql.Statement;
14
15import static com.xtremelabs.robolectric.Robolectric.shadowOf;
16import static org.hamcrest.CoreMatchers.equalTo;
17import static org.hamcrest.CoreMatchers.not;
18import static org.junit.Assert.assertEquals;
19import static org.junit.Assert.assertThat;
20
21@RunWith(WithTestDefaultsRunner.class)
22public class SQLiteDatabaseTest {
23    private SQLiteDatabase database;
24
25    @Before
26    public void setUp() throws Exception {
27        database = SQLiteDatabase.openDatabase("path", null, 0);
28
29        database.execSQL("CREATE TABLE table_name (\n" +
30                "  id INTEGER PRIMARY KEY AUTOINCREMENT,\n" +
31                "  first_column VARCHAR(255),\n" +
32                "  second_column BINARY,\n" +
33                "  name VARCHAR(255),\n" +
34                "  big_int INTEGER\n" +
35                ");");
36    }
37
38    @After
39    public void tearDown() throws Exception {
40        database.close();
41    }
42
43    @Test
44    public void testInsertAndQuery() throws Exception {
45        String stringColumnValue = "column_value";
46        byte[] byteColumnValue = new byte[]{1, 2, 3};
47
48        ContentValues values = new ContentValues();
49
50        values.put("first_column", stringColumnValue);
51        values.put("second_column", byteColumnValue);
52
53        database.insert("table_name", null, values);
54
55        Cursor cursor = database.query("table_name", new String[]{"second_column", "first_column"}, null, null, null, null, null);
56
57        assertThat(cursor.moveToFirst(), equalTo(true));
58
59        byte[] byteValueFromDatabase = cursor.getBlob(0);
60        String stringValueFromDatabase = cursor.getString(1);
61
62        assertThat(stringValueFromDatabase, equalTo(stringColumnValue));
63        assertThat(byteValueFromDatabase, equalTo(byteColumnValue));
64    }
65
66    @Test
67    public void testInsertAndRawQuery() throws Exception {
68        String stringColumnValue = "column_value";
69        byte[] byteColumnValue = new byte[]{1, 2, 3};
70
71        ContentValues values = new ContentValues();
72
73        values.put("first_column", stringColumnValue);
74        values.put("second_column", byteColumnValue);
75
76        database.insert("table_name", null, values);
77
78        Cursor cursor = database.rawQuery("select second_column, first_column from table_name", null);
79
80        assertThat(cursor.moveToFirst(), equalTo(true));
81
82        byte[] byteValueFromDatabase = cursor.getBlob(0);
83        String stringValueFromDatabase = cursor.getString(1);
84
85        assertThat(stringValueFromDatabase, equalTo(stringColumnValue));
86        assertThat(byteValueFromDatabase, equalTo(byteColumnValue));
87    }
88
89    @Test
90    public void testEmptyTable() throws Exception {
91        Cursor cursor = database.query("table_name", new String[]{"second_column", "first_column"}, null, null, null, null, null);
92
93        assertThat(cursor.moveToFirst(), equalTo(false));
94    }
95
96    @Test
97    public void testInsertRowIdGeneration() throws Exception {
98        ContentValues values = new ContentValues();
99        values.put("name", "Chuck");
100
101        long id = database.insert("table_name", null, values);
102
103        assertThat(id, not(equalTo(0L)));
104    }
105
106    @Test
107    public void testInsertKeyGeneration() throws Exception {
108        ContentValues values = new ContentValues();
109        values.put("name", "Chuck");
110
111        long key = database.insertWithOnConflict("table_name", null, values, SQLiteDatabase.CONFLICT_IGNORE);
112
113        assertThat(key, not(equalTo(0L)));
114    }
115
116    @Test
117    public void testUpdate() throws Exception {
118        addChuck();
119
120        assertThat(updateName(1234L, "Buster"), equalTo(1));
121
122        Cursor cursor = database.query("table_name", new String[]{"id", "name"}, null, null, null, null, null);
123        assertThat(cursor.moveToFirst(), equalTo(true));
124        assertThat(cursor.getCount(), equalTo(1));
125
126        assertIdAndName(cursor, 1234L, "Buster");
127    }
128
129    @Test
130    public void testUpdateNoMatch() throws Exception {
131        addChuck();
132
133        assertThat(updateName(5678L, "Buster"), equalTo(0));
134
135        Cursor cursor = database.query("table_name", new String[]{"id", "name"}, null, null, null, null, null);
136        assertThat(cursor.moveToFirst(), equalTo(true));
137        assertThat(cursor.getCount(), equalTo(1));
138
139        assertIdAndName(cursor, 1234L, "Chuck");
140    }
141
142    @Test
143    public void testUpdateAll() throws Exception {
144        addChuck();
145        addJulie();
146
147        assertThat(updateName("Belvedere"), equalTo(2));
148
149        Cursor cursor = database.query("table_name", new String[]{"id", "name"}, null, null, null, null, null);
150        assertThat(cursor.moveToFirst(), equalTo(true));
151        assertThat(cursor.getCount(), equalTo(2));
152
153        assertIdAndName(cursor, 1234L, "Belvedere");
154        assertThat(cursor.moveToNext(), equalTo(true));
155
156        assertIdAndName(cursor, 1235L, "Belvedere");
157        assertThat(cursor.moveToNext(), equalTo(false));
158    }
159
160    @Test
161    public void testDelete() throws Exception {
162        addChuck();
163
164        int deleted = database.delete("table_name", "id=1234", null);
165        assertThat(deleted, equalTo(1));
166
167        assertEmptyDatabase();
168    }
169
170    @Test
171    public void testDeleteNoMatch() throws Exception {
172        addChuck();
173
174        int deleted = database.delete("table_name", "id=5678", null);
175        assertThat(deleted, equalTo(0));
176
177        assertNonEmptyDatabase();
178    }
179
180    @Test
181    public void testDeleteAll() throws Exception {
182        addChuck();
183        addJulie();
184
185        int deleted = database.delete("table_name", "1", null);
186        assertThat(deleted, equalTo(2));
187
188        assertEmptyDatabase();
189    }
190
191    @Test
192    public void testExecSQL() throws Exception {
193        Statement statement;
194        ResultSet resultSet;
195
196        database.execSQL("INSERT INTO table_name (id, name) VALUES(1234, 'Chuck');");
197
198        statement = shadowOf(database).getConnection().createStatement();
199        resultSet = statement.executeQuery("SELECT COUNT(*) FROM table_name");
200        assertThat(resultSet.next(), equalTo(true));
201        assertThat(resultSet.getInt(1), equalTo(1));
202
203        statement = shadowOf(database).getConnection().createStatement();
204        resultSet = statement.executeQuery("SELECT * FROM table_name");
205     //   assertThat(resultSet.first(), equalTo(true));
206        assertThat(resultSet.next(), equalTo(true));
207        assertThat(resultSet.getInt(1), equalTo(1234));
208        assertThat(resultSet.getString(4), equalTo("Chuck"));
209    }
210
211    @Test(expected = android.database.SQLException.class)
212    public void testExecSQLException() throws Exception {
213        database.execSQL("INSERT INTO table_name;");    // invalid SQL
214    }
215
216    @Test
217    public void testExecSQLAutoIncrementSQLite() throws Exception {
218        database.execSQL("CREATE TABLE auto_table (id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(255));");
219
220        ContentValues values = new ContentValues();
221        values.put("name", "Chuck");
222
223        long key = database.insert("auto_table", null, values);
224        assertThat(key, not(equalTo(0L)));
225
226        long key2 = database.insert("auto_table", null, values);
227        assertThat(key2, not(equalTo(key)));
228    }
229
230    @Test(expected = IllegalStateException.class)
231    public void testClose() throws Exception {
232        database.close();
233
234        database.execSQL("INSERT INTO table_name (id, name) VALUES(1234, 'Chuck');");
235    }
236
237    @Test
238    public void testIsOpen() throws Exception {
239        assertThat(database.isOpen(), equalTo(true));
240        database.close();
241        assertThat(database.isOpen(), equalTo(false));
242    }
243
244    @Test
245    public void shouldStoreGreatBigHonkinIntegersCorrectly() throws Exception {
246        database.execSQL("INSERT INTO table_name(big_int) VALUES(1234567890123456789);");
247        Cursor cursor = database.query("table_name", new String[]{"big_int"}, null, null, null, null, null);
248        assertEquals(1234567890123456789L, cursor.getLong(0));
249    }
250
251    private void addChuck() {
252        addPerson(1234L, "Chuck");
253    }
254
255    private void addJulie() {
256        addPerson(1235L, "Julie");
257    }
258
259    private void addPerson(long id, String name) {
260        ContentValues values = new ContentValues();
261        values.put("id", id);
262        values.put("name", name);
263        database.insert("table_name", null, values);
264    }
265
266    private int updateName(long id, String name) {
267        ContentValues values = new ContentValues();
268        values.put("name", name);
269        return database.update("table_name", values, "id=" + id, null);
270    }
271
272    private int updateName(String name) {
273        ContentValues values = new ContentValues();
274        values.put("name", name);
275        return database.update("table_name", values, null, null);
276    }
277
278    private void assertIdAndName(Cursor cursor, long id, String name) {
279        long idValueFromDatabase;
280        String stringValueFromDatabase;
281
282        idValueFromDatabase = cursor.getLong(0);
283        stringValueFromDatabase = cursor.getString(1);
284        assertThat(idValueFromDatabase, equalTo(id));
285        assertThat(stringValueFromDatabase, equalTo(name));
286    }
287
288    private void assertEmptyDatabase() {
289        Cursor cursor = database.query("table_name", new String[]{"id", "name"}, null, null, null, null, null);
290        assertThat(cursor.moveToFirst(), equalTo(false));
291        assertThat(cursor.isClosed(), equalTo(true));
292        assertThat(cursor.getCount(), equalTo(0));
293    }
294
295    private void assertNonEmptyDatabase() {
296        Cursor cursor = database.query("table_name", new String[]{"id", "name"}, null, null, null, null, null);
297        assertThat(cursor.moveToFirst(), equalTo(true));
298        assertThat(cursor.getCount(), not(equalTo(0)));
299    }
300}
301