From bd106f99e1cb8c3022b424253ba17d0c652cae93 Mon Sep 17 00:00:00 2001 From: razeeman Date: Sun, 15 Sep 2024 12:11:24 +0300 Subject: [PATCH] fix tests, add new tests --- .../util/simpletimetracker/AddCategoryTest.kt | 39 ++- .../AddDefaultRecordTypeTest.kt | 2 + .../simpletimetracker/AddRecordTagTest.kt | 13 + .../util/simpletimetracker/AddRecordTest.kt | 260 +++++++++++++++++- .../simpletimetracker/AddRecordTypeTest.kt | 10 + .../simpletimetracker/ChangeRecordTagTest.kt | 1 + .../simpletimetracker/ChangeRecordTest.kt | 6 +- .../simpletimetracker/ChangeRecordTypeTest.kt | 76 +++++ .../ChangeRunningRecordTest.kt | 90 +++++- .../simpletimetracker/DeleteRecordTagTest.kt | 53 ++++ .../simpletimetracker/DeleteRecordTypeTest.kt | 28 +- .../RecordTypeDefaultDurationTest.kt | 114 ++++++++ .../simpletimetracker/RecordsRangesTest.kt | 10 +- .../simpletimetracker/SettingsSortActivity.kt | 5 +- .../util/simpletimetracker/SettingsTest.kt | 6 +- .../StatisticsDetailFilterTest.kt | 74 +++++ .../simpletimetracker/StatisticsDetailTest.kt | 33 +++ .../simpletimetracker/StatisticsRangesTest.kt | 42 +-- .../util/simpletimetracker/StatisticsTest.kt | 67 +++++ .../util/simpletimetracker/utils/NavUtils.kt | 6 +- .../navigation/ActionResolverImpl.kt | 16 +- .../example/util/simpletimetracker/Base.kt | 2 +- .../mapper/CategoryDataLocalMapper.kt | 2 +- .../SelectionButtonAdapterDelegate.kt | 1 + .../viewModel/ChangeRecordBaseViewModel.kt | 4 +- .../manager/NotificationTypeManager.kt | 2 +- gradle.properties | 1 + 27 files changed, 909 insertions(+), 54 deletions(-) create mode 100644 app/src/androidTest/java/com/example/util/simpletimetracker/DeleteRecordTagTest.kt create mode 100644 app/src/androidTest/java/com/example/util/simpletimetracker/RecordTypeDefaultDurationTest.kt diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/AddCategoryTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/AddCategoryTest.kt index 3d79fb85a..116377aca 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/AddCategoryTest.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/AddCategoryTest.kt @@ -12,7 +12,6 @@ import androidx.test.espresso.matcher.ViewMatchers.withParent import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.ext.junit.runners.AndroidJUnit4 import com.example.util.simpletimetracker.core.mapper.ColorMapper -import com.example.util.simpletimetracker.feature_change_record_type.R import com.example.util.simpletimetracker.utils.BaseUiTest import com.example.util.simpletimetracker.utils.NavUtils import com.example.util.simpletimetracker.utils.checkViewDoesNotExist @@ -23,6 +22,7 @@ import com.example.util.simpletimetracker.utils.clickOnView import com.example.util.simpletimetracker.utils.clickOnViewWithId import com.example.util.simpletimetracker.utils.clickOnViewWithText import com.example.util.simpletimetracker.utils.longClickOnView +import com.example.util.simpletimetracker.utils.nestedScrollTo import com.example.util.simpletimetracker.utils.scrollRecyclerToPosition import com.example.util.simpletimetracker.utils.tryAction import com.example.util.simpletimetracker.utils.typeTextIntoView @@ -46,6 +46,7 @@ class AddCategoryTest : BaseUiTest() { val name = "Test" val typeName1 = "Type1" val typeName2 = "Type2" + val note = "note" val lastColorPosition = ColorMapper.getAvailableColors().size - 1 // Add activities @@ -142,6 +143,10 @@ class AddCategoryTest : BaseUiTest() { checkViewIsDisplayed(withText("10$minuteString")) clickOnViewWithText(coreR.string.change_record_type_goal_time_hint) + // Adding note + onView(withId(changeCategoryR.id.etChangeRecordCategoryNote)).perform(nestedScrollTo()) + typeTextIntoView(changeCategoryR.id.etChangeRecordCategoryNote, note) + // Category added clickOnViewWithText(coreR.string.change_record_type_save) checkViewIsDisplayed(withText(name)) @@ -155,12 +160,17 @@ class AddCategoryTest : BaseUiTest() { checkViewIsDisplayed(withId(baseR.id.viewDividerItem)) onView(withText(typeName1)).check(isCompletelyAbove(withId(baseR.id.viewDividerItem))) onView(withText(typeName2)).check(isCompletelyBelow(withId(baseR.id.viewDividerItem))) + clickOnViewWithText(coreR.string.change_category_types_hint) // Check goals saved - clickOnViewWithText(coreR.string.change_category_types_hint) Thread.sleep(1000) clickOnViewWithText(coreR.string.change_record_type_goal_time_hint) checkViewIsDisplayed(withText("10$minuteString")) + clickOnViewWithText(coreR.string.change_record_type_goal_time_hint) + + // Check note saved + onView(withId(changeCategoryR.id.etChangeRecordCategoryNote)).perform(nestedScrollTo()) + checkViewIsDisplayed(allOf(withId(changeCategoryR.id.etChangeRecordCategoryNote), withText(note))) } @Test @@ -227,6 +237,31 @@ class AddCategoryTest : BaseUiTest() { checkViewIsDisplayed(withText(categoryName2)) } + @Test + fun addCategorySameName() { + val name = "Test" + + // Add activity + testUtils.addCategory(name) + + // Add another + NavUtils.openSettingsScreen() + NavUtils.openCategoriesScreen() + clickOnViewWithText(coreR.string.categories_add_category) + closeSoftKeyboard() + + // No error + checkViewDoesNotExist(withText(coreR.string.change_record_message_name_exist)) + + // Check same name + typeTextIntoView(R.id.etChangeCategoryName, name) + checkViewIsDisplayed(withText(coreR.string.change_record_message_name_exist)) + + // Check other name + typeTextIntoView(R.id.etChangeCategoryName, "$name+") + checkViewDoesNotExist(withText(coreR.string.change_record_message_name_exist)) + } + private fun checkPreviewUpdated(matcher: Matcher) = checkViewIsDisplayed(allOf(withId(changeCategoryR.id.previewChangeCategory), matcher)) } diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/AddDefaultRecordTypeTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/AddDefaultRecordTypeTest.kt index 4830a48d8..3a081431e 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/AddDefaultRecordTypeTest.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/AddDefaultRecordTypeTest.kt @@ -112,7 +112,9 @@ class AddDefaultRecordTypeTest : BaseUiTest() { // Hide button clickOnViewWithText(coreR.string.running_records_add_default) clickOnViewWithText(coreR.string.default_types_selection_hide) + clickOnViewWithText(R.string.ok) Thread.sleep(1000) + checkViewIsDisplayed(withText(R.string.running_records_add_type)) checkViewDoesNotExist(withText(coreR.string.running_records_add_default)) } diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTagTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTagTest.kt index de693ec0a..4044379e6 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTagTest.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTagTest.kt @@ -24,6 +24,7 @@ import com.example.util.simpletimetracker.utils.clickOnViewWithId import com.example.util.simpletimetracker.utils.clickOnViewWithText import com.example.util.simpletimetracker.utils.collapseToolbar import com.example.util.simpletimetracker.utils.longClickOnView +import com.example.util.simpletimetracker.utils.nestedScrollTo import com.example.util.simpletimetracker.utils.recyclerItemCount import com.example.util.simpletimetracker.utils.scrollRecyclerToPosition import com.example.util.simpletimetracker.utils.scrollRecyclerToView @@ -53,6 +54,7 @@ class AddRecordTagTest : BaseUiTest() { val name = "Test" val typeName1 = "Type1" val typeName2 = "Type2" + val note = "note" val lastColorPosition = ColorMapper.getAvailableColors().size - 1 // Add activities @@ -67,6 +69,7 @@ class AddRecordTagTest : BaseUiTest() { // View is set up checkViewIsNotDisplayed(withId(changeRecordTagR.id.btnChangeRecordTagArchive)) + checkViewIsNotDisplayed(withId(changeRecordTagR.id.btnChangeRecordTagDelete)) checkViewIsNotDisplayed(withId(changeRecordTagR.id.btnChangeRecordTagStatistics)) checkViewIsNotDisplayed(withId(changeRecordTagR.id.rvChangeRecordTagColor)) checkViewIsNotDisplayed(withId(changeRecordTagR.id.rvIconSelection)) @@ -188,6 +191,10 @@ class AddRecordTagTest : BaseUiTest() { allOf(withId(changeRecordTagR.id.fieldChangeRecordTagType), withCardColor(viewsR.color.colorBackground)), ) + // Adding note + onView(withId(changeRecordTagR.id.etChangeRecordTagNote)).perform(nestedScrollTo()) + typeTextIntoView(changeRecordTagR.id.etChangeRecordTagNote, note) + clickOnViewWithText(coreR.string.change_record_type_save) // Tag added @@ -200,6 +207,8 @@ class AddRecordTagTest : BaseUiTest() { checkPreviewUpdated(withCardColor(lastColor)) checkPreviewUpdated(hasDescendant(withTag(lastIcon))) checkViewIsDisplayed(allOf(withId(changeRecordTagR.id.etChangeRecordTagName), withText(name))) + onView(withId(changeRecordTagR.id.etChangeRecordTagNote)).perform(nestedScrollTo()) + checkViewIsDisplayed(allOf(withId(changeRecordTagR.id.etChangeRecordTagNote), withText(note))) } @Test @@ -430,7 +439,9 @@ class AddRecordTagTest : BaseUiTest() { // Add another tag clickOnViewWithText(coreR.string.categories_add_record_tag) + checkViewDoesNotExist(withText(coreR.string.change_record_message_name_exist)) typeTextIntoView(changeRecordTagR.id.etChangeRecordTagName, tagNameActivity) + checkViewIsDisplayed(withText(coreR.string.change_record_message_name_exist)) clickOnViewWithId(changeRecordTagR.id.fieldChangeRecordTagType) clickOnRecyclerItem(changeRecordTagR.id.rvChangeRecordTagType, withText(typeName)) clickOnViewWithText(coreR.string.change_record_type_save) @@ -439,7 +450,9 @@ class AddRecordTagTest : BaseUiTest() { // Add another general tag clickOnViewWithText(coreR.string.categories_add_record_tag) + checkViewDoesNotExist(withText(coreR.string.change_record_message_name_exist)) typeTextIntoView(changeRecordTagR.id.etChangeRecordTagName, tagNameGeneral) + checkViewIsDisplayed(withText(coreR.string.change_record_message_name_exist)) closeSoftKeyboard() clickOnViewWithText(coreR.string.change_record_type_save) diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTest.kt index 8bf1a491e..9eec2a266 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTest.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTest.kt @@ -521,9 +521,265 @@ class AddRecordTest : BaseUiTest() { ) } + @Test + fun adjustDurationVisibility() { + fun checkField( + isStart: Boolean, + isDuration: Boolean, + ) { + val textField = if (isStart) { + changeRecordR.id.tvChangeRecordTimeStartedAdjust + } else { + changeRecordR.id.tvChangeRecordTimeEndedAdjust + } + val text = if (isDuration) { + coreR.string.change_record_date_time_duration + } else { + if (isStart) { + coreR.string.change_record_date_time_start + } else { + coreR.string.change_record_date_time_end + } + } + val dateField = if (isStart) { + changeRecordR.id.tvChangeRecordTimeStartedDate + } else { + changeRecordR.id.tvChangeRecordTimeEndedDate + } + val timeField = if (isStart) { + changeRecordR.id.tvChangeRecordTimeStartedTime + } else { + changeRecordR.id.tvChangeRecordTimeEndedTime + } + + checkViewIsDisplayed(allOf(withId(textField), withText(text))) + if (isDuration) { + checkViewIsNotDisplayed(withId(dateField)) + checkViewIsDisplayed(withId(timeField)) + } else { + checkViewIsDisplayed(withId(dateField)) + checkViewIsDisplayed(withId(timeField)) + } + } + + // Switch start and end + NavUtils.openRecordsScreen() + clickOnViewWithId(recordsR.id.btnRecordAdd) + checkField(isStart = true, isDuration = false) + checkField(isStart = false, isDuration = false) + + // Check start + clickOnViewWithText(coreR.string.change_record_date_time_start) + checkField(isStart = true, isDuration = true) + checkField(isStart = false, isDuration = false) + clickOnViewWithText(coreR.string.change_record_date_time_duration) + checkField(isStart = true, isDuration = false) + checkField(isStart = false, isDuration = false) + + // Check end + clickOnViewWithText(coreR.string.change_record_date_time_end) + checkField(isStart = true, isDuration = false) + checkField(isStart = false, isDuration = true) + clickOnViewWithText(coreR.string.change_record_date_time_duration) + checkField(isStart = true, isDuration = false) + checkField(isStart = false, isDuration = false) + + // Check from start to end + clickOnViewWithText(coreR.string.change_record_date_time_start) + checkField(isStart = true, isDuration = true) + checkField(isStart = false, isDuration = false) + clickOnViewWithText(coreR.string.change_record_date_time_end) + checkField(isStart = true, isDuration = false) + checkField(isStart = false, isDuration = true) + } + + @Test + fun adjustDuration() { + // Add record + NavUtils.openRecordsScreen() + clickOnViewWithId(recordsR.id.btnRecordAdd) + + // Setup + val hourStarted = 15 + val minutesStarted = 0 + clickOnViewWithId(changeRecordR.id.fieldChangeRecordTimeStarted) + onView(withClassName(equalTo(CustomTimePicker::class.java.name))).perform(setTime(hourStarted, minutesStarted)) + clickOnViewWithId(dialogsR.id.btnDateTimeDialogPositive) + + val hourEnded = 16 + val minutesEnded = 0 + clickOnViewWithId(changeRecordR.id.fieldChangeRecordTimeEnded) + onView(withClassName(equalTo(CustomTimePicker::class.java.name))).perform(setTime(hourEnded, minutesEnded)) + clickOnViewWithId(dialogsR.id.btnDateTimeDialogPositive) + + checkAfterTimeAdjustment( + timeStarted = "15:00", timeEnded = "16:00", duration = "1$hourString 0$minuteString", + ) + + // Check visibility + checkViewIsDisplayed(withId(changeRecordR.id.containerChangeRecordTimeStartedAdjust)) + checkViewIsDisplayed(withId(changeRecordR.id.containerChangeRecordTimeEndedAdjust)) + + fun adjust( + isStart: Boolean, + buttonText: String, + ) { + val containerId = if (isStart) { + changeRecordR.id.containerChangeRecordTimeStartedAdjust + } else { + changeRecordR.id.containerChangeRecordTimeEndedAdjust + } + clickOnView(allOf(isDescendantOfA(withId(containerId)), withText(buttonText))) + } + + // Check time start adjustments + clickOnViewWithText(changeRecordR.string.change_record_date_time_start) + adjust(isStart = true, buttonText = "-30") + checkAfterTimeAdjustment( + timeStarted = "15:30", + timeEnded = "16:00", + timeStartedField = "30$minuteString", + duration = "30$minuteString", + ) + adjust(isStart = true, buttonText = "-5") + checkAfterTimeAdjustment( + timeStarted = "15:35", + timeEnded = "16:00", + timeStartedField = "25$minuteString", + duration = "25$minuteString", + ) + adjust(isStart = true, buttonText = "-1") + checkAfterTimeAdjustment( + timeStarted = "15:36", + timeEnded = "16:00", + timeStartedField = "24$minuteString", + duration = "24$minuteString", + ) + adjust(isStart = true, buttonText = "+1") + checkAfterTimeAdjustment( + timeStarted = "15:35", + timeEnded = "16:00", + timeStartedField = "25$minuteString", + duration = "25$minuteString", + ) + adjust(isStart = true, buttonText = "+5") + checkAfterTimeAdjustment( + timeStarted = "15:30", + timeEnded = "16:00", + timeStartedField = "30$minuteString", + duration = "30$minuteString", + ) + adjust(isStart = true, buttonText = "+30") + checkAfterTimeAdjustment( + timeStarted = "15:00", + timeEnded = "16:00", + timeStartedField = "1$hourString 0$minuteString", + duration = "1$hourString 0$minuteString", + ) + adjust(isStart = true, buttonText = "-30") + adjust(isStart = true, buttonText = "-30") + checkAfterTimeAdjustment( + timeStarted = "16:00", + timeEnded = "16:00", + timeStartedField = "0$minuteString", + duration = "0$minuteString", + ) + adjust(isStart = true, buttonText = "-30") + checkAfterTimeAdjustment( + timeStarted = "16:00", + timeEnded = "16:00", + timeStartedField = "0$minuteString", + duration = "0$minuteString", + ) + adjust(isStart = true, buttonText = "+30") + checkAfterTimeAdjustment( + timeStarted = "15:30", + timeEnded = "16:00", + timeStartedField = "30$minuteString", + duration = "30$minuteString", + ) + adjust(isStart = true, buttonText = "0") + checkAfterTimeAdjustment( + timeStarted = "16:00", + timeEnded = "16:00", + timeStartedField = "0$minuteString", + duration = "0$minuteString", + ) + + // Check time end adjustments + clickOnViewWithText(changeRecordR.string.change_record_date_time_end) + adjust(isStart = false, buttonText = "+30") + adjust(isStart = false, buttonText = "+30") + checkAfterTimeAdjustment( + timeStarted = "16:00", + timeEnded = "17:00", + timeEndedField = "1$hourString 0$minuteString", + duration = "1$hourString 0$minuteString", + ) + adjust(isStart = false, buttonText = "+5") + checkAfterTimeAdjustment( + timeStarted = "16:00", + timeEnded = "17:05", + timeEndedField = "1$hourString 5$minuteString", + duration = "1$hourString 5$minuteString", + ) + adjust(isStart = false, buttonText = "+1") + checkAfterTimeAdjustment( + timeStarted = "16:00", + timeEnded = "17:06", + timeEndedField = "1$hourString 6$minuteString", + duration = "1$hourString 6$minuteString", + ) + adjust(isStart = false, buttonText = "-1") + checkAfterTimeAdjustment( + timeStarted = "16:00", + timeEnded = "17:05", + timeEndedField = "1$hourString 5$minuteString", + duration = "1$hourString 5$minuteString", + ) + adjust(isStart = false, buttonText = "-5") + checkAfterTimeAdjustment( + timeStarted = "16:00", + timeEnded = "17:00", + timeEndedField = "1$hourString 0$minuteString", + duration = "1$hourString 0$minuteString", + ) + adjust(isStart = false, buttonText = "-30") + checkAfterTimeAdjustment( + timeStarted = "16:00", + timeEnded = "16:30", + timeEndedField = "30$minuteString", + duration = "30$minuteString", + ) + adjust(isStart = false, buttonText = "-30") + adjust(isStart = false, buttonText = "-30") + checkAfterTimeAdjustment( + timeStarted = "16:00", + timeEnded = "16:00", + timeEndedField = "0$minuteString", + duration = "0$minuteString", + ) + adjust(isStart = false, buttonText = "+30") + checkAfterTimeAdjustment( + timeStarted = "16:00", + timeEnded = "16:30", + timeEndedField = "30$minuteString", + duration = "30$minuteString", + ) + adjust(isStart = false, buttonText = "0") + checkAfterTimeAdjustment( + timeStarted = "16:00", + timeEnded = "16:00", + timeEndedField = "0$minuteString", + duration = "0$minuteString", + ) + } + private fun checkAfterTimeAdjustment( timeStarted: String, timeEnded: String, + timeStartedField: String = timeStarted, + timeEndedField: String = timeEnded, duration: String, ) { checkPreviewUpdated( @@ -536,10 +792,10 @@ class AddRecordTest : BaseUiTest() { hasDescendant(allOf(withId(changeRecordR.id.tvRecordItemDuration), withText(duration))), ) checkViewIsDisplayed( - allOf(withId(changeRecordR.id.tvChangeRecordTimeStartedTime), withSubstring(timeStarted)), + allOf(withId(changeRecordR.id.tvChangeRecordTimeStartedTime), withSubstring(timeStartedField)), ) checkViewIsDisplayed( - allOf(withId(changeRecordR.id.tvChangeRecordTimeEndedTime), withSubstring(timeEnded)), + allOf(withId(changeRecordR.id.tvChangeRecordTimeEndedTime), withSubstring(timeEndedField)), ) } diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTypeTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTypeTest.kt index 08fe9bebd..d97a2551a 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTypeTest.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTypeTest.kt @@ -24,6 +24,7 @@ import com.example.util.simpletimetracker.utils.clickOnViewWithId import com.example.util.simpletimetracker.utils.clickOnViewWithText import com.example.util.simpletimetracker.utils.collapseToolbar import com.example.util.simpletimetracker.utils.longClickOnView +import com.example.util.simpletimetracker.utils.nestedScrollTo import com.example.util.simpletimetracker.utils.scrollRecyclerToPosition import com.example.util.simpletimetracker.utils.scrollRecyclerToView import com.example.util.simpletimetracker.utils.tryAction @@ -48,6 +49,7 @@ class AddRecordTypeTest : BaseUiTest() { val name = "Test" val categoryName1 = "category1" val categoryName2 = "category2" + val note = "note" val lastColorPosition = ColorMapper.getAvailableColors().size - 1 NavUtils.openSettingsScreen() @@ -61,6 +63,7 @@ class AddRecordTypeTest : BaseUiTest() { // View is set up checkViewIsNotDisplayed(withId(changeRecordTypeR.id.btnChangeRecordTypeArchive)) + checkViewIsNotDisplayed(withId(changeRecordTypeR.id.btnChangeRecordTypeDelete)) checkViewIsNotDisplayed(withId(changeRecordTypeR.id.btnChangeRecordTypeStatistics)) checkViewIsNotDisplayed(withId(changeRecordTypeR.id.rvChangeRecordTypeColor)) checkViewIsNotDisplayed(withId(changeRecordTypeR.id.rvIconSelection)) @@ -157,6 +160,10 @@ class AddRecordTypeTest : BaseUiTest() { checkViewIsDisplayed(withText("10$minuteString")) clickOnViewWithText(coreR.string.change_record_type_goal_time_hint) + // Adding note + onView(withId(changeRecordTypeR.id.etChangeRecordTypeNote)).perform(nestedScrollTo()) + typeTextIntoView(changeRecordTypeR.id.etChangeRecordTypeNote, note) + // Save clickOnViewWithText(coreR.string.change_record_type_save) @@ -171,6 +178,9 @@ class AddRecordTypeTest : BaseUiTest() { checkViewIsDisplayed(withText(coreR.string.something_selected)) onView(withText(categoryName1)).check(isCompletelyBelow(withText(coreR.string.something_selected))) onView(withText(categoryName2)).check(isCompletelyBelow(withText(categoryName1))) + clickOnViewWithText(coreR.string.category_hint) + onView(withId(changeRecordTypeR.id.etChangeRecordTypeNote)).perform(nestedScrollTo()) + checkViewIsDisplayed(allOf(withId(changeRecordTypeR.id.etChangeRecordTypeNote), withText(note))) } @Test diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRecordTagTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRecordTagTest.kt index a4d5e3ea7..eee78d315 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRecordTagTest.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRecordTagTest.kt @@ -49,6 +49,7 @@ class ChangeRecordTagTest : BaseUiTest() { // View is set up checkViewIsDisplayed(withId(changeRecordTagR.id.btnChangeRecordTagArchive)) + checkViewIsDisplayed(withId(changeRecordTagR.id.btnChangeRecordTagDelete)) checkViewIsDisplayed(withId(changeRecordTagR.id.btnChangeRecordTagStatistics)) checkViewIsNotDisplayed(withId(changeRecordTagR.id.rvIconSelection)) diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRecordTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRecordTest.kt index 554da3c0a..a331bb686 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRecordTest.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRecordTest.kt @@ -1,7 +1,6 @@ package com.example.util.simpletimetracker import android.view.View -import android.widget.DatePicker import androidx.test.espresso.Espresso.onView import androidx.test.espresso.Espresso.pressBack import androidx.test.espresso.contrib.PickerActions @@ -11,6 +10,7 @@ import androidx.test.espresso.matcher.ViewMatchers.withClassName import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.example.util.simpletimetracker.feature_dialogs.dateTime.CustomDatePicker import com.example.util.simpletimetracker.feature_dialogs.dateTime.CustomTimePicker import com.example.util.simpletimetracker.utils.BaseUiTest import com.example.util.simpletimetracker.utils.NavUtils @@ -134,7 +134,7 @@ class ChangeRecordTest : BaseUiTest() { onView(withClassName(equalTo(CustomTimePicker::class.java.name))) .perform(PickerActions.setTime(hourStarted, minutesStarted)) clickOnViewWithText(coreR.string.date_time_dialog_date) - onView(withClassName(equalTo(DatePicker::class.java.name))) + onView(withClassName(equalTo(CustomDatePicker::class.java.name))) .perform(PickerActions.setDate(year, month + 1, day)) clickOnViewWithId(dialogsR.id.btnDateTimeDialogPositive) @@ -142,7 +142,7 @@ class ChangeRecordTest : BaseUiTest() { onView(withClassName(equalTo(CustomTimePicker::class.java.name))) .perform(PickerActions.setTime(hourEnded, minutesEnded)) clickOnViewWithText(coreR.string.date_time_dialog_date) - onView(withClassName(equalTo(DatePicker::class.java.name))) + onView(withClassName(equalTo(CustomDatePicker::class.java.name))) .perform(PickerActions.setDate(year, month + 1, day)) clickOnViewWithId(dialogsR.id.btnDateTimeDialogPositive) diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRecordTypeTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRecordTypeTest.kt index 091bf2e3f..c112971b7 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRecordTypeTest.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRecordTypeTest.kt @@ -1,6 +1,7 @@ package com.example.util.simpletimetracker import android.view.View +import androidx.test.espresso.Espresso.closeSoftKeyboard import androidx.test.espresso.Espresso.onView import androidx.test.espresso.Espresso.pressBack import androidx.test.espresso.matcher.ViewMatchers.hasDescendant @@ -21,6 +22,7 @@ import com.example.util.simpletimetracker.utils.clickOnViewWithId import com.example.util.simpletimetracker.utils.clickOnViewWithText import com.example.util.simpletimetracker.utils.collapseToolbar import com.example.util.simpletimetracker.utils.longClickOnView +import com.example.util.simpletimetracker.utils.nestedScrollTo import com.example.util.simpletimetracker.utils.scrollRecyclerToView import com.example.util.simpletimetracker.utils.tryAction import com.example.util.simpletimetracker.utils.typeTextIntoView @@ -31,6 +33,7 @@ import org.hamcrest.CoreMatchers.allOf import org.hamcrest.Matcher import org.junit.Test import org.junit.runner.RunWith +import java.util.concurrent.TimeUnit import com.example.util.simpletimetracker.core.R as coreR import com.example.util.simpletimetracker.feature_change_record_type.R as changeRecordTypeR import com.example.util.simpletimetracker.feature_dialogs.R as dialogsR @@ -52,6 +55,7 @@ class ChangeRecordTypeTest : BaseUiTest() { // View is set up checkViewIsDisplayed(withId(changeRecordTypeR.id.btnChangeRecordTypeArchive)) + checkViewIsDisplayed(withId(changeRecordTypeR.id.btnChangeRecordTypeDelete)) checkViewIsDisplayed(withId(changeRecordTypeR.id.btnChangeRecordTypeStatistics)) checkViewIsNotDisplayed(withId(changeRecordTypeR.id.rvChangeRecordTypeColor)) checkViewIsNotDisplayed(withId(changeRecordTypeR.id.rvIconSelection)) @@ -191,6 +195,78 @@ class ChangeRecordTypeTest : BaseUiTest() { checkViewIsDisplayed(withSubstring(getString(coreR.string.change_record_type_session_goal_time).lowercase())) } + @Test + fun duplicate() { + val type = "type" + val category = "category" + val note = "note" + + // Add data + testUtils.addCategory(category) + testUtils.addActivity( + name = type, + color = firstColor, + icon = firstIcon, + goals = listOf(GoalsTestUtils.getDailyDurationGoal(TimeUnit.MINUTES.toSeconds(1))), + note = note, + categories = listOf(category), + ) + + // Not visible on add + clickOnViewWithText(coreR.string.running_records_add_type) + closeSoftKeyboard() + onView(withText(coreR.string.change_record_type_additional_hint)).perform(nestedScrollTo()) + clickOnViewWithText(coreR.string.change_record_type_additional_hint) + checkViewIsNotDisplayed(withText(coreR.string.change_record_duplicate)) + pressBack() + pressBack() + + // Duplicate + longClickOnView(withText(type)) + onView(withText(coreR.string.change_record_type_additional_hint)).perform(nestedScrollTo()) + clickOnViewWithText(coreR.string.change_record_type_additional_hint) + clickOnViewWithText(coreR.string.change_record_duplicate) + + // Check + tryAction { + checkViewIsDisplayed( + allOf( + withId(R.id.viewRecordTypeItem), + hasDescendant(withText(type)), + hasDescendant(withTag(firstIcon)), + hasDescendant(withCardColor(firstColor)), + ), + ) + } + checkViewIsDisplayed( + allOf( + withId(R.id.viewRecordTypeItem), + hasDescendant(withText("$type (2)")), + hasDescendant(withTag(firstIcon)), + hasDescendant(withCardColor(firstColor)), + ), + ) + longClickOnView(withText("$type (2)")) + checkViewIsDisplayed( + allOf( + withId(changeRecordTypeR.id.tvChangeRecordTypeCategoryPreview), + withText("1"), + ), + ) + checkViewIsDisplayed( + allOf( + withId(changeRecordTypeR.id.tvChangeRecordTypeGoalPreview), + withText("1"), + ), + ) + checkViewIsDisplayed( + allOf( + withId(changeRecordTypeR.id.etChangeRecordTypeNote), + withText(note), + ), + ) + } + private fun checkPreviewUpdated(matcher: Matcher) = checkViewIsDisplayed(allOf(withId(changeRecordTypeR.id.previewChangeRecordType), matcher)) } diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRunningRecordTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRunningRecordTest.kt index d5d7cf8a2..38e545d49 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRunningRecordTest.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRunningRecordTest.kt @@ -1,7 +1,6 @@ package com.example.util.simpletimetracker import android.view.View -import android.widget.DatePicker import androidx.test.espresso.Espresso.closeSoftKeyboard import androidx.test.espresso.Espresso.onView import androidx.test.espresso.Espresso.pressBack @@ -17,6 +16,7 @@ import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.ext.junit.runners.AndroidJUnit4 import com.example.util.simpletimetracker.core.extension.setToStartOfDay import com.example.util.simpletimetracker.domain.model.RecordTypeGoal +import com.example.util.simpletimetracker.feature_dialogs.dateTime.CustomDatePicker import com.example.util.simpletimetracker.feature_dialogs.dateTime.CustomTimePicker import com.example.util.simpletimetracker.utils.BaseUiTest import com.example.util.simpletimetracker.utils.NavUtils @@ -24,6 +24,7 @@ import com.example.util.simpletimetracker.utils.checkViewDoesNotExist import com.example.util.simpletimetracker.utils.checkViewIsDisplayed import com.example.util.simpletimetracker.utils.checkViewIsNotDisplayed import com.example.util.simpletimetracker.utils.clickOnRecyclerItem +import com.example.util.simpletimetracker.utils.clickOnView import com.example.util.simpletimetracker.utils.clickOnViewWithId import com.example.util.simpletimetracker.utils.clickOnViewWithText import com.example.util.simpletimetracker.utils.longClickOnView @@ -135,7 +136,7 @@ class ChangeRunningRecordTest : BaseUiTest() { onView(withClassName(equalTo(CustomTimePicker::class.java.name))) .perform(setTime(hourStarted, minutesStarted)) clickOnViewWithText(coreR.string.date_time_dialog_date) - onView(withClassName(equalTo(DatePicker::class.java.name))) + onView(withClassName(equalTo(CustomDatePicker::class.java.name))) .perform(PickerActions.setDate(year, month + 1, day)) clickOnViewWithId(dialogsR.id.btnDateTimeDialogPositive) @@ -300,6 +301,91 @@ class ChangeRunningRecordTest : BaseUiTest() { ) } + @Test + fun adjustDurationVisibility() { + val type = "type" + + fun checkField( + isDuration: Boolean, + ) { + val textField = changeRecordR.id.tvChangeRecordTimeStartedAdjust + val text = if (isDuration) { + coreR.string.change_record_date_time_duration + } else { + coreR.string.change_record_date_time_start + } + val dateField = changeRecordR.id.tvChangeRecordTimeStartedDate + val timeField = changeRecordR.id.tvChangeRecordTimeStartedTime + + checkViewIsDisplayed(allOf(withId(textField), withText(text))) + if (isDuration) { + checkViewIsNotDisplayed(withId(dateField)) + checkViewIsDisplayed(withId(timeField)) + } else { + checkViewIsDisplayed(withId(dateField)) + checkViewIsDisplayed(withId(timeField)) + } + } + + // Add data + testUtils.addActivity(type) + + // Not visible end + tryAction { clickOnViewWithText(type) } + longClickOnView(allOf(isDescendantOfA(withId(changeRecordR.id.viewRunningRecordItem)), withText(type))) + checkViewIsNotDisplayed(withText(coreR.string.change_record_date_time_end)) + + // Check + checkField(isDuration = false) + clickOnViewWithText(coreR.string.change_record_date_time_start) + checkField(isDuration = true) + clickOnViewWithText(coreR.string.change_record_date_time_start) + checkField(isDuration = false) + } + + @Test + fun adjustDuration() { + // Add activity + val name = "Test" + testUtils.addActivity(name) + + fun checkAfterTimeAdjustment(timeStarted: String) { + checkViewIsDisplayed( + allOf(withId(changeRecordR.id.tvChangeRecordTimeStartedTime), withSubstring(timeStarted)), + ) + } + + // Setup + tryAction { clickOnViewWithText(name) } + longClickOnView(allOf(isDescendantOfA(withId(changeRecordR.id.viewRunningRecordItem)), withText(name))) + + // Check time adjustments + clickOnViewWithText(coreR.string.time_now) + clickOnViewWithText(coreR.string.change_record_date_time_start) + clickOnViewWithText("+30") + checkAfterTimeAdjustment(timeStarted = "30$minuteString") + clickOnViewWithText("+5") + checkAfterTimeAdjustment(timeStarted = "35$minuteString") + clickOnViewWithText("+1") + checkAfterTimeAdjustment(timeStarted = "36$minuteString") + clickOnViewWithText("-1") + checkAfterTimeAdjustment(timeStarted = "35$minuteString") + clickOnViewWithText("-5") + checkAfterTimeAdjustment(timeStarted = "30$minuteString") + clickOnViewWithText("-30") + clickOnViewWithText("-30") + checkAfterTimeAdjustment(timeStarted = "0$secondString") + clickOnViewWithText("+30") + checkAfterTimeAdjustment(timeStarted = "30$minuteString") + clickOnView( + allOf( + isDescendantOfA(withId(changeRecordR.id.containerChangeRecordTimeStartedAdjust)), + withText("0"), + ), + ) + checkAfterTimeAdjustment(timeStarted = "0$secondString") + } + @Test fun lastComments() { val nameNoComments = "Name1" diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/DeleteRecordTagTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/DeleteRecordTagTest.kt new file mode 100644 index 000000000..5d11afb02 --- /dev/null +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/DeleteRecordTagTest.kt @@ -0,0 +1,53 @@ +package com.example.util.simpletimetracker + +import androidx.test.espresso.Espresso.pressBack +import androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed +import androidx.test.espresso.matcher.ViewMatchers.withText +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.example.util.simpletimetracker.utils.BaseUiTest +import com.example.util.simpletimetracker.utils.NavUtils +import com.example.util.simpletimetracker.utils.checkViewDoesNotExist +import com.example.util.simpletimetracker.utils.checkViewIsDisplayed +import com.example.util.simpletimetracker.utils.clickOnViewWithId +import com.example.util.simpletimetracker.utils.clickOnViewWithText +import com.example.util.simpletimetracker.utils.longClickOnView +import dagger.hilt.android.testing.HiltAndroidTest +import org.hamcrest.Matchers.allOf +import org.junit.Test +import org.junit.runner.RunWith +import com.example.util.simpletimetracker.core.R as coreR +import com.example.util.simpletimetracker.feature_change_record_tag.R as changeRecordTagR + +@HiltAndroidTest +@RunWith(AndroidJUnit4::class) +class DeleteRecordTagTest : BaseUiTest() { + + @Test + fun quickDelete() { + val type = "Type" + val tag = "Tag" + + // Add data + testUtils.addActivity(type) + testUtils.addRecordTag(tag) + testUtils.addRecord(type, tagNames = listOf(tag)) + + // Check + NavUtils.openRecordsScreen() + checkViewIsDisplayed(withText("$type - $tag")) + + // Delete + NavUtils.openSettingsScreen() + NavUtils.openCategoriesScreen() + longClickOnView(withText(tag)) + clickOnViewWithId(changeRecordTagR.id.btnChangeRecordTagDelete) + clickOnViewWithText(coreR.string.ok) + checkViewDoesNotExist(withText(tag)) + pressBack() + + // Check + NavUtils.openRecordsScreen() + checkViewIsDisplayed(allOf(withText(type), isCompletelyDisplayed())) + checkViewDoesNotExist(withText("$type - $tag")) + } +} diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/DeleteRecordTypeTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/DeleteRecordTypeTest.kt index d3e925d6d..a3f5a29e4 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/DeleteRecordTypeTest.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/DeleteRecordTypeTest.kt @@ -36,9 +36,9 @@ class DeleteRecordTypeTest : BaseUiTest() { val icon = firstIcon // Add item - Thread.sleep(1000) testUtils.addActivity(name = name, color = color, icon = icon) testUtils.addRecord(name) + Thread.sleep(1000) tryAction { checkViewIsDisplayed( @@ -92,4 +92,30 @@ class DeleteRecordTypeTest : BaseUiTest() { NavUtils.openRecordsScreen() checkViewDoesNotExist(withText(name)) } + + @Test + fun quickDelete() { + val name = "Test" + + // Add data + testUtils.addActivity(name) + testUtils.addRecord(name) + Thread.sleep(1000) + + // Check + checkViewIsDisplayed(allOf(withId(baseR.id.viewRecordTypeItem), hasDescendant(withText(name)))) + NavUtils.openRecordsScreen() + checkViewIsDisplayed(allOf(withId(baseR.id.viewRecordItem), hasDescendant(withText(name)))) + NavUtils.openRunningRecordsScreen() + + // Delete + longClickOnView(allOf(withId(baseR.id.viewRecordTypeItem), hasDescendant(withText(name)))) + clickOnViewWithId(changeRecordTypeR.id.btnChangeRecordTypeDelete) + clickOnViewWithText(coreR.string.ok) + + // Check + checkViewDoesNotExist(allOf(withId(baseR.id.viewRecordTypeItem), hasDescendant(withText(name)))) + NavUtils.openRecordsScreen() + checkViewDoesNotExist(withText(name)) + } } diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/RecordTypeDefaultDurationTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/RecordTypeDefaultDurationTest.kt new file mode 100644 index 000000000..ba813ae9e --- /dev/null +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/RecordTypeDefaultDurationTest.kt @@ -0,0 +1,114 @@ +package com.example.util.simpletimetracker + +import androidx.test.espresso.Espresso.closeSoftKeyboard +import androidx.test.espresso.matcher.ViewMatchers.hasDescendant +import androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed +import androidx.test.espresso.matcher.ViewMatchers.withId +import androidx.test.espresso.matcher.ViewMatchers.withText +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.example.util.simpletimetracker.utils.BaseUiTest +import com.example.util.simpletimetracker.utils.NavUtils +import com.example.util.simpletimetracker.utils.checkViewIsDisplayed +import com.example.util.simpletimetracker.utils.clickOnViewWithId +import com.example.util.simpletimetracker.utils.clickOnViewWithText +import com.example.util.simpletimetracker.utils.longClickOnView +import com.example.util.simpletimetracker.utils.typeTextIntoView +import dagger.hilt.android.testing.HiltAndroidTest +import org.hamcrest.CoreMatchers.allOf +import org.junit.Test +import org.junit.runner.RunWith +import java.util.concurrent.TimeUnit +import com.example.util.simpletimetracker.core.R as coreR +import com.example.util.simpletimetracker.feature_change_record_type.R as changeRecordTypeR +import com.example.util.simpletimetracker.feature_dialogs.R as dialogsR + +@HiltAndroidTest +@RunWith(AndroidJUnit4::class) +class RecordTypeDefaultDurationTest : BaseUiTest() { + + @Test + fun change() { + val type1 = "type1" + + // Add + clickOnViewWithText(R.string.running_records_add_type) + typeTextIntoView(changeRecordTypeR.id.etChangeRecordTypeName, type1) + closeSoftKeyboard() + clickOnViewWithText(coreR.string.change_record_type_additional_hint) + checkViewIsDisplayed( + allOf( + withId(changeRecordTypeR.id.tvChangeRecordTypeAdditionalDefaultDurationSelectorValue), + withText(R.string.change_record_type_goal_time_disabled), + ), + ) + clickOnViewWithText(coreR.string.duration_dialog_save) + + // Change + longClickOnView(withText(type1)) + clickOnViewWithText(coreR.string.change_record_type_additional_hint) + clickOnViewWithId(changeRecordTypeR.id.tvChangeRecordTypeAdditionalDefaultDurationSelectorValue) + clickOnViewWithId(dialogsR.id.tvNumberKeyboard1) + clickOnViewWithId(dialogsR.id.tvNumberKeyboard0) + clickOnViewWithId(dialogsR.id.tvNumberKeyboard0) + clickOnViewWithText(coreR.string.duration_dialog_save) + checkViewIsDisplayed(withText("1$minuteString")) + clickOnViewWithText(coreR.string.duration_dialog_save) + + // Disable + longClickOnView(withText(type1)) + clickOnViewWithText(coreR.string.change_record_type_additional_hint) + clickOnViewWithText("1$minuteString") + clickOnViewWithId(dialogsR.id.btnNumberKeyboardDelete) + clickOnViewWithId(dialogsR.id.btnNumberKeyboardDelete) + clickOnViewWithId(dialogsR.id.btnNumberKeyboardDelete) + clickOnViewWithText(coreR.string.duration_dialog_save) + checkViewIsDisplayed( + allOf( + withId(changeRecordTypeR.id.tvChangeRecordTypeAdditionalDefaultDurationSelectorValue), + withText(R.string.change_record_type_goal_time_disabled), + ), + ) + clickOnViewWithText(coreR.string.duration_dialog_save) + + // Check + longClickOnView(withText(type1)) + clickOnViewWithText(coreR.string.change_record_type_additional_hint) + checkViewIsDisplayed( + allOf( + withId(changeRecordTypeR.id.tvChangeRecordTypeAdditionalDefaultDurationSelectorValue), + withText(R.string.change_record_type_goal_time_disabled), + ), + ) + } + + @Test + fun start() { + val type1 = "type1" + val type2 = "type2" + + // Add data + testUtils.addActivity(type1, defaultDuration = TimeUnit.MINUTES.toSeconds(1)) + testUtils.addActivity(type2) + Thread.sleep(1000) + + // Start + clickOnViewWithText(type1) + clickOnViewWithText(type2) + NavUtils.openRecordsScreen() + checkViewIsDisplayed( + allOf( + withId(R.id.viewRecordItem), + hasDescendant(withText(type1)), + hasDescendant(withText("1$minuteString")), + isCompletelyDisplayed(), + ), + ) + checkViewIsDisplayed( + allOf( + withId(R.id.viewRunningRecordItem), + hasDescendant(withText(type2)), + isCompletelyDisplayed(), + ), + ) + } +} diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/RecordsRangesTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/RecordsRangesTest.kt index 534314d6b..a337f7ca9 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/RecordsRangesTest.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/RecordsRangesTest.kt @@ -1,6 +1,5 @@ package com.example.util.simpletimetracker -import android.widget.DatePicker import androidx.test.espresso.Espresso.onView import androidx.test.espresso.contrib.PickerActions.setDate import androidx.test.espresso.matcher.ViewMatchers.hasDescendant @@ -10,6 +9,7 @@ import androidx.test.espresso.matcher.ViewMatchers.withClassName import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.example.util.simpletimetracker.feature_dialogs.dateTime.CustomDatePicker import com.example.util.simpletimetracker.utils.BaseUiTest import com.example.util.simpletimetracker.utils.NavUtils import com.example.util.simpletimetracker.utils.checkViewIsDisplayed @@ -94,7 +94,7 @@ class RecordsRangesTest : BaseUiTest() { // Check yesterday clickOnViewWithId(recordsR.id.btnRecordsContainerToday) - onView(withClassName(equalTo(DatePicker::class.java.name))) + onView(withClassName(equalTo(CustomDatePicker::class.java.name))) .perform( setDate( calendarPrev.get(Calendar.YEAR), @@ -108,7 +108,7 @@ class RecordsRangesTest : BaseUiTest() { // Check tomorrow clickOnViewWithId(recordsR.id.btnRecordsContainerToday) - onView(withClassName(equalTo(DatePicker::class.java.name))) + onView(withClassName(equalTo(CustomDatePicker::class.java.name))) .perform( setDate( calendarNext.get(Calendar.YEAR), @@ -140,7 +140,7 @@ class RecordsRangesTest : BaseUiTest() { // Check prev date clickOnViewWithId(recordsR.id.btnRecordsContainerToday) - onView(withClassName(equalTo(DatePicker::class.java.name))) + onView(withClassName(equalTo(CustomDatePicker::class.java.name))) .perform( setDate( calendarPrev.get(Calendar.YEAR), @@ -154,7 +154,7 @@ class RecordsRangesTest : BaseUiTest() { // Check next date clickOnViewWithId(recordsR.id.btnRecordsContainerToday) - onView(withClassName(equalTo(DatePicker::class.java.name))) + onView(withClassName(equalTo(CustomDatePicker::class.java.name))) .perform( setDate( calendarNext.get(Calendar.YEAR), diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/SettingsSortActivity.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/SettingsSortActivity.kt index b6d5a432f..e8ab55d61 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/SettingsSortActivity.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/SettingsSortActivity.kt @@ -115,7 +115,10 @@ class SettingsSortActivity : BaseUiTest() { NavUtils.openSettingsDisplay() scrollSettingsRecyclerToText(R.string.settings_sort_order) checkViewIsDisplayed( - allOf(withId(settingsR.id.tvItemSettingsValue), withText(coreR.string.settings_sort_by_name)), + settingsSpinnerValueBesideText( + R.string.settings_sort_order, + withText(coreR.string.settings_sort_by_name), + ), ) } diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/SettingsTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/SettingsTest.kt index 34222db02..215235e6b 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/SettingsTest.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/SettingsTest.kt @@ -1,6 +1,5 @@ package com.example.util.simpletimetracker -import android.widget.DatePicker import androidx.test.espresso.Espresso.onData import androidx.test.espresso.Espresso.onView import androidx.test.espresso.Espresso.pressBack @@ -22,6 +21,7 @@ import com.example.util.simpletimetracker.core.interactor.LanguageInteractor import com.example.util.simpletimetracker.domain.interactor.AppLanguage import com.example.util.simpletimetracker.domain.model.ActivityFilter import com.example.util.simpletimetracker.domain.model.DayOfWeek +import com.example.util.simpletimetracker.feature_dialogs.dateTime.CustomDatePicker import com.example.util.simpletimetracker.feature_dialogs.dateTime.CustomTimePicker import com.example.util.simpletimetracker.utils.BaseUiTest import com.example.util.simpletimetracker.utils.NavUtils @@ -1612,7 +1612,7 @@ class SettingsTest : BaseUiTest() { // Set time started clickOnViewWithId(dialogsR.id.tvCsvExportSettingsTimeStarted) - onView(withClassName(equalTo(DatePicker::class.java.name))) + onView(withClassName(equalTo(CustomDatePicker::class.java.name))) .perform(setDate(year, month + 1, day)) clickOnView( allOf( @@ -1639,7 +1639,7 @@ class SettingsTest : BaseUiTest() { // Set time ended clickOnViewWithId(dialogsR.id.tvCsvExportSettingsTimeEnded) - onView(withClassName(equalTo(DatePicker::class.java.name))) + onView(withClassName(equalTo(CustomDatePicker::class.java.name))) .perform(setDate(year, month + 1, day)) clickOnView( allOf( diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsDetailFilterTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsDetailFilterTest.kt index 718edf71e..18d96dfaf 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsDetailFilterTest.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsDetailFilterTest.kt @@ -14,6 +14,7 @@ import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.ext.junit.runners.AndroidJUnit4 import com.example.util.simpletimetracker.feature_dialogs.R import com.example.util.simpletimetracker.feature_dialogs.dateTime.CustomTimePicker +import com.example.util.simpletimetracker.feature_records_filter.viewData.RecordsFilterSelectionButtonType import com.example.util.simpletimetracker.utils.BaseUiTest import com.example.util.simpletimetracker.utils.NavUtils import com.example.util.simpletimetracker.utils.checkViewIsDisplayed @@ -24,6 +25,7 @@ import com.example.util.simpletimetracker.utils.clickOnViewWithText import com.example.util.simpletimetracker.utils.tryAction import com.example.util.simpletimetracker.utils.typeTextIntoView import com.example.util.simpletimetracker.utils.withPluralText +import com.example.util.simpletimetracker.utils.withTag import dagger.hilt.android.testing.HiltAndroidTest import java.util.Calendar import java.util.concurrent.TimeUnit @@ -81,6 +83,23 @@ class StatisticsDetailFilterTest : BaseUiTest() { clickOnView(allOf(isDescendantOfA(withId(baseR.id.viewRecordTypeItem)), withText(name2))) pressBack() checkRecordsCard(3) + + clickOnViewWithId(statisticsDetailR.id.cardStatisticsDetailFilter) + selectAll( + type = RecordsFilterSelectionButtonType.Type.Activities, + subtype = RecordsFilterSelectionButtonType.Subtype.SelectNone, + ) + pressBack() + checkRecordsCard(0) + + clickOnViewWithId(statisticsDetailR.id.cardStatisticsDetailFilter) + clickOnView(withSubstring(getString(coreR.string.activity_hint))) + selectAll( + type = RecordsFilterSelectionButtonType.Type.Activities, + subtype = RecordsFilterSelectionButtonType.Subtype.SelectAll, + ) + pressBack() + checkRecordsCard(3) } @Test @@ -143,6 +162,23 @@ class StatisticsDetailFilterTest : BaseUiTest() { clickOnView(allOf(isDescendantOfA(withId(baseR.id.viewCategoryItem)), withText(categoryName2))) pressBack() checkRecordsCard(6) + + clickOnViewWithId(statisticsDetailR.id.cardStatisticsDetailFilter) + selectAll( + type = RecordsFilterSelectionButtonType.Type.Categories, + subtype = RecordsFilterSelectionButtonType.Subtype.SelectNone, + ) + pressBack() + checkRecordsCard(0) + + clickOnViewWithId(statisticsDetailR.id.cardStatisticsDetailFilter) + clickOnView(withSubstring(getString(coreR.string.activity_hint))) + selectAll( + type = RecordsFilterSelectionButtonType.Type.Categories, + subtype = RecordsFilterSelectionButtonType.Subtype.SelectAll, + ) + pressBack() + checkRecordsCard(6) } @Test @@ -353,6 +389,30 @@ class StatisticsDetailFilterTest : BaseUiTest() { clickOnView(allOf(isDescendantOfA(withId(baseR.id.viewCategoryItem)), withText(tag1))) pressBack() checkRecordsCard(5) + + clickOnViewWithId(statisticsDetailR.id.cardStatisticsDetailFilter) + clickOnView( + allOf( + hasSibling(withSubstring(getString(coreR.string.activity_hint))), + withId(baseR.id.ivRecordFilterItemRemove), + ), + ) + clickOnView(withSubstring(getString(coreR.string.records_filter_select_tags))) + selectAll( + type = RecordsFilterSelectionButtonType.Type.Tags, + subtype = RecordsFilterSelectionButtonType.Subtype.SelectNone, + ) + pressBack() + checkRecordsCard(0) + + clickOnViewWithId(statisticsDetailR.id.cardStatisticsDetailFilter) + clickOnView(withSubstring(getString(coreR.string.records_filter_select_tags))) + selectAll( + type = RecordsFilterSelectionButtonType.Type.Tags, + subtype = RecordsFilterSelectionButtonType.Subtype.SelectAll, + ) + pressBack() + checkRecordsCard(7) } @Test @@ -872,4 +932,18 @@ class StatisticsDetailFilterTest : BaseUiTest() { ), ) } + + private fun selectAll( + type: RecordsFilterSelectionButtonType.Type, + subtype: RecordsFilterSelectionButtonType.Subtype, + ) { + clickOnView( + withTag( + RecordsFilterSelectionButtonType( + type = type, + subtype = subtype, + ), + ), + ) + } } diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsDetailTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsDetailTest.kt index dfa219587..a27e4defa 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsDetailTest.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsDetailTest.kt @@ -119,6 +119,9 @@ class StatisticsDetailTest : BaseUiTest() { checkViewDoesNotExist( allOf(withId(statisticsDetailR.id.btnStatisticsDetailNext), isCompletelyDisplayed()), ) + checkViewDoesNotExist( + allOf(withTag(StatisticsDetailBlock.DailyCalendarHint), isCompletelyDisplayed()), + ) checkViewDoesNotExist( allOf(withTag(StatisticsDetailBlock.ChartData), isCompletelyDisplayed()), ) @@ -337,6 +340,11 @@ class StatisticsDetailTest : BaseUiTest() { checkViewDoesNotExist(allOf(withId(statisticsDetailR.id.btnStatisticsDetailPrevious), isCompletelyDisplayed())) checkViewDoesNotExist(allOf(withId(statisticsDetailR.id.btnStatisticsDetailNext), isCompletelyDisplayed())) + // Daily calendar + checkViewDoesNotExist( + allOf(withTag(StatisticsDetailBlock.DailyCalendarHint), isCompletelyDisplayed()), + ) + // Bar chart scrollStatDetailRecyclerToTag(StatisticsDetailBlock.ChartData) checkViewIsDisplayed( @@ -504,6 +512,11 @@ class StatisticsDetailTest : BaseUiTest() { clickOnViewWithIdOnPager(statisticsDetailR.id.btnStatisticsDetailToday) clickOnViewWithText(coreR.string.range_day) + // Daily calendar + checkViewIsDisplayed( + allOf(withTag(StatisticsDetailBlock.DailyCalendarHint), isCompletelyDisplayed()), + ) + // Bar chart checkViewDoesNotExist( allOf(withTag(StatisticsDetailBlock.ChartData), isCompletelyDisplayed()), @@ -603,6 +616,11 @@ class StatisticsDetailTest : BaseUiTest() { clickOnViewWithIdOnPager(statisticsDetailR.id.btnStatisticsDetailToday) clickOnViewWithText(coreR.string.range_week) + // Daily calendar + checkViewDoesNotExist( + allOf(withTag(StatisticsDetailBlock.DailyCalendarHint), isCompletelyDisplayed()), + ) + // Bar chart scrollStatDetailRecyclerToTag(StatisticsDetailBlock.ChartData) checkViewIsDisplayed( @@ -710,6 +728,11 @@ class StatisticsDetailTest : BaseUiTest() { clickOnViewWithIdOnPager(statisticsDetailR.id.btnStatisticsDetailToday) clickOnViewWithText(coreR.string.range_month) + // Daily calendar + checkViewDoesNotExist( + allOf(withTag(StatisticsDetailBlock.DailyCalendarHint), isCompletelyDisplayed()), + ) + // Bar chart scrollStatDetailRecyclerToTag(StatisticsDetailBlock.ChartData) checkViewIsDisplayed( @@ -829,6 +852,11 @@ class StatisticsDetailTest : BaseUiTest() { clickOnViewWithIdOnPager(statisticsDetailR.id.btnStatisticsDetailToday) clickOnViewWithText(coreR.string.range_year) + // Daily calendar + checkViewDoesNotExist( + allOf(withTag(StatisticsDetailBlock.DailyCalendarHint), isCompletelyDisplayed()), + ) + // Bar chart scrollStatDetailRecyclerToTag(StatisticsDetailBlock.ChartData) checkViewIsDisplayed( @@ -959,6 +987,11 @@ class StatisticsDetailTest : BaseUiTest() { clickOnView(withPluralText(coreR.plurals.range_last, 7, 7)) clickOnViewWithText(coreR.string.duration_dialog_save) + // Daily calendar + checkViewDoesNotExist( + allOf(withTag(StatisticsDetailBlock.DailyCalendarHint), isCompletelyDisplayed()), + ) + // Bar chart scrollStatDetailRecyclerToTag(StatisticsDetailBlock.ChartData) checkViewIsDisplayed( diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsRangesTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsRangesTest.kt index 664417b90..80cdd6595 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsRangesTest.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsRangesTest.kt @@ -1,6 +1,5 @@ package com.example.util.simpletimetracker -import android.widget.DatePicker import androidx.test.espresso.Espresso.onView import androidx.test.espresso.Espresso.pressBack import androidx.test.espresso.contrib.PickerActions.setDate @@ -13,6 +12,7 @@ import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.ext.junit.runners.AndroidJUnit4 import com.example.util.simpletimetracker.core.extension.setWeekToFirstDay import com.example.util.simpletimetracker.domain.model.DayOfWeek +import com.example.util.simpletimetracker.feature_dialogs.dateTime.CustomDatePicker import com.example.util.simpletimetracker.utils.BaseUiTest import com.example.util.simpletimetracker.utils.NavUtils import com.example.util.simpletimetracker.utils.checkViewDoesNotExist @@ -167,7 +167,7 @@ class StatisticsRangesTest : BaseUiTest() { clickOnViewWithText(coreR.string.range_day) clickOnViewWithId(statisticsR.id.btnStatisticsContainerToday) clickOnViewWithText(coreR.string.range_select_day) - onView(withClassName(equalTo(DatePicker::class.java.name))).perform( + onView(withClassName(equalTo(CustomDatePicker::class.java.name))).perform( setDate( calendarPrev.get(Calendar.YEAR), calendarPrev.get(Calendar.MONTH) + 1, @@ -181,7 +181,7 @@ class StatisticsRangesTest : BaseUiTest() { // Check tomorrow clickOnViewWithId(statisticsR.id.btnStatisticsContainerToday) clickOnViewWithText(coreR.string.range_select_day) - onView(withClassName(equalTo(DatePicker::class.java.name))).perform( + onView(withClassName(equalTo(CustomDatePicker::class.java.name))).perform( setDate( calendarNext.get(Calendar.YEAR), calendarNext.get(Calendar.MONTH) + 1, @@ -215,7 +215,7 @@ class StatisticsRangesTest : BaseUiTest() { clickOnViewWithText(coreR.string.range_day) clickOnViewWithId(statisticsR.id.btnStatisticsContainerToday) clickOnViewWithText(coreR.string.range_select_day) - onView(withClassName(equalTo(DatePicker::class.java.name))).perform( + onView(withClassName(equalTo(CustomDatePicker::class.java.name))).perform( setDate( calendarPrev.get(Calendar.YEAR), calendarPrev.get(Calendar.MONTH) + 1, @@ -229,7 +229,7 @@ class StatisticsRangesTest : BaseUiTest() { // Check next date clickOnViewWithId(statisticsR.id.btnStatisticsContainerToday) clickOnViewWithText(coreR.string.range_select_day) - onView(withClassName(equalTo(DatePicker::class.java.name))).perform( + onView(withClassName(equalTo(CustomDatePicker::class.java.name))).perform( setDate( calendarNext.get(Calendar.YEAR), calendarNext.get(Calendar.MONTH) + 1, @@ -260,7 +260,7 @@ class StatisticsRangesTest : BaseUiTest() { clickOnViewWithText(coreR.string.range_week) clickOnViewWithId(statisticsR.id.btnStatisticsContainerToday) clickOnViewWithText(coreR.string.range_select_week) - onView(withClassName(equalTo(DatePicker::class.java.name))).perform( + onView(withClassName(equalTo(CustomDatePicker::class.java.name))).perform( setDate( calendarPrev.get(Calendar.YEAR), calendarPrev.get(Calendar.MONTH) + 1, @@ -274,7 +274,7 @@ class StatisticsRangesTest : BaseUiTest() { // Check next week clickOnViewWithId(statisticsR.id.btnStatisticsContainerToday) clickOnViewWithText(coreR.string.range_select_week) - onView(withClassName(equalTo(DatePicker::class.java.name))).perform( + onView(withClassName(equalTo(CustomDatePicker::class.java.name))).perform( setDate( calendarNext.get(Calendar.YEAR), calendarNext.get(Calendar.MONTH) + 1, @@ -305,7 +305,7 @@ class StatisticsRangesTest : BaseUiTest() { clickOnViewWithText(coreR.string.range_week) clickOnViewWithId(statisticsR.id.btnStatisticsContainerToday) clickOnViewWithText(coreR.string.range_select_week) - onView(withClassName(equalTo(DatePicker::class.java.name))).perform( + onView(withClassName(equalTo(CustomDatePicker::class.java.name))).perform( setDate( calendarPrev.get(Calendar.YEAR), calendarPrev.get(Calendar.MONTH) + 1, @@ -319,7 +319,7 @@ class StatisticsRangesTest : BaseUiTest() { // Check next date clickOnViewWithId(statisticsR.id.btnStatisticsContainerToday) clickOnViewWithText(coreR.string.range_select_week) - onView(withClassName(equalTo(DatePicker::class.java.name))).perform( + onView(withClassName(equalTo(CustomDatePicker::class.java.name))).perform( setDate( calendarNext.get(Calendar.YEAR), calendarNext.get(Calendar.MONTH) + 1, @@ -353,7 +353,7 @@ class StatisticsRangesTest : BaseUiTest() { clickOnViewWithText(coreR.string.range_week) clickOnViewWithId(statisticsR.id.btnStatisticsContainerToday) clickOnViewWithText(coreR.string.range_select_week) - onView(withClassName(equalTo(DatePicker::class.java.name))).perform( + onView(withClassName(equalTo(CustomDatePicker::class.java.name))).perform( setDate( calendarPrev.get(Calendar.YEAR), calendarPrev.get(Calendar.MONTH) + 1, @@ -367,7 +367,7 @@ class StatisticsRangesTest : BaseUiTest() { // Check next date clickOnViewWithId(statisticsR.id.btnStatisticsContainerToday) clickOnViewWithText(coreR.string.range_select_week) - onView(withClassName(equalTo(DatePicker::class.java.name))).perform( + onView(withClassName(equalTo(CustomDatePicker::class.java.name))).perform( setDate( calendarNext.get(Calendar.YEAR), calendarNext.get(Calendar.MONTH) + 1, @@ -401,7 +401,7 @@ class StatisticsRangesTest : BaseUiTest() { clickOnViewWithText(coreR.string.range_week) clickOnViewWithId(statisticsR.id.btnStatisticsContainerToday) clickOnViewWithText(coreR.string.range_select_week) - onView(withClassName(equalTo(DatePicker::class.java.name))).perform( + onView(withClassName(equalTo(CustomDatePicker::class.java.name))).perform( setDate( calendarPrev.get(Calendar.YEAR), calendarPrev.get(Calendar.MONTH) + 1, @@ -415,7 +415,7 @@ class StatisticsRangesTest : BaseUiTest() { // Check next date clickOnViewWithId(statisticsR.id.btnStatisticsContainerToday) clickOnViewWithText(coreR.string.range_select_week) - onView(withClassName(equalTo(DatePicker::class.java.name))).perform( + onView(withClassName(equalTo(CustomDatePicker::class.java.name))).perform( setDate( calendarNext.get(Calendar.YEAR), calendarNext.get(Calendar.MONTH) + 1, @@ -445,7 +445,7 @@ class StatisticsRangesTest : BaseUiTest() { clickOnViewWithText(coreR.string.range_month) clickOnViewWithId(statisticsR.id.btnStatisticsContainerToday) clickOnViewWithText(coreR.string.range_select_month) - onView(withClassName(equalTo(DatePicker::class.java.name))).perform( + onView(withClassName(equalTo(CustomDatePicker::class.java.name))).perform( setDate( calendarPrev.get(Calendar.YEAR), calendarPrev.get(Calendar.MONTH) + 1, @@ -459,7 +459,7 @@ class StatisticsRangesTest : BaseUiTest() { // Check next month clickOnViewWithId(statisticsR.id.btnStatisticsContainerToday) clickOnViewWithText(coreR.string.range_select_month) - onView(withClassName(equalTo(DatePicker::class.java.name))).perform( + onView(withClassName(equalTo(CustomDatePicker::class.java.name))).perform( setDate( calendarNext.get(Calendar.YEAR), calendarNext.get(Calendar.MONTH) + 1, @@ -493,7 +493,7 @@ class StatisticsRangesTest : BaseUiTest() { clickOnViewWithText(coreR.string.range_month) clickOnViewWithId(statisticsR.id.btnStatisticsContainerToday) clickOnViewWithText(coreR.string.range_select_month) - onView(withClassName(equalTo(DatePicker::class.java.name))).perform( + onView(withClassName(equalTo(CustomDatePicker::class.java.name))).perform( setDate( calendarPrev.get(Calendar.YEAR), calendarPrev.get(Calendar.MONTH) + 1, @@ -507,7 +507,7 @@ class StatisticsRangesTest : BaseUiTest() { // Check next date clickOnViewWithId(statisticsR.id.btnStatisticsContainerToday) clickOnViewWithText(coreR.string.range_select_month) - onView(withClassName(equalTo(DatePicker::class.java.name))).perform( + onView(withClassName(equalTo(CustomDatePicker::class.java.name))).perform( setDate( calendarNext.get(Calendar.YEAR), calendarNext.get(Calendar.MONTH) + 1, @@ -537,7 +537,7 @@ class StatisticsRangesTest : BaseUiTest() { clickOnViewWithText(coreR.string.range_year) clickOnViewWithId(statisticsR.id.btnStatisticsContainerToday) clickOnViewWithText(coreR.string.range_select_year) - onView(withClassName(equalTo(DatePicker::class.java.name))).perform( + onView(withClassName(equalTo(CustomDatePicker::class.java.name))).perform( setDate( calendarPrev.get(Calendar.YEAR), calendarPrev.get(Calendar.MONTH) + 1, @@ -551,7 +551,7 @@ class StatisticsRangesTest : BaseUiTest() { // Check next month clickOnViewWithId(statisticsR.id.btnStatisticsContainerToday) clickOnViewWithText(coreR.string.range_select_year) - onView(withClassName(equalTo(DatePicker::class.java.name))).perform( + onView(withClassName(equalTo(CustomDatePicker::class.java.name))).perform( setDate( calendarNext.get(Calendar.YEAR), calendarNext.get(Calendar.MONTH) + 1, @@ -585,7 +585,7 @@ class StatisticsRangesTest : BaseUiTest() { clickOnViewWithText(coreR.string.range_year) clickOnViewWithId(statisticsR.id.btnStatisticsContainerToday) clickOnViewWithText(coreR.string.range_select_year) - onView(withClassName(equalTo(DatePicker::class.java.name))).perform( + onView(withClassName(equalTo(CustomDatePicker::class.java.name))).perform( setDate( calendarPrev.get(Calendar.YEAR), calendarPrev.get(Calendar.MONTH) + 1, @@ -599,7 +599,7 @@ class StatisticsRangesTest : BaseUiTest() { // Check next date clickOnViewWithId(statisticsR.id.btnStatisticsContainerToday) clickOnViewWithText(coreR.string.range_select_year) - onView(withClassName(equalTo(DatePicker::class.java.name))).perform( + onView(withClassName(equalTo(CustomDatePicker::class.java.name))).perform( setDate( calendarNext.get(Calendar.YEAR), calendarNext.get(Calendar.MONTH) + 1, diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsTest.kt index 18e87508d..3001bfe2c 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsTest.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsTest.kt @@ -2,6 +2,7 @@ package com.example.util.simpletimetracker import androidx.test.espresso.Espresso.pressBack import androidx.test.espresso.matcher.ViewMatchers.hasDescendant +import androidx.test.espresso.matcher.ViewMatchers.hasSibling import androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withSubstring @@ -15,6 +16,7 @@ import com.example.util.simpletimetracker.utils.clickOnView import com.example.util.simpletimetracker.utils.clickOnViewWithId import com.example.util.simpletimetracker.utils.clickOnViewWithIdOnPager import com.example.util.simpletimetracker.utils.clickOnViewWithText +import com.example.util.simpletimetracker.utils.tryAction import com.example.util.simpletimetracker.utils.withCardColor import com.example.util.simpletimetracker.utils.withPluralText import com.example.util.simpletimetracker.utils.withTag @@ -48,6 +50,7 @@ class StatisticsTest : BaseUiTest() { testUtils.addRecord(name, timeStarted = before, timeEnded = before) NavUtils.openStatisticsScreen() + Thread.sleep(1000) // Check day range checkRecordsRange(firstColor, lastColor, firstIcon, lastIcon, name, newName) @@ -643,4 +646,68 @@ class StatisticsTest : BaseUiTest() { ) clickOnViewWithId(statisticsR.id.btnStatisticsContainerNext) } + + @Test + fun totalTracked() { + val type1 = "type1" + val type2 = "type2" + val category1 = "category1" + val category2 = "category2" + val tag1 = "tag1" + val tag2 = "tag2" + + // Add data + testUtils.addCategory(category1) + testUtils.addCategory(category2) + testUtils.addActivity(type1, categories = listOf(category1)) + testUtils.addActivity(type2, categories = listOf(category2)) + testUtils.addRecord(type1, tagNames = listOf(tag1)) + testUtils.addRecord(type2, tagNames = listOf(tag2)) + + NavUtils.openStatisticsScreen() + + // Check total tracked for activity + clickOnView(allOf(withText(R.string.statistics_total_tracked), isCompletelyDisplayed())) + tryAction { + checkViewIsDisplayed( + allOf( + withPluralText(coreR.plurals.statistics_detail_times_tracked, 2), + hasSibling(withText("2")), + isCompletelyDisplayed(), + ), + ) + } + pressBack() + + // Check total tracked for category + clickOnViewWithIdOnPager(statisticsR.id.btnStatisticsChartFilter) + clickOnViewWithText(coreR.string.category_hint) + pressBack() + clickOnView(allOf(withText(R.string.statistics_total_tracked), isCompletelyDisplayed())) + tryAction { + checkViewIsDisplayed( + allOf( + withPluralText(coreR.plurals.statistics_detail_times_tracked, 2), + hasSibling(withText("2")), + isCompletelyDisplayed(), + ), + ) + } + pressBack() + + // Check total tracked for tag + clickOnViewWithIdOnPager(statisticsR.id.btnStatisticsChartFilter) + clickOnViewWithText(coreR.string.record_tag_hint_short) + pressBack() + clickOnView(allOf(withText(R.string.statistics_total_tracked), isCompletelyDisplayed())) + tryAction { + checkViewIsDisplayed( + allOf( + withPluralText(coreR.plurals.statistics_detail_times_tracked, 2), + hasSibling(withText("2")), + isCompletelyDisplayed(), + ), + ) + } + } } diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/utils/NavUtils.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/utils/NavUtils.kt index 2ad38220d..16da41f67 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/utils/NavUtils.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/utils/NavUtils.kt @@ -1,6 +1,5 @@ package com.example.util.simpletimetracker.utils -import android.widget.DatePicker import androidx.test.espresso.Espresso.closeSoftKeyboard import androidx.test.espresso.Espresso.onView import androidx.test.espresso.Espresso.pressBack @@ -16,6 +15,7 @@ import com.example.util.simpletimetracker.R import com.example.util.simpletimetracker.clickOnSettingsRecyclerText import com.example.util.simpletimetracker.domain.extension.padDuration import com.example.util.simpletimetracker.domain.model.RecordTypeGoal +import com.example.util.simpletimetracker.feature_dialogs.dateTime.CustomDatePicker import com.example.util.simpletimetracker.feature_dialogs.dateTime.CustomTimePicker import com.example.util.simpletimetracker.scrollSettingsRecyclerToText import org.hamcrest.CoreMatchers.allOf @@ -405,13 +405,13 @@ object NavUtils { ) { // Set time started clickOnViewWithId(dialogsR.id.tvCustomRangeSelectionTimeStarted) - onView(withClassName(equalTo(DatePicker::class.java.name))) + onView(withClassName(equalTo(CustomDatePicker::class.java.name))) .perform(setDate(yearStarted, monthStarted + 1, dayStarted)) clickOnViewWithId(dialogsR.id.btnDateTimeDialogPositive) // Set time ended clickOnViewWithId(dialogsR.id.tvCustomRangeSelectionTimeEnded) - onView(withClassName(equalTo(DatePicker::class.java.name))) + onView(withClassName(equalTo(CustomDatePicker::class.java.name))) .perform(setDate(yearEnded, monthEnded + 1, dayEnded)) clickOnViewWithId(dialogsR.id.btnDateTimeDialogPositive) diff --git a/app/src/main/java/com/example/util/simpletimetracker/navigation/ActionResolverImpl.kt b/app/src/main/java/com/example/util/simpletimetracker/navigation/ActionResolverImpl.kt index f20cde6f4..36e935738 100644 --- a/app/src/main/java/com/example/util/simpletimetracker/navigation/ActionResolverImpl.kt +++ b/app/src/main/java/com/example/util/simpletimetracker/navigation/ActionResolverImpl.kt @@ -51,17 +51,20 @@ class ActionResolverImpl @Inject constructor( private fun openMarket(activity: Activity?, params: OpenMarketParams) { val uri = Uri.parse(MARKET_INTENT + params.packageName) val intent = Intent(Intent.ACTION_VIEW, uri) + intent.setPackage(MARKET_PACKAGE) intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) try { activity?.startActivity(intent) } catch (e: ActivityNotFoundException) { - activity?.startActivity( - Intent( - Intent.ACTION_VIEW, - Uri.parse(MARKET_LINK + params.packageName), - ), - ) + Intent( + Intent.ACTION_VIEW, + Uri.parse(MARKET_LINK + params.packageName), + ).apply { + intent.setPackage(MARKET_PACKAGE) + }.let { + activity?.startActivity(it) + } } } @@ -175,6 +178,7 @@ class ActionResolverImpl @Inject constructor( companion object { private const val MARKET_INTENT = "market://details?id=" private const val MARKET_LINK = "http://play.google.com/store/apps/details?id=" + private const val MARKET_PACKAGE = "com.android.vending" private const val EMAIL_URI = "mailto:" } } \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/com/example/util/simpletimetracker/Base.kt b/buildSrc/src/main/kotlin/com/example/util/simpletimetracker/Base.kt index d3b0c1673..39803eb5c 100644 --- a/buildSrc/src/main/kotlin/com/example/util/simpletimetracker/Base.kt +++ b/buildSrc/src/main/kotlin/com/example/util/simpletimetracker/Base.kt @@ -5,7 +5,7 @@ object Base { const val namespace = "com.example.util.simpletimetracker" // Raise by 2 to account for wear version code. - const val versionCode = 65 + const val versionCode = 67 const val versionName = "1.45" const val minSDK = 21 const val currentSDK = 34 diff --git a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/mapper/CategoryDataLocalMapper.kt b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/mapper/CategoryDataLocalMapper.kt index c5fa2ca6d..f59b43b2f 100644 --- a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/mapper/CategoryDataLocalMapper.kt +++ b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/mapper/CategoryDataLocalMapper.kt @@ -25,7 +25,7 @@ class CategoryDataLocalMapper @Inject constructor() { name = domain.name, color = domain.color.colorId, colorInt = domain.color.colorInt, - note = domain.note + note = domain.note, ) } } \ No newline at end of file diff --git a/features/feature_base_adapter/src/main/java/com/example/util/simpletimetracker/feature_base_adapter/selectionButton/SelectionButtonAdapterDelegate.kt b/features/feature_base_adapter/src/main/java/com/example/util/simpletimetracker/feature_base_adapter/selectionButton/SelectionButtonAdapterDelegate.kt index a8f8cae0f..c4ad2fe42 100644 --- a/features/feature_base_adapter/src/main/java/com/example/util/simpletimetracker/feature_base_adapter/selectionButton/SelectionButtonAdapterDelegate.kt +++ b/features/feature_base_adapter/src/main/java/com/example/util/simpletimetracker/feature_base_adapter/selectionButton/SelectionButtonAdapterDelegate.kt @@ -14,6 +14,7 @@ fun createSelectionButtonAdapterDelegate( with(binding) { item as ViewData + root.setTag(item.type) root.setCardBackgroundColor(item.color) tvSelectionButtonItemName.text = item.name root.setOnClickWith(item, onItemClick) diff --git a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordBaseViewModel.kt b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordBaseViewModel.kt index 9b02e8046..0c3cae2a6 100644 --- a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordBaseViewModel.kt +++ b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordBaseViewModel.kt @@ -717,7 +717,7 @@ abstract class ChangeRecordBaseViewModel( newTimeStarted += shift } is ChangeRecordDateTimeFieldsState.State.Duration -> { - newTimeStarted -= shift + newTimeStarted = (newTimeStarted - shift).coerceAtMost(previewTimeEnded) } } onTimeStartedChanged() @@ -728,7 +728,7 @@ abstract class ChangeRecordBaseViewModel( newTimeEnded += shift } is ChangeRecordDateTimeFieldsState.State.Duration -> { - newTimeEnded = previewTimeEnded + shift + newTimeEnded = (previewTimeEnded + shift).coerceAtLeast(newTimeStarted) } } onTimeEndedChanged() diff --git a/features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/recordType/manager/NotificationTypeManager.kt b/features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/recordType/manager/NotificationTypeManager.kt index 1cea04f05..240697911 100644 --- a/features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/recordType/manager/NotificationTypeManager.kt +++ b/features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/recordType/manager/NotificationTypeManager.kt @@ -316,7 +316,7 @@ class NotificationTypeManager @Inject constructor( icon = icon, color = color, isChecked = isChecked, - isComplete = isComplete + isComplete = isComplete, ) setViewVisibility(R.id.containerNotificationType, View.VISIBLE) setImageViewBitmap(R.id.ivNotificationType, bitmap) diff --git a/gradle.properties b/gradle.properties index e85f84b6a..e7de7b2c9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,6 +14,7 @@ kotlin.code.style=official android.enableJetifier=false org.gradle.jvmargs=-Xmx2048M -Dkotlin.daemon.jvm.options\="-Xmx2048M" android.useAndroidX=true +android.injected.androidTest.leaveApksInstalledAfterRun=true # TODO With AGP version 8 these defaults to true android.nonFinalResIds=false