PixelDroid-App-Android/app/src/androidTest/java/org/pixeldroid/app/HomeFeedTest.kt

310 lines
10 KiB
Kotlin

package org.pixeldroid.app
import android.content.Context
import androidx.test.core.app.ActivityScenario
import androidx.test.core.app.ApplicationProvider
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions
import androidx.test.espresso.action.ViewActions.openLinkWithText
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition
import androidx.test.espresso.contrib.RecyclerViewActions.scrollToPosition
import androidx.test.espresso.matcher.ViewMatchers.*
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.viewpager2.widget.ViewPager2
import com.google.android.material.tabs.TabLayout
import org.hamcrest.CoreMatchers.*
import org.pixeldroid.app.utils.db.AppDatabase
import org.pixeldroid.app.posts.StatusViewHolder
import org.pixeldroid.app.testUtility.*
import org.hamcrest.core.IsInstanceOf
import org.hamcrest.core.StringContains.containsString
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestRule
import org.junit.rules.Timeout
import org.junit.runner.Description
import org.junit.runner.RunWith
import org.junit.runners.model.Statement
@RunWith(AndroidJUnit4::class)
class HomeFeedTest {
private lateinit var activityScenario: ActivityScenario<MainActivity>
private lateinit var db: AppDatabase
private lateinit var context: Context
@Rule @JvmField
var repeatRule: RepeatRule = RepeatRule()
@Before
fun before(){
context = ApplicationProvider.getApplicationContext()
db = initDB(context)
db.clearAllTables()
db.instanceDao().insertInstance(
testiTestoInstance
)
db.userDao().insertUser(
testiTesto
)
db.close()
activityScenario = ActivityScenario.launch(MainActivity::class.java)
waitForView(R.id.username)
onView(withId(R.id.list)).perform(scrollToPosition<StatusViewHolder>(0))
}
@After
fun after() {
clearData()
}
@Test
@RepeatTest
fun clickingTabOnAlbumShowsNextPhoto() {
//Wait for the feed to load
waitForView(R.id.postPager)
activityScenario.onActivity {
a -> run {
//Pick the second photo
a.findViewById<ViewPager2>(R.id.postPager).currentItem = 2
}
}
onView(first(withId(R.id.postPager))).check(matches(isDisplayed()))
}
@Test
@RepeatTest
fun tabReClickScrollUp() {
//Wait for the feed to load
waitForView(R.id.postPager)
onView(withId(R.id.list)).perform(scrollToPosition<StatusViewHolder>(4))
onView(first(IsInstanceOf.instanceOf(TabLayout.TabView::class.java))).perform(ViewActions.click())
onView(first(withId(R.id.description))).check(matches(withText(containsString("@user2"))));
}
@Test
@RepeatTest
fun hashtag() {
//Wait for the feed to load
waitForView(R.id.postPager)
onView(allOf(withClassName(endsWith("RecyclerView")), not(withId(R.id.material_drawer_recycler_view))))
.perform(
scrollToPosition<StatusViewHolder>(3)
)
onView(allOf(withText(containsString("randomNoise"))))
.perform(clickClickableSpan("#randomNoise"))
waitForView(R.id.action_bar, allOf(withText("#randomNoise"), not(withId(R.id.description))))
onView(withId(R.id.action_bar)).check(matches(isDisplayed()));
onView(allOf(withText("#randomNoise"), not(withId(R.id.description)))).check(matches(withParent(withId(R.id.action_bar))));
}
/*
@Test
fun clickingReblogButtonWorks() {
onView(withId(R.id.list))
.perform(actionOnItemAtPosition<StatusViewHolder>
(0, clickChildViewWithId(R.id.reblogger)))
onView(withId(R.id.list))
.perform(actionOnItemAtPosition<StatusViewHolder>
(0, clickChildViewWithId(R.id.reblogger)))
onView(first(withId(R.id.nshares)))
.check(matches(withText(getText(first(withId(R.id.nshares))))))
}
@Test
fun doubleTapLikerWorks() {
Thread.sleep(1000)
//Get initial like count
val likes = getText(first(withId(R.id.nlikes)))
val nLikes = likes!!.split(" ")[0].toInt()
//Remove sensitive media warning
onView(withId(R.id.list))
.perform(actionOnItemAtPosition<StatusViewHolder>
(0, clickChildViewWithId(R.id.sensitiveWarning)))
Thread.sleep(100)
//Like the post
onView(withId(R.id.list))
.perform(actionOnItemAtPosition<StatusViewHolder>
(0, clickChildViewWithId(R.id.postPicture)))
onView(withId(R.id.list))
.perform(actionOnItemAtPosition<StatusViewHolder >
(0, clickChildViewWithId(R.id.postPicture)))
//...
Thread.sleep(100)
//Profit
onView(first(withId(R.id.nlikes))).check(matches((withText("${nLikes + 1} Likes"))))
}
@Test
fun clickingLikeButtonWorks() {
onView(withId(R.id.list)).perform(
actionOnItemAtPosition<StatusViewHolder>(0, clickChildViewWithId(R.id.liker))
)
onView(withId(R.id.list)).perform(
actionOnItemAtPosition<StatusViewHolder>(0, clickChildViewWithId(R.id.liker))
)
onView(first(withId(R.id.nlikes)))
.check(matches(withText(getText(first(withId(R.id.nlikes))))))
}
@Test
fun clickingLikeButtonFails() {
onView(withId(R.id.list)).perform(
actionOnItemAtPosition<StatusViewHolder>(2, clickChildViewWithId(R.id.liker))
)
onView((withId(R.id.list))).check(matches(isDisplayed()))
}*/
@Test
@RepeatTest
fun clickingUsernameOpensProfile() {
waitForView(R.id.username)
onView(withId(R.id.list)).perform(
actionOnItemAtPosition<StatusViewHolder>(0, clickChildViewWithId(R.id.username))
)
onView(withId(R.id.accountNameTextView)).check(matches(isDisplayed()))
}
@Test
@RepeatTest
fun clickingProfilePicOpensProfile() {
waitForView(R.id.profilePic)
onView(withId(R.id.list)).perform(
actionOnItemAtPosition<StatusViewHolder>(0, clickChildViewWithId(R.id.profilePic))
)
onView(withId(R.id.accountNameTextView)).check(matches(isDisplayed()))
}
@Test
@RepeatTest
fun clickingMentionOpensProfile() {
waitForView(R.id.description)
onView(withId(R.id.list)).perform(
actionOnItemAtPosition<StatusViewHolder>(0, clickChildViewWithId(R.id.description))
)
onView(first(withId(R.id.username))).check(matches(isDisplayed()))
}
/*
@Test
fun clickingCommentButtonOpensCommentSection() {
onView(withId(R.id.list)).perform(
actionOnItemAtPosition<StatusViewHolder>(0, clickChildViewWithId(R.id.commenter))
)
onView(first(withId(R.id.commentIn)))
.check(matches(hasDescendant(withId(R.id.editComment))))
}
@Test
fun clickingViewCommentShowsTheComments() {
//Open the comment section
onView(withId(R.id.list))
.perform(actionOnItemAtPosition<StatusViewHolder>
(0, clickChildViewWithId(R.id.viewComments)))
Thread.sleep(1000)
onView(first(withId(R.id.commentContainer)))
.check(matches(hasDescendant(withId(R.id.comment))))
}
@Test
fun clickingViewCommentFails() {
//Open the comment section
onView(withId(R.id.list))
.perform(actionOnItemAtPosition<StatusViewHolder>
(2, clickChildViewWithId(R.id.viewComments)))
Thread.sleep(1000)
onView(withId(R.id.list)).check(matches(isDisplayed()))
}
@Test
fun postingACommentWorks() {
//Open the comment section
onView(withId(R.id.list))
.perform(actionOnItemAtPosition<StatusViewHolder>
(0, clickChildViewWithId(R.id.commenter)))
onView(withId(R.id.list)).perform(slowSwipeUp(false))
Thread.sleep(1000)
onView(withId(R.id.list))
.perform(actionOnItemAtPosition<StatusViewHolder>
(0, typeTextInViewWithId(R.id.editComment, "test")))
onView(withId(R.id.list))
.perform(actionOnItemAtPosition<StatusViewHolder>
(0, clickChildViewWithId(R.id.submitComment)))
Thread.sleep(1000)
onView(first(withId(R.id.commentContainer)))
.check(matches(hasDescendant(withId(R.id.comment))))
}*/
@RepeatTest
@Test
fun performClickOnSensitiveWarning() {
waitForView(R.id.username)
onView(second(withId(R.id.sensitiveWarning))).check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
onView(withId(R.id.list))
.perform(actionOnItemAtPosition<StatusViewHolder>
(1, clickChildViewWithId(R.id.sensitiveWarning)))
onView(withId(R.id.list))
.check(matches(atPosition(1, not(withId(R.id.sensitiveWarning)))))
}
@Test
@RepeatTest
fun performClickOnSensitiveWarningTabs() {
waitForView(R.id.username)
onView(first(withId(R.id.sensitiveWarning))).check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
onView(withId(R.id.list))
.perform(actionOnItemAtPosition<StatusViewHolder>
(0, clickChildViewWithId(R.id.sensitiveWarning)))
onView(first(withId(R.id.sensitiveWarning))).check(matches(withEffectiveVisibility(Visibility.GONE)))
}
/*
@Test
fun goOfflineShowsPosts() {
// show some posts to populate DB
onView(withId(R.id.main_activity_main_linear_layout)).perform(swipeUp())
Thread.sleep(1000)
onView(withId(R.id.main_activity_main_linear_layout)).perform(swipeUp())
Thread.sleep(1000)
// offline section
LoginActivityOfflineTest.switchAirplaneMode()
activityScenario = ActivityScenario.launch(MainActivity::class.java)
onView(withId(R.id.offline_feed_recyclerview)).check(matches(isDisplayed()))
// back online
LoginActivityOfflineTest.switchAirplaneMode()
}
*/
}