/**
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.sync.repeats;
import java.io.IOException;
import java.util.concurrent.Semaphore;
import org.json.JSONObject;
import com.google.ical.values.Frequency;
import com.google.ical.values.RRule;
import com.timsu.astrid.R;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.actfm.sync.ActFmInvoker;
import com.todoroo.astrid.actfm.sync.ActFmPreferenceService;
import com.todoroo.astrid.actfm.sync.ActFmSyncService;
import com.todoroo.astrid.actfm.sync.ActFmSyncV2Provider;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.sync.SyncResultCallbackAdapter;
public class RepeatTestsActFmSync extends AbstractSyncRepeatTests<Task> {
@Autowired MetadataService metadataService;
@Autowired ActFmSyncService actFmSyncService;
@Autowired ActFmPreferenceService actFmPreferenceService;
protected static ActFmInvoker invoker = null;
private static final String TEST_ACCOUNT = "sync_tester2@astrid.com";
private static final String TEST_PASSWORD = "wonkwonkjj";
private static boolean initialized = false;
@Override
protected void setUp() throws Exception {
super.setUp();
Preferences.setStringFromInteger(R.string.p_default_urgency_key, 0);
if (!initialized) {
initializeTestService();
}
clearTasks();
}
private void initializeTestService() throws Exception {
invoker = new ActFmInvoker();
authenticate(TEST_ACCOUNT, null, null, ActFmInvoker.PROVIDER_PASSWORD, TEST_PASSWORD);
initialized = true;
}
private void clearTasks() throws Exception {
// JSONObject result = invoker.invoke("task_list", "active", 1);
//
// JSONArray taskList = result.getJSONArray("list");
// for(int i = 0; i < taskList.length(); i++) {
// Task remote = new Task();
// ActFmSyncService.JsonHelper.taskFromJson(taskList.getJSONObject(i), remote, new ArrayList<Metadata>());
//
// remote.setValue(Task.DELETION_DATE, DateUtilities.now());
// actFmSyncService.pushTaskOnSave(remote, remote.getSetValues());
// }
}
private void authenticate(String email, String firstName, String lastName, String provider, String secret) {
try {
JSONObject result = invoker.authenticate(email, firstName, lastName, provider, secret);
String token = invoker.getToken();
postAuthenticate(result, token);
} catch (IOException e) {
e.printStackTrace();
fail("Error authenticating");
}
}
@SuppressWarnings("nls")
private void postAuthenticate(JSONObject result, String token) {
actFmPreferenceService.setToken(token);
Preferences.setString(ActFmPreferenceService.PREF_USER_ID,
Long.toString(result.optLong("id")));
Preferences.setString(ActFmPreferenceService.PREF_NAME, result.optString("name"));
Preferences.setString(ActFmPreferenceService.PREF_EMAIL, result.optString("email"));
Preferences.setString(ActFmPreferenceService.PREF_PICTURE, result.optString("picture"));
}
@Override
protected void waitAndSync() {
AndroidUtilities.sleepDeep(3000L);
final Semaphore sema = new Semaphore(0);
new ActFmSyncV2Provider().synchronizeActiveTasks(true, new SyncResultCallbackAdapter() {
@Override
public void finished() {
sema.release();
}
});
try {
sema.acquire();
} catch (InterruptedException e) {
fail("Interrupted while waiting for sync to finish");
}
AndroidUtilities.sleepDeep(3000L);
}
/**
* @param t
* @param expectedDueDate
*/
@Override
protected Task assertTaskExistsRemotely(Task t, long expectedDueDate) {
// Task remote = new Task();
// try {
// ActFmSyncService.JsonHelper.taskFromJson(invoker.invoke("task_show", "id", t.getValue(Task.UUID)), remote,
// new ArrayList<Metadata>());
// assertTimesMatch(expectedDueDate, remote.getValue(Task.DUE_DATE).longValue());
// } catch (Exception e) {
// e.printStackTrace();
// fail("Error in ActFm invoker");
// }
return null; //remote;
}
@Override
protected void testRepeating(boolean completeBefore, boolean fromCompletion, RRule rrule, Frequency frequency, String title) {
Task t = new Task();
t.setValue(Task.TITLE, title);
long dueDate = DateUtilities.now() + ((completeBefore ? -1 : 1) * DateUtilities.ONE_DAY * 3);
dueDate = Task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME, (dueDate / 1000L) * 1000L); // Strip milliseconds
t.setValue(Task.DUE_DATE, dueDate);
if (rrule == null) {
rrule = new RRule();
rrule.setFreq(frequency);
int interval = 5;
rrule.setInterval(interval);
}
String result = rrule.toIcal();
if (fromCompletion)
result = result + ";FROM=COMPLETION";
t.setValue(Task.RECURRENCE, rrule.toIcal());
taskDao.save(t);
waitAndSync();
t = taskDao.fetch(t.getId(), Task.PROPERTIES); // Refetch
Task remoteModel = assertTaskExistsRemotely(t, dueDate);
long completionDate = setCompletionDate(completeBefore, t, remoteModel, dueDate);
waitAndSync();
TodorooCursor<Task> cursor = taskDao.query(Query.select(Task.PROPERTIES).where(TaskCriteria.notDeleted()));
try {
assertEquals(1, cursor.getCount());
cursor.moveToFirst();
t.readFromCursor(cursor);
long fromDate = (fromCompletion? completionDate : dueDate);
long expectedTime = computeNextDueDateFromDate(fromDate, rrule, fromCompletion);
long newDueDate = t.getValue(Task.DUE_DATE);
assertTaskExistsRemotely(t, expectedTime);
assertTrue(t.hasDueTime());
assertEquals(title, t.getValue(Task.TITLE));
assertTimesMatch(expectedTime, newDueDate);
assertFalse(t.isCompleted());
} finally {
cursor.close();
}
}
}