package edu.mit.mobile.android.locast.test;
/*
* Copyright (C) 2011 MIT Mobile Experience Lab
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.test.ProviderTestCase2;
import edu.mit.mobile.android.locast.data.Cast;
import edu.mit.mobile.android.locast.data.Comment;
import edu.mit.mobile.android.locast.data.Itinerary;
import edu.mit.mobile.android.locast.data.MediaProvider;
import edu.mit.mobile.android.locast.data.Project;
import edu.mit.mobile.android.locast.data.Tag;
import edu.mit.mobile.android.locast.data.TaggableItem;
public class MediaProviderTest extends ProviderTestCase2<MediaProvider> {
public MediaProviderTest() {
super(MediaProvider.class, MediaProvider.AUTHORITY);
}
private Context mContext;
private ContentResolver mCr;
@Override
protected void setUp() throws Exception {
super.setUp();
mContext = getMockContext();
mCr = getMockContentResolver();
}
private static final Uri
U_CAST_ITEM = ContentUris.withAppendedId(Cast.CONTENT_URI, 1),
U_COMMENT_ITEM = ContentUris.withAppendedId(Comment.CONTENT_URI, 1),
U_ITINERARY_ITEM = ContentUris.withAppendedId(Itinerary.CONTENT_URI, 1),
U_ITINERARY_CAST_DIR = Uri.withAppendedPath(U_ITINERARY_ITEM, Cast.PATH),
U_ITINERARY_CAST_ITEM = ContentUris.withAppendedId(U_ITINERARY_CAST_DIR, 1),
U_PROJECT_ITEM = ContentUris.withAppendedId(Project.CONTENT_URI, 1),
U_PROJECT_CAST_DIR = Uri.withAppendedPath(U_PROJECT_ITEM, Cast.PATH),
U_PROJECT_CAST_ITEM = ContentUris.withAppendedId(U_PROJECT_CAST_DIR, 1);
private static final Uri[] U_ALL = {
Cast.CONTENT_URI,
U_CAST_ITEM,
Comment.CONTENT_URI,
U_COMMENT_ITEM,
Itinerary.CONTENT_URI,
U_ITINERARY_ITEM,
U_ITINERARY_CAST_DIR,
U_ITINERARY_CAST_ITEM,
Project.CONTENT_URI,
U_PROJECT_ITEM,
U_PROJECT_CAST_DIR,
U_PROJECT_CAST_ITEM,
};
public void testContentTypes(){
// casts
assertEquals(MediaProvider.TYPE_CAST_DIR, mCr.getType(Cast.CONTENT_URI));
assertEquals(MediaProvider.TYPE_CAST_ITEM, mCr.getType(U_CAST_ITEM));
// comments
assertEquals(MediaProvider.TYPE_COMMENT_DIR, mCr.getType(Comment.CONTENT_URI));
assertEquals(MediaProvider.TYPE_COMMENT_ITEM, mCr.getType(U_COMMENT_ITEM));
//
testAllContentTypes(new ContentUriTest() {
@Override
public void runUriTest(Uri contentUri) {
contentUri = ContentUris.withAppendedId(contentUri, 1);
final Uri commentUri = Uri.withAppendedPath(contentUri, Comment.PATH);
assertEquals(contentUri.toString(), MediaProvider.TYPE_COMMENT_DIR, mCr.getType(commentUri));
assertEquals(contentUri.toString(), MediaProvider.TYPE_COMMENT_ITEM, mCr.getType(ContentUris.withAppendedId(commentUri, 1)));
}
// these should all be indexes to things that are commentable.
}, Project.CONTENT_URI, Cast.CONTENT_URI, Itinerary.CONTENT_URI, U_PROJECT_CAST_DIR, U_ITINERARY_CAST_DIR);
// projects
assertEquals(MediaProvider.TYPE_PROJECT_DIR, mCr.getType(Project.CONTENT_URI));
assertEquals(MediaProvider.TYPE_PROJECT_ITEM, mCr.getType(U_PROJECT_ITEM));
// casts of projects
assertEquals(MediaProvider.TYPE_PROJECT_CAST_DIR, mCr.getType(U_PROJECT_CAST_DIR));
assertEquals(MediaProvider.TYPE_PROJECT_CAST_ITEM, mCr.getType(U_PROJECT_CAST_ITEM));
// itineraries
assertEquals(MediaProvider.TYPE_ITINERARY_DIR, mCr.getType(Itinerary.CONTENT_URI));
assertEquals(MediaProvider.TYPE_ITINERARY_ITEM, mCr.getType(U_ITINERARY_ITEM));
// casts in itineraries
assertEquals(MediaProvider.TYPE_CAST_DIR, mCr.getType(U_ITINERARY_CAST_DIR));
assertEquals(MediaProvider.TYPE_CAST_ITEM, mCr.getType(U_ITINERARY_CAST_ITEM));
}
public void testSyncability(){
testAllContentTypes(new ContentUriTest(){
@Override
public void runUriTest(Uri contentUri) {
assertNotNull(MediaProvider.canSync(contentUri));
}
}, U_ALL);
}
public void testQueries(){
testAllContentTypes(new ContentUriTest(){
@Override
public void runUriTest(Uri contentUri) {
assertNotNull(contentUri.toString(), mCr.query(contentUri, null, null, null, null));
}
}, U_ALL);
}
private void testAllContentTypes(ContentUriTest test, Uri ... types){
for (final Uri contentUri: types){
test.runUriTest(contentUri);
}
}
private interface ContentUriTest{
public void runUriTest(Uri contentUri);
}
private static final String
T_TITLE = "title 1",
T_TITLE2 = "title 2",
T_DESCRIPTION = "description 1",
T_DESCRIPTION2 = "description 2",
T_AUTHOR = "author1",
T_AUTHOR2 = "author2";
private final Set<String> T_TAGS = new HashSet<String>(Arrays.asList(new String[]{"robots", "kittens"}));
private final Set<String> T_TAGS_AFTER_ADD1 = new HashSet<String>(Arrays.asList(new String[]{"robots", "kittens", "lasers"}));
private final String
T_TAG_TO_ADD1 = "lasers";
/**
* Create a cast using the provided URI.
*
* @param uri
* @return
*/
private Uri createCast(Uri uri){
final ContentValues cv = new ContentValues();
cv.put(Cast._TITLE, T_TITLE);
cv.put(Cast._DESCRIPTION, T_DESCRIPTION);
cv.put(Cast._AUTHOR, T_AUTHOR);
cv.put(Cast._DRAFT, true);
TaggableItem.putList(Tag.PATH, cv, T_TAGS);
final Uri cast = mCr.insert(uri, cv);
return cast;
}
private void testCastCRUD(Uri castUri){
// create
final Uri cast = createCast(castUri);
assertNotNull(cast);
// read
final Cursor c = mCr.query(cast, Cast.PROJECTION, null, null, null);
assertNotNull(c);
assertTrue(c.moveToFirst());
assertEquals(T_TITLE, c.getString(c.getColumnIndex(Cast._TITLE)));
assertEquals(T_DESCRIPTION, c.getString(c.getColumnIndex(Cast._DESCRIPTION)));
assertEquals(T_AUTHOR, c.getString(c.getColumnIndex(Cast._AUTHOR)));
assertTrue(c.getInt(c.getColumnIndex(Cast._DRAFT)) != 0);
assertTagsEqual(T_TAGS, TaggableItem.getTags(mCr, cast));
// update
assertEquals(1,mCr.delete(cast, null, null));
}
public void testCastCRUD(){
testCastCRUD(Cast.CONTENT_URI);
}
private void assertTagsEqual(Set<String> expected, Set<String> actual){
assertEquals(expected.size(), actual.size());
for (final String tag : expected){
if (!actual.contains(tag)){
fail("'"+ tag + "' expected in set, but not found in "+ actual);
}
}
}
private Uri createItinerary(){
final ContentValues cv = new ContentValues();
cv.put(Cast._TITLE, T_TITLE);
cv.put(Cast._DESCRIPTION, T_DESCRIPTION);
cv.put(Cast._AUTHOR, T_AUTHOR);
cv.put(Cast._DRAFT, true);
TaggableItem.putList(Tag.PATH, cv, T_TAGS);
return mCr.insert(Itinerary.CONTENT_URI, cv);
}
public void testItineraryCRUD(){
// create
final Uri itinerary = createItinerary();
assertNotNull(itinerary);
// read
final Cursor c = mCr.query(itinerary, Itinerary.PROJECTION, null, null, null);
assertNotNull(c);
assertTrue(c.moveToFirst());
assertEquals(T_TITLE, c.getString(c.getColumnIndex(Itinerary._TITLE)));
assertEquals(T_DESCRIPTION, c.getString(c.getColumnIndex(Itinerary._DESCRIPTION)));
assertEquals(T_AUTHOR, c.getString(c.getColumnIndex(Itinerary._AUTHOR)));
assertTrue(c.getInt(c.getColumnIndex(Itinerary._DRAFT)) != 0);
assertTagsEqual(T_TAGS, TaggableItem.getTags(mCr, itinerary));
assertEquals(1, mCr.delete(itinerary, null, null));
}
public void testItineraryCast(){
final Uri itinerary = createItinerary();
testCastCRUD(Itinerary.getCastsUri(itinerary));
assertEquals(1, mCr.delete(itinerary, null, null));
}
}