mirror of https://github.com/tasks/tasks
Turned preference service into an injected class for better testability, wrote the first test, of the decorator
parent
a87cb96a8d
commit
0cf572de59
@ -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;
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue