Turned preference service into an injected class for better testability, wrote the first test, of the decorator

pull/14/head
Tim Su 14 years ago
parent a87cb96a8d
commit 0cf572de59

@ -24,6 +24,7 @@ import com.todoroo.astrid.data.Task;
public class GtasksDecorationExposer implements TaskDecorationExposer {
@Autowired private GtasksMetadataService gtasksMetadataService;
@Autowired private GtasksPreferenceService gtasksPreferenceService;
public GtasksDecorationExposer() {
DependencyInjectionService.getInstance().inject(this);
@ -31,7 +32,7 @@ public class GtasksDecorationExposer implements TaskDecorationExposer {
@Override
public TaskDecoration expose(Filter activeFilter, Task task) {
if(!GtasksUtilities.INSTANCE.isLoggedIn())
if(!gtasksPreferenceService.isLoggedIn())
return null;
if(!activeFilter.sqlQuery.contains(GtasksMetadata.METADATA_KEY))

@ -26,18 +26,16 @@ public class GtasksDetailExposer extends BroadcastReceiver {
public static final String DETAIL_SEPARATOR = " | "; //$NON-NLS-1$
@Autowired
private GtasksMetadataService gtasksMetadataService;
@Autowired
private GtasksListService gtasksListService;
@Autowired private GtasksMetadataService gtasksMetadataService;
@Autowired private GtasksListService gtasksListService;
@Autowired private GtasksPreferenceService gtasksPreferenceService;
@Override
public void onReceive(Context context, Intent intent) {
ContextManager.setContext(context);
// if we aren't logged in, don't expose features
if(!GtasksUtilities.INSTANCE.isLoggedIn())
if(!gtasksPreferenceService.isLoggedIn())
return;
long taskId = intent.getLongExtra(AstridApiConstants.EXTRAS_TASK_ID, -1);
@ -50,7 +48,7 @@ public class GtasksDetailExposer extends BroadcastReceiver {
return;
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_DETAILS);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_ADDON, GtasksUtilities.IDENTIFIER);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_ADDON, GtasksPreferenceService.IDENTIFIER);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, taskId);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_EXTENDED, extended);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, taskDetail);

@ -38,11 +38,12 @@ import com.todoroo.astrid.data.TaskApiDao.TaskCriteria;
*/
public class GtasksFilterExposer extends BroadcastReceiver {
@Autowired
private GtasksListService gtasksListService;
@Autowired private GtasksListService gtasksListService;
@Autowired private GtasksPreferenceService gtasksPreferenceService;
private StoreObject[] lists;
private Filter filterFromList(StoreObject list) {
public static Filter filterFromList(StoreObject list) {
String listName = list.getValue(GtasksList.NAME);
ContentValues values = new ContentValues();
values.putAll(GtasksMetadata.createEmptyMetadata().getMergedValues());
@ -66,7 +67,7 @@ public class GtasksFilterExposer extends BroadcastReceiver {
DependencyInjectionService.getInstance().inject(this);
// if we aren't logged in, don't expose features
if(!GtasksUtilities.INSTANCE.isLoggedIn())
if(!gtasksPreferenceService.isLoggedIn())
return;
lists = gtasksListService.getLists();

@ -37,7 +37,7 @@ public class GtasksMetadata {
Metadata metadata = new Metadata();
metadata.setValue(Metadata.KEY, GtasksMetadata.METADATA_KEY);
metadata.setValue(ID, (long)VALUE_UNSET);
metadata.setValue(LIST_ID, Preferences.getLong(GtasksUtilities.PREF_DEFAULT_LIST,
metadata.setValue(LIST_ID, Preferences.getLong(GtasksPreferenceService.PREF_DEFAULT_LIST,
VALUE_UNSET));
metadata.setValue(OWNER_ID, (long)VALUE_UNSET);
metadata.setValue(INDENTATION, 0);

@ -5,7 +5,9 @@ package com.todoroo.astrid.gtasks;
import java.util.ArrayList;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.data.Metadata;
@ -22,8 +24,11 @@ import com.todoroo.astrid.sync.SyncProviderUtilities;
*/
public final class GtasksMetadataService extends SyncMetadataService<GtasksTaskContainer> {
@Autowired private GtasksPreferenceService gtasksPreferenceService;
public GtasksMetadataService() {
super(ContextManager.getContext());
DependencyInjectionService.getInstance().inject(this);
}
@Override
@ -49,7 +54,7 @@ public final class GtasksMetadataService extends SyncMetadataService<GtasksTaskC
@Override
public SyncProviderUtilities getUtilities() {
return GtasksUtilities.INSTANCE;
return gtasksPreferenceService;
}
}

@ -9,13 +9,11 @@ import com.todoroo.astrid.sync.SyncProviderUtilities;
* @author timsu
*
*/
public class GtasksUtilities extends SyncProviderUtilities {
public class GtasksPreferenceService extends SyncProviderUtilities {
/** add-on identifier */
public static final String IDENTIFIER = "gtasks"; //$NON-NLS-1$
public static final GtasksUtilities INSTANCE = new GtasksUtilities();
@Override
public String getIdentifier() {
return IDENTIFIER;
@ -29,8 +27,4 @@ public class GtasksUtilities extends SyncProviderUtilities {
/** GTasks user's default list id */
public static final String PREF_DEFAULT_LIST = IDENTIFIER + "_defaultlist"; //$NON-NLS-1$
private GtasksUtilities() {
// prevent instantiation
}
}

@ -13,6 +13,7 @@ import com.todoroo.astrid.dao.StoreObjectDao;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.gtasks.GtasksListService;
import com.todoroo.astrid.gtasks.GtasksMetadataService;
import com.todoroo.astrid.gtasks.GtasksPreferenceService;
import com.todoroo.astrid.utility.Constants;
/**
@ -64,6 +65,7 @@ public class AstridDependencyInjector extends AbstractDependencyInjector {
injectables.put("syncTable", "sync");
// com.todoroo.astrid.gtasks
injectables.put("gtasksPreferenceService", GtasksPreferenceService.class);
injectables.put("gtasksListService", GtasksListService.class);
injectables.put("gtasksMetadataService", GtasksMetadataService.class);

@ -21,6 +21,7 @@ public class TodorooTestCase extends AndroidTestCase {
@Override
protected void setUp() throws Exception {
super.setUp();
ContextManager.setContext(this.getContext());
AstridDependencyInjector.flush();
DependencyInjectionService.getInstance().inject(this);

@ -0,0 +1,34 @@
package com.todoroo.andlib.test;
import android.test.AndroidTestCase;
import com.todoroo.andlib.service.TestDependencyInjector;
/**
* Base test case for Astrid tests that need a separate injection context
*
* @author Tim Su <tim@todoroo.com>
*
*/
abstract public class TodorooTestCaseWithInjector extends AndroidTestCase {
protected TestDependencyInjector testInjector;
abstract protected void addInjectables();
@Override
protected void setUp() throws Exception {
testInjector = TestDependencyInjector.initialize("test");
addInjectables();
super.setUp();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
TestDependencyInjector.deinitialize(testInjector);
}
}

@ -0,0 +1,131 @@
package com.todoroo.astrid.gtasks;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.RemoteViews;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.TaskDecoration;
import com.todoroo.astrid.core.CoreFilterExposer;
import com.todoroo.astrid.core.PluginServices;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.test.DatabaseTestCase;
public class GtasksDecorationExposerTest extends DatabaseTestCase {
private GtasksTestPreferenceService preferences = new GtasksTestPreferenceService();
private TaskDecoration result;
public void testExposeNotLoggedIn() {
givenLoggedInStatus(true);
whenRequestingDecoration(gtasksFilter(), indentedTask(1));
thenExpectNoDecoration();
}
public void testExposeLoggedInButNormalFilter() {
givenLoggedInStatus(false);
whenRequestingDecoration(nonGtasksFilter(), indentedTask(1));
thenExpectNoDecoration();
}
public void testExposeIndentation() {
givenLoggedInStatus(true);
whenRequestingDecoration(gtasksFilter(), indentedTask(1));
thenExpectDecoration(1);
}
public void testExposeIndentationWithNormalTask() {
givenLoggedInStatus(true);
whenRequestingDecoration(gtasksFilter(), nonIndentedTask());
thenExpectNoDecoration();
}
public void testMoreIndentationIsWider() {
givenLoggedInStatus(true);
whenRequestingDecoration(gtasksFilter(), indentedTask(2));
thenExpectWiderThan(indentedTask(1));
}
// --- helpers
private void thenExpectWiderThan(Task otherTask) {
assertNotNull(result);
RemoteViews view = result.decoration;
FrameLayout parent = new FrameLayout(getContext());
View inflated = view.apply(getContext(), parent);
int width = inflated.getWidth();
result = new GtasksDecorationExposer().expose(gtasksFilter(), otherTask);
View otherInflated = result.decoration.apply(getContext(), parent);
int otherWidth = otherInflated.getWidth();
assertTrue(width + " > " + otherWidth, width > otherWidth);
}
private Task nonIndentedTask() {
Task task = new Task();
PluginServices.getTaskService().save(task);
Metadata metadata = GtasksMetadata.createEmptyMetadata();
PluginServices.getMetadataService().save(metadata);
return task;
}
private void thenExpectDecoration(int minWidth) {
assertNotNull(result);
RemoteViews view = result.decoration;
FrameLayout parent = new FrameLayout(getContext());
View inflated = view.apply(getContext(), parent);
assertTrue("actual: " + inflated.getWidth(), inflated.getWidth() > minWidth);
}
private Filter gtasksFilter() {
StoreObject list = new StoreObject();
list.setValue(GtasksList.REMOTE_ID, "1");
list.setValue(GtasksList.NAME, "lamo");
return GtasksFilterExposer.filterFromList(list);
}
private Task indentedTask(int indentation) {
Task task = new Task();
PluginServices.getTaskService().save(task);
Metadata metadata = GtasksMetadata.createEmptyMetadata();
metadata.setValue(GtasksMetadata.INDENTATION, indentation);
PluginServices.getMetadataService().save(metadata);
return task;
}
private Filter nonGtasksFilter() {
return CoreFilterExposer.buildInboxFilter(getContext().getResources());
}
@Override
protected void addInjectables() {
super.addInjectables();
testInjector.addInjectable("gtasksPreferenceService", preferences);
}
private void thenExpectNoDecoration() {
assertNull(result);
}
private void whenRequestingDecoration(Filter filter, Task task) {
result = new GtasksDecorationExposer().expose(filter, task);
}
private void givenLoggedInStatus(boolean status) {
preferences.setLoggedIn(status);
}
}

@ -0,0 +1,16 @@
package com.todoroo.astrid.gtasks;
public class GtasksTestPreferenceService extends GtasksPreferenceService {
private boolean loggedIn = false;
public void setLoggedIn(boolean loggedIn) {
this.loggedIn = loggedIn;
}
@Override
public boolean isLoggedIn() {
return loggedIn;
}
}

@ -2,8 +2,7 @@ package com.todoroo.astrid.test;
import java.io.File;
import com.todoroo.andlib.service.TestDependencyInjector;
import com.todoroo.andlib.test.TodorooTestCase;
import com.todoroo.andlib.test.TodorooTestCaseWithInjector;
import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.legacy.AlarmDatabase;
import com.todoroo.astrid.service.AstridDependencyInjector;
@ -14,7 +13,7 @@ import com.todoroo.astrid.service.AstridDependencyInjector;
* @author Tim Su <tim@todoroo.com>
*
*/
public class DatabaseTestCase extends TodorooTestCase {
public class DatabaseTestCase extends TodorooTestCaseWithInjector {
public static Database database = new TestDatabase();
@ -22,12 +21,13 @@ public class DatabaseTestCase extends TodorooTestCase {
AstridDependencyInjector.initialize();
}
@Override
protected void addInjectables() {
testInjector.addInjectable("database", database);
}
@Override
protected void setUp() throws Exception {
// initialize test dependency injector
TestDependencyInjector injector = TestDependencyInjector.initialize("db");
injector.addInjectable("database", database);
// call upstream setup, which invokes dependency injector
super.setUp();
@ -49,6 +49,7 @@ public class DatabaseTestCase extends TodorooTestCase {
@Override
protected void tearDown() throws Exception {
database.close();
super.tearDown();
}
public static class TestDatabase extends Database {

Loading…
Cancel
Save