Configure dependency injection for API and the database. Uses Dagger (dagger.dev) The API is held in a holder, so that it can be invalidated or recreated as needed. Big refactor of the feeds, this introduces a bit more duplication of code (some very similar methods that differ only in the types or minor details), but now the inheritance makes more sense and there is less "forcing" to make the inheritance work (for example: no more casting Int to String just to have the right type for the key) It should be easier to work with the feeds in the future, maybe we'll find better abstractions later on.
310 lines
11 KiB
Kotlin
310 lines
11 KiB
Kotlin
package com.h.pixeldroid
|
|
|
|
|
|
import android.content.Context
|
|
import android.graphics.ColorMatrix
|
|
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.click
|
|
import androidx.test.espresso.assertion.ViewAssertions.matches
|
|
import androidx.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition
|
|
import androidx.test.espresso.matcher.ViewMatchers.*
|
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
|
import com.google.android.material.tabs.TabLayout
|
|
import com.h.pixeldroid.db.AppDatabase
|
|
import com.h.pixeldroid.db.InstanceDatabaseEntity
|
|
import com.h.pixeldroid.db.UserDatabaseEntity
|
|
import com.h.pixeldroid.fragments.feeds.postFeeds.PostViewHolder
|
|
import com.h.pixeldroid.testUtility.CustomMatchers.Companion.clickChildViewWithId
|
|
import com.h.pixeldroid.testUtility.CustomMatchers.Companion.first
|
|
import com.h.pixeldroid.testUtility.MockServer
|
|
import com.h.pixeldroid.testUtility.initDB
|
|
import com.h.pixeldroid.utils.DBUtils
|
|
import com.h.pixeldroid.utils.PostUtils.Companion.censorColorMatrix
|
|
import com.h.pixeldroid.utils.PostUtils.Companion.uncensorColorMatrix
|
|
import org.junit.Before
|
|
import org.junit.Rule
|
|
import org.junit.Test
|
|
import org.junit.rules.Timeout
|
|
import org.junit.runner.RunWith
|
|
|
|
|
|
@RunWith(AndroidJUnit4::class)
|
|
class MockedServerTest {
|
|
|
|
private val mockServer = MockServer()
|
|
private lateinit var activityScenario: ActivityScenario<MainActivity>
|
|
private lateinit var db: AppDatabase
|
|
private lateinit var context: Context
|
|
|
|
@get:Rule
|
|
var globalTimeout: Timeout = Timeout.seconds(100)
|
|
|
|
@Before
|
|
fun before(){
|
|
mockServer.start()
|
|
val baseUrl = mockServer.getUrl()
|
|
context = ApplicationProvider.getApplicationContext()
|
|
db = initDB(context)
|
|
db.clearAllTables()
|
|
db.instanceDao().insertInstance(
|
|
InstanceDatabaseEntity(
|
|
uri = baseUrl.toString(),
|
|
title = "PixelTest"
|
|
)
|
|
)
|
|
|
|
db.userDao().insertUser(
|
|
UserDatabaseEntity(
|
|
user_id = "123",
|
|
instance_uri = baseUrl.toString(),
|
|
username = "Testi",
|
|
display_name = "Testi Testo",
|
|
avatar_static = "some_avatar_url",
|
|
isActive = true,
|
|
accessToken = "token"
|
|
)
|
|
)
|
|
db.close()
|
|
activityScenario = ActivityScenario.launch(MainActivity::class.java)
|
|
}
|
|
|
|
@Test
|
|
fun searchPosts() {
|
|
activityScenario.onActivity{
|
|
a -> a.findViewById<TabLayout>(R.id.tabs).getTabAt(1)?.select()
|
|
}
|
|
|
|
Thread.sleep(1000)
|
|
onView(withId(R.id.searchEditText)).perform(ViewActions.replaceText("caturday"), ViewActions.closeSoftKeyboard())
|
|
|
|
onView(withId(R.id.searchButton)).perform(click())
|
|
Thread.sleep(3000)
|
|
onView(first(withId(R.id.username))).check(matches(withText("memo")))
|
|
}
|
|
|
|
@Test
|
|
fun searchHashtags() {
|
|
activityScenario.onActivity{
|
|
a -> a.findViewById<TabLayout>(R.id.tabs).getTabAt(1)?.select()
|
|
}
|
|
|
|
Thread.sleep(1000)
|
|
onView(withId(R.id.searchEditText)).perform(ViewActions.replaceText("#caturday"), ViewActions.closeSoftKeyboard())
|
|
|
|
onView(withId(R.id.searchButton)).perform(click())
|
|
Thread.sleep(3000)
|
|
onView(first(withId(R.id.tag_name))).check(matches(withText("#caturday")))
|
|
|
|
}
|
|
@Test
|
|
fun openDiscoverPost(){
|
|
activityScenario.onActivity{
|
|
a -> a.findViewById<TabLayout>(R.id.tabs).getTabAt(1)?.select()
|
|
}
|
|
Thread.sleep(1000)
|
|
onView(withId(R.id.discoverList)).perform(click())
|
|
Thread.sleep(1000)
|
|
onView(withId(R.id.username)).check(matches(withText("machintuck")))
|
|
|
|
}
|
|
|
|
@Test
|
|
fun searchAccounts() {
|
|
activityScenario.onActivity{
|
|
a -> a.findViewById<TabLayout>(R.id.tabs).getTabAt(1)?.select()
|
|
}
|
|
|
|
Thread.sleep(1000)
|
|
onView(withId(R.id.searchEditText)).perform(ViewActions.replaceText("@dansup"), ViewActions.closeSoftKeyboard())
|
|
|
|
onView(withId(R.id.searchButton)).perform(click())
|
|
Thread.sleep(3000)
|
|
onView(first(withId(R.id.account_entry_username))).check(matches(withText("dansup")))
|
|
|
|
}
|
|
|
|
@Test
|
|
fun clickFollowButton() {
|
|
//Get initial like count
|
|
onView(withId(R.id.list))
|
|
.perform(actionOnItemAtPosition<PostViewHolder>
|
|
(0, clickChildViewWithId(R.id.username)))
|
|
|
|
Thread.sleep(1000)
|
|
|
|
// Unfollow
|
|
onView(withId(R.id.followButton)).perform((click()))
|
|
Thread.sleep(1000)
|
|
onView(withId(R.id.followButton)).check(matches(withText("Follow")))
|
|
|
|
// Follow
|
|
onView(withId(R.id.followButton)).perform((click()))
|
|
Thread.sleep(1000)
|
|
onView(withId(R.id.followButton)).check(matches(withText("Unfollow")))
|
|
}
|
|
|
|
@Test
|
|
fun clickOtherUserFollowers() {
|
|
//Get initial like count
|
|
onView(withId(R.id.list))
|
|
.perform(actionOnItemAtPosition<PostViewHolder>
|
|
(0, clickChildViewWithId(R.id.username)))
|
|
|
|
Thread.sleep(1000)
|
|
|
|
// Open followers list
|
|
onView(withId(R.id.nbFollowersTextView)).perform((click()))
|
|
Thread.sleep(1000)
|
|
// Open follower's profile
|
|
onView(withText("ete2")).perform((click()))
|
|
Thread.sleep(1000)
|
|
|
|
onView(withId(R.id.accountNameTextView)).check(matches(withText("Christian")))
|
|
}
|
|
|
|
@Test
|
|
fun testNotificationsList() {
|
|
activityScenario.onActivity{
|
|
a -> a.findViewById<TabLayout>(R.id.tabs).getTabAt(3)?.select()
|
|
}
|
|
|
|
Thread.sleep(1000)
|
|
onView(withId(R.id.view_pager)).perform(ViewActions.swipeUp()).perform(ViewActions.swipeDown())
|
|
onView(withText("Dobios liked your post")).check(matches(withId(R.id.notification_type)))
|
|
onView(withId(R.id.view_pager)).perform(ViewActions.swipeDown())
|
|
|
|
Thread.sleep(1000)
|
|
onView(withText("Dobios followed you")).check(matches(withId(R.id.notification_type)))
|
|
|
|
}
|
|
@Test
|
|
fun clickNotification() {
|
|
activityScenario.onActivity{
|
|
a -> a.findViewById<TabLayout>(R.id.tabs).getTabAt(3)?.select()
|
|
}
|
|
|
|
Thread.sleep(1000)
|
|
onView(withId(R.id.view_pager)).perform(ViewActions.swipeUp()).perform(ViewActions.swipeDown())
|
|
|
|
Thread.sleep(1000)
|
|
onView(withText("Dobios liked your post")).perform(click())
|
|
|
|
Thread.sleep(1000)
|
|
onView(withText("6 Likes")).check(matches(withId(R.id.nlikes)))
|
|
}
|
|
|
|
@Test
|
|
fun clickNotificationUser() {
|
|
activityScenario.onActivity{
|
|
a -> a.findViewById<TabLayout>(R.id.tabs).getTabAt(3)?.select()
|
|
}
|
|
Thread.sleep(1000)
|
|
|
|
onView(withId(R.id.view_pager)).perform(ViewActions.swipeUp()).perform(ViewActions.swipeDown())
|
|
Thread.sleep(1000)
|
|
|
|
onView(withText("Dobios followed you")).perform(click())
|
|
Thread.sleep(1000)
|
|
onView(withText("Andrew Dobis")).check(matches(withId(R.id.accountNameTextView)))
|
|
}
|
|
|
|
@Test
|
|
fun clickNotificationPost() {
|
|
activityScenario.onActivity{
|
|
a -> a.findViewById<TabLayout>(R.id.tabs).getTabAt(3)?.select()
|
|
}
|
|
Thread.sleep(1000)
|
|
|
|
onView(withId(R.id.view_pager)).perform(ViewActions.swipeUp()).perform(ViewActions.swipeDown())
|
|
Thread.sleep(1000)
|
|
|
|
onView(withText("Dobios liked your post")).perform(click())
|
|
Thread.sleep(1000)
|
|
|
|
onView(withId(R.id.username)).perform(click())
|
|
Thread.sleep(10000)
|
|
onView(withText("Dante")).check(matches(withId(R.id.accountNameTextView)))
|
|
}
|
|
|
|
@Test
|
|
fun clickNotificationRePost() {
|
|
activityScenario.onActivity{
|
|
a -> a.findViewById<TabLayout>(R.id.tabs).getTabAt(3)?.select()
|
|
}
|
|
Thread.sleep(1000)
|
|
|
|
onView(withId(R.id.view_pager)).perform(ViewActions.swipeUp()).perform(ViewActions.swipeDown())
|
|
Thread.sleep(1000)
|
|
|
|
onView(withText("Clement shared your post")).perform(click())
|
|
Thread.sleep(1000)
|
|
|
|
onView(first(withText("Clement"))).check(matches(withId(R.id.username)))
|
|
}
|
|
|
|
@Test
|
|
fun swipingRightStopsAtHomepage() {
|
|
activityScenario.onActivity {
|
|
a -> a.findViewById<TabLayout>(R.id.tabs).getTabAt(4)?.select()
|
|
} // go to the last tab
|
|
|
|
Thread.sleep(1000)
|
|
onView(withId(R.id.main_activity_main_linear_layout))
|
|
.perform(ViewActions.swipeRight()) // notifications
|
|
.perform(ViewActions.swipeRight()) // camera
|
|
.perform(ViewActions.swipeRight()) // search
|
|
.perform(ViewActions.swipeRight()) // homepage
|
|
.perform(ViewActions.swipeRight()) // should stop at homepage
|
|
onView(withId(R.id.list)).check(matches(isDisplayed()))
|
|
}
|
|
|
|
@Test
|
|
fun swipingLeftStopsAtPublicTimeline() {
|
|
activityScenario.onActivity {
|
|
a -> a.findViewById<TabLayout>(R.id.tabs).getTabAt(0)?.select()
|
|
}
|
|
|
|
Thread.sleep(1000)
|
|
onView(withId(R.id.main_activity_main_linear_layout))
|
|
.perform(ViewActions.swipeLeft()) // notifications
|
|
.perform(ViewActions.swipeLeft()) // camera
|
|
.perform(ViewActions.swipeLeft()) // search
|
|
.perform(ViewActions.swipeLeft()) // homepage
|
|
.perform(ViewActions.swipeLeft()) // should stop at homepage
|
|
onView(withId(R.id.list)).check(matches(isDisplayed()))
|
|
}
|
|
|
|
@Test
|
|
fun swipingPublicTimelineWorks() {
|
|
activityScenario.onActivity {
|
|
a -> a.findViewById<TabLayout>(R.id.tabs).getTabAt(4)?.select()
|
|
} // go to the last tab
|
|
|
|
Thread.sleep(1000)
|
|
onView(withId(R.id.main_activity_main_linear_layout))
|
|
.perform(ViewActions.swipeUp()) // notifications
|
|
.perform(ViewActions.swipeUp()) // camera
|
|
.perform(ViewActions.swipeUp()) // search
|
|
.perform(ViewActions.swipeUp()) // homepage
|
|
.perform(ViewActions.swipeUp()) // should stop at homepage
|
|
onView(withId(R.id.list)).check(matches(isDisplayed()))
|
|
}
|
|
|
|
@Test
|
|
fun censorMatrices() {
|
|
// Doing these dummy checks as I can not get the matrix property from the ImageView
|
|
val array: FloatArray = floatArrayOf(
|
|
0.1f, 0f, 0f, 0f, 0f, // red vector
|
|
0f, 0.1f, 0f, 0f, 0f, // green vector
|
|
0f, 0f, 0.1f, 0f, 0f, // blue vector
|
|
0f, 0f, 0f, 1f, 0f ) // alpha vector
|
|
|
|
assert(censorColorMatrix().equals(array))
|
|
assert(uncensorColorMatrix().equals(ColorMatrix()))
|
|
}
|
|
}
|
|
|