diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java b/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java index 9cf6d748d..39270d77e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java @@ -246,16 +246,14 @@ public class APIHelper implements Action1 { auth.setPassword(password); auth.setConfirmPassword(confirmPassword); auth.setEmail(email); - return this.apiService.registerUser(auth) - .compose(this.configureApiCallObserver()); + return this.apiService.registerUser(auth); } public Observable connectUser(String username, String password) { UserAuth auth = new UserAuth(); auth.setUsername(username); auth.setPassword(password); - return this.apiService.connectLocal(auth) - .compose(this.configureApiCallObserver()); + return this.apiService.connectLocal(auth); } public Observable connectSocial(String userId, String accessToken) { @@ -265,8 +263,7 @@ public class APIHelper implements Action1 { authResponse.setClient_id(userId); authResponse.setAccess_token(accessToken); auth.setAuthResponse(authResponse); - return this.apiService.connectSocial(auth) - .compose(this.configureApiCallObserver()); + return this.apiService.connectSocial(auth); } @Override diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.java index fcb1248ca..1df35def4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.java @@ -154,9 +154,9 @@ public class SetupActivity extends BaseActivity implements View.OnClickListener, public void onClick(View v) { if (v == this.nextButton) { if (this.pager.getCurrentItem() == 1) { - List> newTasks = this.taskSetupFragment.createSampleTasks(); + List newTasks = this.taskSetupFragment.createSampleTasks(); this.completedSetup = true; - this.apiHelper.apiService.createItems(newTasks) + this.apiHelper.apiService.createTasks(newTasks) .compose(this.apiHelper.configureApiCallObserver()) .subscribe(tasks -> { onUserReceived(user); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/TaskSetupFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/TaskSetupFragment.java index 8db5280e0..ba3c9c067 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/TaskSetupFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/TaskSetupFragment.java @@ -5,6 +5,7 @@ import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.activities.SetupActivity; import com.habitrpg.android.habitica.ui.adapter.setup.TaskSetupAdapter; import com.habitrpg.android.habitica.ui.fragments.BaseFragment; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.Days; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; import android.os.Bundle; @@ -104,7 +105,7 @@ public class TaskSetupFragment extends BaseFragment { }; } - public List> createSampleTasks() { + public List createSampleTasks() { List groups = new ArrayList<>(); int i = 0; for (Boolean checked : this.adapter.checkedList) { @@ -113,10 +114,10 @@ public class TaskSetupFragment extends BaseFragment { } i++; } - List> tasks = new ArrayList<>(); + List tasks = new ArrayList<>(); for (Object[] task : this.tasks) { if (groups.contains((String) task[0])) { - Map taskObject = new HashMap<>(); + Task taskObject; if (task.length == 5) { taskObject = this.makeTaskObject((String) task[1], (String) task[2], (Boolean) task[3], (Boolean) task[4]); } else { @@ -128,29 +129,29 @@ public class TaskSetupFragment extends BaseFragment { return tasks; } - private Map makeTaskObject(String type, String text, Boolean up, Boolean down) { - Map task = new HashMap<>(); - task.put("text", text); - task.put("priority", 1); - task.put("type", type); + private Task makeTaskObject(String type, String text, Boolean up, Boolean down) { + Task task = new Task(); + task.text = text; + task.priority = 1.0f; + task.type = type; if (type.equals("habit")) { - task.put("up", up); - task.put("down", down); + task.up = up; + task.down = down; } if (type.equals("daily")) { - task.put("frequency", "weekly"); - task.put("startDate", new Date()); - Map repeat= new HashMap<>(); - repeat.put("m", true); - repeat.put("t", true); - repeat.put("w", true); - repeat.put("th", true); - repeat.put("f", true); - repeat.put("s", true); - repeat.put("su", true); - task.put("repeat", repeat); + task.frequency = "weekly"; + task.startDate = new Date(); + Days days = new Days(); + days.setM(true); + days.setT(true); + days.setW(true); + days.setTh(true); + days.setF(true); + days.setS(true); + days.setSu(true); + task.repeat = days; } return task; diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java index b3b04b0ee..c887362fa 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java @@ -94,7 +94,7 @@ public interface ApiService { Observable createItem(@Body Task item); @POST("tasks/user") - Observable> createItems(@Body List> tasks); + Observable> createTasks(@Body List tasks); @PUT("tasks/{id}") Observable updateTask(@Path("id") String id, @Body Task item); diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java index bd482c0cf..53b44f480 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/tasks/Task.java @@ -88,6 +88,7 @@ public class Task extends BaseModel { public Integer everyX, streak; @Column + public Date startDate; @Column diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/TaskSerializer.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/TaskSerializer.java index 5bafa45a1..0404ac8cd 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/TaskSerializer.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/TaskSerializer.java @@ -15,7 +15,7 @@ public class TaskSerializer implements JsonSerializer { @Override public JsonElement serialize(Task task, Type typeOfSrc, JsonSerializationContext context) { JsonObject obj = new JsonObject(); - obj.addProperty("id", task.getId()); + obj.addProperty("_id", task.getId()); obj.addProperty("text", task.getText()); obj.addProperty("notes", task.getNotes()); obj.addProperty("value", task.getValue()); diff --git a/Habitica/src/test/java/com/habitrpg/android/habitica/APIHelperTests.java b/Habitica/src/test/java/com/habitrpg/android/habitica/APIHelperTests.java deleted file mode 100644 index 4bc63614f..000000000 --- a/Habitica/src/test/java/com/habitrpg/android/habitica/APIHelperTests.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.habitrpg.android.habitica; - - -import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; -import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; -import com.magicmicky.habitrpgwrapper.lib.models.tasks.TaskList; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricGradleTestRunner; -import org.robolectric.annotation.Config; - -import android.os.Build; - -import java.util.List; - -import rx.observers.TestSubscriber; - -@Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.LOLLIPOP) -@RunWith(RobolectricGradleTestRunner.class) -public class APIHelperTests { - - private APIHelper apiHelper; - - @Before - public void setUp() { - HostConfig hostConfig = new HostConfig(BuildConfig.BASE_URL, - BuildConfig.PORT, - BuildConfig.TEST_USER_KEY, - BuildConfig.TEST_USER_ID); - apiHelper = new APIHelper(APIHelper.createGsonFactory(), hostConfig); - } - - @Test - public void shouldLoadUserFromServer() { - TestSubscriber testSubscriber = new TestSubscriber<>(); - apiHelper.apiService.getUser().subscribe(testSubscriber); - testSubscriber.assertNoErrors(); - testSubscriber.assertCompleted(); - testSubscriber.assertValueCount(1); - } - - @Test - public void shouldLoadTasksFromServer() { - TestSubscriber testSubscriber = new TestSubscriber<>(); - apiHelper.apiService.getTasks().subscribe(testSubscriber); - testSubscriber.assertNoErrors(); - testSubscriber.assertCompleted(); - } - - @Test - public void shouldLoadCompleteUserFromServer() { - TestSubscriber testSubscriber = new TestSubscriber<>(); - apiHelper.retrieveUser(true).subscribe(testSubscriber); - testSubscriber.assertNoErrors(); - testSubscriber.assertCompleted(); - testSubscriber.assertValueCount(1); - } -} diff --git a/Habitica/src/test/java/com/habitrpg/android/habitica/api/BaseAPITests.java b/Habitica/src/test/java/com/habitrpg/android/habitica/api/BaseAPITests.java new file mode 100644 index 000000000..1ca2c4cb3 --- /dev/null +++ b/Habitica/src/test/java/com/habitrpg/android/habitica/api/BaseAPITests.java @@ -0,0 +1,55 @@ +package com.habitrpg.android.habitica.api; + + +import com.habitrpg.android.habitica.APIHelper; +import com.habitrpg.android.habitica.BuildConfig; +import com.habitrpg.android.habitica.HostConfig; +import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; +import com.magicmicky.habitrpgwrapper.lib.models.UserAuthResponse; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.TaskList; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricGradleTestRunner; +import org.robolectric.annotation.Config; + +import android.os.Build; + +import java.util.List; +import java.util.UUID; + +import rx.observers.TestSubscriber; + +@Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.LOLLIPOP) +@RunWith(RobolectricGradleTestRunner.class) +public class BaseAPITests { + + public APIHelper apiHelper; + public HostConfig hostConfig; + + public String username; + public final String password = "password"; + + @Before + public void setUp() { + hostConfig = new HostConfig(BuildConfig.BASE_URL, + BuildConfig.PORT, + "", + ""); + apiHelper = new APIHelper(APIHelper.createGsonFactory(), hostConfig); + generateUser(); + } + + public void generateUser() { + TestSubscriber testSubscriber = new TestSubscriber<>(); + username = UUID.randomUUID().toString(); + apiHelper.registerUser(username, username+"@example.com", password, password) + .subscribe(testSubscriber); + testSubscriber.assertCompleted(); + UserAuthResponse response = testSubscriber.getOnNextEvents().get(0); + hostConfig.setUser(response.getId()); + hostConfig.setApi(response.getApiToken() != null ? response.getApiToken() : response.getToken()); + } +} diff --git a/Habitica/src/test/java/com/habitrpg/android/habitica/api/TaskAPITests.java b/Habitica/src/test/java/com/habitrpg/android/habitica/api/TaskAPITests.java new file mode 100644 index 000000000..ca3534d60 --- /dev/null +++ b/Habitica/src/test/java/com/habitrpg/android/habitica/api/TaskAPITests.java @@ -0,0 +1,110 @@ +package com.habitrpg.android.habitica.api; + + +import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; +import com.magicmicky.habitrpgwrapper.lib.models.TaskDirectionData; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.TaskList; + +import org.hamcrest.CoreMatchers; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import rx.observers.TestSubscriber; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +public class TaskAPITests extends BaseAPITests { + + private Task habit1; + private Task daily1; + private Task todo1; + private Task reward1; + + @Override + public void setUp() { + super.setUp(); + TestSubscriber oldTaskSubscriber = new TestSubscriber<>(); + apiHelper.apiService.getTasks().subscribe(oldTaskSubscriber); + TaskList tasks = oldTaskSubscriber.getOnNextEvents().get(0); + for (Task task : tasks.tasks.values()) { + apiHelper.apiService.deleteTask(task.getId()).subscribe(new TestSubscriber<>()); + } + + List randomTasks = new ArrayList<>(); + randomTasks.add(createRandomTask("1", "habit")); + habit1 = randomTasks.get(0); + randomTasks.add(createRandomTask("2", "habit")); + randomTasks.add(createRandomTask("3", "daily")); + daily1 = randomTasks.get(2); + randomTasks.add(createRandomTask("4", "daily")); + randomTasks.add(createRandomTask("5", "todo")); + todo1 = randomTasks.get(4); + randomTasks.add(createRandomTask("6", "todo")); + randomTasks.add(createRandomTask("7", "reward")); + reward1 = randomTasks.get(6); + randomTasks.add(createRandomTask("8", "reward")); + TestSubscriber> testSubscriber = new TestSubscriber<>(); + apiHelper.apiService.createTasks(randomTasks).subscribe(testSubscriber); + testSubscriber.assertNoErrors(); + testSubscriber.assertCompleted(); + } + + private Task createRandomTask(String number, String type) { + Task task = new Task(); + task.setId(String.valueOf(UUID.randomUUID())); + task.setText("task-"+number); + task.setType(type); + task.setTags(new ArrayList<>()); + task.setChecklist(new ArrayList<>()); + return task; + } + + @Test + public void shouldLoadAllTasksFromServer() { + TestSubscriber testSubscriber = new TestSubscriber<>(); + apiHelper.apiService.getTasks().subscribe(testSubscriber); + testSubscriber.assertNoErrors(); + testSubscriber.assertCompleted(); + TaskList taskList = testSubscriber.getOnNextEvents().get(0); + assertEquals(8, taskList.tasks.size()); + } + + @Test + public void shouldBeAbleToScoreTaskUp() { + TestSubscriber testSubscriber = new TestSubscriber<>(); + apiHelper.apiService.postTaskDirection(habit1.getId(), "up").subscribe(testSubscriber); + testSubscriber.assertNoErrors(); + testSubscriber.assertCompleted(); + TaskDirectionData data = testSubscriber.getOnNextEvents().get(0); + assertTrue(data.getDelta() > 0); + } + + @Test + public void shouldBeAbleToScoreTaskDown() { + TestSubscriber testSubscriber = new TestSubscriber<>(); + apiHelper.apiService.postTaskDirection(habit1.getId(), "down").subscribe(testSubscriber); + testSubscriber.assertNoErrors(); + testSubscriber.assertCompleted(); + TaskDirectionData data = testSubscriber.getOnNextEvents().get(0); + assertTrue(data.getDelta() < 0); + } + + @Test + public void shouldBeAbleToDeleteATask() { + TestSubscriber testSubscriber = new TestSubscriber<>(); + apiHelper.apiService.deleteTask(habit1.getId()).subscribe(testSubscriber); + testSubscriber.assertCompleted(); + testSubscriber.assertNoErrors(); + TestSubscriber newTaskListSubscriber = new TestSubscriber<>(); + apiHelper.apiService.getTasks().subscribe(newTaskListSubscriber); + TaskList taskList = newTaskListSubscriber.getOnNextEvents().get(0); + assertEquals(7, taskList.tasks.size()); + } + +} diff --git a/Habitica/src/test/java/com/habitrpg/android/habitica/api/UserAPITests.java b/Habitica/src/test/java/com/habitrpg/android/habitica/api/UserAPITests.java new file mode 100644 index 000000000..5a6688262 --- /dev/null +++ b/Habitica/src/test/java/com/habitrpg/android/habitica/api/UserAPITests.java @@ -0,0 +1,66 @@ +package com.habitrpg.android.habitica.api; + + +import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; +import com.magicmicky.habitrpgwrapper.lib.models.UserAuthResponse; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.TaskList; + +import junit.framework.Assert; + +import org.junit.Test; + +import java.util.UUID; + +import rx.observers.TestSubscriber; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertNotSame; + +public class UserAPITests extends BaseAPITests { + + @Test + public void shouldLoadUserFromServer() { + TestSubscriber testSubscriber = new TestSubscriber<>(); + apiHelper.apiService.getUser().subscribe(testSubscriber); + testSubscriber.assertNoErrors(); + testSubscriber.assertCompleted(); + testSubscriber.assertValueCount(1); + } + + @Test + public void shouldLoadCompleteUserFromServer() { + TestSubscriber testSubscriber = new TestSubscriber<>(); + apiHelper.retrieveUser(true).subscribe(testSubscriber); + testSubscriber.assertNoErrors(); + testSubscriber.assertCompleted(); + testSubscriber.assertValueCount(1); + } + + @Test + public void shouldRegisterNewUser() { + hostConfig.setUser(""); + hostConfig.setApi(""); + TestSubscriber testSubscriber = new TestSubscriber<>(); + username = UUID.randomUUID().toString(); + apiHelper.registerUser(username, username+"@example.com", password, password) + .subscribe(testSubscriber); + testSubscriber.assertNoErrors(); + testSubscriber.assertCompleted(); + UserAuthResponse response = testSubscriber.getOnNextEvents().get(0); + + assertNotSame(hostConfig.getUser(), response.getId()); + assertNotSame(hostConfig.getApi(), response.getApiToken() != null ? response.getApiToken() : response.getToken()); + } + + @Test + public void shouldLoginExistingUser() { + TestSubscriber testSubscriber = new TestSubscriber<>(); + apiHelper.connectUser(username, password).subscribe(testSubscriber); + testSubscriber.assertNoErrors(); + testSubscriber.assertCompleted(); + UserAuthResponse response = testSubscriber.getOnNextEvents().get(0); + assertEquals(hostConfig.getUser(), response.getId()); + assertEquals(hostConfig.getApi(), response.getApiToken() != null ? response.getApiToken() : response.getToken()); + } + +} diff --git a/habitica.properties.example b/habitica.properties.example index f8c5fc74b..00f3fb4b7 100644 --- a/habitica.properties.example +++ b/habitica.properties.example @@ -11,4 +11,4 @@ PORT=80 # BASE_URL=http://10.0.2.2:3000 # Production -BASE_URL=https://habitica.com \ No newline at end of file +BASE_URL=https://habitica.com