Refactored the recent MR for dynamicly adding default repos.

The idea was good: reduce the amount of copied/pasted code
where ContentValues were initialized, populated, then inserted.
I've kept the idea, by putting it in its own method which is
called twice. But the resources are not loaded dynamically any
more. This is so that the compiler will be able to pick up if
we reference a missing resource. Also, I took the opportunity
to replace the field name string literals with references to
RepoProvider.DataColumns.* constants.

Finally, changed the tests around because now we need to
have the "getInteger()" call mocked in resources correctly
(for priority/inUse).
This commit is contained in:
Peter Serwylo 2014-03-23 22:31:06 +11:00
parent 9703350f41
commit 3ebad383d6
5 changed files with 95 additions and 48 deletions

View File

@ -177,55 +177,46 @@ public class DBHelper extends SQLiteOpenHelper {
public void onCreate(SQLiteDatabase db) {
createAppApk(db);
db.execSQL(CREATE_TABLE_REPO);
Resources ress = context.getResources();
insertRepo(
db,
context.getString(R.string.default_repo_name1),
context.getString(R.string.default_repo_address1),
context.getString(R.string.default_repo_description1),
context.getString(R.string.default_repo_pubkey1),
context.getResources().getInteger(R.integer.default_repo_inuse1),
context.getResources().getInteger(R.integer.default_repo_priority1)
);
int repoCount = ress.getInteger(R.integer.default_repo_count);
for (int i = 1; i <= repoCount; i++) {
ContentValues values = new ContentValues();
String repoName = context.getString(ress.getIdentifier(
"default_repo_name" + i,
"string",
"org.fdroid.fdroid"
));
values.put("address",
context.getString(ress.getIdentifier(
"default_repo_address" + i,
"string",
"org.fdroid.fdroid"
)));
values.put("name",repoName);
values.put("description",
context.getString(ress.getIdentifier(
"default_repo_description" + i,
"string",
"org.fdroid.fdroid"
)));
String pubkey = context.getString(ress.getIdentifier(
"default_repo_pubkey" + i,
"string",
"org.fdroid.fdroid"
));
String fingerprint = Utils.calcFingerprint(pubkey);
values.put("pubkey", pubkey);
values.put("fingerprint", fingerprint);
values.put("maxage", 0);
values.put("inuse", ress.getInteger(ress.getIdentifier(
"default_repo_inuse" + i,
"integer",
"org.fdroid.fdroid"
)));
values.put("priority", ress.getInteger(ress.getIdentifier(
"default_repo_priority" + i,
"integer",
"org.fdroid.fdroid"
)));
values.put("lastetag", (String) null);
Log.i("FDroid", "Add repository " + repoName);
db.insert(TABLE_REPO, null, values);
}
insertRepo(
db,
context.getString(R.string.default_repo_name2),
context.getString(R.string.default_repo_address2),
context.getString(R.string.default_repo_description2),
context.getString(R.string.default_repo_pubkey2),
context.getResources().getInteger(R.integer.default_repo_inuse2),
context.getResources().getInteger(R.integer.default_repo_priority2)
);
}
private void insertRepo(
SQLiteDatabase db, String name, String address, String description,
String pubKey, int inUse, int priority) {
ContentValues values = new ContentValues();
values.put(RepoProvider.DataColumns.ADDRESS, address);
values.put(RepoProvider.DataColumns.NAME, name);
values.put(RepoProvider.DataColumns.DESCRIPTION, description);
values.put(RepoProvider.DataColumns.PUBLIC_KEY, pubKey);
values.put(RepoProvider.DataColumns.FINGERPRINT, Utils.calcFingerprint(pubKey));
values.put(RepoProvider.DataColumns.MAX_AGE, 0);
values.put(RepoProvider.DataColumns.IN_USE, inUse);
values.put(RepoProvider.DataColumns.PRIORITY, priority);
values.put(RepoProvider.DataColumns.LAST_ETAG, (String)null);
Log.i("FDroid", "Adding repository " + name);
db.insert(TABLE_REPO, null, values);
}
@Override

View File

@ -1,9 +1,14 @@
package mock;
import android.content.Context;
import android.test.mock.*;
import org.fdroid.fdroid.*;
public class MockCategoryResources extends MockResources {
public class MockCategoryResources extends MockFDroidResources {
public MockCategoryResources(Context getStringDelegatingContext) {
super(getStringDelegatingContext);
}
@Override
public String getString(int id) {

View File

@ -0,0 +1,36 @@
package mock;
import android.content.Context;
import android.content.res.Resources;
import android.test.mock.*;
import org.fdroid.fdroid.*;
public class MockFDroidResources extends MockResources {
private Context getStringDelegatingContext;
public MockFDroidResources(Context getStringDelegatingContext) {
this.getStringDelegatingContext = getStringDelegatingContext;
}
@Override
public String getString(int id) {
return getStringDelegatingContext.getString(id);
}
@Override
public int getInteger(int id) {
if (id == R.integer.default_repo_inuse1) {
return 1;
} else if (id == R.integer.default_repo_inuse2) {
return 0;
} else if (id == R.integer.default_repo_priority1) {
return 10;
} else if (id == R.integer.default_repo_priority2) {
return 20;
} else {
return 0;
}
}
}

View File

@ -2,6 +2,7 @@ package org.fdroid.fdroid;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.res.Resources;
import android.database.Cursor;
import mock.MockCategoryResources;
@ -24,7 +25,12 @@ public class AppProviderTest extends FDroidProviderTest<AppProvider> {
@Override
public void setUp() throws Exception {
super.setUp();
getSwappableContext().setResources(new MockCategoryResources());
getSwappableContext().setResources(new MockCategoryResources(getContext()));
}
@Override
protected Resources getMockResources() {
return new MockCategoryResources(getContext());
}
@Override

View File

@ -3,13 +3,16 @@ package org.fdroid.fdroid;
import android.annotation.TargetApi;
import android.content.ContentValues;
import android.content.Context;
import android.content.res.Resources;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.provider.ContactsContract;
import android.test.ProviderTestCase2MockContext;
import mock.MockCategoryResources;
import mock.MockContextEmptyComponents;
import mock.MockContextSwappableComponents;
import mock.MockFDroidResources;
import org.fdroid.fdroid.data.FDroidProvider;
import org.fdroid.fdroid.mock.MockInstalledApkCache;
@ -23,10 +26,15 @@ public abstract class FDroidProviderTest<T extends FDroidProvider> extends Provi
super(providerClass, providerAuthority);
}
protected Resources getMockResources() {
return new MockFDroidResources(getContext());
}
@Override
public void setUp() throws Exception {
super.setUp();
Utils.setupInstalledApkCache(new MockInstalledApkCache());
getSwappableContext().setResources(getMockResources());
// The *Provider.Helper.* functions tend to take a Context as their
// first parameter. This context is used to connect to the relevant
@ -34,6 +42,7 @@ public abstract class FDroidProviderTest<T extends FDroidProvider> extends Provi
// to the mock content resolver, in order to reach the provider
// under test.
getSwappableContext().setContentResolver(getMockContentResolver());
}
@TargetApi(Build.VERSION_CODES.ECLAIR)