mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-27 12:53:55 +01:00
* *.kt: bulk correction of formatting using ktlint --format * *.kt: replace wildcard imports and second stage auto format ktlint --format * QuizQuestionTest.kt: modified property names to camel case to meet ktlint standard * LevelControllerTest.kt: modified property names to camel case to meet ktlint standard * QuizActivityUnitTest.kt: modified property names to camel case to meet ktlint standard * MediaDetailFragmentUnitTests.kt: modified property names to camel case to meet ktlint standard * UploadWorker.kt: modified property names to camel case to meet ktlint standard * UploadClient.kt: modified property names to camel case to meet ktlint standard * BasePagingPresenter.kt: modified property names to camel case to meet ktlint standard * DescriptionEditActivity.kt: modified property names to camel case to meet ktlint standard * OnSwipeTouchListener.kt: modified property names to camel case to meet ktlint standard * MediaDetailFragmentUnitTests.kt: corrected excessive line length to meet ktlint standard * DepictedItem.kt: corrected property name format and catch format to for ktlint standard * UploadCategoryAdapter.kt: corrected class definition format to meet ktlint standard * CustomSelectorActivity.kt: reformatted function names to first letter lowercase to meet ktlint standard * MediaDetailFragmentUnitTests.kt: fix string literal indentation to meet ktlint standard * NotForUploadDao.kt: file renamed to match class name, new file NotForUploadStatusDao.kt * UploadedDao.kt: file renamed to match class name, new file UploadedStatusDao.kt * Urls.kt: fixed excessive line length for ktLint standard * Snak_partial.kt & Statement_partial.kt: refactored to remove underscores in class names to meet ktLint standard * *.kt: fixed consecutive KDOC error for ktLint * PageableBaseDataSourceTest.kt & UploadPresenterTest.kt: fixed excessive line lengths to meet ktLint standard * CheckboxTriStatesTest.kt: renamed file to match class name to meet ktLint standard * .kt: resolved backing-property-naming error in ktLint, made matching properties public, matched names and refactored * TestConnectionFactory.kt: fixed property naming to adhere to ktLint standard
205 lines
7.6 KiB
Kotlin
205 lines
7.6 KiB
Kotlin
package fr.free.nrw.commons
|
|
|
|
import android.app.Activity
|
|
import android.content.pm.ActivityInfo
|
|
import android.view.View
|
|
import android.view.ViewGroup
|
|
import androidx.test.espresso.Espresso.onView
|
|
import androidx.test.espresso.NoMatchingViewException
|
|
import androidx.test.espresso.action.ViewActions
|
|
import androidx.test.espresso.matcher.ViewMatchers
|
|
import androidx.test.rule.ActivityTestRule
|
|
import org.apache.commons.lang3.StringUtils
|
|
import org.hamcrest.BaseMatcher
|
|
import org.hamcrest.Description
|
|
import org.hamcrest.Matcher
|
|
import org.hamcrest.Matchers
|
|
import org.hamcrest.TypeSafeMatcher
|
|
import timber.log.Timber
|
|
|
|
class UITestHelper {
|
|
companion object {
|
|
fun skipWelcome() {
|
|
try {
|
|
onView(ViewMatchers.withId(R.id.button_ok))
|
|
.perform(ViewActions.click())
|
|
// Skip tutorial
|
|
onView(ViewMatchers.withId(R.id.finishTutorialButton))
|
|
.perform(ViewActions.click())
|
|
} catch (ignored: NoMatchingViewException) {
|
|
}
|
|
}
|
|
|
|
fun skipLogin() {
|
|
try {
|
|
// Skip Login
|
|
val htmlTextView =
|
|
onView(
|
|
Matchers.allOf(
|
|
ViewMatchers.withId(R.id.skip_login),
|
|
ViewMatchers.withText("Skip"),
|
|
ViewMatchers.isDisplayed(),
|
|
),
|
|
)
|
|
htmlTextView.perform(ViewActions.click())
|
|
|
|
val appCompatButton =
|
|
onView(
|
|
Matchers.allOf(
|
|
ViewMatchers.withId(android.R.id.button1),
|
|
ViewMatchers.withText("Yes"),
|
|
childAtPosition(
|
|
childAtPosition(
|
|
ViewMatchers.withId(R.id.buttonPanel),
|
|
0,
|
|
),
|
|
3,
|
|
),
|
|
),
|
|
)
|
|
appCompatButton.perform(ViewActions.scrollTo(), ViewActions.click())
|
|
} catch (ignored: NoMatchingViewException) {
|
|
}
|
|
}
|
|
|
|
fun loginUser() {
|
|
try {
|
|
// Perform Login
|
|
sleep(3000)
|
|
onView(ViewMatchers.withId(R.id.login_username))
|
|
.perform(
|
|
ViewActions.replaceText(getTestUsername()),
|
|
ViewActions.closeSoftKeyboard(),
|
|
)
|
|
sleep(2000)
|
|
onView(ViewMatchers.withId(R.id.login_password))
|
|
.perform(
|
|
ViewActions.replaceText(getTestUserPassword()),
|
|
ViewActions.closeSoftKeyboard(),
|
|
)
|
|
sleep(2000)
|
|
onView(ViewMatchers.withId(R.id.login_button))
|
|
.perform(ViewActions.click())
|
|
sleep(10000)
|
|
} catch (ignored: NoMatchingViewException) {
|
|
}
|
|
}
|
|
|
|
fun logoutUser() {
|
|
try {
|
|
onView(
|
|
Matchers.allOf(
|
|
ViewMatchers.withContentDescription("More"),
|
|
childAtPosition(
|
|
childAtPosition(
|
|
ViewMatchers.withId(R.id.fragment_main_nav_tab_layout),
|
|
0,
|
|
),
|
|
4,
|
|
),
|
|
ViewMatchers.isDisplayed(),
|
|
),
|
|
).perform(ViewActions.click())
|
|
onView(
|
|
Matchers.allOf(
|
|
ViewMatchers.withId(R.id.more_logout),
|
|
ViewMatchers.withText("Logout"),
|
|
childAtPosition(
|
|
childAtPosition(
|
|
ViewMatchers.withId(R.id.scroll_view_more_bottom_sheet),
|
|
0,
|
|
),
|
|
6,
|
|
),
|
|
),
|
|
).perform(ViewActions.scrollTo(), ViewActions.click())
|
|
onView(
|
|
Matchers.allOf(
|
|
ViewMatchers.withId(android.R.id.button1),
|
|
ViewMatchers.withText("Yes"),
|
|
childAtPosition(
|
|
childAtPosition(
|
|
ViewMatchers.withId(R.id.buttonPanel),
|
|
0,
|
|
),
|
|
3,
|
|
),
|
|
),
|
|
).perform(ViewActions.scrollTo(), ViewActions.click())
|
|
sleep(5000)
|
|
} catch (ignored: NoMatchingViewException) {
|
|
}
|
|
}
|
|
|
|
fun childAtPosition(
|
|
parentMatcher: Matcher<View>,
|
|
position: Int,
|
|
): Matcher<View> {
|
|
return object : TypeSafeMatcher<View>() {
|
|
override fun describeTo(description: Description) {
|
|
description.appendText("Child at position $position in parent ")
|
|
parentMatcher.describeTo(description)
|
|
}
|
|
|
|
public override fun matchesSafely(view: View): Boolean {
|
|
val parent = view.parent
|
|
return parent is ViewGroup &&
|
|
parentMatcher.matches(parent) &&
|
|
view == parent.getChildAt(position)
|
|
}
|
|
}
|
|
}
|
|
|
|
fun sleep(timeInMillis: Long) {
|
|
try {
|
|
Timber.d("Sleeping for %d", timeInMillis)
|
|
Thread.sleep(timeInMillis)
|
|
} catch (e: InterruptedException) {
|
|
e.printStackTrace()
|
|
}
|
|
}
|
|
|
|
private fun getTestUsername(): String {
|
|
val username = BuildConfig.TEST_USERNAME
|
|
if (StringUtils.isEmpty(username) || username == "null") {
|
|
throw NotImplementedError("Configure your beta account's username")
|
|
} else {
|
|
return username
|
|
}
|
|
}
|
|
|
|
private fun getTestUserPassword(): String {
|
|
val password = BuildConfig.TEST_PASSWORD
|
|
if (StringUtils.isEmpty(password) || password == "null") {
|
|
throw NotImplementedError("Configure your beta account's password")
|
|
} else {
|
|
return password
|
|
}
|
|
}
|
|
|
|
fun <T : Activity> changeOrientation(activityRule: ActivityTestRule<T>) {
|
|
activityRule.activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
|
|
assert(activityRule.activity.requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
|
|
activityRule.activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
|
|
assert(activityRule.activity.requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
|
|
}
|
|
|
|
fun <T> first(matcher: Matcher<T>): Matcher<T>? {
|
|
return object : BaseMatcher<T>() {
|
|
var isFirst = true
|
|
|
|
override fun matches(item: Any): Boolean {
|
|
if (isFirst && matcher.matches(item)) {
|
|
isFirst = false
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
override fun describeTo(description: Description) {
|
|
description.appendText("should return first matching item")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|