Repository: incubator-taverna-mobile
Updated Branches:
  refs/heads/master d827f599a -> 775fe175a


Added login activity UI test


Project: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/commit/8cdbc03b
Tree: 
http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/tree/8cdbc03b
Diff: 
http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/diff/8cdbc03b

Branch: refs/heads/master
Commit: 8cdbc03bdf08ddc5ce1e25941d487ee944a8a031
Parents: d827f59
Author: Hitesh Gautam <gautam31.hit...@gmail.com>
Authored: Fri Aug 10 22:31:05 2018 +0530
Committer: Hitesh Gautam <gautam31.hit...@gmail.com>
Committed: Fri Aug 10 22:31:05 2018 +0530

----------------------------------------------------------------------
 app/build.gradle                                |  24 ++-
 .../taverna/mobile/TestComponentRule.java       | 103 +++++++++
 .../injection/component/TestComponent.java      |  31 +++
 .../injection/module/ApplicationTestModule.java |  62 ++++++
 .../taverna/mobile/login/LoginActivityTest.java | 208 +++++++++++++++++++
 .../mobile/runner/RxAndroidJUnitRunner.java     |  39 ++++
 .../runner/UnlockDeviceAndroidJUnitRunner.java  |  55 +++++
 .../mobile/utils/RxEspressoScheduleHandler.java |  52 +++++
 .../taverna/mobile/FakeRemoteDataSource.java    |   6 +
 .../org/apache/taverna/mobile/FakeXMLName.java  |   2 +-
 app/src/main/AndroidManifest.xml                |   2 +
 .../taverna/mobile/ui/DashboardActivity.java    |  69 ++++--
 .../taverna/mobile/TestComponentRule.java       |  67 ++++++
 .../injection/component/TestComponent.java      |  31 +++
 .../injection/module/ApplicationTestModule.java |  62 ++++++
 .../anouncements/AnnouncementPresenterTest.java |   1 +
 .../FavouriteWorkflowsPresenterTest.java        |   1 +
 .../ui/workflow/WorkflowPresenterTest.java      |   1 +
 .../mobile/utils/RxSchedulersOverrideRule.java  |  19 +-
 app/src/test/resources/user.xml                 |  12 ++
 build.gradle                                    |   5 +-
 21 files changed, 826 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/8cdbc03b/app/build.gradle
