Added category tests.

This will be useful when somebody wants to move categories from a comma
separated string in the app table, to a separate table all together.
This commit is contained in:
Peter Serwylo 2014-02-11 07:34:01 +11:00
parent feec3b1c51
commit 43f8ea0814
5 changed files with 208 additions and 22 deletions

View File

@ -0,0 +1,21 @@
package mock;
import android.test.mock.*;
import org.fdroid.fdroid.*;
public class MockCategoryResources extends MockResources {
@Override
public String getString(int id) {
if (id == R.string.category_all) {
return "All";
} else if (id == R.string.category_recentlyupdated) {
return "Recently Updated";
} else if (id == R.string.category_whatsnew) {
return "Whats New";
} else {
return "";
}
}
}

View File

@ -2,13 +2,14 @@ package mock;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.test.mock.MockContext;
import android.test.mock.*;
public class MockContextSwappableComponents extends MockContext {
private PackageManager packageManager;
private Resources resources;
private MockContentResolver contentResolver;
public MockContextSwappableComponents setPackageManager(PackageManager pm) {
packageManager = pm;
@ -20,6 +21,11 @@ public class MockContextSwappableComponents extends MockContext {
return this;
}
public MockContextSwappableComponents setContentResolver(MockContentResolver contentResolver) {
this.contentResolver = contentResolver;
return this;
}
@Override
public PackageManager getPackageManager() {
return packageManager;
@ -29,4 +35,9 @@ public class MockContextSwappableComponents extends MockContext {
public Resources getResources() {
return resources;
}
@Override
public MockContentResolver getContentResolver() {
return contentResolver;
}
}

View File

@ -1,18 +1,18 @@
package org.fdroid.fdroid;
import android.content.ContentValues;
import android.content.pm.PackageInfo;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import junit.framework.AssertionFailedError;
import mock.MockCategoryResources;
import mock.MockInstallablePackageManager;
import org.fdroid.fdroid.data.ApkProvider;
import org.fdroid.fdroid.data.App;
import org.fdroid.fdroid.data.AppProvider;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
public class AppProviderTest extends FDroidProviderTest<AppProvider> {
@ -20,6 +20,13 @@ public class AppProviderTest extends FDroidProviderTest<AppProvider> {
super(AppProvider.class, AppProvider.getAuthority());
}
@Override
public void setUp() throws Exception {
super.setUp();
getSwappableContext().setResources(new MockCategoryResources());
getSwappableContext().setContentResolver(getMockContentResolver());
}
protected String[] getMinimalProjection() {
return new String[] {
AppProvider.DataColumns.APP_ID,
@ -53,6 +60,12 @@ public class AppProviderTest extends FDroidProviderTest<AppProvider> {
assertNotNull(cursor);
}
private void insertApps(int count) {
for (int i = 0; i < count; i ++) {
insertApp("com.example.test." + i, "Test app " + i);
}
}
public void testInstalled() {
Utils.clearInstalledApksCache();
@ -60,9 +73,7 @@ public class AppProviderTest extends FDroidProviderTest<AppProvider> {
MockInstallablePackageManager pm = new MockInstallablePackageManager();
getSwappableContext().setPackageManager(pm);
for (int i = 0; i < 100; i ++) {
insertApp("com.example.test." + i, "Test app " + i);
}
insertApps(100);
assertAppCount(100, AppProvider.getContentUri());
assertAppCount(0, AppProvider.getInstalledUri());
@ -75,7 +86,7 @@ public class AppProviderTest extends FDroidProviderTest<AppProvider> {
}
private void assertAppCount(int expectedCount, Uri uri) {
Cursor cursor = getProvider().query(uri, getMinimalProjection(), null, null, null);
Cursor cursor = getMockContentResolver().query(uri, getMinimalProjection(), null, null, null);
assertNotNull(cursor);
assertEquals(expectedCount, cursor.getCount());
}
@ -114,25 +125,134 @@ public class AppProviderTest extends FDroidProviderTest<AppProvider> {
}
private Cursor queryAllApps() {
return getProvider().query(AppProvider.getContentUri(), getMinimalProjection(), null, null, null);
return getMockContentResolver().query(AppProvider.getContentUri(), getMinimalProjection(), null, null, null);
}
public void testCategoriesSingle() {
insertAppWithCategory("com.dog", "Dog", "Animal");
insertAppWithCategory("com.rock", "Rock", "Mineral");
insertAppWithCategory("com.banana", "Banana", "Vegetable");
List<String> categories = AppProvider.Helper.categories(getMockContext());
String[] expected = new String[] {
getMockContext().getResources().getString(R.string.category_whatsnew),
getMockContext().getResources().getString(R.string.category_recentlyupdated),
getMockContext().getResources().getString(R.string.category_all),
"Animal",
"Mineral",
"Vegetable"
};
assertContainsOnly(categories, expected);
}
public void testCategoriesMultiple() {
insertAppWithCategory("com.rock.dog", "Rock-Dog", "Mineral,Animal");
insertAppWithCategory("com.dog.rock.apple", "Dog-Rock-Apple", "Animal,Mineral,Vegetable");
insertAppWithCategory("com.banana.apple", "Banana", "Vegetable,Vegetable");
List<String> categories = AppProvider.Helper.categories(getMockContext());
String[] expected = new String[] {
getMockContext().getResources().getString(R.string.category_whatsnew),
getMockContext().getResources().getString(R.string.category_recentlyupdated),
getMockContext().getResources().getString(R.string.category_all),
"Animal",
"Mineral",
"Vegetable"
};
assertContainsOnly(categories, expected);
insertAppWithCategory("com.example.game", "Game",
"Running,Shooting,Jumping,Bleh,Sneh,Pleh,Blah,Test category," +
"The quick brown fox jumps over the lazy dog,With apostrophe's");
List<String> categoriesLonger = AppProvider.Helper.categories(getMockContext());
String[] expectedLonger = new String[] {
getMockContext().getResources().getString(R.string.category_whatsnew),
getMockContext().getResources().getString(R.string.category_recentlyupdated),
getMockContext().getResources().getString(R.string.category_all),
"Animal",
"Mineral",
"Vegetable",
"Running",
"Shooting",
"Jumping",
"Bleh",
"Sneh",
"Pleh",
"Blah",
"Test category",
"The quick brown fox jumps over the lazy dog",
"With apostrophe's"
};
assertContainsOnly(categoriesLonger, expectedLonger);
}
private void insertApp(String id, String name) {
ContentValues values = new ContentValues(2);
values.put(AppProvider.DataColumns.APP_ID, id);
values.put(AppProvider.DataColumns.NAME, name);
insertApp(id, name, new ContentValues());
}
// Required fields (NOT NULL in the database).
values.put(AppProvider.DataColumns.SUMMARY, "test summary");
values.put(AppProvider.DataColumns.DESCRIPTION, "test description");
values.put(AppProvider.DataColumns.LICENSE, "GPL?");
values.put(AppProvider.DataColumns.IS_COMPATIBLE, 1);
values.put(AppProvider.DataColumns.IGNORE_ALLUPDATES, 0);
values.put(AppProvider.DataColumns.IGNORE_THISUPDATE, 0);
private void insertAppWithCategory(String id, String name,
String categories) {
ContentValues values = new ContentValues(1);
values.put(AppProvider.DataColumns.CATEGORIES, categories);
insertApp(id, name, values);
}
Uri uri = AppProvider.getContentUri();
private void insertApp(String id, String name,
ContentValues additionalValues) {
TestUtils.insertApp(getMockContentResolver(), id, name, additionalValues);
}
getProvider().insert(uri, values);
private <T extends Comparable> void assertContainsOnly(List<T> actualList, T[] expectedContains) {
List<T> containsList = new ArrayList<T>(expectedContains.length);
Collections.addAll(containsList, expectedContains);
assertContainsOnly(actualList, containsList);
}
private <T> String listToString(List<T> list) {
String string = "[";
for (int i = 0; i < list.size(); i ++) {
if (i > 0) {
string += ", ";
}
string += list.get(i);
}
string += "]";
return string;
}
private <T extends Comparable> void assertContainsOnly(List<T> actualList, List<T> expectedContains) {
if (actualList.size() != expectedContains.size()) {
String message =
"List sizes don't match.\n" +
"Expected: " +
listToString(expectedContains) + "\n" +
"Actual: " +
listToString(actualList);
throw new AssertionFailedError(message);
}
for (T required : expectedContains) {
boolean containsRequired = false;
for (T itemInList : actualList) {
if (required.equals(itemInList)) {
containsRequired = true;
break;
}
}
if (!containsRequired) {
String message =
"List doesn't contain \"" + required + "\".\n" +
"Expected: " +
listToString(expectedContains) + "\n" +
"Actual: " +
listToString(actualList);
throw new AssertionFailedError(message);
}
}
}
}

View File

@ -53,13 +53,17 @@ public abstract class FDroidProviderTest<T extends FDroidProvider> extends Provi
protected void assertInvalidUri(Uri uri) {
try {
// Use getProvdider instead of getContentResolver, because the mock
// content resolver wont result in the provider we are testing, and
// hence we don't get to see how our provider responds to invalid
// uris.
getProvider().query(uri, getMinimalProjection(), null, null, null);
fail();
} catch (UnsupportedOperationException e) {}
}
protected void assertValidUri(Uri uri) {
Cursor cursor = getProvider().query(uri, getMinimalProjection(), null, null, null);
Cursor cursor = getMockContentResolver().query(uri, getMinimalProjection(), null, null, null);
assertNotNull(cursor);
}

View File

@ -0,0 +1,30 @@
package org.fdroid.fdroid;
import android.content.*;
import android.net.Uri;
import org.fdroid.fdroid.data.AppProvider;
public class TestUtils {
public static void insertApp(ContentResolver resolver, String id, String name, ContentValues additionalValues) {
ContentValues values = new ContentValues();
values.put(AppProvider.DataColumns.APP_ID, id);
values.put(AppProvider.DataColumns.NAME, name);
// Required fields (NOT NULL in the database).
values.put(AppProvider.DataColumns.SUMMARY, "test summary");
values.put(AppProvider.DataColumns.DESCRIPTION, "test description");
values.put(AppProvider.DataColumns.LICENSE, "GPL?");
values.put(AppProvider.DataColumns.IS_COMPATIBLE, 1);
values.put(AppProvider.DataColumns.IGNORE_ALLUPDATES, 0);
values.put(AppProvider.DataColumns.IGNORE_THISUPDATE, 0);
values.putAll(additionalValues);
Uri uri = AppProvider.getContentUri();
resolver.insert(uri, values);
}
}