Skip to content

Commit c0426d1

Browse files
committed
add goals ui tests
1 parent 1fe5895 commit c0426d1

File tree

2 files changed

+281
-3
lines changed

2 files changed

+281
-3
lines changed

app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRunningRecordTest.kt

Lines changed: 277 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ package com.example.util.simpletimetracker
33
import android.view.View
44
import android.widget.DatePicker
55
import android.widget.TimePicker
6+
import androidx.annotation.IdRes
67
import androidx.test.espresso.Espresso.onView
78
import androidx.test.espresso.contrib.PickerActions
89
import androidx.test.espresso.contrib.PickerActions.setTime
910
import androidx.test.espresso.matcher.ViewMatchers.hasDescendant
11+
import androidx.test.espresso.matcher.ViewMatchers.hasSibling
1012
import androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA
1113
import androidx.test.espresso.matcher.ViewMatchers.withClassName
1214
import androidx.test.espresso.matcher.ViewMatchers.withId
@@ -21,6 +23,7 @@ import com.example.util.simpletimetracker.utils.clickOnRecyclerItem
2123
import com.example.util.simpletimetracker.utils.clickOnViewWithId
2224
import com.example.util.simpletimetracker.utils.clickOnViewWithText
2325
import com.example.util.simpletimetracker.utils.longClickOnView
26+
import com.example.util.simpletimetracker.utils.scrollRecyclerToView
2427
import com.example.util.simpletimetracker.utils.tryAction
2528
import com.example.util.simpletimetracker.utils.typeTextIntoView
2629
import com.example.util.simpletimetracker.utils.unconstrainedClickOnView
@@ -158,7 +161,6 @@ class ChangeRunningRecordTest : BaseUiTest() {
158161
color = lastColor,
159162
text = lastEmoji,
160163
timeStarted = timeStartedPreview,
161-
goalTime = "",
162164
comment = comment
163165
)
164166
}
@@ -357,6 +359,280 @@ class ChangeRunningRecordTest : BaseUiTest() {
357359
clickOnViewWithText(R.string.change_record_comment_field)
358360
}
359361