----------------------------------------------------------------------
diff --git a/app/build.gradle b/app/build.gradle
index ea848af..f64f473 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -16,6 +16,7 @@ android {
         versionCode 1
         versionName "1.0"
         multiDexEnabled true
+        testInstrumentationRunner 
'org.apache.taverna.mobile.runner.RxAndroidJUnitRunner'
     }
 
     sourceSets {
@@ -125,11 +126,30 @@ dependencies {
 
     //Dependencies for JUNit and unit tests.
     testImplementation "junit:junit:4.12"
-    testImplementation "org.mockito:mockito-all:1.10.19"
+    testImplementation "org.mockito:mockito-core:2.8.47"
+
+    androidTestImplementation "junit:junit:4.12"
+    androidTestImplementation "org.mockito:mockito-core:2.8.47"
+
+    androidTestImplementation "org.mockito:mockito-android:2.8.47"
+    androidTestImplementation 
"com.android.support:support-annotations:$rootProject.supportLibraryVersion"
+    
androidTestImplementation("com.android.support.test.espresso:espresso-contrib:$rootProject.espresso")
 {
+        exclude group: 'com.android.support', module: 'appcompat'
+        exclude group: 'com.android.support', module: 'support-v4'
+        exclude group: 'com.android.support', module: 'recyclerview-v7'
+    }
+    androidTestImplementation 
"com.android.support.test.espresso:espresso-core:$rootProject.espresso"
+    androidTestImplementation 
("com.android.support.test.espresso:espresso-intents:$rootProject.espresso")
+
+    androidTestImplementation 
"com.android.support.test:runner:$rootProject.runner"
+    androidTestImplementation 
"com.android.support.test:rules:$rootProject.runner"
 
     //Dependencies for Dagger 2
     implementation  "com.google.dagger:dagger:$rootProject.dagger"
+    testImplementation  "com.google.dagger:dagger:$rootProject.dagger"
+    androidTestImplementation  "com.google.dagger:dagger:$rootProject.dagger"
     annotationProcessor "com.google.dagger:dagger-compiler:$rootProject.dagger"
-
+    androidTestAnnotationProcessor 
"com.google.dagger:dagger-compiler:$rootProject.dagger"
+    testAnnotationProcessor 
"com.google.dagger:dagger-compiler:$rootProject.dagger"
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/8cdbc03b/app/src/androidTest/java/org/apache/taverna/mobile/TestComponentRule.java
----------------------------------------------------------------------
diff --git 
a/app/src/androidTest/java/org/apache/taverna/mobile/TestComponentRule.java 
b/app/src/androidTest/java/org/apache/taverna/mobile/TestComponentRule.java
new file mode 100644
index 0000000..9c5b5f8
--- /dev/null
+++ b/app/src/androidTest/java/org/apache/taverna/mobile/TestComponentRule.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.taverna.mobile;
+
+import org.apache.taverna.mobile.data.DataManager;
+import org.apache.taverna.mobile.injection.component.DaggerTestComponent;
+import org.apache.taverna.mobile.injection.component.TestComponent;
+import org.apache.taverna.mobile.injection.module.ApplicationTestModule;
+
+
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+
+import android.content.Context;
+
+import java.util.concurrent.Callable;
+
+import io.reactivex.Scheduler;
+import io.reactivex.android.plugins.RxAndroidPlugins;
+import io.reactivex.functions.Function;
+import io.reactivex.plugins.RxJavaPlugins;
+import io.reactivex.schedulers.Schedulers;
+
+public class TestComponentRule implements TestRule {
+
+    private final TestComponent mTestComponent;
+    private final Context mContext;
+
+    private Scheduler schedulerInstance = Schedulers.trampoline();
+
+    private Function<Scheduler, Scheduler> schedulerMapper = new 
Function<Scheduler, Scheduler>() {
+        @Override
+        public Scheduler apply(Scheduler scheduler) throws Exception {
+            return schedulerInstance;
+        }
+    };
+    private Function<Callable<Scheduler>, Scheduler> schedulerMapperLazy =
+            new Function<Callable<Scheduler>, Scheduler>() {
+
+
+        @Override
+        public Scheduler apply(Callable<Scheduler> schedulerCallable) throws 
Exception {
+            return schedulerInstance;
+        }
+    };
+
+    public TestComponentRule(Context context) {
+        mContext = context;
+        TavernaApplication application = TavernaApplication.get(context);
+        mTestComponent = DaggerTestComponent.builder()
+                .applicationTestModule(new ApplicationTestModule(application))
+                .build();
+    }
+
+    public Context getContext() {
+        return mContext;
+    }
+
+    public DataManager getMockDataManager() {
+        return mTestComponent.dataManager();
+    }
+
+    @Override
+    public Statement apply(final Statement base, Description description) {
+        return new Statement() {
+            @Override
+            public void evaluate() throws Throwable {
+                RxAndroidPlugins.reset();
+                
RxAndroidPlugins.setInitMainThreadSchedulerHandler(schedulerMapperLazy);
+
+                RxJavaPlugins.reset();
+                RxJavaPlugins.setIoSchedulerHandler(schedulerMapper);
+                RxJavaPlugins.setNewThreadSchedulerHandler(schedulerMapper);
+                RxJavaPlugins.setComputationSchedulerHandler(schedulerMapper);
+
+                TavernaApplication application = 
TavernaApplication.get(mContext);
+                application.setComponent(mTestComponent);
+
+                base.evaluate();
+                application.setComponent(null);
+                RxAndroidPlugins.reset();
+                RxJavaPlugins.reset();
+            }
+        };
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/8cdbc03b/app/src/androidTest/java/org/apache/taverna/mobile/injection/component/TestComponent.java
----------------------------------------------------------------------
diff --git 
a/app/src/androidTest/java/org/apache/taverna/mobile/injection/component/TestComponent.java
 
b/app/src/androidTest/java/org/apache/taverna/mobile/injection/component/TestComponent.java
new file mode 100644
index 0000000..76ac0e8
--- /dev/null
+++ 
b/app/src/androidTest/java/org/apache/taverna/mobile/injection/component/TestComponent.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.taverna.mobile.injection.component;
+
+import org.apache.taverna.mobile.injection.module.ApplicationTestModule;
+
+import javax.inject.Singleton;
+
+import dagger.Component;
+
+@Singleton
+@Component(modules = ApplicationTestModule.class)
+public interface TestComponent extends ApplicationComponent {
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/8cdbc03b/app/src/androidTest/java/org/apache/taverna/mobile/injection/module/ApplicationTestModule.java
----------------------------------------------------------------------
diff --git 
a/app/src/androidTest/java/org/apache/taverna/mobile/injection/module/ApplicationTestModule.java
 
b/app/src/androidTest/java/org/apache/taverna/mobile/injection/module/ApplicationTestModule.java
new file mode 100644
index 0000000..e8a683f
--- /dev/null
+++ 
b/app/src/androidTest/java/org/apache/taverna/mobile/injection/module/ApplicationTestModule.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.taverna.mobile.injection.module;
+
+import org.apache.taverna.mobile.data.DataManager;
+import org.apache.taverna.mobile.injection.ApplicationContext;
+import org.mockito.Mockito;
+
+import android.app.Application;
+import android.content.Context;
+
+import javax.inject.Singleton;
+
+import dagger.Module;
+import dagger.Provides;
+
+@Module
+public class ApplicationTestModule {
+
+    private final Application mApplication;
+
+    public ApplicationTestModule(Application application) {
+        mApplication = application;
+    }
+
+    @Provides
+    Application provideApplication() {
+        return mApplication;
+    }
+
+    @Provides
+    @ApplicationContext
+    Context provideContext() {
+        return mApplication;
+    }
+
+    /************* MOCKS *************/
+
+    @Provides
+    @Singleton
+    DataManager provideDataManager() {
+        return Mockito.mock(DataManager.class);
+    }
+
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/8cdbc03b/app/src/androidTest/java/org/apache/taverna/mobile/login/LoginActivityTest.java
----------------------------------------------------------------------
diff --git 
a/app/src/androidTest/java/org/apache/taverna/mobile/login/LoginActivityTest.java
 
b/app/src/androidTest/java/org/apache/taverna/mobile/login/LoginActivityTest.java
new file mode 100644
index 0000000..acc2e8a
--- /dev/null
+++ 
b/app/src/androidTest/java/org/apache/taverna/mobile/login/LoginActivityTest.java
@@ -0,0 +1,208 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.taverna.mobile.login;
+
+import org.apache.taverna.mobile.FakeRemoteDataSource;
+import org.apache.taverna.mobile.TestComponentRule;
+
+import org.apache.taverna.mobile.R;
+
+import org.apache.taverna.mobile.data.model.User;
+import org.apache.taverna.mobile.ui.login.LoginActivity;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.RuleChain;
+import org.junit.rules.TestRule;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+
+import android.content.Intent;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.espresso.Espresso;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+
+import io.reactivex.Observable;
+
+import static android.os.SystemClock.sleep;
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static 
android.support.test.espresso.action.ViewActions.closeSoftKeyboard;
+import static android.support.test.espresso.action.ViewActions.typeText;
+import static android.support.test.espresso.assertion.ViewAssertions.matches;
+import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+import static org.hamcrest.core.AllOf.allOf;
+
+@RunWith(AndroidJUnit4.class)
+public class LoginActivityTest {
+
+    User testUser;
+
+    @Rule
+    public ActivityTestRule<LoginActivity> mActivityTestRule
+            = new ActivityTestRule<>(LoginActivity.class);
+
+    public final TestComponentRule component =
+            new TestComponentRule(InstrumentationRegistry.getTargetContext());
+    public final ActivityTestRule<LoginActivity> 
mLoginActivityActivityTestRule =
+            new ActivityTestRule<LoginActivity>(LoginActivity.class, false, 
false) {
+                @Override
+                protected Intent getActivityIntent() {
+                    /**
+                     * Override the default intent so we pass a false flag for 
syncing so it doesn't
+                     * start a sync service in the background that would 
affect  the behaviour of
+                     * this test.
+                     */
+                    return new 
Intent(InstrumentationRegistry.getTargetContext(), LoginActivity
+                            .class);
+                }
+            };
+
+    /**
+     * TestComponentRule needs to go first to make sure the Dagger 
ApplicationTestComponent is set
+     * in the Application before any Activity is launched.
+     */
+    @Rule
+    public final TestRule chain = RuleChain.outerRule(component)
+            .around(mLoginActivityActivityTestRule);
+
+    @Before
+    public void setUp() {
+        testUser = FakeRemoteDataSource.getLoginUser();
+    }
+
+    /**
+     * Checks if all the views are visible on the login activity
+     */
+    @Test
+    public void checkAllViewAreVisible() throws Exception {
+        onView(withId(R.id.logo)).check(matches(isDisplayed()));
+        
onView(withId(R.id.tvAppName)).check(matches(withText(R.string.app_name)));
+        onView(withId(R.id.loginlayout)).check(matches(isDisplayed()));
+        onView(withId(R.id.myExperimentIcon)).check(matches(isDisplayed()));
+        onView(withId(R.id.input_layout_email)).check(matches(isDisplayed()));
+        
onView(withId(R.id.input_layout_password)).check(matches(isDisplayed()));
+        onView(withId(R.id.etEmail)).check(matches(isDisplayed()));
+        onView(withId(R.id.etPassword)).check(matches(isDisplayed()));
+        Espresso.closeSoftKeyboard();
+        onView(withId(R.id.bLogin)).check(matches(isDisplayed()));
+        onView(withId(R.id.bRegister)).check(matches(isDisplayed()));
+    }
+
+    /**
+     * This test demonstrates that when user enters the invalid username and 
password both then
+     * it verify if the correct snackbar is shown or not
+     */
+    @Test
+    public void invalidLoginCredentials_showErrorSnackBar() throws Exception {
+
+        testUser = new User();
+        Mockito.when(component.getMockDataManager()
+                .getLoginUserDetail("Basic cG9zdG1hbjpwYXNzd29yZA==", true))
+                .thenReturn(Observable.just(testUser))
+                .thenThrow(new RuntimeException("runtime exception"));
+        mLoginActivityActivityTestRule.launchActivity(null);
+
+        onView(withId(R.id.etEmail))
+                .perform(typeText("postman"), closeSoftKeyboard());
+        onView(withId(R.id.etPassword))
+                .perform(typeText("password"), closeSoftKeyboard());
+
+        onView(withId(R.id.bLogin)).perform(click());
+
+        onView(allOf(withId(android.support.design.R.id.snackbar_text),
+                withText("Please enter valid credential")))
+                .check(matches(isDisplayed()));
+    }
+
+    /**
+     * This test demonstrates that when user enters the valid/invalid password 
and empty username
+     * then it verify if the correct snackbar is shown or not
+     */
+    @Test
+    public void emptyUsername_invalidCredentials_showErrorSnackBar() throws 
Exception {
+
+        testUser = new User();
+        Mockito.when(component.getMockDataManager()
+                .getLoginUserDetail("Basic OnRlc3QNCg==", true))
+                .thenReturn(Observable.just(testUser));
+        mLoginActivityActivityTestRule.launchActivity(null);
+
+        onView(withId(R.id.etEmail))
+                .perform(typeText(""), closeSoftKeyboard());
+        onView(withId(R.id.etPassword))
+                .perform(typeText("test"), closeSoftKeyboard());
+        onView(withId(R.id.bLogin)).perform(click());
+        sleep(2000);
+
+        onView(allOf(withId(android.support.design.R.id.snackbar_text),
+                withText("Please enter valid credential")))
+                .check(matches(isDisplayed()));
+    }
+
+    /**
+     * This test demonstrates that when user enters the valid/invalid username 
and empty password
+     * then it verify if the correct snackbar is shown or not
+     */
+    @Test
+    public void invalidPassword_invalidLoginCredentials_showErrorSnackBar() 
throws Exception {
+
+        testUser = new User();
+        Mockito.when(component.getMockDataManager()
+                .getLoginUserDetail("Basic dGVzdDoNCg==", true))
+                .thenReturn(Observable.just(testUser));
+        mLoginActivityActivityTestRule.launchActivity(null);
+
+        onView(withId(R.id.etEmail))
+                .perform(typeText("test"), closeSoftKeyboard());
+        onView(withId(R.id.etPassword))
+                .perform(typeText(""), closeSoftKeyboard());
+
+        onView(withId(R.id.bLogin)).perform(click());
+        sleep(2000);
+
+        onView(allOf(withId(android.support.design.R.id.snackbar_text),
+                withText("Please enter valid credential")))
+                .check(matches(isDisplayed()));
+    }
+
+    /**
+     * This test demonstrates that when user does not enters anything inside 
the username
+     * and password then it verify if the correct snackbar is shown or not
+     */
+    @Test
+    public void nullLoginCredentials_showErrorSnackBar() throws Exception {
+
+        mLoginActivityActivityTestRule.launchActivity(null);
+
+        onView(withId(R.id.etEmail))
+                .perform(typeText(""), closeSoftKeyboard());
+        onView(withId(R.id.etPassword))
+                .perform(typeText(""), closeSoftKeyboard());
+
+        onView(withId(R.id.bLogin)).perform(click());
+
+        onView(allOf(withId(android.support.design.R.id.snackbar_text),
+                withText("Please enter valid credential")))
+                .check(matches(isDisplayed()));
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/8cdbc03b/app/src/androidTest/java/org/apache/taverna/mobile/runner/RxAndroidJUnitRunner.java
----------------------------------------------------------------------
diff --git 
a/app/src/androidTest/java/org/apache/taverna/mobile/runner/RxAndroidJUnitRunner.java
 
b/app/src/androidTest/java/org/apache/taverna/mobile/runner/RxAndroidJUnitRunner.java
new file mode 100644
index 0000000..42b320c
--- /dev/null
+++ 
b/app/src/androidTest/java/org/apache/taverna/mobile/runner/RxAndroidJUnitRunner.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.taverna.mobile.runner;
+
+import org.apache.taverna.mobile.utils.RxEspressoScheduleHandler;
+
+import android.os.Bundle;
+import android.support.test.espresso.Espresso;
+
+import io.reactivex.plugins.RxJavaPlugins;
+
+public class RxAndroidJUnitRunner extends UnlockDeviceAndroidJUnitRunner {
+
+    @Override
+    public void onCreate(Bundle arguments) {
+        super.onCreate(arguments);
+
+        RxEspressoScheduleHandler rxEspressoScheduleHandler = new 
RxEspressoScheduleHandler();
+        RxJavaPlugins.setScheduleHandler(rxEspressoScheduleHandler);
+        
Espresso.registerIdlingResources(rxEspressoScheduleHandler.getIdlingResource());
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/8cdbc03b/app/src/androidTest/java/org/apache/taverna/mobile/runner/UnlockDeviceAndroidJUnitRunner.java
----------------------------------------------------------------------
diff --git 
a/app/src/androidTest/java/org/apache/taverna/mobile/runner/UnlockDeviceAndroidJUnitRunner.java
 
b/app/src/androidTest/java/org/apache/taverna/mobile/runner/UnlockDeviceAndroidJUnitRunner.java
new file mode 100644
index 0000000..9760a4a
--- /dev/null
+++ 
b/app/src/androidTest/java/org/apache/taverna/mobile/runner/UnlockDeviceAndroidJUnitRunner.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.taverna.mobile.runner;
+
+import android.annotation.SuppressLint;
+import android.app.Application;
+import android.app.KeyguardManager;
+import android.content.Context;
+import android.os.PowerManager;
+import android.support.test.runner.AndroidJUnitRunner;
+
+public class UnlockDeviceAndroidJUnitRunner extends AndroidJUnitRunner {
+
+    private PowerManager.WakeLock mWakeLock;
+
+    @SuppressLint("MissingPermission")
+    @Override
+    public void onStart() {
+        Application application = (Application) 
getTargetContext().getApplicationContext();
+        String simpleName = 
UnlockDeviceAndroidJUnitRunner.class.getSimpleName();
+        // Unlock the device so that the tests can input keystrokes.
+        ((KeyguardManager) 
application.getSystemService(Context.KEYGUARD_SERVICE))
+                .newKeyguardLock(simpleName)
+                .disableKeyguard();
+        // Wake up the screen.
+        PowerManager powerManager = ((PowerManager) 
application.getSystemService(Context
+                .POWER_SERVICE));
+        mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK |
+                PowerManager.ACQUIRE_CAUSES_WAKEUP | 
PowerManager.ON_AFTER_RELEASE, simpleName);
+        mWakeLock.acquire();
+        super.onStart();
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        mWakeLock.release();
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/8cdbc03b/app/src/androidTest/java/org/apache/taverna/mobile/utils/RxEspressoScheduleHandler.java
----------------------------------------------------------------------
diff --git 
a/app/src/androidTest/java/org/apache/taverna/mobile/utils/RxEspressoScheduleHandler.java
 
b/app/src/androidTest/java/org/apache/taverna/mobile/utils/RxEspressoScheduleHandler.java
new file mode 100644
index 0000000..9c60972
--- /dev/null
+++ 
b/app/src/androidTest/java/org/apache/taverna/mobile/utils/RxEspressoScheduleHandler.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.taverna.mobile.utils;
+
+import android.support.annotation.NonNull;
+import android.support.test.espresso.IdlingResource;
+import android.support.test.espresso.contrib.CountingIdlingResource;
+
+
+import io.reactivex.functions.Function;
+public class RxEspressoScheduleHandler implements Function<Runnable, Runnable> 
{
+
+    private final CountingIdlingResource mCountingIdlingResource =
+            new CountingIdlingResource("rxJava");
+
+    @Override
+    public Runnable apply(@NonNull final Runnable runnable) throws Exception {
+        return new Runnable() {
+            @Override
+            public void run() {
+                mCountingIdlingResource.increment();
+
+                try {
+                    runnable.run();
+                } finally {
+                    mCountingIdlingResource.decrement();
+                }
+            }
+        };
+    }
+
+    public IdlingResource getIdlingResource() {
+        return mCountingIdlingResource;
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/8cdbc03b/app/src/commonTest/java/org/apache/taverna/mobile/FakeRemoteDataSource.java
----------------------------------------------------------------------
diff --git 
a/app/src/commonTest/java/org/apache/taverna/mobile/FakeRemoteDataSource.java 
b/app/src/commonTest/java/org/apache/taverna/mobile/FakeRemoteDataSource.java
index 3058152..adb1054 100644
--- 
a/app/src/commonTest/java/org/apache/taverna/mobile/FakeRemoteDataSource.java
+++ 
b/app/src/commonTest/java/org/apache/taverna/mobile/FakeRemoteDataSource.java
@@ -2,6 +2,7 @@ package org.apache.taverna.mobile;
 
 import org.apache.taverna.mobile.data.model.Announcements;
 import org.apache.taverna.mobile.data.model.DetailAnnouncement;
+import org.apache.taverna.mobile.data.model.User;
 import org.apache.taverna.mobile.data.model.Workflows;
 
 public class FakeRemoteDataSource {
@@ -22,4 +23,9 @@ public class FakeRemoteDataSource {
     public static Workflows getWorkflowList() {
         return mTestDataFactory.getObjectTypeBean(Workflows.class, 
FakeXMLName.WORKFLOWS_XML);
     }
+
+
+    public static User getLoginUser() {
+        return mTestDataFactory.getObjectTypeBean(User.class, 
FakeXMLName.USER_XML);
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/8cdbc03b/app/src/commonTest/java/org/apache/taverna/mobile/FakeXMLName.java
----------------------------------------------------------------------
diff --git a/app/src/commonTest/java/org/apache/taverna/mobile/FakeXMLName.java 
b/app/src/commonTest/java/org/apache/taverna/mobile/FakeXMLName.java
index eaeeaec..749ec45 100644
--- a/app/src/commonTest/java/org/apache/taverna/mobile/FakeXMLName.java
+++ b/app/src/commonTest/java/org/apache/taverna/mobile/FakeXMLName.java
@@ -5,5 +5,5 @@ public class FakeXMLName {
     public static final String ANNOUNCEMENTS_XML = "announcements.xml";
     public static final String ANNOUNCEMENT_XML = "announcement.xml";
     public static final String WORKFLOWS_XML = "workflows.xml";
-
+    public static final String USER_XML = "user.xml";
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/8cdbc03b/app/src/main/AndroidManifest.xml
----------------------------------------------------------------------
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1290302..950d7d8 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -24,6 +24,8 @@ limitations under the License.
     <uses-permission android:name="android.permission.INTERNET"/>
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
+    <uses-permission android:name="android.permission.WAKE_LOCK"/>
 
     <application
             android:name=".TavernaApplication"

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/8cdbc03b/app/src/main/java/org/apache/taverna/mobile/ui/DashboardActivity.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/org/apache/taverna/mobile/ui/DashboardActivity.java 
b/app/src/main/java/org/apache/taverna/mobile/ui/DashboardActivity.java
index f9a4ae2..60b3316 100644
--- a/app/src/main/java/org/apache/taverna/mobile/ui/DashboardActivity.java
+++ b/app/src/main/java/org/apache/taverna/mobile/ui/DashboardActivity.java
@@ -281,29 +281,57 @@ public class DashboardActivity extends BaseActivity {
     private void setNavHeader() {
 
         View headerView =  navigationView.getHeaderView(0);
-        String avatarUrl = 
dataManager.getPreferencesHelper().getUserAvatarUrl();
         final CircleImageView navUserAvatar = 
headerView.findViewById(R.id.nav_user_avatar);
 
-        Glide.with(getContext())
-                .load(avatarUrl)
-                .diskCacheStrategy(DiskCacheStrategy.SOURCE)
-                .placeholder(R.drawable.ic_account_circle_black_24dp)
-                .error(R.drawable.ic_account_circle_black_24dp)
-                .into(new SimpleTarget<GlideDrawable>() {
-                    @Override
-                    public void onResourceReady(GlideDrawable resource, 
GlideAnimation<?
-                            super GlideDrawable> glideAnimation) {
-                        navUserAvatar.setImageDrawable(resource);
-                    }
-                });
+        if (dataManager.getPreferencesHelper().getUserAvatarUrl() != null) {
+
+            String avatarUrl = 
dataManager.getPreferencesHelper().getUserAvatarUrl();
+
+            Glide.with(getContext())
+                    .load(avatarUrl)
+                    .diskCacheStrategy(DiskCacheStrategy.SOURCE)
+                    .placeholder(R.drawable.ic_account_circle_black_24dp)
+                    .error(R.drawable.ic_account_circle_black_24dp)
+                    .into(new SimpleTarget<GlideDrawable>() {
+                        @Override
+                        public void onResourceReady(GlideDrawable resource, 
GlideAnimation<?
+                                super GlideDrawable> glideAnimation) {
+                            navUserAvatar.setImageDrawable(resource);
+                        }
+                    });
+
+            navUserAvatar.setOnClickListener(new View.OnClickListener() {
+                @OnClick
+                public void onClick(View v) {
+                    Intent intent = new Intent(DashboardActivity.this, 
UserProfileActivity.class);
+                    startActivity(intent);
+                }
+            });
+        } else {
 
-        navUserAvatar.setOnClickListener(new View.OnClickListener() {
-            @OnClick
-            public void onClick(View v) {
-                Intent intent = new Intent(DashboardActivity.this, 
UserProfileActivity.class);
-                startActivity(intent);
-            }
-        });
+            String avatarUrl = "http://www.myexperiment.org/images/avatar.png";;
+
+            Glide.with(getContext())
+                    .load(avatarUrl)
+                    .diskCacheStrategy(DiskCacheStrategy.SOURCE)
+                    .placeholder(R.drawable.ic_account_circle_black_24dp)
+                    .error(R.drawable.ic_account_circle_black_24dp)
+                    .into(new SimpleTarget<GlideDrawable>() {
+                        @Override
+                        public void onResourceReady(GlideDrawable resource, 
GlideAnimation<?
+                                super GlideDrawable> glideAnimation) {
+                            navUserAvatar.setImageDrawable(resource);
+                        }
+                    });
+
+            navUserAvatar.setOnClickListener(new View.OnClickListener() {
+                @OnClick
+                public void onClick(View v) {
+                    Intent intent = new Intent(DashboardActivity.this, 
UserProfileActivity.class);
+                    startActivity(intent);
+                }
+            });
+        }
 
         String userName = dataManager.getPreferencesHelper().getUserName();
         TextView navUserName = headerView.findViewById(R.id.nav_user_name);
@@ -315,7 +343,6 @@ public class DashboardActivity extends BaseActivity {
 
     }
 
-
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/8cdbc03b/app/src/test/java/org/apache/taverna/mobile/TestComponentRule.java
----------------------------------------------------------------------
diff --git a/app/src/test/java/org/apache/taverna/mobile/TestComponentRule.java 
b/app/src/test/java/org/apache/taverna/mobile/TestComponentRule.java
new file mode 100644
index 0000000..4b56791
--- /dev/null
+++ b/app/src/test/java/org/apache/taverna/mobile/TestComponentRule.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.taverna.mobile;
+
+
+import org.apache.taverna.mobile.data.DataManager;
+
+import org.apache.taverna.mobile.injection.component.DaggerTestComponent;
+import org.apache.taverna.mobile.injection.component.TestComponent;
+import org.apache.taverna.mobile.injection.module.ApplicationTestModule;
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+
+
+import android.content.Context;
+
+public class TestComponentRule implements TestRule {
+
+    private final TestComponent mTestComponent;
+    private final Context mContext;
+
+    public TestComponentRule(Context context) {
+        mContext = context;
+        TavernaApplication application = TavernaApplication.get(context);
+        mTestComponent = DaggerTestComponent.builder()
+                .applicationTestModule(new ApplicationTestModule(application))
+                .build();
+    }
+
+    public Context getContext() {
+        return mContext;
+    }
+
+    public DataManager getMockDataManager() {
+        return mTestComponent.dataManager();
+    }
+
+    @Override
+    public Statement apply(final Statement base, Description description) {
+        return new Statement() {
+            @Override
+            public void evaluate() throws Throwable {
+                TavernaApplication application = 
TavernaApplication.get(mContext);
+                application.setComponent(mTestComponent);
+                base.evaluate();
+                application.setComponent(null);
+            }
+        };
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/8cdbc03b/app/src/test/java/org/apache/taverna/mobile/injection/component/TestComponent.java
----------------------------------------------------------------------
diff --git 
a/app/src/test/java/org/apache/taverna/mobile/injection/component/TestComponent.java
 
b/app/src/test/java/org/apache/taverna/mobile/injection/component/TestComponent.java
new file mode 100644
index 0000000..76ac0e8
--- /dev/null
+++ 
b/app/src/test/java/org/apache/taverna/mobile/injection/component/TestComponent.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.taverna.mobile.injection.component;
+
+import org.apache.taverna.mobile.injection.module.ApplicationTestModule;
+
+import javax.inject.Singleton;
+
+import dagger.Component;
+
+@Singleton
+@Component(modules = ApplicationTestModule.class)
+public interface TestComponent extends ApplicationComponent {
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/8cdbc03b/app/src/test/java/org/apache/taverna/mobile/injection/module/ApplicationTestModule.java
----------------------------------------------------------------------
diff --git 
a/app/src/test/java/org/apache/taverna/mobile/injection/module/ApplicationTestModule.java
 
b/app/src/test/java/org/apache/taverna/mobile/injection/module/ApplicationTestModule.java
new file mode 100644
index 0000000..e8a683f
--- /dev/null
+++ 
b/app/src/test/java/org/apache/taverna/mobile/injection/module/ApplicationTestModule.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.taverna.mobile.injection.module;
+
+import org.apache.taverna.mobile.data.DataManager;
+import org.apache.taverna.mobile.injection.ApplicationContext;
+import org.mockito.Mockito;
+
+import android.app.Application;
+import android.content.Context;
+
+import javax.inject.Singleton;
+
+import dagger.Module;
+import dagger.Provides;
+
+@Module
+public class ApplicationTestModule {
+
+    private final Application mApplication;
+
+    public ApplicationTestModule(Application application) {
+        mApplication = application;
+    }
+
+    @Provides
+    Application provideApplication() {
+        return mApplication;
+    }
+
+    @Provides
+    @ApplicationContext
+    Context provideContext() {
+        return mApplication;
+    }
+
+    /************* MOCKS *************/
+
+    @Provides
+    @Singleton
+    DataManager provideDataManager() {
+        return Mockito.mock(DataManager.class);
+    }
+
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/8cdbc03b/app/src/test/java/org/apache/taverna/mobile/ui/anouncements/AnnouncementPresenterTest.java
----------------------------------------------------------------------
diff --git 
a/app/src/test/java/org/apache/taverna/mobile/ui/anouncements/AnnouncementPresenterTest.java
 
b/app/src/test/java/org/apache/taverna/mobile/ui/anouncements/AnnouncementPresenterTest.java
index 0f08d18..716d0b8 100644
--- 
a/app/src/test/java/org/apache/taverna/mobile/ui/anouncements/AnnouncementPresenterTest.java
+++ 
b/app/src/test/java/org/apache/taverna/mobile/ui/anouncements/AnnouncementPresenterTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.taverna.mobile.ui.anouncements;
 
+
 import org.apache.taverna.mobile.FakeRemoteDataSource;
 import org.apache.taverna.mobile.R;
 import org.apache.taverna.mobile.data.DataManager;

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/8cdbc03b/app/src/test/java/org/apache/taverna/mobile/ui/favouriteworkflow/FavouriteWorkflowsPresenterTest.java
----------------------------------------------------------------------
diff --git 
a/app/src/test/java/org/apache/taverna/mobile/ui/favouriteworkflow/FavouriteWorkflowsPresenterTest.java
 
b/app/src/test/java/org/apache/taverna/mobile/ui/favouriteworkflow/FavouriteWorkflowsPresenterTest.java
index 1d58bdc..2fecf78 100644
--- 
a/app/src/test/java/org/apache/taverna/mobile/ui/favouriteworkflow/FavouriteWorkflowsPresenterTest.java
+++ 
b/app/src/test/java/org/apache/taverna/mobile/ui/favouriteworkflow/FavouriteWorkflowsPresenterTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.taverna.mobile.ui.favouriteworkflow;
 
+
 import org.apache.taverna.mobile.FakeRemoteDataSource;
 import org.apache.taverna.mobile.data.DataManager;
 import org.apache.taverna.mobile.data.model.Workflow;

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/8cdbc03b/app/src/test/java/org/apache/taverna/mobile/ui/workflow/WorkflowPresenterTest.java
----------------------------------------------------------------------
diff --git 
a/app/src/test/java/org/apache/taverna/mobile/ui/workflow/WorkflowPresenterTest.java
 
b/app/src/test/java/org/apache/taverna/mobile/ui/workflow/WorkflowPresenterTest.java
index 591b040..205aeba 100644
--- 
a/app/src/test/java/org/apache/taverna/mobile/ui/workflow/WorkflowPresenterTest.java
+++ 
b/app/src/test/java/org/apache/taverna/mobile/ui/workflow/WorkflowPresenterTest.java
@@ -1,5 +1,6 @@
 package org.apache.taverna.mobile.ui.workflow;
 
+
 import org.apache.taverna.mobile.FakeRemoteDataSource;
 import org.apache.taverna.mobile.R;
 import org.apache.taverna.mobile.data.DataManager;

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/8cdbc03b/app/src/test/java/org/apache/taverna/mobile/utils/RxSchedulersOverrideRule.java
----------------------------------------------------------------------
diff --git 
a/app/src/test/java/org/apache/taverna/mobile/utils/RxSchedulersOverrideRule.java
 
b/app/src/test/java/org/apache/taverna/mobile/utils/RxSchedulersOverrideRule.java
index b6be49f..3016a90 100644
--- 
a/app/src/test/java/org/apache/taverna/mobile/utils/RxSchedulersOverrideRule.java
+++ 
b/app/src/test/java/org/apache/taverna/mobile/utils/RxSchedulersOverrideRule.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.taverna.mobile.utils;
 
 import org.junit.rules.TestRule;
@@ -12,7 +30,6 @@ import io.reactivex.functions.Function;
 import io.reactivex.plugins.RxJavaPlugins;
 import io.reactivex.schedulers.Schedulers;
 
-
 public class RxSchedulersOverrideRule implements TestRule {
 
     private final Function<Callable<Scheduler>, Scheduler> 
mRxAndroidSchedulersHook =

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/8cdbc03b/app/src/test/resources/user.xml
----------------------------------------------------------------------
diff --git a/app/src/test/resources/user.xml b/app/src/test/resources/user.xml
new file mode 100644
index 0000000..d4542b9
--- /dev/null
+++ b/app/src/test/resources/user.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<user uri="http://www.myexperiment.org/user.xml?id=65265"; 
resource="http://www.myexperiment.org/users/65265"; id="65265">
+    <id>65265</id>
+    <created-at>2016-04-27 04:48:05 UTC</created-at>
+    <name>Sagar Sagar</name>
+    <description/>
+    <email/>
+    <avatar resource="http://www.myexperiment.org/images/avatar.png"/>
+    <city/>
+    <country/>
+    <website/>
+</user>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/8cdbc03b/build.gradle
----------------------------------------------------------------------
diff --git a/build.gradle b/build.gradle
index dd2a26b..7326a5d 100644
--- a/build.gradle
+++ b/build.gradle
@@ -40,7 +40,7 @@ ext {
     buildToolsVersion = '27.0.3'
 
     // App dependencies
-    rxJava2Version = '2.0.1'
+    rxJava2Version = '2.0.2'
     supportLibraryVersion = '27.0.2'
     raizLabsDBFlow = '3.1.1'
     retrofitVersionLatest = '2.3.0'
@@ -49,4 +49,7 @@ ext {
     stetho='1.5.0'
     leakcanary ='1.5.4'
     dagger='2.8'
+
+    espresso = '2.2.1'
+    runner = '0.4'
 }
\ No newline at end of file

Reply via email to