Skip to content

Commit a161496

Browse files
committed
add goal date selection tests
1 parent 60c24cf commit a161496

File tree

3 files changed

+135
-14
lines changed

3 files changed

+135
-14
lines changed

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

Lines changed: 123 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ package com.example.util.simpletimetracker
22

33
import android.view.View
44
import androidx.test.espresso.Espresso.onView
5+
import androidx.test.espresso.contrib.PickerActions.setDate
56
import androidx.test.espresso.matcher.ViewMatchers.hasDescendant
67
import androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed
78
import androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA
9+
import androidx.test.espresso.matcher.ViewMatchers.withClassName
810
import androidx.test.espresso.matcher.ViewMatchers.withId
911
import androidx.test.espresso.matcher.ViewMatchers.withSubstring
1012
import androidx.test.espresso.matcher.ViewMatchers.withText
@@ -22,12 +24,18 @@ import com.example.util.simpletimetracker.GoalsTestUtils.getMonthlyDurationGoal
2224
import com.example.util.simpletimetracker.GoalsTestUtils.getSessionDurationGoal
2325
import com.example.util.simpletimetracker.GoalsTestUtils.getWeeklyCountGoal
2426
import com.example.util.simpletimetracker.GoalsTestUtils.getWeeklyDurationGoal
27+
import com.example.util.simpletimetracker.domain.daysOfWeek.model.DayOfWeek
2528
import com.example.util.simpletimetracker.domain.recordType.extension.value
2629
import com.example.util.simpletimetracker.domain.recordType.model.RecordTypeGoal
27-
import com.example.util.simpletimetracker.feature_change_record.R
30+
import com.example.util.simpletimetracker.domain.statistics.model.RangeLength
31+
import com.example.util.simpletimetracker.feature_dialogs.dateTime.CustomDatePicker
2832
import com.example.util.simpletimetracker.utils.BaseUiTest
2933
import com.example.util.simpletimetracker.utils.NavUtils
3034
import com.example.util.simpletimetracker.utils.checkViewIsDisplayed
35+
import com.example.util.simpletimetracker.utils.clickOnCurrentDate
36+
import com.example.util.simpletimetracker.utils.clickOnCurrentSelectedDate
37+
import com.example.util.simpletimetracker.utils.clickOnNextDate
38+
import com.example.util.simpletimetracker.utils.clickOnPrevDate
3139
import com.example.util.simpletimetracker.utils.clickOnView
3240
import com.example.util.simpletimetracker.utils.clickOnViewWithId
3341
import com.example.util.simpletimetracker.utils.clickOnViewWithText
@@ -39,6 +47,7 @@ import com.example.util.simpletimetracker.utils.tryAction
3947
import dagger.hilt.android.testing.HiltAndroidTest
4048
import kotlinx.coroutines.runBlocking
4149
import org.hamcrest.CoreMatchers.allOf
50+
import org.hamcrest.CoreMatchers.equalTo
4251
import org.hamcrest.Matcher
4352
import org.junit.Test
4453
import org.junit.runner.RunWith
@@ -48,6 +57,8 @@ import com.example.util.simpletimetracker.feature_change_record_type.R as change
4857
import com.example.util.simpletimetracker.feature_goals.R as goalsR
4958
import com.example.util.simpletimetracker.feature_main.R as mainR
5059
import com.example.util.simpletimetracker.feature_statistics_detail.R as featureStatisticsDetailR
60+
import java.util.Calendar
61+
import java.util.concurrent.TimeUnit
5162

5263
@HiltAndroidTest
5364
@RunWith(AndroidJUnit4::class)
@@ -346,6 +357,103 @@ class GoalsTabTest : BaseUiTest() {
346357
checkStatisticsMark(goalMonthlyCountFinished, isVisible = true)
347358
}
348359