362+
@Test
363+
fun goalTimes() {
364+
fun checkGoal(typeName: String, @IdRes goalTextId: Int, goal: String) {
365+
allOf(
366+
isDescendantOfA(withId(R.id.viewRunningRecordItem)),
367+
hasSibling(withText(typeName)),
368+
withId(goalTextId),
369+
withSubstring(goal),
370+
).let(::checkViewIsDisplayed)
371+
}
372+
373+
fun checkNoGoal(typeName: String, @IdRes goalTextId: Int) {
374+
allOf(
375+
isDescendantOfA(withId(R.id.viewRunningRecordItem)),
376+
hasSibling(withText(typeName)),
377+
withId(goalTextId),
378+
).let(::checkViewIsNotDisplayed)
379+
}
380+
381+
fun checkGoalMark(typeName: String, @IdRes checkId: Int, isVisible: Boolean) {
382+
allOf(
383+
isDescendantOfA(withId(R.id.viewRunningRecordItem)),
384+
hasSibling(withText(typeName)),
385+
withId(checkId),
386+
).let {
387+
if (isVisible) checkViewIsDisplayed(it) else checkViewIsNotDisplayed(it)
388+
}
389+
}
390+
391+
fun scrollTo(typeName: String) {
392+
tryAction {
393+
scrollRecyclerToView(
394+
R.id.rvRunningRecordsList,
395+
allOf(withId(R.id.viewRunningRecordItem), hasDescendant(withText(typeName)))
396+
)
397+
}
398+
}
399+
400+
val sessionGoal = getString(R.string.change_record_type_session_goal_time).lowercase()
401+
val dailyGoal = getString(R.string.change_record_type_daily_goal_time).lowercase()
402+
val weeklyGoal = getString(R.string.change_record_type_weekly_goal_time).lowercase()
403+
val currentTime = Calendar.getInstance().timeInMillis
404+
405+
val noGoals = "noGoals"
406+
val sessionGoalNotFinished = "sessionGoalNotFinished"
407+
val sessionGoalFinished = "sessionGoalFinished"
408+
val dailyGoalNotFinished = "dailyGoalNotFinished"
409+
val dailyGoalFinished = "dailyGoalFinished"
410+
val weeklyGoalNotFinished = "weeklyGoalNotFinished"
411+
val weeklyGoalFinished = "weeklyGoalFinished"
412+
val allGoalsNotFinished = "allGoalsNotFinished"
413+
val allGoalsFinished = "allGoalsFinished"
414+
val allGoalsSessionFinished = "allGoalsSessionFinished"
415+
val allGoalsDailyFinished = "allGoalsDailyFinished"
416+
val allGoalsWeeklyFinished = "allGoalsWeeklyFinished"
417+
418+
// Add data
419+
testUtils.addActivity(noGoals)
420+
testUtils.addRunningRecord(noGoals)
421+
422+
testUtils.addActivity(sessionGoalNotFinished, goalTime = TimeUnit.MINUTES.toSeconds(10))
423+
testUtils.addRecord(sessionGoalNotFinished)
424+
testUtils.addRunningRecord(sessionGoalNotFinished)
425+
426+
testUtils.addActivity(sessionGoalFinished, goalTime = TimeUnit.MINUTES.toSeconds(10))
427+
testUtils.addRunningRecord(
428+
typeName = sessionGoalFinished,
429+
timeStarted = currentTime - TimeUnit.MINUTES.toMillis(10),
430+
)
431+
432+
testUtils.addActivity(dailyGoalNotFinished, dailyGoalTime = TimeUnit.MINUTES.toSeconds(10))
433+
testUtils.addRecord(
434+
typeName = dailyGoalNotFinished,
435+
timeStarted = currentTime - TimeUnit.MINUTES.toMillis(5),
436+
timeEnded = currentTime,
437+
)
438+
testUtils.addRunningRecord(dailyGoalNotFinished)
439+
440+
testUtils.addActivity(dailyGoalFinished, dailyGoalTime = TimeUnit.MINUTES.toSeconds(10))
441+
testUtils.addRecord(
442+
typeName = dailyGoalFinished,
443+
timeStarted = currentTime - TimeUnit.MINUTES.toMillis(10),
444+
timeEnded = currentTime,
445+
)
446+
testUtils.addRunningRecord(dailyGoalFinished)
447+
448+
testUtils.addActivity(weeklyGoalNotFinished, weeklyGoalTime = TimeUnit.MINUTES.toSeconds(10))
449+
testUtils.addRecord(
450+
typeName = weeklyGoalNotFinished,
451+
timeStarted = currentTime - TimeUnit.MINUTES.toMillis(5),
452+
timeEnded = currentTime,
453+
)
454+
testUtils.addRunningRecord(weeklyGoalNotFinished)
455+
456+
testUtils.addActivity(weeklyGoalFinished, weeklyGoalTime = TimeUnit.MINUTES.toSeconds(10))
457+
testUtils.addRecord(
458+
typeName = weeklyGoalFinished,
459+
timeStarted = currentTime - TimeUnit.MINUTES.toMillis(10),
460+
timeEnded = currentTime,
461+
)
462+
testUtils.addRunningRecord(weeklyGoalFinished)
463+
464+
testUtils.addActivity(
465+
name = allGoalsNotFinished,
466+
goalTime = TimeUnit.MINUTES.toSeconds(10),
467+
dailyGoalTime = TimeUnit.MINUTES.toSeconds(20),
468+
weeklyGoalTime = TimeUnit.MINUTES.toSeconds(30),
469+
)
470+
testUtils.addRecord(
471+
typeName = allGoalsNotFinished,
472+
timeStarted = currentTime - TimeUnit.MINUTES.toMillis(5),
473+
timeEnded = currentTime,
474+
)
475+
testUtils.addRunningRecord(allGoalsNotFinished)
476+
477+
testUtils.addActivity(
478+
name = allGoalsFinished,
479+
goalTime = TimeUnit.MINUTES.toSeconds(10),
480+
dailyGoalTime = TimeUnit.MINUTES.toSeconds(10),
481+
weeklyGoalTime = TimeUnit.MINUTES.toSeconds(10),
482+
)
483+
testUtils.addRecord(
484+
typeName = allGoalsFinished,
485+
timeStarted = currentTime - TimeUnit.MINUTES.toMillis(10),
486+
timeEnded = currentTime,
487+
)
488+
testUtils.addRunningRecord(
489+
typeName = allGoalsFinished,
490+
timeStarted = currentTime - TimeUnit.MINUTES.toMillis(10),
491+
)
492+
493+
testUtils.addActivity(
494+
name = allGoalsSessionFinished,
495+
goalTime = TimeUnit.MINUTES.toSeconds(10),
496+
dailyGoalTime = TimeUnit.MINUTES.toSeconds(20),
497+
weeklyGoalTime = TimeUnit.MINUTES.toSeconds(30),
498+
)
499+
testUtils.addRunningRecord(
500+
typeName = allGoalsSessionFinished,
501+
timeStarted = currentTime - TimeUnit.MINUTES.toMillis(10),
502+
)
503+
504+
testUtils.addActivity(
505+
name = allGoalsDailyFinished,
506+
goalTime = TimeUnit.MINUTES.toSeconds(20),
507+
dailyGoalTime = TimeUnit.MINUTES.toSeconds(10),
508+
weeklyGoalTime = TimeUnit.MINUTES.toSeconds(30),
509+
)
510+
testUtils.addRunningRecord(
511+
typeName = allGoalsDailyFinished,
512+
timeStarted = currentTime - TimeUnit.MINUTES.toMillis(10),
513+
)
514+
515+
testUtils.addActivity(
516+
name = allGoalsWeeklyFinished,
517+
goalTime = TimeUnit.MINUTES.toSeconds(20),
518+
dailyGoalTime = TimeUnit.MINUTES.toSeconds(30),
519+
weeklyGoalTime = TimeUnit.MINUTES.toSeconds(10),
520+
)
521+
testUtils.addRunningRecord(
522+
typeName = allGoalsWeeklyFinished,
523+
timeStarted = currentTime - TimeUnit.MINUTES.toMillis(10),
524+
)
525+
526+
// No goals
527+
Thread.sleep(1000)
528+
scrollTo(noGoals)
529+
checkNoGoal(noGoals, R.id.tvRunningRecordItemGoalTime)
530+
checkGoalMark(noGoals, R.id.ivRunningRecordItemGoalTimeCheck, isVisible = false)
531+
checkNoGoal(noGoals, R.id.tvRunningRecordItemGoalTime2)
532+
checkGoalMark(noGoals, R.id.ivRunningRecordItemGoalTimeCheck2, isVisible = false)
533+
checkNoGoal(noGoals, R.id.tvRunningRecordItemGoalTime3)
534+
checkGoalMark(noGoals, R.id.ivRunningRecordItemGoalTimeCheck3, isVisible = false)
535+
536+
// Session goal not finished
537+
scrollTo(sessionGoalNotFinished)
538+
checkGoal(sessionGoalNotFinished, R.id.tvRunningRecordItemGoalTime, "$sessionGoal 9$minuteString")
539+
checkGoalMark(sessionGoalNotFinished, R.id.ivRunningRecordItemGoalTimeCheck, isVisible = false)
540+
checkNoGoal(sessionGoalNotFinished, R.id.tvRunningRecordItemGoalTime2)
541+
checkGoalMark(sessionGoalNotFinished, R.id.ivRunningRecordItemGoalTimeCheck2, isVisible = false)
542+
checkNoGoal(sessionGoalNotFinished, R.id.tvRunningRecordItemGoalTime3)
543+
checkGoalMark(sessionGoalNotFinished, R.id.ivRunningRecordItemGoalTimeCheck3, isVisible = false)
544+
545+
// Session goal finished
546+
scrollTo(sessionGoalFinished)
547+
checkGoal(sessionGoalFinished, R.id.tvRunningRecordItemGoalTime, sessionGoal)
548+
checkGoalMark(sessionGoalFinished, R.id.ivRunningRecordItemGoalTimeCheck, isVisible = true)
549+
checkNoGoal(sessionGoalFinished, R.id.tvRunningRecordItemGoalTime2)
550+
checkGoalMark(sessionGoalFinished, R.id.ivRunningRecordItemGoalTimeCheck2, isVisible = false)
551+
checkNoGoal(sessionGoalFinished, R.id.tvRunningRecordItemGoalTime3)
552+
checkGoalMark(sessionGoalFinished, R.id.ivRunningRecordItemGoalTimeCheck3, isVisible = false)
553+
554+
// Daily goal not finished
555+
scrollTo(dailyGoalNotFinished)
556+
checkNoGoal(dailyGoalNotFinished, R.id.tvRunningRecordItemGoalTime)
557+
checkGoalMark(dailyGoalNotFinished, R.id.ivRunningRecordItemGoalTimeCheck, isVisible = false)
558+
checkGoal(dailyGoalNotFinished, R.id.tvRunningRecordItemGoalTime2, "$dailyGoal 4$minuteString")
559+
checkGoalMark(dailyGoalNotFinished, R.id.ivRunningRecordItemGoalTimeCheck2, isVisible = false)
560+
checkNoGoal(dailyGoalNotFinished, R.id.tvRunningRecordItemGoalTime3)
561+
checkGoalMark(dailyGoalNotFinished, R.id.ivRunningRecordItemGoalTimeCheck3, isVisible = false)
562+
563+
// Daily goal finished
564+
scrollTo(dailyGoalFinished)
565+
checkNoGoal(dailyGoalFinished, R.id.tvRunningRecordItemGoalTime)
566+
checkGoalMark(dailyGoalFinished, R.id.ivRunningRecordItemGoalTimeCheck, isVisible = false)
567+
checkGoal(dailyGoalFinished, R.id.tvRunningRecordItemGoalTime2, dailyGoal)
568+
checkGoalMark(dailyGoalFinished, R.id.ivRunningRecordItemGoalTimeCheck2, isVisible = true)
569+
checkNoGoal(dailyGoalFinished, R.id.tvRunningRecordItemGoalTime3)
570+
checkGoalMark(dailyGoalFinished, R.id.ivRunningRecordItemGoalTimeCheck3, isVisible = false)
571+
572+
// Weekly goal not finished
573+
scrollTo(weeklyGoalNotFinished)
574+
checkNoGoal(weeklyGoalNotFinished, R.id.tvRunningRecordItemGoalTime)
575+
checkGoalMark(weeklyGoalNotFinished, R.id.ivRunningRecordItemGoalTimeCheck, isVisible = false)
576+
checkNoGoal(weeklyGoalNotFinished, R.id.tvRunningRecordItemGoalTime2)
577+
checkGoalMark(weeklyGoalNotFinished, R.id.ivRunningRecordItemGoalTimeCheck2, isVisible = false)
578+
checkGoal(weeklyGoalNotFinished, R.id.tvRunningRecordItemGoalTime3, "$weeklyGoal 4$minuteString")
579+
checkGoalMark(weeklyGoalNotFinished, R.id.ivRunningRecordItemGoalTimeCheck3, isVisible = false)
580+
581+
// Weekly goal finished
582+
scrollTo(weeklyGoalFinished)
583+
checkNoGoal(weeklyGoalFinished, R.id.tvRunningRecordItemGoalTime)
584+
checkGoalMark(weeklyGoalFinished, R.id.ivRunningRecordItemGoalTimeCheck, isVisible = false)
585+
checkNoGoal(weeklyGoalFinished, R.id.tvRunningRecordItemGoalTime2)
586+
checkGoalMark(weeklyGoalFinished, R.id.ivRunningRecordItemGoalTimeCheck2, isVisible = false)
587+
checkGoal(weeklyGoalFinished, R.id.tvRunningRecordItemGoalTime3, weeklyGoal)
588+
checkGoalMark(weeklyGoalFinished, R.id.ivRunningRecordItemGoalTimeCheck3, isVisible = true)
589+
590+
// All goals, all not finished
591+
scrollTo(allGoalsNotFinished)
592+
checkGoal(allGoalsNotFinished, R.id.tvRunningRecordItemGoalTime, "$sessionGoal 9$minuteString")
593+
checkGoalMark(allGoalsNotFinished, R.id.ivRunningRecordItemGoalTimeCheck, isVisible = false)
594+
checkGoal(allGoalsNotFinished, R.id.tvRunningRecordItemGoalTime2, "$dailyGoal 14$minuteString")
595+
checkGoalMark(allGoalsNotFinished, R.id.ivRunningRecordItemGoalTimeCheck2, isVisible = false)
596+
checkGoal(allGoalsNotFinished, R.id.tvRunningRecordItemGoalTime3, "$weeklyGoal 24$minuteString")
597+
checkGoalMark(allGoalsNotFinished, R.id.ivRunningRecordItemGoalTimeCheck3, isVisible = false)
598+
599+
// All goals, all finished
600+
scrollTo(allGoalsFinished)
601+
checkGoal(allGoalsFinished, R.id.tvRunningRecordItemGoalTime, sessionGoal)
602+
checkGoalMark(allGoalsFinished, R.id.ivRunningRecordItemGoalTimeCheck, isVisible = true)
603+
checkGoal(allGoalsFinished, R.id.tvRunningRecordItemGoalTime2, dailyGoal)
604+
checkGoalMark(allGoalsFinished, R.id.ivRunningRecordItemGoalTimeCheck2, isVisible = true)
605+
checkGoal(allGoalsFinished, R.id.tvRunningRecordItemGoalTime3, weeklyGoal)
606+
checkGoalMark(allGoalsFinished, R.id.ivRunningRecordItemGoalTimeCheck3, isVisible = true)
607+
608+
// All goals, session finished
609+
scrollTo(allGoalsSessionFinished)
610+
checkGoal(allGoalsSessionFinished, R.id.tvRunningRecordItemGoalTime, sessionGoal)
611+
checkGoalMark(allGoalsSessionFinished, R.id.ivRunningRecordItemGoalTimeCheck, isVisible = true)
612+
checkGoal(allGoalsSessionFinished, R.id.tvRunningRecordItemGoalTime2, "$dailyGoal 9$minuteString")
613+
checkGoalMark(allGoalsSessionFinished, R.id.ivRunningRecordItemGoalTimeCheck2, isVisible = false)
614+
checkGoal(allGoalsSessionFinished, R.id.tvRunningRecordItemGoalTime3, "$weeklyGoal 19$minuteString")
615+
checkGoalMark(allGoalsSessionFinished, R.id.ivRunningRecordItemGoalTimeCheck3, isVisible = false)
616+
617+
// All goals, daily finished
618+
scrollTo(allGoalsDailyFinished)
619+
checkGoal(allGoalsDailyFinished, R.id.tvRunningRecordItemGoalTime, "$sessionGoal 9$minuteString")
620+
checkGoalMark(allGoalsDailyFinished, R.id.ivRunningRecordItemGoalTimeCheck, isVisible = false)
621+
checkGoal(allGoalsDailyFinished, R.id.tvRunningRecordItemGoalTime2, dailyGoal)
622+
checkGoalMark(allGoalsDailyFinished, R.id.ivRunningRecordItemGoalTimeCheck2, isVisible = true)
623+
checkGoal(allGoalsDailyFinished, R.id.tvRunningRecordItemGoalTime3, "$weeklyGoal 19$minuteString")
624+
checkGoalMark(allGoalsDailyFinished, R.id.ivRunningRecordItemGoalTimeCheck3, isVisible = false)
625+
626+
// All goals, weekly finished
627+
scrollTo(allGoalsWeeklyFinished)
628+
checkGoal(allGoalsWeeklyFinished, R.id.tvRunningRecordItemGoalTime, "$sessionGoal 9$minuteString")
629+
checkGoalMark(allGoalsWeeklyFinished, R.id.ivRunningRecordItemGoalTimeCheck, isVisible = false)
630+
checkGoal(allGoalsWeeklyFinished, R.id.tvRunningRecordItemGoalTime2, "$dailyGoal 19$minuteString")
631+
checkGoalMark(allGoalsWeeklyFinished, R.id.ivRunningRecordItemGoalTimeCheck2, isVisible = false)
632+
checkGoal(allGoalsWeeklyFinished, R.id.tvRunningRecordItemGoalTime3, weeklyGoal)
633+
checkGoalMark(allGoalsWeeklyFinished, R.id.ivRunningRecordItemGoalTimeCheck3, isVisible = true)
634+
}
635+
360636
private fun checkAfterTimeAdjustment(timeStarted: String) {
361637
checkPreviewUpdated(hasDescendant(allOf(withId(R.id.tvRunningRecordItemTimeStarted), withText(timeStarted))))
362638
checkViewIsDisplayed(allOf(withId(R.id.tvChangeRecordTimeStarted), withSubstring(timeStarted)))

core/src/main/java/com/example/util/simpletimetracker/core/utils/TestUtils.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ class TestUtils @Inject constructor(
6666
icon: Int? = null,
6767
text: String? = null,
6868
goalTime: Long? = null,
69+
dailyGoalTime: Long? = null,
70+
weeklyGoalTime: Long? = null,
6971
archived: Boolean = false,
7072
categories: List<String> = emptyList(),
7173
) = runBlocking {
@@ -87,8 +89,8 @@ class TestUtils @Inject constructor(
8789
icon = iconId,
8890
hidden = archived,
8991
goalTime = goalTime.orZero(),
90-
dailyGoalTime = 0,
91-
weeklyGoalTime = 0,
92+
dailyGoalTime = dailyGoalTime.orZero(),
93+
weeklyGoalTime = weeklyGoalTime.orZero(),
9294
)
9395

9496
val typeId = recordTypeInteractor.add(data)

0 commit comments

Comments
 (0)