app/src/androidTest/java/ch/epfl/sweng/favors/chat/ConversationTest.java
package ch.epfl.sweng.favors.chat;
import android.support.test.espresso.ViewInteraction;
import android.support.test.filters.LargeTest;
import android.support.test.rule.ActivityTestRule;
import android.support.test.rule.GrantPermissionRule;
import android.support.test.runner.AndroidJUnit4;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
import org.hamcrest.core.IsInstanceOf;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import ch.epfl.sweng.favors.R;
import ch.epfl.sweng.favors.database.FakeDatabase;
import ch.epfl.sweng.favors.main.SplashScreenActivity;
import ch.epfl.sweng.favors.utils.ExecutionMode;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.Espresso.pressBack;
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.longClick;
import static android.support.test.espresso.action.ViewActions.replaceText;
import static android.support.test.espresso.action.ViewActions.scrollTo;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withClassName;
import static android.support.test.espresso.matcher.ViewMatchers.withContentDescription;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.is;
@LargeTest
@RunWith(AndroidJUnit4.class)
public class ConversationTest {
@Rule
public ActivityTestRule<SplashScreenActivity> mActivityTestRule = new ActivityTestRule<>(SplashScreenActivity.class, false, false);
@Rule
public GrantPermissionRule mGrantPermissionRule =
GrantPermissionRule.grant(
"android.permission.ACCESS_FINE_LOCATION",
"android.permission.ACCESS_COARSE_LOCATION");
@Before
public void setUp() {
ExecutionMode.getInstance().setTest(true);
FakeDatabase.getInstance().createBasicDatabase();
}
@Test
public void conversationTest() {
mActivityTestRule.launchActivity(null);
try {
Thread.sleep(7000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ViewInteraction appCompatImageButton = onView(
allOf(withContentDescription("Open navigation drawer"),
childAtPosition(
allOf(withId(R.id.toolbar),
childAtPosition(
withClassName(is("android.widget.LinearLayout")),
0)),
0),
isDisplayed()));
appCompatImageButton.perform(click());
ViewInteraction navigationMenuItemView = onView(
allOf(childAtPosition(
allOf(withId(R.id.design_navigation_view),
childAtPosition(
withId(R.id.nav_view),
0)),
3),
isDisplayed()));
navigationMenuItemView.perform(click());
// Added a sleep statement to match the app's execution delay.
// The recommended way to handle such scenarios is to use Espresso idling resources:
// https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ViewInteraction textView = onView(
allOf(withId(R.id.chatTitle), withText("Conversation test"),
childAtPosition(
childAtPosition(
IsInstanceOf.<View>instanceOf(android.widget.LinearLayout.class),
0),
0),
isDisplayed()));
textView.check(matches(withText("Conversation test")));
ViewInteraction textView2 = onView(
allOf(withId(R.id.participants), withText("You, Jean and Jeanne"),
childAtPosition(
childAtPosition(
IsInstanceOf.<View>instanceOf(android.widget.LinearLayout.class),
1),
1),
isDisplayed()));
textView2.check(matches(withText("You, Jean and Jeanne")));
ViewInteraction textView3 = onView(
allOf(withId(R.id.chatTitle), withText("You and Harvey"),
childAtPosition(
childAtPosition(
IsInstanceOf.<View>instanceOf(android.widget.LinearLayout.class),
0),
0),
isDisplayed()));
textView3.check(matches(withText("You and Harvey")));
textView.perform(click()); // Open the chat
// Added a sleep statement to match the app's execution delay.
// The recommended way to handle such scenarios is to use Espresso idling resources:
// https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
ViewInteraction textView4 = onView(
allOf(withId(R.id.title), withText("Conversation test"),
childAtPosition(
childAtPosition(
IsInstanceOf.<View>instanceOf(android.widget.LinearLayout.class),
0),
0),
isDisplayed()));
textView4.check(matches(withText("Conversation test")));
ViewInteraction textView5 = onView(
allOf(withText("Bien et toi ?"),
childAtPosition(
allOf(withId(R.id.messageView),
childAtPosition(
withId(R.id.marginView),
0)),
1),
isDisplayed()));
textView5.check(matches(withText("Bien et toi ?")));
textView5.perform(longClick());
ViewInteraction appCompatButton55 = onView(
allOf(withId(android.R.id.button3), withText("No")));
appCompatButton55.perform(click());
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
textView5.perform(longClick());
ViewInteraction appCompatButton = onView(
allOf(withId(android.R.id.button1), withText("Yes")));
appCompatButton.perform(click());
// Added a sleep statement to match the app's execution delay.
// The recommended way to handle such scenarios is to use Espresso idling resources:
// https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
ViewInteraction appCompatTextView = onView(
allOf(withId(R.id.editTitle), withText("Edit"),
childAtPosition(
childAtPosition(
withClassName(is("android.widget.LinearLayout")),
0),
2),
isDisplayed()));
appCompatTextView.perform(click());
ViewInteraction appCompatEditText2 = onView(
allOf(withId(R.id.editTitleText),
childAtPosition(
childAtPosition(
withClassName(is("android.widget.LinearLayout")),
0),
1),
isDisplayed()));
appCompatEditText2.perform(replaceText("Cool name"), closeSoftKeyboard());
ViewInteraction appCompatTextView2 = onView(
allOf(withId(R.id.editTitle), withText("OK"),
childAtPosition(
childAtPosition(
withClassName(is("android.widget.LinearLayout")),
0),
2),
isDisplayed()));
appCompatTextView2.perform(click());
// Added a sleep statement to match the app's execution delay.
// The recommended way to handle such scenarios is to use Espresso idling resources:
// https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
ViewInteraction textView6 = onView(
allOf(withId(R.id.title), withText("Cool name"),
childAtPosition(
childAtPosition(
IsInstanceOf.<View>instanceOf(android.widget.LinearLayout.class),
0),
0),
isDisplayed()));
textView6.check(matches(withText("Cool name")));
ViewInteraction appCompatEditText4 = onView(
allOf(withId(R.id.chatMessageText),
childAtPosition(
childAtPosition(
withClassName(is("android.widget.LinearLayout")),
2),
0),
isDisplayed()));
appCompatEditText4.perform(replaceText("Au fait non"), closeSoftKeyboard());
ViewInteraction appCompatButton2 = onView(
allOf(withId(R.id.sendButton), withText("SEND"),
childAtPosition(
childAtPosition(
withClassName(is("android.widget.LinearLayout")),
2),
1),
isDisplayed()));
appCompatButton2.perform(click());
// Added a sleep statement to match the app's execution delay.
// The recommended way to handle such scenarios is to use Espresso idling resources:
// https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
pressBack();
// Added a sleep statement to match the app's execution delay.
// The recommended way to handle such scenarios is to use Espresso idling resources:
// https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
ViewInteraction appCompatButton3 = onView(
allOf(withId(R.id.deleteChat),
childAtPosition(
childAtPosition(
childAtPosition(
withId(R.id.chats_list_items),
0),
0),
2),
isDisplayed()));
appCompatButton3.perform(click());
ViewInteraction appCompatButton44 = onView(
allOf(withId(android.R.id.button3), withText("Cancel")));
appCompatButton44.perform(click());
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
appCompatButton3.perform(click());
ViewInteraction appCompatButton4 = onView(
allOf(withId(android.R.id.button1), withText("OK")));
appCompatButton4.perform(click());
// Added a sleep statement to match the app's execution delay.
// The recommended way to handle such scenarios is to use Espresso idling resources:
// https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
ViewInteraction recyclerView2 = onView(
allOf(withId(R.id.chats_list_items),
childAtPosition(
withClassName(is("android.widget.LinearLayout")),
1)));
recyclerView2.perform(actionOnItemAtPosition(0, click()));
// Added a sleep statement to match the app's execution delay.
// The recommended way to handle such scenarios is to use Espresso idling resources:
// https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
pressBack();
// Added a sleep statement to match the app's execution delay.
// The recommended way to handle such scenarios is to use Espresso idling resources:
// https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
ViewInteraction appCompatImageButton2 = onView(
allOf(withContentDescription("Open navigation drawer"),
childAtPosition(
allOf(withId(R.id.toolbar),
childAtPosition(
withClassName(is("android.widget.LinearLayout")),
0)),
0),
isDisplayed()));
appCompatImageButton2.perform(click());
ViewInteraction navigationMenuItemView2 = onView(
allOf(childAtPosition(
allOf(withId(R.id.design_navigation_view),
childAtPosition(
withId(R.id.nav_view),
0)),
1),
isDisplayed()));
navigationMenuItemView2.perform(click());
// Added a sleep statement to match the app's execution delay.
// The recommended way to handle such scenarios is to use Espresso idling resources:
// https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
ViewInteraction textView8 = onView(
allOf(withId(R.id.title), withText("Closest favor")));
textView8.perform(click());
// Added a sleep statement to match the app's execution delay.
// The recommended way to handle such scenarios is to use Espresso idling resources:
// https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
ViewInteraction appCompatTextView3 = onView(
allOf(withId(R.id.favorPosterDetailViewAccess), withText("Jean"),
childAtPosition(
childAtPosition(
withClassName(is("android.widget.ScrollView")),
0),
7)));
appCompatTextView3.perform(scrollTo(), click());
// Added a sleep statement to match the app's execution delay.
// The recommended way to handle such scenarios is to use Espresso idling resources:
// https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
ViewInteraction appCompatButton5 = onView(
allOf(withId(R.id.writeMessage), withText("Write a message"),
childAtPosition(
childAtPosition(
withClassName(is("android.widget.LinearLayout")),
8),
1)));
appCompatButton5.perform(scrollTo(), click());
// Added a sleep statement to match the app's execution delay.
// The recommended way to handle such scenarios is to use Espresso idling resources:
// https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html
try {
Thread.sleep(600);
} catch (InterruptedException e) {
e.printStackTrace();
}
pressBack();
}
private static Matcher<View> childAtPosition(
final Matcher<View> parentMatcher, final int position) {
return new TypeSafeMatcher<View>() {
@Override
public void describeTo(Description description) {
description.appendText("Child at position " + position + " in parent ");
parentMatcher.describeTo(description);
}
@Override
public boolean matchesSafely(View view) {
ViewParent parent = view.getParent();
return parent instanceof ViewGroup && parentMatcher.matches(parent)
&& view.equals(((ViewGroup) parent).getChildAt(position));
}
};
}
}