360+
@Test
361+
fun dateSelection() {
362+
val typeName = "typeName"
363+
364+
// Add data
365+
testUtils.addActivity(
366+
name = typeName,
367+
goals = listOf(
368+
getDailyDurationGoal(durationInSeconds),
369+
getMonthlyDurationGoal(2 * durationInSeconds),
370+
),
371+
)
372+
373+
val goalHint = getString(coreR.string.change_record_type_goal_time_hint).lowercase()
374+
val dailyGoalValue = "$goalHint - 10$minuteString"
375+
val monthlyGoalValue = "$goalHint - 20$minuteString"
376+
377+
val startOfDayShift = runBlocking { prefsInteractor.getStartOfDayShift() }
378+
val firstDayOfWeek = runBlocking { prefsInteractor.getFirstDayOfWeek() }
379+
380+
fun getRangeTitle(shift: Int, goalRange: RecordTypeGoal.Range): String {
381+
return getRangeTitle(shift, goalRange, startOfDayShift, firstDayOfWeek)
382+
}
383+
384+
val firstDayCalendar = Calendar.getInstance().apply {
385+
set(Calendar.DAY_OF_MONTH, 1)
386+
set(Calendar.HOUR_OF_DAY, 12)
387+
set(Calendar.MINUTE, 0)
388+
set(Calendar.SECOND, 0)
389+
set(Calendar.MILLISECOND, 0)
390+
}
391+
val firstDay = firstDayCalendar.timeInMillis
392+
val prevDay = Calendar.getInstance().apply {
393+
timeInMillis = firstDay
394+
add(Calendar.DATE, -1)
395+
}.timeInMillis
396+
397+
val shiftToFirstDay = timeMapper.toTimestampShift(
398+
toTime = firstDay,
399+
range = RangeLength.Day,
400+
firstDayOfWeek = firstDayOfWeek,
401+
).toInt()
402+
403+
val todayTitle = getRangeTitle(shift = shiftToFirstDay, goalRange = RecordTypeGoal.Range.Daily)
404+
val prevTitle = getRangeTitle(shift = shiftToFirstDay - 1, goalRange = RecordTypeGoal.Range.Daily)
405+
val todayMonthTitle = getRangeTitle(shift = 0, goalRange = RecordTypeGoal.Range.Monthly)
406+
val prevMonthTitle = getRangeTitle(shift = -1, goalRange = RecordTypeGoal.Range.Monthly)
407+
408+
testUtils.addRecord(
409+
typeName = typeName,
410+
timeStarted = firstDay,
411+
timeEnded = firstDay + TimeUnit.MINUTES.toMillis(1),
412+
)
413+
testUtils.addRecord(
414+
typeName = typeName,
415+
timeStarted = prevDay,
416+
timeEnded = prevDay + TimeUnit.MINUTES.toMillis(2),
417+
)
418+
419+
// Open goals
420+
NavUtils.openGoalsScreen()
421+
clickOnCurrentSelectedDate()
422+
onView(withClassName(equalTo(CustomDatePicker::class.java.name))).perform(
423+
setDate(
424+
firstDayCalendar.get(Calendar.YEAR),
425+
firstDayCalendar.get(Calendar.MONTH) + 1,
426+
firstDayCalendar.get(Calendar.DAY_OF_MONTH),
427+
),
428+
)
429+
clickOnViewWithId(R.id.btnDateTimeDialogPositive)
430+
431+
// Check first day
432+
tryAction {
433+
checkViewIsDisplayed(
434+
allOf(withId(baseR.id.tvHintItemText), withText(todayTitle)),
435+
)
436+
}
437+
checkViewIsDisplayed(
438+
allOf(withId(baseR.id.tvHintItemText), withText(todayMonthTitle)),
439+
)
440+
checkStatisticsGoal(typeName, "1$minuteString", dailyGoalValue)
441+
checkStatisticsGoal(typeName, "1$minuteString", monthlyGoalValue)
442+
443+
// Check prev day
444+
clickOnCurrentDate(shiftToFirstDay - 1)
445+
tryAction {
446+
checkViewIsDisplayed(
447+
allOf(withId(baseR.id.tvHintItemText), withText(prevTitle)),
448+
)
449+
}
450+
checkViewIsDisplayed(
451+
allOf(withId(baseR.id.tvHintItemText), withText(prevMonthTitle)),
452+
)
453+
checkStatisticsGoal(typeName, "2$minuteString", dailyGoalValue)
454+
checkStatisticsGoal(typeName, "2$minuteString", monthlyGoalValue)
455+
}
456+
349457
@Test
350458
fun goalNavigation() {
351459
val typeName = "typeName"
@@ -387,4 +495,18 @@ class GoalsTabTest : BaseUiTest() {
387495

388496
tryAction { scrollRecyclerToView(goalsR.id.rvGoalsList, allOf(matchers)) }
389497
}
498+
499+
private fun getRangeTitle(
500+
shift: Int,
501+
goalRange: RecordTypeGoal.Range,
502+
startOfDayShift: Long,
503+
firstDayOfWeek: DayOfWeek,
504+
): String {
505+
return when (goalRange) {
506+
is RecordTypeGoal.Range.Session -> ""
507+
is RecordTypeGoal.Range.Daily -> timeMapper.toDayDateTitle(shift, startOfDayShift)
508+
is RecordTypeGoal.Range.Weekly -> timeMapper.toWeekDateTitle(shift, startOfDayShift, firstDayOfWeek)
509+
is RecordTypeGoal.Range.Monthly -> timeMapper.toMonthDateTitle(shift, startOfDayShift)
510+
}
511+
}
390512
}

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -139,18 +139,18 @@ object GoalsTestUtils {
139139
goal: String,
140140
) {
141141
allOf(
142-
isDescendantOfA(withId(baseR.id.viewStatisticsGoalItem)),
143-
hasSibling(withText(typeName)),
144-
withId(R.id.tvStatisticsGoalItemCurrent),
145-
withSubstring(current),
146-
isCompletelyDisplayed(),
147-
).let(::checkViewIsDisplayed)
148-
149-
allOf(
150-
isDescendantOfA(withId(baseR.id.viewStatisticsGoalItem)),
151-
hasSibling(withText(typeName)),
152-
withId(R.id.tvStatisticsGoalItemGoal),
153-
withText(goal),
142+
withId(baseR.id.viewStatisticsGoalItem),
143+
hasDescendant(withText(typeName)),
144+
hasDescendant(
145+
allOf(
146+
withId(R.id.tvStatisticsGoalItemCurrent), withSubstring(current),
147+
),
148+
),
149+
hasDescendant(
150+
allOf(
151+
withId(R.id.tvStatisticsGoalItemGoal), withText(goal),
152+
),
153+
),
154154
isCompletelyDisplayed(),
155155
).let(::checkViewIsDisplayed)
156156
}

features/feature_goals/src/main/java/com/example/util/simpletimetracker/feature_goals/viewModel/GoalsViewModel.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ class GoalsViewModel @Inject constructor(
7979
statisticsDetailNavigationInteractor.navigateByGoal(
8080
goalId = item.id,
8181
shift = 0, // TODO GOAL pass correct shift and range?
82-
// TODO GOAL add tests
8382
)
8483
}
8584

0 commit comments

Comments
 (0)