Skip to content

Commit a2f56f9

Browse files
committed
add widget tests
1 parent 34b771a commit a2f56f9

File tree

5 files changed

+256
-5
lines changed

5 files changed

+256
-5
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.example.util.simpletimetracker
2+
3+
import androidx.test.core.app.ActivityScenario
4+
import androidx.test.espresso.matcher.ViewMatchers.hasDescendant
5+
import androidx.test.espresso.matcher.ViewMatchers.withId
6+
import androidx.test.espresso.matcher.ViewMatchers.withText
7+
import androidx.test.ext.junit.runners.AndroidJUnit4
8+
import com.example.util.simpletimetracker.feature_widget.configure.view.WidgetConfigureActivity
9+
import com.example.util.simpletimetracker.utils.BaseUiTest
10+
import com.example.util.simpletimetracker.utils.checkViewDoesNotExist
11+
import com.example.util.simpletimetracker.utils.checkViewIsDisplayed
12+
import com.example.util.simpletimetracker.utils.withCardColor
13+
import org.hamcrest.CoreMatchers.allOf
14+
import org.junit.Test
15+
import org.junit.runner.RunWith
16+
17+
@RunWith(AndroidJUnit4::class)
18+
class Widget : BaseUiTest() {
19+
20+
private lateinit var scenarioRule: ActivityScenario<WidgetConfigureActivity>
21+
22+
override fun after() {
23+
super.after()
24+
scenarioRule.close()
25+
}
26+
27+
@Test
28+
fun widgetConfigure() {
29+
val name1 = "TypeName1"
30+
val name2 = "TypeName2"
31+
val name3 = "TypeName3"
32+
33+
// Add data
34+
testUtils.addActivity(name1, color = firstColor)
35+
testUtils.addActivity(name2, color = lastColor)
36+
testUtils.addActivity(name3, archived = true)
37+
scenarioRule = ActivityScenario.launch(WidgetConfigureActivity::class.java)
38+
39+
// Check data
40+
checkType(firstColor, name1)
41+
checkType(lastColor, name2)
42+
checkViewDoesNotExist(withText(name3))
43+
}
44+
45+
private fun checkType(color: Int, name: String) {
46+
checkViewIsDisplayed(
47+
allOf(
48+
withId(R.id.viewRecordTypeItem),
49+
withCardColor(color),
50+
hasDescendant(withText(name))
51+
)
52+
)
53+
}
54+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.example.util.simpletimetracker
2+
3+
import androidx.test.core.app.ActivityScenario
4+
import androidx.test.core.app.ApplicationProvider
5+
import androidx.test.espresso.matcher.ViewMatchers.withText
6+
import androidx.test.ext.junit.runners.AndroidJUnit4
7+
import com.example.util.simpletimetracker.feature_widget.widget.WidgetTagSelectionActivity
8+
import com.example.util.simpletimetracker.navigation.params.RecordTagSelectionParams
9+
import com.example.util.simpletimetracker.utils.BaseUiTest
10+
import com.example.util.simpletimetracker.utils.checkViewDoesNotExist
11+
import com.example.util.simpletimetracker.utils.checkViewIsDisplayed
12+
import org.junit.Test
13+
import org.junit.runner.RunWith
14+
15+
@RunWith(AndroidJUnit4::class)
16+
class WidgetTagSelection : BaseUiTest() {
17+
18+
private lateinit var scenarioRule: ActivityScenario<WidgetTagSelectionActivity>
19+
20+
override fun after() {
21+
super.after()
22+
scenarioRule.close()
23+
}
24+
25+
@Test
26+
fun widgetTagSelection() {
27+
val name1 = "TypeName1"
28+
val tag1 = "TagName1"
29+
val tag2 = "TagName2"
30+
31+
// Add data
32+
testUtils.addActivity(name1)
33+
testUtils.addRecordTag(name1, tag1)
34+
testUtils.addRecordTag(name1, tag2, archived = true)
35+
36+
val intent = WidgetTagSelectionActivity.getStartIntent(
37+
ApplicationProvider.getApplicationContext(),
38+
RecordTagSelectionParams(testUtils.getTypeId(name1))
39+
)
40+
scenarioRule = ActivityScenario.launch(intent)
41+
42+
// Check data
43+
checkViewIsDisplayed(withText(R.string.change_record_untagged))
44+
checkViewIsDisplayed(withText(tag1))
45+
checkViewDoesNotExist(withText(tag2))
46+
}
47+
}
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
package com.example.util.simpletimetracker
2+
3+
import androidx.test.core.app.ActivityScenario
4+
import androidx.test.espresso.matcher.ViewMatchers.hasDescendant
5+
import androidx.test.espresso.matcher.ViewMatchers.withId
6+
import androidx.test.espresso.matcher.ViewMatchers.withText
7+
import androidx.test.ext.junit.runners.AndroidJUnit4
8+
import com.example.util.simpletimetracker.feature_widget.universal.activity.view.WidgetUniversalActivity
9+
import com.example.util.simpletimetracker.utils.BaseUiTest
10+
import com.example.util.simpletimetracker.utils.checkViewDoesNotExist
11+
import com.example.util.simpletimetracker.utils.checkViewIsDisplayed
12+
import com.example.util.simpletimetracker.utils.clickOnViewWithText
13+
import com.example.util.simpletimetracker.utils.withCardColor
14+
import kotlinx.coroutines.runBlocking
15+
import org.hamcrest.CoreMatchers.allOf
16+
import org.junit.Test
17+
import org.junit.runner.RunWith
18+
19+
@RunWith(AndroidJUnit4::class)
20+
class WidgetUniversal : BaseUiTest() {
21+
22+
private lateinit var scenarioRule: ActivityScenario<WidgetUniversalActivity>
23+
24+
override fun after() {
25+
super.after()
26+
scenarioRule.close()
27+
}
28+
29+
@Test
30+
fun widgetUniversalActivities() {
31+
val name1 = "TypeName1"
32+
val name2 = "TypeName2"
33+
val name3 = "TypeName3"
34+
35+
// Add data
36+
testUtils.addActivity(name1, color = firstColor)
37+
testUtils.addActivity(name2, color = lastColor)
38+
testUtils.addActivity(name3, archived = true)
39+
scenarioRule = ActivityScenario.launch(WidgetUniversalActivity::class.java)
40+
41+
// Check data
42+
checkType(firstColor, name1)
43+
checkType(lastColor, name2)
44+
checkViewDoesNotExist(withText(name3))
45+
46+
// Start activity
47+
clickOnViewWithText(name1)
48+
checkType(R.color.colorFiltered, name1)
49+
50+
// Stop activity
51+
clickOnViewWithText(name1)
52+
checkType(firstColor, name1)
53+
}
54+
55+
@Test
56+
fun widgetUniversalMultitasking() {
57+
val name1 = "TypeName1"
58+
val name2 = "TypeName2"
59+
60+
// Add data
61+
testUtils.addActivity(name1, color = firstColor)
62+
testUtils.addActivity(name2, color = lastColor)
63+
scenarioRule = ActivityScenario.launch(WidgetUniversalActivity::class.java)
64+
65+
// Start timers
66+
clickOnViewWithText(name1)
67+
checkType(R.color.colorFiltered, name1)
68+
clickOnViewWithText(name2)
69+
checkType(R.color.colorFiltered, name2)
70+
71+
// Stop timer
72+
clickOnViewWithText(name2)
73+
checkType(R.color.colorFiltered, name1)
74+
checkType(lastColor, name2)
75+
76+
// Change setting
77+
runBlocking { prefsInteractor.setAllowMultitasking(false) }
78+
79+
// Start another
80+
clickOnViewWithText(name2)
81+
checkType(firstColor, name1)
82+
checkType(R.color.colorFiltered, name2)
83+
84+
// Start another
85+
clickOnViewWithText(name1)
86+
checkType(R.color.colorFiltered, name1)
87+
checkType(lastColor, name2)
88+
}
89+
90+
@Test
91+
fun widgetUniversalTagSelection() {
92+
val name1 = "TypeName1"
93+
val name2 = "TypeName2"
94+
val tag1 = "TagName1"
95+
val tag2 = "TagName2"
96+
97+
// Add data
98+
testUtils.addActivity(name1, color = firstColor)
99+
testUtils.addActivity(name2, color = lastColor)
100+
testUtils.addRecordTag(name1, tag1)
101+
testUtils.addRecordTag(name1, tag2, archived = true)
102+
scenarioRule = ActivityScenario.launch(WidgetUniversalActivity::class.java)
103+
104+
// Start timers
105+
clickOnViewWithText(name1)
106+
checkType(R.color.colorFiltered, name1)
107+
clickOnViewWithText(name2)
108+
checkType(R.color.colorFiltered, name2)
109+
clickOnViewWithText(name1)
110+
clickOnViewWithText(name2)
111+
112+
// Change setting
113+
runBlocking { prefsInteractor.setShowRecordTagSelection(true) }
114+
115+
// Start timers
116+
clickOnViewWithText(name1)
117+
checkViewIsDisplayed(withText(R.string.change_record_untagged))
118+
checkViewIsDisplayed(withText(tag1))
119+
checkViewDoesNotExist(withText(tag2))
120+
clickOnViewWithText(tag1)
121+
checkType(R.color.colorFiltered, name1)
122+
123+
clickOnViewWithText(name2)
124+
checkType(R.color.colorFiltered, name2)
125+
}
126+
127+
private fun checkType(color: Int, name: String) {
128+
checkViewIsDisplayed(
129+
allOf(
130+
withId(R.id.viewRecordTypeItem),
131+
withCardColor(color),
132+
hasDescendant(withText(name))
133+
)
134+
)
135+
}
136+
}

app/src/androidTest/java/com/example/util/simpletimetracker/utils/BaseUiTest.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.example.util.simpletimetracker.core.utils.CountingIdlingResourceProvi
1212
import com.example.util.simpletimetracker.core.utils.TestUtils
1313
import com.example.util.simpletimetracker.di.AppModule
1414
import com.example.util.simpletimetracker.di.DaggerTestAppComponent
15+
import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor
1516
import com.example.util.simpletimetracker.feature_records.view.RecordsContainerFragment
1617
import com.example.util.simpletimetracker.feature_statistics.view.StatisticsContainerFragment
1718
import com.example.util.simpletimetracker.ui.MainActivity
@@ -34,6 +35,9 @@ open class BaseUiTest {
3435
@Inject
3536
lateinit var timeMapper: TimeMapper
3637

38+
@Inject
39+
lateinit var prefsInteractor: PrefsInteractor
40+
3741
@Rule
3842
@JvmField
3943
val activityScenarioRule = ActivityScenarioRule(MainActivity::class.java)
@@ -64,14 +68,14 @@ open class BaseUiTest {
6468
}
6569

6670
@Before
67-
fun setUp() {
71+
open fun setUp() {
6872
clearData()
6973
disableAnimations()
7074
registerIdlingResource()
7175
}
7276

7377
@After
74-
fun after() {
78+
open fun after() {
7579
enableAnimations()
7680
unregisterIdlingResource()
7781
}

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

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class TestUtils @Inject constructor(
4848
icon: Int? = null,
4949
emoji: String? = null,
5050
goalTime: Long? = null,
51+
archived: Boolean = false,
5152
categories: List<String> = emptyList()
5253
) = runBlocking {
5354
val icons = iconImageMapper.availableIconsNames
@@ -64,7 +65,8 @@ class TestUtils @Inject constructor(
6465
name = name,
6566
color = colorId,
6667
icon = iconId,
67-
goalTime = goalTime.orZero()
68+
goalTime = goalTime.orZero(),
69+
hidden = archived
6870
)
6971

7072
val typeId = recordTypeInteractor.add(data)
@@ -117,16 +119,24 @@ class TestUtils @Inject constructor(
117119

118120
fun addRecordTag(
119121
typeName: String,
120-
tagName: String
122+
tagName: String,
123+
archived: Boolean = false
121124
) = runBlocking {
122125
val type = recordTypeInteractor.getAll().firstOrNull { it.name == typeName }
123126
?: return@runBlocking
124127

125128
val data = RecordTag(
126129
typeId = type.id,
127-
name = tagName
130+
name = tagName,
131+
archived = archived
128132
)
129133

130134
recordTagInteractor.add(data)
131135
}
136+
137+
fun getTypeId(typeName: String): Long = runBlocking {
138+
recordTypeInteractor.getAll()
139+
.firstOrNull { it.name == typeName}
140+
?.id.orZero()
141+
}
132142
}

0 commit comments

Comments
 (0)