A fork of Simple Time Tracker with WearOS support. (Now integrated upstream)
0

Configure Feed

Select the types of activity you want to include in your feed.

fix ui tests

razeeman (Jan 15, 2023, 10:10 PM +0300) e32e8510 0d1488cd

+90 -84
+1 -1
core/src/main/res/values-sv/strings.xml
··· 104 104 <string name="change_record_continue_hint">Tar bort sluttid och återaktiverar denna aktivitet</string> 105 105 <string name="change_record_merge">Sammanfoga</string> 106 106 <string name="change_record_merge_hint">Lägger till denna tid till tidigare händelse</string> 107 - <string name="change_record_adjust">Change</string> 107 + <string name="change_record_adjust">Förändra</string> 108 108 <string name="change_record_change_prev_record">Ändra även tid för tidigare händelse</string> 109 109 <string name="change_record_change_adjacent_records">Ändra också tiden för de intilliggande händelserna</string> 110 110
+1 -1
core/src/main/res/values-tr/strings.xml
··· 104 104 <string name="change_record_continue_hint">Geçerli kaydı kaldıracak ve bu etkinliği izlemeye devam edecek</string> 105 105 <string name="change_record_merge">Birleştirmek</string> 106 106 <string name="change_record_merge_hint">Bu sefer önceki rekora eklenecek</string> 107 - <string name="change_record_adjust">Change</string> 107 + <string name="change_record_adjust">Değiştirmek</string> 108 108 <string name="change_record_change_prev_record">Ayrıca önceki kaydın zamanını değiştir</string> 109 109 <string name="change_record_change_adjacent_records">Bitişik kayıtların zamanını da değiştir</string> 110 110
+1 -1
core/src/main/res/values-uk/strings.xml
··· 104 104 <string name="change_record_continue_hint">Буде видалено поточний запис і продовжено відстеження цієї діяльності</string> 105 105 <string name="change_record_merge">Об’єднати</string> 106 106 <string name="change_record_merge_hint">Додасть цей час до попереднього запису</string> 107 - <string name="change_record_adjust">Change</string> 107 + <string name="change_record_adjust">Зміна</string> 108 108 <string name="change_record_change_prev_record">Також змінити час попереднього запису</string> 109 109 <string name="change_record_change_adjacent_records">Також змінити час суміжних записів</string> 110 110
+5 -9
app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTest.kt
··· 12 12 import androidx.test.espresso.matcher.ViewMatchers.withSubstring 13 13 import androidx.test.espresso.matcher.ViewMatchers.withText 14 14 import androidx.test.ext.junit.runners.AndroidJUnit4 15 + import com.example.util.simpletimetracker.feature_dialogs.dateTime.CustomTimePicker 15 16 import com.example.util.simpletimetracker.utils.BaseUiTest 16 17 import com.example.util.simpletimetracker.utils.NavUtils 17 18 import com.example.util.simpletimetracker.utils.checkViewDoesNotExist ··· 73 74 val hourStarted = 15 74 75 val minutesStarted = 16 75 76 clickOnViewWithId(R.id.tvChangeRecordTimeStarted) 76 - onView(withClassName(equalTo(TimePicker::class.java.name))) 77 + onView(withClassName(equalTo(CustomTimePicker::class.java.name))) 77 78 .perform(setTime(hourStarted, minutesStarted)) 78 79 clickOnViewWithId(R.id.btnDateTimeDialogPositive) 79 80 ··· 91 92 val hourEnded = 17 92 93 val minutesEnded = 19 93 94 clickOnViewWithId(R.id.tvChangeRecordTimeEnded) 94 - onView(withClassName(equalTo(TimePicker::class.java.name))) 95 + onView(withClassName(equalTo(CustomTimePicker::class.java.name))) 95 96 .perform(setTime(hourEnded, minutesEnded)) 96 97 clickOnViewWithId(R.id.btnDateTimeDialogPositive) 97 98 ··· 128 129 checkPreviewUpdated(hasDescendant(withText(name))) 129 130 checkPreviewUpdated(withCardColor(color)) 130 131 checkPreviewUpdated(hasDescendant(withTag(icon))) 131 - clickOnViewWithText(R.string.change_record_type_field) 132 132 133 133 // Set comment 134 134 clickOnViewWithText(R.string.change_record_comment_field) ··· 199 199 // Select activity 200 200 clickOnViewWithText(R.string.change_record_type_field) 201 201 clickOnRecyclerItem(R.id.rvChangeRecordType, withText(name)) 202 - clickOnViewWithText(R.string.change_record_type_field) 203 202 204 203 // Open tag chooser 205 204 clickOnViewWithId(R.id.fieldChangeRecordCategory) ··· 239 238 // Select activity with no previous comments 240 239 clickOnViewWithText(R.string.change_record_type_field) 241 240 clickOnRecyclerItem(R.id.rvChangeRecordType, withText(nameNoComments)) 242 - clickOnViewWithText(R.string.change_record_type_field) 243 241 244 242 // Still no last comments 245 243 clickOnViewWithText(R.string.change_record_comment_field) ··· 252 250 // Select activity with one previous comment 253 251 clickOnViewWithText(R.string.change_record_type_field) 254 252 clickOnRecyclerItem(R.id.rvChangeRecordType, withText(nameComment)) 255 - clickOnViewWithText(R.string.change_record_type_field) 256 253 257 254 // One last comment 258 255 clickOnViewWithText(R.string.change_record_comment_field) ··· 270 267 // Select activity with many previous comments 271 268 clickOnViewWithText(R.string.change_record_type_field) 272 269 clickOnRecyclerItem(R.id.rvChangeRecordType, withText(nameComments)) 273 - clickOnViewWithText(R.string.change_record_type_field) 274 270 275 271 // Two last comments 276 272 clickOnViewWithText(R.string.change_record_comment_field) ··· 296 292 val hourStarted = 15 297 293 val minutesStarted = 0 298 294 clickOnViewWithId(R.id.tvChangeRecordTimeStarted) 299 - onView(withClassName(equalTo(TimePicker::class.java.name))).perform(setTime(hourStarted, minutesStarted)) 295 + onView(withClassName(equalTo(CustomTimePicker::class.java.name))).perform(setTime(hourStarted, minutesStarted)) 300 296 clickOnViewWithId(R.id.btnDateTimeDialogPositive) 301 297 302 298 val hourEnded = 16 303 299 val minutesEnded = 0 304 300 clickOnViewWithId(R.id.tvChangeRecordTimeEnded) 305 - onView(withClassName(equalTo(TimePicker::class.java.name))).perform(setTime(hourEnded, minutesEnded)) 301 + onView(withClassName(equalTo(CustomTimePicker::class.java.name))).perform(setTime(hourEnded, minutesEnded)) 306 302 clickOnViewWithId(R.id.btnDateTimeDialogPositive) 307 303 308 304 checkAfterTimeAdjustment(
-1
app/src/androidTest/java/com/example/util/simpletimetracker/ArchiveTest.kt
··· 173 173 clickOnViewWithId(R.id.btnRecordAdd) 174 174 clickOnViewWithText(R.string.change_record_type_field) 175 175 clickOnView(withText(name1)) 176 - clickOnViewWithText(R.string.change_record_type_field) 177 176 clickOnViewWithText(R.string.change_record_tag_field) 178 177 checkTagVisible(tag1) 179 178 checkTagNotVisible(tag2)
+3 -4
app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRecordTest.kt
··· 11 11 import androidx.test.espresso.matcher.ViewMatchers.withId 12 12 import androidx.test.espresso.matcher.ViewMatchers.withText 13 13 import androidx.test.ext.junit.runners.AndroidJUnit4 14 + import com.example.util.simpletimetracker.feature_dialogs.dateTime.CustomTimePicker 14 15 import com.example.util.simpletimetracker.utils.BaseUiTest 15 16 import com.example.util.simpletimetracker.utils.NavUtils 16 17 import com.example.util.simpletimetracker.utils.checkViewDoesNotExist ··· 78 79 clickOnViewWithText(R.string.change_record_comment_field) 79 80 clickOnViewWithText(R.string.change_record_type_field) 80 81 clickOnRecyclerItem(R.id.rvChangeRecordType, withText(name)) 81 - clickOnViewWithText(R.string.change_record_type_field) 82 82 clickOnViewWithText(R.string.change_record_tag_field) 83 83 clickOnRecyclerItem(R.id.rvChangeRecordCategories, withText(tag1)) 84 84 clickOnViewWithText(R.string.change_record_tag_field) ··· 108 108 // Change item 109 109 clickOnViewWithText(R.string.change_record_type_field) 110 110 clickOnRecyclerItem(R.id.rvChangeRecordType, withText(newName)) 111 - clickOnViewWithText(R.string.change_record_type_field) 112 111 clickOnViewWithText(R.string.change_record_tag_field) 113 112 clickOnRecyclerItem(R.id.rvChangeRecordCategories, withText(tag2)) 114 113 clickOnViewWithText(R.string.change_record_tag_field) ··· 125 124 val day = calendar.get(Calendar.DAY_OF_MONTH) 126 125 127 126 clickOnViewWithId(R.id.tvChangeRecordTimeStarted) 128 - onView(withClassName(equalTo(TimePicker::class.java.name))) 127 + onView(withClassName(equalTo(CustomTimePicker::class.java.name))) 129 128 .perform(PickerActions.setTime(hourStarted, minutesStarted)) 130 129 clickOnViewWithText(R.string.date_time_dialog_date) 131 130 onView(withClassName(equalTo(DatePicker::class.java.name))) ··· 133 132 clickOnViewWithId(R.id.btnDateTimeDialogPositive) 134 133 135 134 clickOnViewWithId(R.id.tvChangeRecordTimeEnded) 136 - onView(withClassName(equalTo(TimePicker::class.java.name))) 135 + onView(withClassName(equalTo(CustomTimePicker::class.java.name))) 137 136 .perform(PickerActions.setTime(hourEnded, minutesEnded)) 138 137 clickOnViewWithText(R.string.date_time_dialog_date) 139 138 onView(withClassName(equalTo(DatePicker::class.java.name)))
+3 -7
app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRunningRecordTest.kt
··· 15 15 import androidx.test.espresso.matcher.ViewMatchers.withSubstring 16 16 import androidx.test.espresso.matcher.ViewMatchers.withText 17 17 import androidx.test.ext.junit.runners.AndroidJUnit4 18 + import com.example.util.simpletimetracker.feature_dialogs.dateTime.CustomTimePicker 18 19 import com.example.util.simpletimetracker.utils.BaseUiTest 19 20 import com.example.util.simpletimetracker.utils.checkViewDoesNotExist 20 21 import com.example.util.simpletimetracker.utils.checkViewIsDisplayed ··· 97 98 // Change item 98 99 clickOnViewWithText(R.string.change_record_type_field) 99 100 clickOnRecyclerItem(R.id.rvChangeRecordType, withText(name2)) 100 - clickOnViewWithText(R.string.change_record_type_field) 101 101 clickOnViewWithText(R.string.change_record_tag_field) 102 102 clickOnRecyclerItem(R.id.rvChangeRecordCategories, withText(tag2)) 103 103 clickOnViewWithText(R.string.change_record_tag_field) ··· 112 112 val day = calendar.get(Calendar.DAY_OF_MONTH) 113 113 114 114 clickOnViewWithId(R.id.tvChangeRecordTimeStarted) 115 - onView(withClassName(equalTo(TimePicker::class.java.name))) 115 + onView(withClassName(equalTo(CustomTimePicker::class.java.name))) 116 116 .perform(setTime(hourStarted, minutesStarted)) 117 117 clickOnViewWithText(R.string.date_time_dialog_date) 118 118 onView(withClassName(equalTo(DatePicker::class.java.name))) ··· 206 206 clickOnViewWithText(R.string.change_record_type_field) 207 207 clickOnRecyclerItem(R.id.rvChangeRecordType, withText(name2)) 208 208 checkPreviewUpdated(hasDescendant(withText(name2))) 209 - clickOnViewWithText(R.string.change_record_type_field) 210 209 clickOnViewWithText(R.string.change_record_tag_field) 211 210 clickOnRecyclerItem(R.id.rvChangeRecordCategories, withText(tag2)) 212 211 clickOnRecyclerItem(R.id.rvChangeRecordCategories, withText(tag3)) ··· 243 242 tryAction { clickOnViewWithText(name) } 244 243 longClickOnView(allOf(isDescendantOfA(withId(R.id.viewRunningRecordItem)), withText(name))) 245 244 clickOnViewWithId(R.id.tvChangeRecordTimeStarted) 246 - onView(withClassName(equalTo(TimePicker::class.java.name))).perform(setTime(hourStarted, minutesStarted)) 245 + onView(withClassName(equalTo(CustomTimePicker::class.java.name))).perform(setTime(hourStarted, minutesStarted)) 247 246 clickOnViewWithId(R.id.btnDateTimeDialogPositive) 248 247 249 248 checkAfterTimeAdjustment(timeStarted = "00:00") ··· 310 309 // Select activity with one previous comment 311 310 clickOnViewWithText(R.string.change_record_type_field) 312 311 clickOnRecyclerItem(R.id.rvChangeRecordType, withText(nameComment)) 313 - clickOnViewWithText(R.string.change_record_type_field) 314 312 315 313 // One last comment 316 314 clickOnViewWithText(R.string.change_record_comment_field) ··· 328 326 // Select activity with many previous comments 329 327 clickOnViewWithText(R.string.change_record_type_field) 330 328 clickOnRecyclerItem(R.id.rvChangeRecordType, withText(nameComments)) 331 - clickOnViewWithText(R.string.change_record_type_field) 332 329 333 330 // Two last comments 334 331 clickOnViewWithText(R.string.change_record_comment_field) ··· 348 345 // Select activity with no previous comments 349 346 clickOnViewWithText(R.string.change_record_type_field) 350 347 clickOnRecyclerItem(R.id.rvChangeRecordType, withText(nameNoComments)) 351 - clickOnViewWithText(R.string.change_record_type_field) 352 348 353 349 // No last comments 354 350 clickOnViewWithText(R.string.change_record_comment_field)
+1 -4
app/src/androidTest/java/com/example/util/simpletimetracker/DeleteRecordTest.kt
··· 5 5 import androidx.test.espresso.matcher.ViewMatchers.withId 6 6 import androidx.test.espresso.matcher.ViewMatchers.withText 7 7 import androidx.test.ext.junit.runners.AndroidJUnit4 8 - import androidx.test.platform.app.InstrumentationRegistry 9 8 import com.example.util.simpletimetracker.utils.BaseUiTest 10 9 import com.example.util.simpletimetracker.utils.NavUtils 11 10 import com.example.util.simpletimetracker.utils.checkViewDoesNotExist ··· 44 43 clickOnViewWithId(R.id.btnChangeRecordDelete) 45 44 46 45 // Check message 47 - val message = InstrumentationRegistry.getInstrumentation().targetContext 48 - .resources.getString(R.string.record_removed, name) 49 46 checkViewIsDisplayed( 50 47 allOf( 51 - withText(message), 48 + withText(getString(R.string.record_removed, name)), 52 49 withId(com.google.android.material.R.id.snackbar_text) 53 50 ) 54 51 )
+8 -4
app/src/androidTest/java/com/example/util/simpletimetracker/MessagesTest.kt
··· 1 1 package com.example.util.simpletimetracker 2 2 3 + import androidx.test.espresso.matcher.ViewMatchers 3 4 import androidx.test.espresso.matcher.ViewMatchers.withText 4 5 import androidx.test.ext.junit.runners.AndroidJUnit4 5 6 import com.example.util.simpletimetracker.utils.BaseUiTest ··· 9 10 import com.example.util.simpletimetracker.utils.clickOnViewWithText 10 11 import com.example.util.simpletimetracker.utils.tryAction 11 12 import dagger.hilt.android.testing.HiltAndroidTest 13 + import org.hamcrest.Matchers 12 14 import org.junit.Test 13 15 import org.junit.runner.RunWith 14 16 ··· 18 20 19 21 @Test 20 22 fun messageRecordTypeName() { 21 - return // TODO doesn't work 22 23 tryAction { clickOnViewWithText(R.string.running_records_add_type) } 23 24 clickOnViewWithId(R.id.fieldChangeRecordTypeColor) 24 25 clickOnViewWithText(R.string.change_record_type_save) 25 - tryAction { 26 - checkViewIsDisplayed(withText(R.string.change_record_message_choose_name)) 27 - } 26 + checkViewIsDisplayed( 27 + Matchers.allOf( 28 + withText(R.string.change_record_message_choose_name), 29 + ViewMatchers.withId(com.google.android.material.R.id.snackbar_text) 30 + ) 31 + ) 28 32 } 29 33 30 34 @Test
+10 -13
app/src/androidTest/java/com/example/util/simpletimetracker/RecordActionsContinueTest.kt
··· 2 2 3 3 import androidx.test.espresso.Espresso.onView 4 4 import androidx.test.espresso.Espresso.pressBack 5 + import androidx.test.espresso.action.ViewActions.click 5 6 import androidx.test.espresso.matcher.ViewMatchers.hasDescendant 6 7 import androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed 7 8 import androidx.test.espresso.matcher.ViewMatchers.withId ··· 17 18 import com.example.util.simpletimetracker.utils.clickOnViewWithId 18 19 import com.example.util.simpletimetracker.utils.clickOnViewWithText 19 20 import com.example.util.simpletimetracker.utils.longClickOnView 21 + import com.example.util.simpletimetracker.utils.nestedScrollTo 20 22 import com.example.util.simpletimetracker.utils.recyclerItemCount 21 23 import com.example.util.simpletimetracker.utils.tryAction 22 24 import com.example.util.simpletimetracker.utils.unconstrainedClickOnView ··· 69 71 // Continue 70 72 clickOnViewWithText(fullName) 71 73 clickOnViewWithText(R.string.change_record_actions_hint) 72 - clickOnViewWithText(R.string.change_record_continue) 74 + onView(withText(R.string.change_record_continue)).perform(nestedScrollTo(), click()) 73 75 74 76 // Check no record 75 77 checkViewDoesNotExist(allOf(withText(fullName), isCompletelyDisplayed())) ··· 111 113 112 114 // Continue untracked doesn't work 113 115 clickOnViewWithText(R.string.change_record_actions_hint) 114 - clickOnViewWithText(R.string.change_record_continue) 116 + onView(withText(R.string.change_record_continue)).perform(nestedScrollTo(), click()) 115 117 clickOnViewWithText(R.string.change_record_actions_hint) 116 118 117 119 // Select activity 118 120 clickOnViewWithText(R.string.change_record_type_field) 119 121 clickOnRecyclerItem(R.id.rvChangeRecordType, withText(name)) 120 - clickOnViewWithText(R.string.change_record_type_field) 121 122 122 123 // Continue 123 124 clickOnViewWithText(R.string.change_record_actions_hint) 124 - clickOnViewWithText(R.string.change_record_continue) 125 + onView(withText(R.string.change_record_continue)).perform(nestedScrollTo(), click()) 125 126 126 127 checkViewIsDisplayed( 127 128 allOf( ··· 173 174 // Select activity 174 175 clickOnViewWithText(R.string.change_record_type_field) 175 176 clickOnRecyclerItem(R.id.rvChangeRecordType, withText(name)) 176 - clickOnViewWithText(R.string.change_record_type_field) 177 177 178 178 // Continue 179 179 clickOnViewWithText(R.string.change_record_actions_hint) 180 - clickOnViewWithText(R.string.change_record_continue) 180 + onView(withText(R.string.change_record_continue)).perform(nestedScrollTo(), click()) 181 181 182 182 checkViewDoesNotExist(allOf(withText(name), isCompletelyDisplayed())) 183 183 onView(allOf(withId(R.id.rvRecordsList), isCompletelyDisplayed())).check(recyclerItemCount(1)) ··· 213 213 NavUtils.openRecordsScreen() 214 214 clickOnView(allOf(withText(name), isCompletelyDisplayed())) 215 215 clickOnViewWithText(R.string.change_record_actions_hint) 216 - clickOnViewWithText(R.string.change_record_continue) 216 + onView(withText(R.string.change_record_continue)).perform(nestedScrollTo(), click()) 217 217 pressBack() 218 218 219 219 // Try continue from add record 220 220 clickOnViewWithId(R.id.btnRecordAdd) 221 221 clickOnViewWithText(R.string.change_record_type_field) 222 222 clickOnRecyclerItem(R.id.rvChangeRecordType, withText(name)) 223 - clickOnViewWithText(R.string.change_record_type_field) 224 223 unconstrainedClickOnView(withId(R.id.btnChangeRecordTimeStartedAdjust)) 225 224 clickOnViewWithText("+30") 226 225 clickOnViewWithText("+30") 227 226 clickOnViewWithText("+5") 228 227 clickOnViewWithText(R.string.change_record_actions_hint) 229 - clickOnViewWithText(R.string.change_record_continue) 228 + onView(withText(R.string.change_record_continue)).perform(nestedScrollTo(), click()) 230 229 231 230 // Still on edit screen 232 231 checkViewIsDisplayed(withText(R.string.change_record_save)) ··· 259 258 clickOnViewWithId(R.id.btnRecordAdd) 260 259 clickOnViewWithText(R.string.change_record_type_field) 261 260 clickOnRecyclerItem(R.id.rvChangeRecordType, withText(name)) 262 - clickOnViewWithText(R.string.change_record_type_field) 263 261 clickOnViewWithText(R.string.change_record_actions_hint) 264 - clickOnViewWithText(R.string.change_record_continue) 262 + onView(withText(R.string.change_record_continue)).perform(nestedScrollTo(), click()) 265 263 266 264 // Running record stopped 267 265 checkViewIsDisplayed(allOf(withText(name), isCompletelyDisplayed())) ··· 287 285 clickOnViewWithId(R.id.btnRecordAdd) 288 286 clickOnViewWithText(R.string.change_record_type_field) 289 287 clickOnRecyclerItem(R.id.rvChangeRecordType, withText(name2)) 290 - clickOnViewWithText(R.string.change_record_type_field) 291 288 clickOnViewWithText(R.string.change_record_actions_hint) 292 - clickOnViewWithText(R.string.change_record_continue) 289 + onView(withText(R.string.change_record_continue)).perform(nestedScrollTo(), click()) 293 290 294 291 // Running record stopped 295 292 checkViewIsDisplayed(allOf(withText(name1), isCompletelyDisplayed()))
+22 -2
app/src/androidTest/java/com/example/util/simpletimetracker/RecordActionsMergeTest.kt
··· 1 1 package com.example.util.simpletimetracker 2 2 3 + import androidx.test.espresso.Espresso.onView 3 4 import androidx.test.espresso.Espresso.pressBack 5 + import androidx.test.espresso.action.ViewActions.click 4 6 import androidx.test.espresso.matcher.ViewMatchers.hasDescendant 5 7 import androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed 6 8 import androidx.test.espresso.matcher.ViewMatchers.withId ··· 15 17 import com.example.util.simpletimetracker.utils.clickOnViewWithId 16 18 import com.example.util.simpletimetracker.utils.clickOnViewWithText 17 19 import com.example.util.simpletimetracker.utils.longClickOnView 20 + import com.example.util.simpletimetracker.utils.nestedScrollTo 18 21 import com.example.util.simpletimetracker.utils.tryAction 19 22 import dagger.hilt.android.testing.HiltAndroidTest 20 23 import kotlinx.coroutines.runBlocking ··· 35 38 // Setup 36 39 testUtils.addActivity(name) 37 40 testUtils.addRecord(name) 41 + testUtils.addRecord( 42 + typeName = name, 43 + timeStarted = calendar.timeInMillis - TimeUnit.DAYS.toMillis(1), 44 + timeEnded = calendar.timeInMillis - TimeUnit.DAYS.toMillis(1), 45 + ) 38 46 testUtils.addRunningRecord(name) 39 47 runBlocking { prefsInteractor.setShowUntrackedInRecords(true) } 48 + Thread.sleep(1000) 40 49 41 50 // Running record - not shown 42 51 tryAction { longClickOnView(allOf(withId(R.id.viewRunningRecordItem), hasDescendant(withText(name)))) } ··· 57 66 checkViewIsNotDisplayed(withText(R.string.change_record_merge)) 58 67 pressBack() 59 68 60 - // Untracked - shown 69 + // Untracked and have prev record - shown 61 70 clickOnView(allOf(withText(R.string.untracked_time_name), isCompletelyDisplayed())) 62 71 clickOnViewWithText(R.string.change_record_actions_hint) 72 + onView(withText(R.string.change_record_merge)).perform(nestedScrollTo()) 63 73 checkViewIsDisplayed(withText(R.string.change_record_merge)) 74 + pressBack() 75 + 76 + // Untracked and have no prev record - not shown 77 + clickOnViewWithId(R.id.btnRecordsContainerPrevious) 78 + clickOnView(allOf(withText(name), isCompletelyDisplayed())) 79 + clickOnViewWithId(R.id.btnChangeRecordDelete) 80 + clickOnViewWithId(R.id.btnRecordsContainerNext) 81 + clickOnView(allOf(withText(R.string.untracked_time_name), isCompletelyDisplayed())) 82 + clickOnViewWithText(R.string.change_record_actions_hint) 83 + checkViewIsNotDisplayed(withText(R.string.change_record_merge)) 64 84 } 65 85 66 86 @Test ··· 113 133 ) 114 134 ) 115 135 clickOnViewWithText(R.string.change_record_actions_hint) 116 - clickOnViewWithText(R.string.change_record_merge) 136 + onView(withText(R.string.change_record_merge)).perform(nestedScrollTo(), click()) 117 137 118 138 // Check records 119 139 checkViewDoesNotExist(
-2
app/src/androidTest/java/com/example/util/simpletimetracker/RecordActionsSplitTest.kt
··· 191 191 // Select activity 192 192 clickOnViewWithText(R.string.change_record_type_field) 193 193 clickOnRecyclerItem(R.id.rvChangeRecordType, withText(name)) 194 - clickOnViewWithText(R.string.change_record_type_field) 195 194 196 195 // Split 197 196 clickOnViewWithText(R.string.change_record_actions_hint) ··· 223 222 // Select activity 224 223 clickOnViewWithText(R.string.change_record_type_field) 225 224 clickOnRecyclerItem(R.id.rvChangeRecordType, withText(name)) 226 - clickOnViewWithText(R.string.change_record_type_field) 227 225 228 226 // Split 229 227 clickOnViewWithText(R.string.change_record_actions_hint)
+14 -24
app/src/androidTest/java/com/example/util/simpletimetracker/RecordAdjustTimeTest.kt
··· 1 1 package com.example.util.simpletimetracker 2 2 3 3 import androidx.test.espresso.Espresso.onView 4 - import androidx.test.espresso.assertion.ViewAssertions.matches 4 + import androidx.test.espresso.action.ViewActions.swipeUp 5 5 import androidx.test.espresso.matcher.ViewMatchers.hasDescendant 6 - import androidx.test.espresso.matcher.ViewMatchers.isChecked 7 6 import androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed 8 7 import androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA 9 - import androidx.test.espresso.matcher.ViewMatchers.isNotChecked 10 8 import androidx.test.espresso.matcher.ViewMatchers.withId 11 9 import androidx.test.espresso.matcher.ViewMatchers.withText 12 10 import androidx.test.ext.junit.runners.AndroidJUnit4 13 11 import com.example.util.simpletimetracker.utils.BaseUiTest 14 12 import com.example.util.simpletimetracker.utils.NavUtils 15 13 import com.example.util.simpletimetracker.utils.checkViewIsDisplayed 16 - import com.example.util.simpletimetracker.utils.checkViewIsNotDisplayed 17 14 import com.example.util.simpletimetracker.utils.clickOnRecyclerItem 18 - import com.example.util.simpletimetracker.utils.clickOnViewWithId 19 15 import com.example.util.simpletimetracker.utils.clickOnViewWithText 20 16 import com.example.util.simpletimetracker.utils.getMillis 21 17 import com.example.util.simpletimetracker.utils.longClickOnView 18 + import com.example.util.simpletimetracker.utils.nestedScrollTo 22 19 import com.example.util.simpletimetracker.utils.tryAction 23 20 import com.example.util.simpletimetracker.utils.unconstrainedClickOnView 24 21 import dagger.hilt.android.testing.HiltAndroidTest ··· 81 78 82 79 // Change record 83 80 longClickOnView(allOf(withText(name2), isCompletelyDisplayed())) 84 - checkViewIsNotDisplayed(withId(R.id.checkboxChangeRecordAdjustPrevRecord)) 85 81 unconstrainedClickOnView(withId(R.id.btnChangeRecordTimeStartedAdjust)) 86 82 clickOnViewWithText("-30") 87 - checkViewIsDisplayed(withId(R.id.checkboxChangeRecordAdjustPrevRecord)) 88 - onView(withId(R.id.checkboxChangeRecordAdjustPrevRecord)).check(matches(isNotChecked())) 89 83 unconstrainedClickOnView(withId(R.id.btnChangeRecordTimeEndedAdjust)) 90 84 tryAction { clickOnViewWithText("+30") } 91 85 clickOnViewWithText("+30") 92 - clickOnViewWithId(R.id.checkboxChangeRecordAdjustPrevRecord) 93 - onView(withId(R.id.checkboxChangeRecordAdjustPrevRecord)).check(matches(isChecked())) 94 - clickOnViewWithText(R.string.change_record_save) 86 + clickOnViewWithText(R.string.change_record_actions_hint) 87 + onView(withText(R.string.change_record_adjust)).perform(nestedScrollTo()) 88 + onView(withId(R.id.containerChangeRecordAction)).perform(swipeUp()) 89 + clickOnViewWithText(R.string.change_record_adjust) 95 90 96 91 // Check records 97 92 checkRecord( ··· 169 164 isCompletelyDisplayed() 170 165 ) 171 166 ) 172 - checkViewIsNotDisplayed(withId(R.id.checkboxChangeRecordAdjustPrevRecord)) 173 167 unconstrainedClickOnView(withId(R.id.btnChangeRecordTimeStartedAdjust)) 174 168 clickOnViewWithText("-1") 175 169 clickOnViewWithText("-1") 176 - checkViewIsDisplayed(withId(R.id.checkboxChangeRecordAdjustPrevRecord)) 177 - onView(withId(R.id.checkboxChangeRecordAdjustPrevRecord)).check(matches(isNotChecked())) 178 170 unconstrainedClickOnView(withId(R.id.btnChangeRecordTimeEndedAdjust)) 179 171 tryAction { clickOnViewWithText("+1") } 180 - clickOnViewWithId(R.id.checkboxChangeRecordAdjustPrevRecord) 181 - onView(withId(R.id.checkboxChangeRecordAdjustPrevRecord)).check(matches(isChecked())) 182 172 clickOnViewWithText(R.string.change_record_type_field) 183 173 clickOnRecyclerItem(R.id.rvChangeRecordType, withText(name2)) 184 - clickOnViewWithText(R.string.change_record_type_field) 185 - clickOnViewWithText(R.string.change_record_save) 174 + clickOnViewWithText(R.string.change_record_actions_hint) 175 + onView(withText(R.string.change_record_adjust)).perform(nestedScrollTo()) 176 + onView(withId(R.id.containerChangeRecordAction)).perform(swipeUp()) 177 + clickOnViewWithText(R.string.change_record_adjust) 186 178 187 179 // Check records 188 180 val newUntrackedTimeStarted = timeEndedTimeStamp1 - TimeUnit.MINUTES.toMillis(2) ··· 241 233 242 234 // Change record 243 235 longClickOnView(allOf(isDescendantOfA(withId(R.id.viewRunningRecordItem)), withText(name2))) 244 - checkViewIsNotDisplayed(withId(R.id.checkboxChangeRecordAdjustPrevRecord)) 245 236 unconstrainedClickOnView(withId(R.id.btnChangeRecordTimeStartedAdjust)) 246 237 clickOnViewWithText("-5") 247 - checkViewIsDisplayed(withId(R.id.checkboxChangeRecordAdjustPrevRecord)) 248 - onView(withId(R.id.checkboxChangeRecordAdjustPrevRecord)).check(matches(isNotChecked())) 249 - clickOnViewWithId(R.id.checkboxChangeRecordAdjustPrevRecord) 250 - onView(withId(R.id.checkboxChangeRecordAdjustPrevRecord)).check(matches(isChecked())) 251 - clickOnViewWithText(R.string.change_record_save) 238 + clickOnViewWithText(R.string.change_record_actions_hint) 239 + onView(withText(R.string.change_record_adjust)).perform(nestedScrollTo()) 240 + onView(withId(R.id.containerChangeRecordAction)).perform(swipeUp()) 241 + clickOnViewWithText(R.string.change_record_adjust) 252 242 253 243 // Check records 254 244 val newTimeEnded = current - TimeUnit.MINUTES.toMillis(5)
+6 -6
app/src/androidTest/java/com/example/util/simpletimetracker/SettingsTest.kt
··· 1 1 package com.example.util.simpletimetracker 2 2 3 3 import android.widget.DatePicker 4 - import android.widget.TimePicker 5 4 import androidx.test.espresso.Espresso.onView 6 5 import androidx.test.espresso.Espresso.pressBack 7 6 import androidx.test.espresso.action.ViewActions.click ··· 23 22 import com.example.util.simpletimetracker.core.extension.setWeekToFirstDay 24 23 import com.example.util.simpletimetracker.domain.model.ActivityFilter 25 24 import com.example.util.simpletimetracker.domain.model.DayOfWeek 25 + import com.example.util.simpletimetracker.feature_dialogs.dateTime.CustomTimePicker 26 26 import com.example.util.simpletimetracker.utils.BaseUiTest 27 27 import com.example.util.simpletimetracker.utils.NavUtils 28 28 import com.example.util.simpletimetracker.utils.checkViewDoesNotExist ··· 704 704 705 705 // Change setting to +1 706 706 clickOnView(withId(R.id.groupSettingsStartOfDay)) 707 - onView(withClassName(equalTo(TimePicker::class.java.name))).perform(setTime(1, 0)) 707 + onView(withClassName(equalTo(CustomTimePicker::class.java.name))).perform(setTime(1, 0)) 708 708 clickOnViewWithId(R.id.btnDateTimeDialogPositive) 709 709 startOfDayTimeStamp = calendar.timeInMillis + TimeUnit.HOURS.toMillis(1) 710 710 startOfDayPreview = startOfDayTimeStamp.toTimePreview() ··· 810 810 811 811 NavUtils.openSettingsScreen() 812 812 onView(withId(R.id.groupSettingsStartOfDay)).perform(nestedScrollTo(), click()) 813 - onView(withClassName(equalTo(TimePicker::class.java.name))).perform(setTime(2, 0)) 813 + onView(withClassName(equalTo(CustomTimePicker::class.java.name))).perform(setTime(2, 0)) 814 814 clickOnViewWithId(R.id.btnDateTimeDialogPositive) 815 815 checkViewIsDisplayed(allOf(withId(R.id.tvSettingsStartOfDayTime), withText(startOfDayPreview))) 816 816 checkViewIsDisplayed( ··· 864 864 865 865 NavUtils.openSettingsScreen() 866 866 onView(withId(R.id.groupSettingsStartOfDay)).perform(nestedScrollTo(), click()) 867 - onView(withClassName(equalTo(TimePicker::class.java.name))).perform(setTime(0, 0)) 867 + onView(withClassName(equalTo(CustomTimePicker::class.java.name))).perform(setTime(0, 0)) 868 868 clickOnViewWithId(R.id.btnDateTimeDialogPositive) 869 869 checkViewIsDisplayed(allOf(withId(R.id.tvSettingsStartOfDayTime), withText(startOfDayPreview))) 870 870 checkViewIsNotDisplayed(withId(R.id.btnSettingsStartOfDaySign)) ··· 1030 1030 onView(withClassName(equalTo(DatePicker::class.java.name))) 1031 1031 .perform(setDate(year, month + 1, day)) 1032 1032 clickOnView(allOf(isDescendantOfA(withId(R.id.tabsDateTimeDialog)), withText(R.string.date_time_dialog_time))) 1033 - onView(withClassName(equalTo(TimePicker::class.java.name))) 1033 + onView(withClassName(equalTo(CustomTimePicker::class.java.name))) 1034 1034 .perform(setTime(hourStarted, minutesStarted)) 1035 1035 clickOnViewWithId(R.id.btnDateTimeDialogPositive) 1036 1036 ··· 1053 1053 onView(withClassName(equalTo(DatePicker::class.java.name))) 1054 1054 .perform(setDate(year, month + 1, day)) 1055 1055 clickOnView(allOf(isDescendantOfA(withId(R.id.tabsDateTimeDialog)), withText(R.string.date_time_dialog_time))) 1056 - onView(withClassName(equalTo(TimePicker::class.java.name))) 1056 + onView(withClassName(equalTo(CustomTimePicker::class.java.name))) 1057 1057 .perform(setTime(hourEnded, minutesEnded)) 1058 1058 clickOnViewWithId(R.id.btnDateTimeDialogPositive) 1059 1059
+4
app/src/androidTest/java/com/example/util/simpletimetracker/StartRecordTest.kt
··· 1 1 package com.example.util.simpletimetracker 2 2 3 + import androidx.test.espresso.action.ViewActions 4 + import androidx.test.espresso.action.ViewActions.closeSoftKeyboard 5 + import androidx.test.espresso.action.ViewActions.pressBack 3 6 import androidx.test.espresso.matcher.ViewMatchers.hasDescendant 4 7 import androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed 5 8 import androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA ··· 117 120 longClickOnView(allOf(isDescendantOfA(withId(R.id.viewRunningRecordItem)), withText(name))) 118 121 clickOnViewWithText(R.string.change_record_comment_field) 119 122 typeTextIntoView(R.id.etChangeRecordComment, comment) 123 + clickOnViewWithText(R.string.change_record_comment_field) 120 124 clickOnViewWithText(R.string.change_record_save) 121 125 122 126 // Stop timer
+4
app/src/androidTest/java/com/example/util/simpletimetracker/utils/BaseUiTest.kt
··· 4 4 import androidx.annotation.ColorInt 5 5 import androidx.emoji2.bundled.BundledEmojiCompatConfig 6 6 import androidx.emoji2.text.EmojiCompat 7 + import androidx.emoji2.text.EmojiCompat.init 7 8 import androidx.test.core.app.ApplicationProvider 8 9 import androidx.test.espresso.IdlingRegistry 9 10 import androidx.test.ext.junit.rules.ActivityScenarioRule ··· 24 25 import org.junit.After 25 26 import org.junit.Before 26 27 import org.junit.Rule 28 + import java.util.Calendar 27 29 import javax.inject.Inject 28 30 29 31 @HiltAndroidTest ··· 77 79 val hourString: String by lazy { getString(R.string.time_hour) } 78 80 val minuteString: String by lazy { getString(R.string.time_minute) } 79 81 val secondString: String by lazy { getString(R.string.time_second) } 82 + 83 + val calendar: Calendar = Calendar.getInstance() 80 84 81 85 init { 82 86 val app = ApplicationProvider.getApplicationContext() as Context
+2 -1
app/src/androidTest/java/com/example/util/simpletimetracker/utils/Extensions.kt
··· 2 2 3 3 import java.util.Calendar 4 4 5 - fun Calendar.getMillis(hour: Int, minute: Int): Long { 5 + fun Calendar.getMillis(hour: Int, minute: Int, millis: Int = 0): Long { 6 6 set(Calendar.HOUR_OF_DAY, hour) 7 7 set(Calendar.MINUTE, minute) 8 + set(Calendar.MILLISECOND, millis) 8 9 return timeInMillis 9 10 }
+3 -3
app/src/androidTest/java/com/example/util/simpletimetracker/utils/NavUtils.kt
··· 13 13 import androidx.test.espresso.matcher.ViewMatchers.withId 14 14 import androidx.test.espresso.matcher.ViewMatchers.withText 15 15 import com.example.util.simpletimetracker.R 16 + import com.example.util.simpletimetracker.feature_dialogs.dateTime.CustomTimePicker 16 17 import org.hamcrest.CoreMatchers.allOf 17 18 import org.hamcrest.CoreMatchers.equalTo 18 19 ··· 209 210 210 211 // Time started 211 212 clickOnViewWithId(R.id.tvChangeRecordTimeStarted) 212 - onView(withClassName(equalTo(TimePicker::class.java.name))) 213 + onView(withClassName(equalTo(CustomTimePicker::class.java.name))) 213 214 .perform(setTime(hourStarted, minutesStarted)) 214 215 clickOnViewWithId(R.id.btnDateTimeDialogPositive) 215 216 216 217 // Time ended 217 218 clickOnViewWithId(R.id.tvChangeRecordTimeEnded) 218 - onView(withClassName(equalTo(TimePicker::class.java.name))) 219 + onView(withClassName(equalTo(CustomTimePicker::class.java.name))) 219 220 .perform(setTime(hourEnded, minutesEnded)) 220 221 clickOnViewWithId(R.id.btnDateTimeDialogPositive) 221 222 ··· 229 230 // Activity 230 231 clickOnViewWithText(R.string.change_record_type_field) 231 232 clickOnRecyclerItem(R.id.rvChangeRecordType, withText(name)) 232 - clickOnViewWithText(R.string.change_record_type_field) 233 233 234 234 // Tag 235 235 if (tag != null) {
+2 -1
app/src/androidTest/java/com/example/util/simpletimetracker/utils/ViewInteractions.kt
··· 20 20 import androidx.test.espresso.matcher.ViewMatchers.withId 21 21 import androidx.test.espresso.matcher.ViewMatchers.withText 22 22 import com.example.util.simpletimetracker.feature_base_adapter.BaseRecyclerViewHolder 23 + import com.example.util.simpletimetracker.feature_dialogs.dateTime.CustomTimePicker 23 24 import org.hamcrest.CoreMatchers.allOf 24 25 import org.hamcrest.CoreMatchers.equalTo 25 26 import org.hamcrest.CoreMatchers.not ··· 85 86 onView(withId(id)).check(matches(withSliderValue((expectedValue)))) 86 87 87 88 fun setPickerTime(hour: Int, minute: Int) { 88 - onView(withClassName(equalTo(TimePicker::class.java.name))).perform(setTime(hour, minute)) 89 + onView(withClassName(equalTo(CustomTimePicker::class.java.name))).perform(setTime(hour, minute)) 89 90 }