Skip to content

Commit

Permalink
Added tests
Browse files Browse the repository at this point in the history
Added unit and instrumented tests
  • Loading branch information
Jon6193 committed Jul 10, 2017
1 parent dc2dfd7 commit 8322170
Show file tree
Hide file tree
Showing 21 changed files with 582 additions and 71 deletions.
24 changes: 22 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@ apply plugin: "me.tatarka.retrolambda"
android {
compileSdkVersion 25
buildToolsVersion "25.0.3"

defaultConfig {
applicationId "com.jonathnpetitfrere.mvvm"
minSdkVersion 19
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

testInstrumentationRunner "com.jonathanpetitfrere.mvvm.TestRunner"

javaCompileOptions {
annotationProcessorOptions {
Expand Down Expand Up @@ -51,6 +53,8 @@ ext {
okHttpVersion = '3.8.1'
stethoVersion = '1.5.0'
leakCanaryVersion = '1.5.1'
espressoVersion = '2.2.2'
mockitoVersion = '2.6.3'
}

dependencies {
Expand Down Expand Up @@ -101,8 +105,24 @@ dependencies {
compile 'com.andrewreitz.velcro:velcro-bindablerecycleradapter:2.0.0-SNAPSHOT'

testCompile 'junit:junit:4.12'
testCompile "org.mockito:mockito-core:$mockitoVersion"
testCompile ("android.arch.core:core-testing:$architectureVersion", {
exclude group: 'com.android.support', module: 'support-compat'
exclude group: 'com.android.support', module: 'support-annotations'
exclude group: 'com.android.support', module: 'support-core-utils'
})

androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
androidTestCompile("com.android.support.test.espresso:espresso-core:$espressoVersion", {
exclude group: 'com.android.support', module: 'support-annotations'
})
androidTestCompile("com.android.support.test.espresso:espresso-contrib:$espressoVersion", {
exclude group: 'com.android.support', module: 'support-v4'
exclude group: 'com.android.support', module: 'appcompat-v7'
exclude group: 'com.android.support', module: 'design'
exclude group: 'com.android.support', module: 'recyclerview-v7'
})
androidTestCompile "android.arch.core:core-testing:$architectureVersion"
androidTestCompile "org.mockito:mockito-android:$mockitoVersion"

androidTestAnnotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion"
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.jonathanpetitfrere.mvvm;

import com.jonathanpetitfrere.mvvm.di.AppGraph;

/**
* @author jpetit
*/

public class TestApplication extends MvvmApplication {

public void setAppGraph(AppGraph appGraph) {
this.component = appGraph;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.jonathanpetitfrere.mvvm;

import android.app.Application;
import android.content.Context;
import android.support.test.runner.AndroidJUnitRunner;

/**
* @author jpetit
*/

public class TestRunner extends AndroidJUnitRunner {

@Override
public Application newApplication(ClassLoader cl, String className, Context context) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
return super.newApplication(cl, TestApplication.class.getName(), context);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.jonathanpetitfrere.mvvm.di;

/**
* @author jpetit
*/

public class TestApiModule extends ApiModule {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.jonathanpetitfrere.mvvm.di;

import android.app.Application;

/**
* @author jpetit
*/

public class TestApplicationModule extends ApplicationModule {

public TestApplicationModule(Application application) {
super(application);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.jonathanpetitfrere.mvvm.di;

import android.app.Application;

import javax.inject.Singleton;

import dagger.Component;

/**
* @author jpetit
*/
@Singleton
@Component(modules = {
ApplicationModule.class,
ApiModule.class,
RepositoryModule.class
})
public interface TestComponent extends AppGraph {

final class Initializer {

public static TestComponent init(Application application) {

return DaggerTestComponent.builder()
.applicationModule(new TestApplicationModule(application))
.repositoryModule(new TestRepositoryModule())
.apiModule(new TestApiModule())
.build();
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.jonathanpetitfrere.mvvm.di;

import android.arch.persistence.room.Room;
import android.content.Context;

import com.jonathanpetitfrere.mvvm.repository.persistence.MvvmDatabase;

/**
* @author jpetit
*/

public class TestRepositoryModule extends RepositoryModule {

@Override
MvvmDatabase provideMvvmDatabase(Context context) {
return Room.inMemoryDatabaseBuilder(context.getApplicationContext(), MvvmDatabase.class)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package com.jonathanpetitfrere.mvvm.repository.persistence.dao;

import android.arch.persistence.room.Room;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;

import com.jonathanpetitfrere.mvvm.repository.persistence.MvvmDatabase;
import com.jonathanpetitfrere.mvvm.repository.persistence.entity.User;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.util.ArrayList;
import java.util.List;

/**
* @author jpetit
*/

@RunWith(AndroidJUnit4.class)
public class UserDaoTest {

private MvvmDatabase mvvmDatabase;
private UserDao userDao;

@Before
public void setup() {
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
mvvmDatabase = Room.inMemoryDatabaseBuilder(context, MvvmDatabase.class).build();
userDao = mvvmDatabase.userDao();
}

@After
public void tearDown() {
mvvmDatabase.close();
}

@Test
public void saveAndLoadUserSuccess() throws InterruptedException {
User user = new User("john.doe@gmail.com", "John", "Doe");
userDao.saveUser(user);

userDao.loadUser(user.getEmail())
.take(1)
.test()
.await()
.assertResult(user);
}

@Test
public void saveAndLoadMultipleUsersSuccess() throws InterruptedException {
User userOne = new User("john.doe@gmail.com", "John", "Doe");
User userTwo = new User("jane.doe@gmail.com", "Jane", "Doe");

List<User> users = new ArrayList<>();
users.add(userOne);
users.add(userTwo);

for(User user : users) {
userDao.saveUser(user);
}

//noinspection unchecked
userDao.loadUsers()
.take(1)
.test()
.await()
.assertResult(users);
}


@Test
public void saveAndLoadUserUpdateFirstNameSuccess() throws InterruptedException {
User user = new User("john.doe@gmail.com", "John", "Doe");

userDao.saveUser(user);
user = new User(user.getEmail(), "Johnny", user.getLastName());
userDao.saveUser(user);

userDao.loadUser(user.getEmail())
.take(1)
.test()
.await()
.assertResult(user);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package com.jonathanpetitfrere.mvvm.ui.main;

import android.os.SystemClock;
import android.support.test.InstrumentationRegistry;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;

import com.jonathanpetitfrere.mvvm.R;
import com.jonathanpetitfrere.mvvm.TestApplication;
import com.jonathanpetitfrere.mvvm.di.TestComponent;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;

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.typeText;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static junit.framework.Assert.assertEquals;

/**
* @author jpetit
*/

@RunWith(AndroidJUnit4.class)
public class MainActivityTest {

@Rule
public final ActivityTestRule<MainActivity> activityTestRule = new ActivityTestRule<>(MainActivity.class, false, false);

@Before
public void setup() {
TestApplication application = ((TestApplication) InstrumentationRegistry.getTargetContext().getApplicationContext());
TestComponent component = TestComponent.Initializer.init(application);
application.setAppGraph(component);
activityTestRule.launchActivity(null);
}

@Test
public void enterUserDataAndCreateUser() {
String email = "John.doe@gmail.com";
String firstName = "John";
String lastName = "Doe";

onView(withId(R.id.main_email_input))
.perform(typeText(email));

onView(withId(R.id.main_first_name_input))
.perform(typeText(firstName));

onView(withId(R.id.main_last_name_input))
.perform(typeText(lastName));

onView(withId(R.id.main_create_button))
.perform(click());

MainActivity activity = activityTestRule.getActivity();
UserListItemView view = (UserListItemView) activity.recyclerView.getChildAt(0);

assertEquals("email == email", email, view.emailText.getText().toString());
assertEquals("firstName == firstName", firstName, view.firstNameText.getText().toString());
assertEquals("lastName == lastName", lastName, view.lastNameText.getText().toString());
}

}
Loading

0 comments on commit 8322170

Please sign in to comment.