Done lesson 4a: testing
authorNeil Smith <neil.git@njae.me.uk>
Sun, 9 Nov 2014 16:55:07 +0000 (16:55 +0000)
committerNeil Smith <neil.git@njae.me.uk>
Sun, 9 Nov 2014 16:55:07 +0000 (16:55 +0000)
app/src/androidTest/java/uk/me/njae/sunshine/TestDb.java

index d47e534f35afa729b8942693864007a6fd41ddca..73353e84bf85be93f80f5ae97b597e70ae3a87ff 100644 (file)
@@ -6,6 +6,9 @@ import android.database.sqlite.SQLiteDatabase;
 import android.test.AndroidTestCase;
 import android.util.Log;
 
+import java.util.Map;
+import java.util.Set;
+
 import uk.me.njae.sunshine.data.WeatherContract.LocationEntry;
 import uk.me.njae.sunshine.data.WeatherContract.WeatherEntry;
 import uk.me.njae.sunshine.data.WeatherDbHelper;
@@ -36,14 +39,10 @@ public class TestDb extends AndroidTestCase {
         SQLiteDatabase db = dbHelper.getWritableDatabase();
 
         // Create a new map of values, where column names are the keys
-        ContentValues values = new ContentValues();
-        values.put(LocationEntry.COLUMN_LOCATION_SETTING, testLocationSetting);
-        values.put(LocationEntry.COLUMN_CITY_NAME, testCityName);
-        values.put(LocationEntry.COLUMN_COORD_LAT, testLatitude);
-        values.put(LocationEntry.COLUMN_COORD_LONG, testLongitude);
+        ContentValues locationTestValues = createNorthPoleLocationValues();
 
         long locationRowId;
-        locationRowId = db.insert(LocationEntry.TABLE_NAME, null, values);
+        locationRowId = db.insert(LocationEntry.TABLE_NAME, null, locationTestValues);
 
         // Verify we got a row back.
         assertTrue(locationRowId != -1);
@@ -52,19 +51,10 @@ public class TestDb extends AndroidTestCase {
         // Data's inserted.  IN THEORY.  Now pull some out to stare at it and verify it made
         // the round trip.
 
-        // Specify which columns you want.
-        String[] columns = {
-                LocationEntry._ID,
-                LocationEntry.COLUMN_LOCATION_SETTING,
-                LocationEntry.COLUMN_CITY_NAME,
-                LocationEntry.COLUMN_COORD_LAT,
-                LocationEntry.COLUMN_COORD_LONG
-        };
-
         // A cursor is your primary interface to the query results.
         Cursor cursor = db.query(
                 LocationEntry.TABLE_NAME,  // Table to Query
-                columns,
+                null, // All columns
                 null, // Columns for the "where" clause
                 null, // Values for the "where" clause
                 null, // columns to group by
@@ -72,49 +62,13 @@ public class TestDb extends AndroidTestCase {
                 null // sort order
         );
 
-        // If possible, move to the first row of the query results.
-        if (cursor.moveToFirst()) {
-            // Get the value in each column by finding the appropriate column index.
-            int locationIndex = cursor.getColumnIndex(LocationEntry.COLUMN_LOCATION_SETTING);
-            String location = cursor.getString(locationIndex);
-
-            int nameIndex = cursor.getColumnIndex((LocationEntry.COLUMN_CITY_NAME));
-            String name = cursor.getString(nameIndex);
-
-            int latIndex = cursor.getColumnIndex((LocationEntry.COLUMN_COORD_LAT));
-            double latitude = cursor.getDouble(latIndex);
-
-            int longIndex = cursor.getColumnIndex((LocationEntry.COLUMN_COORD_LONG));
-            double longitude = cursor.getDouble(longIndex);
-
-            // Hooray, data was returned!  Assert that it's the right data, and that the database
-            // creation code is working as intended.
-            // Then take a break.  We both know that wasn't easy.
-            assertEquals(testCityName, name);
-            assertEquals(testLocationSetting, location);
-            assertEquals(testLatitude, latitude);
-            assertEquals(testLongitude, longitude);
-
-            // Fantastic.  Now that we have a location, add some weather!
-        } else {
-            // That's weird, it works on MY machine...
-            fail("No values returned :(");
-        }
+         validateCursor(cursor, locationTestValues);
 
         // Fantastic.  Now that we have a location, add some weather!
-        ContentValues weatherValues = new ContentValues();
-        weatherValues.put(WeatherEntry.COLUMN_LOC_KEY, locationRowId);
-        weatherValues.put(WeatherEntry.COLUMN_DATETEXT, "20141205");
-        weatherValues.put(WeatherEntry.COLUMN_DEGREES, 1.1);
-        weatherValues.put(WeatherEntry.COLUMN_HUMIDITY, 1.2);
-        weatherValues.put(WeatherEntry.COLUMN_PRESSURE, 1.3);
-        weatherValues.put(WeatherEntry.COLUMN_MAX_TEMP, 75);
-        weatherValues.put(WeatherEntry.COLUMN_MIN_TEMP, 65);
-        weatherValues.put(WeatherEntry.COLUMN_SHORT_DESC, "Asteroids");
-        weatherValues.put(WeatherEntry.COLUMN_WIND_SPEED, 5.5);
-        weatherValues.put(WeatherEntry.COLUMN_WEATHER_ID, 321);
 
-        long weatherRowId = db.insert(WeatherEntry.TABLE_NAME, null, weatherValues);
+        ContentValues weatherTestValues = createWeatherValues(locationRowId);
+
+        long weatherRowId = db.insert(WeatherEntry.TABLE_NAME, null, weatherTestValues);
         assertTrue(weatherRowId != -1);
 
         // A cursor is your primary interface to the query results.
@@ -128,32 +82,52 @@ public class TestDb extends AndroidTestCase {
                 null  // sort order
         );
 
-        if (!weatherCursor.moveToFirst()) {
-            fail("No weather data returned!");
-        }
-
-        assertEquals(weatherCursor.getInt(
-                weatherCursor.getColumnIndex(WeatherEntry.COLUMN_LOC_KEY)), locationRowId);
-        assertEquals(weatherCursor.getString(
-                weatherCursor.getColumnIndex(WeatherEntry.COLUMN_DATETEXT)), "20141205");
-        assertEquals(weatherCursor.getDouble(
-                weatherCursor.getColumnIndex(WeatherEntry.COLUMN_DEGREES)), 1.1);
-        assertEquals(weatherCursor.getDouble(
-                weatherCursor.getColumnIndex(WeatherEntry.COLUMN_HUMIDITY)), 1.2);
-        assertEquals(weatherCursor.getDouble(
-                weatherCursor.getColumnIndex(WeatherEntry.COLUMN_PRESSURE)), 1.3);
-        assertEquals(weatherCursor.getInt(
-                weatherCursor.getColumnIndex(WeatherEntry.COLUMN_MAX_TEMP)), 75);
-        assertEquals(weatherCursor.getInt(
-                weatherCursor.getColumnIndex(WeatherEntry.COLUMN_MIN_TEMP)), 65);
-        assertEquals(weatherCursor.getString(
-                weatherCursor.getColumnIndex(WeatherEntry.COLUMN_SHORT_DESC)), "Asteroids");
-        assertEquals(weatherCursor.getDouble(
-                weatherCursor.getColumnIndex(WeatherEntry.COLUMN_WIND_SPEED)), 5.5);
-        assertEquals(weatherCursor.getInt(
-                weatherCursor.getColumnIndex(WeatherEntry.COLUMN_WEATHER_ID)), 321);
+        validateCursor(weatherCursor, weatherTestValues);
 
         weatherCursor.close();
         dbHelper.close();
     }
+
+    static ContentValues createWeatherValues(long locationRowId) {
+        ContentValues weatherValues = new ContentValues();
+        weatherValues.put(WeatherEntry.COLUMN_LOC_KEY, locationRowId);
+        weatherValues.put(WeatherEntry.COLUMN_DATETEXT, "20141205");
+        weatherValues.put(WeatherEntry.COLUMN_DEGREES, 1.1);
+        weatherValues.put(WeatherEntry.COLUMN_HUMIDITY, 1.2);
+        weatherValues.put(WeatherEntry.COLUMN_PRESSURE, 1.3);
+        weatherValues.put(WeatherEntry.COLUMN_MAX_TEMP, 75);
+        weatherValues.put(WeatherEntry.COLUMN_MIN_TEMP, 65);
+        weatherValues.put(WeatherEntry.COLUMN_SHORT_DESC, "Asteroids");
+        weatherValues.put(WeatherEntry.COLUMN_WIND_SPEED, 5.5);
+        weatherValues.put(WeatherEntry.COLUMN_WEATHER_ID, 321);
+
+        return weatherValues;
+    }
+
+    static ContentValues createNorthPoleLocationValues() {
+        // Create a new map of values, where column names are the keys
+        ContentValues testValues = new ContentValues();
+        testValues.put(LocationEntry.COLUMN_LOCATION_SETTING, "99705");
+        testValues.put(LocationEntry.COLUMN_CITY_NAME, "North Pole");
+        testValues.put(LocationEntry.COLUMN_COORD_LAT, 64.7488);
+        testValues.put(LocationEntry.COLUMN_COORD_LONG, -147.353);
+
+        return testValues;
+    }
+
+    static void validateCursor(Cursor valueCursor, ContentValues expectedValues) {
+
+        assertTrue(valueCursor.moveToFirst());
+
+        Set<Map.Entry<String, Object>> valueSet = expectedValues.valueSet();
+        for (Map.Entry<String, Object> entry : valueSet) {
+            String columnName = entry.getKey();
+            int idx = valueCursor.getColumnIndex(columnName);
+            assertFalse(idx == -1);
+            String expectedValue = entry.getValue().toString();
+            assertEquals(expectedValue, valueCursor.getString(idx));
+        }
+        valueCursor.close();
+    }
+
 }