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 { public class GtasksDecorationExposer implements TaskDecorationExposer {
@Autowired private GtasksMetadataService gtasksMetadataService; @Autowired private GtasksMetadataService gtasksMetadataService;
@Autowired private GtasksPreferenceService gtasksPreferenceService;
public GtasksDecorationExposer() { public GtasksDecorationExposer() {
DependencyInjectionService.getInstance().inject(this); DependencyInjectionService.getInstance().inject(this);
@ -31,7 +32,7 @@ public class GtasksDecorationExposer implements TaskDecorationExposer {
@Override @Override
public TaskDecoration expose(Filter activeFilter, Task task) { public TaskDecoration expose(Filter activeFilter, Task task) {
if(!GtasksUtilities.INSTANCE.isLoggedIn()) if(!gtasksPreferenceService.isLoggedIn())
return null; return null;
if(!activeFilter.sqlQuery.contains(GtasksMetadata.METADATA_KEY)) 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$ public static final String DETAIL_SEPARATOR = " | "; //$NON-NLS-1$
@Autowired @Autowired private GtasksMetadataService gtasksMetadataService;
private GtasksMetadataService gtasksMetadataService; @Autowired private GtasksListService gtasksListService;
@Autowired private GtasksPreferenceService gtasksPreferenceService;
@Autowired
private GtasksListService gtasksListService;
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
ContextManager.setContext(context); ContextManager.setContext(context);
// if we aren't logged in, don't expose features // if we aren't logged in, don't expose features
if(!GtasksUtilities.INSTANCE.isLoggedIn()) if(!gtasksPreferenceService.isLoggedIn())
return; return;
long taskId = intent.getLongExtra(AstridApiConstants.EXTRAS_TASK_ID, -1); long taskId = intent.getLongExtra(AstridApiConstants.EXTRAS_TASK_ID, -1);
@ -50,7 +48,7 @@ public class GtasksDetailExposer extends BroadcastReceiver {
return; return;
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_DETAILS); 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_TASK_ID, taskId);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_EXTENDED, extended); broadcastIntent.putExtra(AstridApiConstants.EXTRAS_EXTENDED, extended);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, taskDetail); broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, taskDetail);

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

@ -37,7 +37,7 @@ public class GtasksMetadata {
Metadata metadata = new Metadata(); Metadata metadata = new Metadata();
metadata.setValue(Metadata.KEY, GtasksMetadata.METADATA_KEY); metadata.setValue(Metadata.KEY, GtasksMetadata.METADATA_KEY);
metadata.setValue(ID, (long)VALUE_UNSET); 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)); VALUE_UNSET));
metadata.setValue(OWNER_ID, (long)VALUE_UNSET); metadata.setValue(OWNER_ID, (long)VALUE_UNSET);
metadata.setValue(INDENTATION, 0); metadata.setValue(INDENTATION, 0);

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

@ -9,13 +9,11 @@ import com.todoroo.astrid.sync.SyncProviderUtilities;
* @author timsu * @author timsu
* *
*/ */
public class GtasksUtilities extends SyncProviderUtilities { public class GtasksPreferenceService extends SyncProviderUtilities {
/** add-on identifier */ /** add-on identifier */
public static final String IDENTIFIER = "gtasks"; //$NON-NLS-1$ public static final String IDENTIFIER = "gtasks"; //$NON-NLS-1$
public static final GtasksUtilities INSTANCE = new GtasksUtilities();
@Override @Override
public String getIdentifier() { public String getIdentifier() {
return IDENTIFIER; return IDENTIFIER;
@ -29,8 +27,4 @@ public class GtasksUtilities extends SyncProviderUtilities {
/** GTasks user's default list id */ /** GTasks user's default list id */
public static final String PREF_DEFAULT_LIST = IDENTIFIER + "_defaultlist"; //$NON-NLS-1$ 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.dao.TaskDao;
import com.todoroo.astrid.gtasks.GtasksListService; import com.todoroo.astrid.gtasks.GtasksListService;
import com.todoroo.astrid.gtasks.GtasksMetadataService; import com.todoroo.astrid.gtasks.GtasksMetadataService;
import com.todoroo.astrid.gtasks.GtasksPreferenceService;
import com.todoroo.astrid.utility.Constants; import com.todoroo.astrid.utility.Constants;
/** /**
@ -64,6 +65,7 @@ public class AstridDependencyInjector extends AbstractDependencyInjector {
injectables.put("syncTable", "sync"); injectables.put("syncTable", "sync");
// com.todoroo.astrid.gtasks // com.todoroo.astrid.gtasks
injectables.put("gtasksPreferenceService", GtasksPreferenceService.class);
injectables.put("gtasksListService", GtasksListService.class); injectables.put("gtasksListService", GtasksListService.class);
injectables.put("gtasksMetadataService", GtasksMetadataService.class); injectables.put("gtasksMetadataService", GtasksMetadataService.class);

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

Loading…
Cancel
Save