/**
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.gtasks;
import java.util.Date;
import java.util.List;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.accounts.AccountManagerFuture;
import android.content.Intent;
import android.os.Bundle;
import com.google.api.client.googleapis.extensions.android2.auth.GoogleAccountManager;
import com.google.api.client.util.DateTime;
import com.google.api.services.tasks.model.Task;
import com.google.api.services.tasks.model.TaskList;
import com.google.api.services.tasks.model.TaskLists;
import com.google.api.services.tasks.model.Tasks;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.gtasks.api.GtasksApiUtilities;
import com.todoroo.astrid.gtasks.api.GtasksInvoker;
import com.todoroo.astrid.gtasks.api.MoveListRequest;
import com.todoroo.astrid.gtasks.auth.GtasksTokenValidator;
import com.todoroo.astrid.test.DatabaseTestCase;
@SuppressWarnings("nls")
public class GtasksApiTest extends DatabaseTestCase {
private static final String DEFAULT_LIST = "@default";
private static final String TEST_ACCOUNT = "sync_tester2@astrid.com";
private static GtasksInvoker service;
private static boolean initialized = false;
private boolean bypassTests = false;
public void testCreateTask() throws Exception {
if(bypassTests) return;
Task newTask = new Task();
String title = "New task";
newTask.setTitle(title);
service.createGtask(DEFAULT_LIST, newTask);
assertTrue(taskWithTitleExists(title));
}
public void testUpdateTaskProperties() throws Exception {
if(bypassTests) return;
Task newTask = new Task();
String title = "This title will change";
newTask.setTitle(title);
newTask = service.createGtask(DEFAULT_LIST, newTask);
assertTrue(taskWithTitleExists(title));
String title2 = "Changed Title";
newTask.setTitle(title2);
service.updateGtask(DEFAULT_LIST, newTask);
assertTrue(taskWithTitleExists(title2));
assertFalse(taskWithTitleExists(title));
}
public void testTaskDateFormatting2() throws Exception {
if(bypassTests) return;
Task newTask = new Task();
String title = "Due date will change";
newTask.setTitle(title);
newTask = service.createGtask(DEFAULT_LIST, newTask);
assertTrue(taskWithTitleExists(title));
newTask = service.getGtask(DEFAULT_LIST, newTask.getId());
System.err.println("Newtask A: " + newTask.getDue());
long now = DateUtilities.now();
newTask.setDue(GtasksApiUtilities.unixTimeToGtasksDueDate(now));
System.err.println("Newtask B: " + newTask.getDue());
newTask = service.updateGtask(DEFAULT_LIST, newTask);
System.err.println("Newtask C: " + newTask.getDue());
long complete = now + DateUtilities.ONE_DAY;
newTask.setCompleted(GtasksApiUtilities.unixTimeToGtasksCompletionTime(complete));
System.err.println("Newtask D: " + newTask.getCompleted());
newTask.setStatus("completed");
newTask = service.updateGtask(DEFAULT_LIST, newTask);
System.err.println("Newtask E: " + newTask.getCompleted());
}
public void testTaskDateFormatting() throws Exception {
if(bypassTests) return;
Task newTask = new Task();
String title = "Due date will change";
newTask.setTitle(title);
newTask = service.createGtask(DEFAULT_LIST, newTask);
assertTrue(taskWithTitleExists(title));
long dueTime = new Date(114, 1, 13).getTime();
DateTime dueTimeString = GtasksApiUtilities.unixTimeToGtasksDueDate(dueTime);
newTask.setDue(dueTimeString);
newTask = service.updateGtask(DEFAULT_LIST, newTask);
//assertEquals(dueTimeString, GtasksApiUtilities.gtasksDueTimeStringToLocalTimeString(newTask.due));
assertEquals(dueTime, GtasksApiUtilities.gtasksDueTimeToUnixTime(newTask.getDue(), 0));
long compTime = new Date(115, 2, 14).getTime();
DateTime compTimeString = GtasksApiUtilities.unixTimeToGtasksCompletionTime(compTime);
newTask.setCompleted(compTimeString);
newTask.setStatus("completed");
newTask = service.updateGtask(DEFAULT_LIST, newTask);
//assertEquals(compTimeString, GtasksApiUtilities.gtasksCompletedTimeStringToLocalTimeString(newTask.completed));
assertEquals(compTime, GtasksApiUtilities.gtasksCompletedTimeToUnixTime(newTask.getCompleted(), 0));
}
public void testTaskDeleted() throws Exception {
if(bypassTests) return;
Task newTask = new Task();
String title = "This task will be deleted";
newTask.setTitle(title);
newTask = service.createGtask(DEFAULT_LIST, newTask);
assertTrue(taskWithTitleExists(title));
service.deleteGtask(DEFAULT_LIST, newTask.getId());
assertFalse(taskWithTitleExists(title));
}
public void testTaskMoved() throws Exception {
if(bypassTests) return;
Task newTask1 = new Task();
String title1 = "Task 1";
newTask1.setTitle(title1);
Task newTask2 = new Task();
String title2 = "Task 2";
newTask2.setTitle(title2);
newTask1 = service.createGtask(DEFAULT_LIST, newTask1);
newTask2 = service.createGtask(DEFAULT_LIST, newTask2);
assertTrue(taskWithTitleExists(title1));
assertTrue(taskWithTitleExists(title2));
System.err.println("Task 1 id: " + newTask1.getId());
System.err.println("Task 2 id: " + newTask2.getId());
service.moveGtask(DEFAULT_LIST, newTask1.getId(), newTask2.getId(), null);
newTask1 = service.getGtask(DEFAULT_LIST, newTask1.getId());
newTask2 = service.getGtask(DEFAULT_LIST, newTask2.getId());
assertEquals(newTask1.getParent(), newTask2.getId());
service.moveGtask(DEFAULT_LIST, newTask1.getId(), null, newTask2.getId());
newTask1 = service.getGtask(DEFAULT_LIST, newTask1.getId());
newTask2 = service.getGtask(DEFAULT_LIST, newTask2.getId());
assertNull(newTask1.getParent());
assertTrue(newTask2.getPosition().compareTo(newTask1.getPosition()) < 0);
}
public void testMoveBetweenLists() throws Exception {
if(bypassTests) return;
Task newTask = new Task();
String title = "This task will move lists";
newTask.setTitle(title);
newTask = service.createGtask(DEFAULT_LIST, newTask);
assertTrue(taskWithTitleExists(title));
String listTitle = "New list";
service.createGtaskList(listTitle);
TaskList newList;
assertNotNull(newList = listWithTitle(listTitle));
MoveListRequest moveTask = new MoveListRequest(service, newTask.getId(), DEFAULT_LIST, newList.getId(), null);
moveTask.executePush();
assertFalse(taskWithTitleExists(title));
assertTrue(listHasTaskWithTitle(newList.getId(), title));
}
private boolean listHasTaskWithTitle(String listId, String title) throws Exception {
com.google.api.services.tasks.model.Tasks newListTasks = service.getAllGtasksFromListId(listId, false, false, 0);
List<Task> items = newListTasks.getItems();
if (items != null) {
for (Task t : items) {
if (t.getTitle().equals(title)) {
return true;
}
}
}
return false;
}
private boolean taskWithTitleExists(String title) throws Exception {
Tasks defaultList = service.getAllGtasksFromListId(DEFAULT_LIST, false, false, 0);
List<Task> items = defaultList.getItems();
if (items != null) {
for (Task t : items) {
if (t.getTitle().equals(title))
return true;
}
}
return false;
}
public void testCreateList() throws Exception {
if(bypassTests) return;
String title1 = "My new list!";
service.createGtaskList(title1);
assertNotNull(listWithTitle(title1));
String title2 = "Another new list!";
service.createGtaskList("Another new list!");
assertNotNull(listWithTitle(title2));
assertNotNull(listWithTitle(title1));
}
public void testDeleteList() throws Exception {
if(bypassTests) return;
String title = "This list will be deleted";
TaskList t = service.createGtaskList(title);
assertNotNull(listWithTitle(title));
service.deleteGtaskList(t.getId());
assertNull(listWithTitle(title));
}
public void testUpdateListProperties() throws Exception {
if(bypassTests) return;
String title1 = "This title will change";
TaskList t = service.createGtaskList(title1);
assertNotNull(listWithTitle(title1));
String title2 = "New title";
t.setTitle(title2);
service.updateGtaskList(t);
assertNotNull(listWithTitle(title2));
assertNull(listWithTitle(title1));
}
private TaskList listWithTitle(String title) throws Exception {
TaskLists allLists = service.allGtaskLists();
List<TaskList> items = allLists.getItems();
for (TaskList t : items) {
if (t.getTitle().equals(title))
return t;
}
return null;
}
@Override
protected void setUp() throws Exception {
super.setUp();
if (!initialized) {
GoogleAccountManager manager = new GoogleAccountManager(ContextManager.getContext());
Account[] accounts = manager.getAccounts();
Account toUse = null;
for (Account a : accounts) {
if (a.name.equals(TEST_ACCOUNT)) {
toUse = a;
break;
}
}
if (toUse == null) {
if (accounts.length == 0) {
bypassTests = true;
return;
}
toUse = accounts[0];
}
Preferences.setString(GtasksPreferenceService.PREF_USER_NAME, toUse.name);
AccountManagerFuture<Bundle> accountManagerFuture = manager.manager.getAuthToken(toUse, GtasksInvoker.AUTH_TOKEN_TYPE, true, null, null);
Bundle authTokenBundle = accountManagerFuture.getResult();
if (authTokenBundle.containsKey(AccountManager.KEY_INTENT)) {
Intent i = (Intent) authTokenBundle.get(AccountManager.KEY_INTENT);
ContextManager.getContext().startActivity(i);
return;
}
String authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN);
authToken = GtasksTokenValidator.validateAuthToken(getContext(), authToken);
service = new GtasksInvoker(authToken);
initialized = true;
}
deleteAllLists();
clearDefaultList();
}
private void deleteAllLists() {
try {
TaskLists allLists = service.allGtaskLists();
List<TaskList> items = allLists.getItems();
for (TaskList t : items) {
if (!t.getTitle().equals("Default List"))
service.deleteGtaskList(t.getId());
}
} catch (Exception e) {
e.printStackTrace();
fail("Failed to clear lists");
}
}
private void clearDefaultList() {
try {
Tasks tasks = service.getAllGtasksFromListId(DEFAULT_LIST, false, false, 0);
List<Task> items = tasks.getItems();
if (items != null) {
for (Task t : items) {
service.deleteGtask(DEFAULT_LIST, t.getId());
}
}
} catch (Exception e) {
e.printStackTrace();
fail("Failed to clear default list");
}
}
}