Now passing the first of the content provider unit tests

pull/14/head
Tim Su 16 years ago
parent c1d1fa801f
commit 0b77d19f7d

@ -149,6 +149,13 @@
android:grantUriPermissions="true" android:grantUriPermissions="true"
android:readPermission="com.timsu.astrid.permission.READ_TASKS"/> android:readPermission="com.timsu.astrid.permission.READ_TASKS"/>
<provider android:name="com.todoroo.astrid.provider.Astrid3ContentProvider"
android:authorities="com.todoroo.astrid"
android:multiprocess="true"
android:grantUriPermissions="true"
android:readPermission="com.timsu.astrid.permission.READ_TASKS"
android:writePermission="com.timsu.astrid.permission.WRITE_TASKS"/>
<!-- ========================================================= Plugins = --> <!-- ========================================================= Plugins = -->
<!-- core --> <!-- core -->

@ -35,7 +35,7 @@ public class AstridApiConstants {
/** /**
* URI to append to base content URI for making groupby queries * URI to append to base content URI for making groupby queries
*/ */
public static final String GROUP_BY_URI = "groupby/"; public static final String GROUP_BY_URI = "/groupby/";
// --- Broadcast Extras // --- Broadcast Extras

@ -47,10 +47,14 @@ public class GenericDao<TYPE extends AbstractModel> {
} }
/** /**
* Sets up a database * Sets database accessed by this DAO. Used for dependency-injected
* initialization by child classes and unit tests
*
* @param database * @param database
*/ */
protected void setDatabase(AbstractDatabase database) { public void setDatabase(AbstractDatabase database) {
if(database == this.database)
return;
this.database = database; this.database = database;
table = database.getTable(modelClass); table = database.getTable(modelClass);
} }

@ -9,10 +9,10 @@ import android.net.Uri;
import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.Property.LongProperty;
import com.todoroo.andlib.data.Property.StringProperty;
import com.todoroo.andlib.data.Table; import com.todoroo.andlib.data.Table;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.data.Property.LongProperty;
import com.todoroo.andlib.data.Property.StringProperty;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
/** /**
@ -31,7 +31,7 @@ public class Metadata extends AbstractModel {
/** content uri for this model */ /** content uri for this model */
public static final Uri CONTENT_URI = Uri.parse("content://" + AstridApiConstants.PACKAGE + "/" + public static final Uri CONTENT_URI = Uri.parse("content://" + AstridApiConstants.PACKAGE + "/" +
TABLE.name + "/"); TABLE.name);
// --- properties // --- properties

@ -9,10 +9,10 @@ import android.net.Uri;
import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.Property.LongProperty;
import com.todoroo.andlib.data.Property.StringProperty;
import com.todoroo.andlib.data.Table; import com.todoroo.andlib.data.Table;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.data.Property.LongProperty;
import com.todoroo.andlib.data.Property.StringProperty;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
/** /**
@ -31,7 +31,7 @@ public class StoreObject extends AbstractModel {
/** content uri for this model */ /** content uri for this model */
public static final Uri CONTENT_URI = Uri.parse("content://" + AstridApiConstants.PACKAGE + "/" + public static final Uri CONTENT_URI = Uri.parse("content://" + AstridApiConstants.PACKAGE + "/" +
TABLE.name + "/"); TABLE.name);
// --- properties // --- properties

@ -15,11 +15,11 @@ import android.net.Uri;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.Table;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.data.Property.IntegerProperty; import com.todoroo.andlib.data.Property.IntegerProperty;
import com.todoroo.andlib.data.Property.LongProperty; import com.todoroo.andlib.data.Property.LongProperty;
import com.todoroo.andlib.data.Property.StringProperty; import com.todoroo.andlib.data.Property.StringProperty;
import com.todoroo.andlib.data.Table;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
@ -39,7 +39,7 @@ public final class Task extends AbstractModel {
/** content uri for this model */ /** content uri for this model */
public static final Uri CONTENT_URI = Uri.parse("content://" + AstridApiConstants.PACKAGE + "/" + public static final Uri CONTENT_URI = Uri.parse("content://" + AstridApiConstants.PACKAGE + "/" +
TABLE.name + "/"); TABLE.name);
// --- properties // --- properties

@ -12,6 +12,7 @@ import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri; import android.net.Uri;
import android.text.TextUtils; import android.text.TextUtils;
import com.todoroo.andlib.data.AbstractDatabase;
import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.GenericDao; import com.todoroo.andlib.data.GenericDao;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
@ -64,9 +65,12 @@ public class Astrid3ContentProvider extends ContentProvider {
/** URI for making a request over all items grouped by some field */ /** URI for making a request over all items grouped by some field */
private static final int URI_GROUP = 3; private static final int URI_GROUP = 3;
private static final UriMatcher uriMatcher;
private static AbstractDatabase databaseOverride;
// --- instance variables // --- instance variables
private final UriMatcher uriMatcher;
@Autowired @Autowired
private Database database; private Database database;
@ -83,6 +87,8 @@ public class Astrid3ContentProvider extends ContentProvider {
@Autowired @Autowired
private ExceptionService exceptionService; private ExceptionService exceptionService;
static String hello = "hello";
@Override @Override
public boolean onCreate() { public boolean onCreate() {
try { try {
@ -94,18 +100,24 @@ public class Astrid3ContentProvider extends ContentProvider {
} }
} }
public Astrid3ContentProvider() { static {
DependencyInjectionService.getInstance().inject(this);
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
for(Uri uri : new Uri[] { Task.CONTENT_URI, Metadata.CONTENT_URI, StoreObject.CONTENT_URI }) { for(Uri uri : new Uri[] { Task.CONTENT_URI, Metadata.CONTENT_URI, StoreObject.CONTENT_URI }) {
String uriAsString = uri.toString(); String authority = AstridApiConstants.PACKAGE;
uriMatcher.addURI(uriAsString, "", URI_DIR);
uriMatcher.addURI(uriAsString, "#", URI_ITEM); String table = uri.toString();
uriMatcher.addURI(uriAsString, table = table.substring(table.indexOf('/', 11) + 1);
uriMatcher.addURI(authority, table, URI_DIR);
uriMatcher.addURI(authority, table + "/#", URI_ITEM);
uriMatcher.addURI(authority, table +
AstridApiConstants.GROUP_BY_URI + "*", URI_GROUP); AstridApiConstants.GROUP_BY_URI + "*", URI_GROUP);
} }
}
public Astrid3ContentProvider() {
DependencyInjectionService.getInstance().inject(this);
setReadPermission(AstridApiConstants.PERMISSION_READ); setReadPermission(AstridApiConstants.PERMISSION_READ);
setWritePermission(AstridApiConstants.PERMISSION_WRITE); setWritePermission(AstridApiConstants.PERMISSION_WRITE);
@ -120,7 +132,7 @@ public class Astrid3ContentProvider extends ContentProvider {
case URI_ITEM: case URI_ITEM:
return "vnd.android.cursor/vnd.astrid.item"; return "vnd.android.cursor/vnd.astrid.item";
default: default:
throw new IllegalArgumentException("Unsupported URI: " + uri); throw new IllegalArgumentException("Unsupported URI " + uri + " (" + uriMatcher.match(uri) + ")");
} }
} }
@ -153,22 +165,35 @@ public class Astrid3ContentProvider extends ContentProvider {
UriHelper<Task> helper = new UriHelper<Task>(); UriHelper<Task> helper = new UriHelper<Task>();
helper.model = populateModel ? new Task() : null; helper.model = populateModel ? new Task() : null;
helper.dao = taskDao; helper.dao = taskDao;
helper.dao.setDatabase(getDatabase());
return helper; return helper;
} else if(uri.toString().startsWith(Metadata.CONTENT_URI.toString())) { } else if(uri.toString().startsWith(Metadata.CONTENT_URI.toString())) {
UriHelper<Metadata> helper = new UriHelper<Metadata>(); UriHelper<Metadata> helper = new UriHelper<Metadata>();
helper.model = populateModel ? new Metadata() : null; helper.model = populateModel ? new Metadata() : null;
helper.dao = metadataDao; helper.dao = metadataDao;
helper.dao.setDatabase(getDatabase());
return helper; return helper;
} else if(uri.toString().startsWith(StoreObject.CONTENT_URI.toString())) { } else if(uri.toString().startsWith(StoreObject.CONTENT_URI.toString())) {
UriHelper<StoreObject> helper = new UriHelper<StoreObject>(); UriHelper<StoreObject> helper = new UriHelper<StoreObject>();
helper.model = populateModel ? new StoreObject() : null; helper.model = populateModel ? new StoreObject() : null;
helper.dao = storeObjectDao; helper.dao = storeObjectDao;
helper.dao.setDatabase(getDatabase());
return helper; return helper;
} }
throw new UnsupportedOperationException("Unknown URI " + uri); throw new UnsupportedOperationException("Unknown URI " + uri);
} }
static void setDatabaseOverride(AbstractDatabase override) {
databaseOverride = override;
}
private AbstractDatabase getDatabase() {
if(databaseOverride != null)
return databaseOverride;
return database;
}
/* ====================================================================== /* ======================================================================
* =========================================================== delete === * =========================================================== delete ===
* ====================================================================== */ * ====================================================================== */
@ -204,10 +229,10 @@ public class Astrid3ContentProvider extends ContentProvider {
break; break;
default: default:
throw new IllegalArgumentException("Unknown URI " + uri); throw new IllegalArgumentException("Unknown URI " + uri + " (" + uriMatcher.match(uri) + ")");
} }
return database.delete(helper.dao.getTable().name, selection, selectionArgs); return getDatabase().delete(helper.dao.getTable().name, selection, selectionArgs);
} }
/* ====================================================================== /* ======================================================================
@ -236,6 +261,7 @@ public class Astrid3ContentProvider extends ContentProvider {
helper.create(); helper.create();
Uri newUri = ContentUris.withAppendedId(uri, helper.model.getId()); Uri newUri = ContentUris.withAppendedId(uri, helper.model.getId());
getContext().getContentResolver().notifyChange(newUri, null); getContext().getContentResolver().notifyChange(newUri, null);
return newUri;
} }
default: default:
@ -302,10 +328,10 @@ public class Astrid3ContentProvider extends ContentProvider {
builder.appendWhere(itemSelector); builder.appendWhere(itemSelector);
break; break;
default: default:
throw new IllegalArgumentException("Unknown URI " + uri); throw new IllegalArgumentException("Unknown URI " + uri + " (" + uriMatcher.match(uri) + ")");
} }
Cursor cursor = builder.query(database.getDatabase(), projection, selection, selectionArgs, groupBy, null, sortOrder); Cursor cursor = builder.query(getDatabase().getDatabase(), projection, selection, selectionArgs, groupBy, null, sortOrder);
cursor.setNotificationUri(getContext().getContentResolver(), uri); cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor; return cursor;
} }

@ -20,12 +20,21 @@ public class Astrid3ProviderTests extends DatabaseTestCase {
Task.TITLE.name, Task.TITLE.name,
}; };
@Override
protected void setUp() throws Exception {
super.setUp();
// set up database
Astrid3ContentProvider.setDatabaseOverride(database);
}
/** Test CRUD over tasks with the ALL ITEMS cursor */ /** Test CRUD over tasks with the ALL ITEMS cursor */
public void testAllItemsCrud() { public void testAllItemsCrud() {
ContentResolver resolver = getContext().getContentResolver(); ContentResolver resolver = getContext().getContentResolver();
// fetch all tasks, get nothing // fetch all tasks, get nothing
Uri uri = Uri.withAppendedPath(Task.CONTENT_URI, ""); Uri uri = Task.CONTENT_URI;
Cursor cursor = resolver.query(uri, PROJECTION, "1", null, null); Cursor cursor = resolver.query(uri, PROJECTION, "1", null, null);
assertEquals(0, cursor.getCount()); assertEquals(0, cursor.getCount());
cursor.close(); cursor.close();

Loading…
Cancel
Save