Skip to content

Commit 2a18193

Browse files
committed
androidTestとtest分離
1 parent b150cdb commit 2a18193

4 files changed

Lines changed: 134 additions & 162 deletions

File tree

AndroidApp/domain/build.gradle.kts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ dependencies {
2121
api(libs.androidx.compose.runtime)
2222

2323
// test
24+
testImplementation(libs.junit)
25+
testImplementation(libs.com.google.truth)
26+
testImplementation(libs.kotlinx.coroutines.test)
27+
testImplementation(libs.mockk)
2428
androidTestImplementation(libs.junit)
2529
androidTestImplementation(libs.com.google.truth)
2630
androidTestImplementation(libs.androidx.test.ext.junit)

AndroidApp/domain/src/androidTest/java/me/nya_n/notificationnotifier/UseCaseTest.kt

Lines changed: 0 additions & 162 deletions
Original file line numberDiff line numberDiff line change
@@ -12,32 +12,24 @@ import me.nya_n.notificationnotifier.data.repository.AppRepository
1212
import me.nya_n.notificationnotifier.data.repository.UserSettingsRepository
1313
import me.nya_n.notificationnotifier.data.repository.impl.BackupRepositoryImpl
1414
import me.nya_n.notificationnotifier.domain.usecase.AddTargetAppUseCase
15-
import me.nya_n.notificationnotifier.domain.usecase.DeleteTargetAppUseCase
1615
import me.nya_n.notificationnotifier.domain.usecase.ExportDataUseCase
1716
import me.nya_n.notificationnotifier.domain.usecase.ImportDataUseCase
1817
import me.nya_n.notificationnotifier.domain.usecase.LoadAddressUseCase
1918
import me.nya_n.notificationnotifier.domain.usecase.LoadFilterConditionUseCase
20-
import me.nya_n.notificationnotifier.domain.usecase.NotifyUseCase
21-
import me.nya_n.notificationnotifier.domain.usecase.PackageVisibilityGrantedUseCase
2219
import me.nya_n.notificationnotifier.domain.usecase.SaveAddressUseCase
2320
import me.nya_n.notificationnotifier.domain.usecase.SaveFilterConditionUseCase
2421
import me.nya_n.notificationnotifier.domain.usecase.ToggleIgnoreSummaryUseCase
2522
import me.nya_n.notificationnotifier.domain.usecase.impl.AddTargetAppUseCaseImpl
26-
import me.nya_n.notificationnotifier.domain.usecase.impl.DeleteTargetAppUseCaseImpl
2723
import me.nya_n.notificationnotifier.domain.usecase.impl.ExportDataUseCaseImpl
2824
import me.nya_n.notificationnotifier.domain.usecase.impl.ImportDataUseCaseImpl
2925
import me.nya_n.notificationnotifier.domain.usecase.impl.LoadAddressUseCaseImpl
3026
import me.nya_n.notificationnotifier.domain.usecase.impl.LoadAppUseCaseImpl
3127
import me.nya_n.notificationnotifier.domain.usecase.impl.LoadFilterConditionUseCaseImpl
32-
import me.nya_n.notificationnotifier.domain.usecase.impl.NotifyUseCaseImpl
33-
import me.nya_n.notificationnotifier.domain.usecase.impl.PackageVisibilityGrantedUseCaseImpl
3428
import me.nya_n.notificationnotifier.domain.usecase.impl.SaveAddressUseCaseImpl
3529
import me.nya_n.notificationnotifier.domain.usecase.impl.SaveFilterConditionUseCaseImpl
3630
import me.nya_n.notificationnotifier.domain.usecase.impl.ToggleIgnoreSummaryUseCaseImpl
37-
import me.nya_n.notificationnotifier.model.AppException.PermissionDeniedException
3831
import me.nya_n.notificationnotifier.model.FilterCondition
3932
import me.nya_n.notificationnotifier.model.InstalledApp
40-
import org.junit.Assume.assumeTrue
4133
import org.junit.Before
4234
import org.junit.Test
4335
import org.junit.runner.RunWith
@@ -59,14 +51,11 @@ class UseCaseTest {
5951

6052
private lateinit var addTargetAppUseCase: AddTargetAppUseCase
6153
private lateinit var loadAppUseCase: LoadAppUseCaseImpl
62-
private lateinit var deleteTargetAppUseCase: DeleteTargetAppUseCase
63-
private lateinit var packageVisibilityGrantedUseCase: PackageVisibilityGrantedUseCase
6454
private lateinit var saveFilterConditionUseCase: SaveFilterConditionUseCase
6555
private lateinit var toggleIgnoreSummaryUseCase: ToggleIgnoreSummaryUseCase
6656
private lateinit var loadFilterConditionUseCase: LoadFilterConditionUseCase
6757
private lateinit var saveAddressUseCase: SaveAddressUseCase
6858
private lateinit var loadAddressUseCase: LoadAddressUseCase
69-
private lateinit var notifyUseCase: NotifyUseCase
7059
private lateinit var exportDataUseCase: ExportDataUseCase
7160
private lateinit var importDataUseCase: ImportDataUseCase
7261

@@ -82,168 +71,17 @@ class UseCaseTest {
8271
val backupRepository = BackupRepositoryImpl(appContext, testDispatcher)
8372
addTargetAppUseCase = AddTargetAppUseCaseImpl(appRepository)
8473
loadAppUseCase = LoadAppUseCaseImpl(userSettingsRepository, appRepository, testDispatcher)
85-
deleteTargetAppUseCase = DeleteTargetAppUseCaseImpl(appRepository)
86-
packageVisibilityGrantedUseCase =
87-
PackageVisibilityGrantedUseCaseImpl(userSettingsRepository)
8874
saveFilterConditionUseCase = SaveFilterConditionUseCaseImpl(appRepository)
8975
toggleIgnoreSummaryUseCase = ToggleIgnoreSummaryUseCaseImpl(appRepository)
9076
loadFilterConditionUseCase = LoadFilterConditionUseCaseImpl(appRepository)
9177
saveAddressUseCase = SaveAddressUseCaseImpl(userSettingsRepository)
9278
loadAddressUseCase = LoadAddressUseCaseImpl(userSettingsRepository)
93-
notifyUseCase = NotifyUseCaseImpl(userSettingsRepository, testDispatcher)
9479
exportDataUseCase =
9580
ExportDataUseCaseImpl(userSettingsRepository, appRepository, backupRepository)
9681
importDataUseCase =
9782
ImportDataUseCaseImpl(userSettingsRepository, appRepository, backupRepository)
9883
}
9984

100-
@Test
101-
fun `通知対象アプリの追加、取得、削除`() {
102-
runTest(testDispatcher) {
103-
val app = InstalledApp("sample", "com.sample.www")
104-
addTargetAppUseCase(app)
105-
106-
val added = loadAppUseCase.loadTargetList()
107-
assertThat(added).hasSize(1)
108-
assertThat(added.first()).isEqualTo(app)
109-
110-
deleteTargetAppUseCase(app)
111-
val deleted = loadAppUseCase.loadTargetList()
112-
assertThat(deleted).isEmpty()
113-
}
114-
}
115-
116-
@Test
117-
fun `インストール済みアプリの取得_成功(ついでにアプリ一覧取得権限許可処理も)`() {
118-
packageVisibilityGrantedUseCase()
119-
val ret = loadAppUseCase.loadInstalledAppList()
120-
assertThat(ret.getOrNull()).apply {
121-
isNotNull()
122-
isNotEmpty()
123-
}
124-
}
125-
126-
@Test
127-
fun `インストール済みアプリの取得_失敗`() {
128-
val ret = loadAppUseCase.loadInstalledAppList()
129-
assertThat(ret.exceptionOrNull()).apply {
130-
isNotNull()
131-
isInstanceOf(PermissionDeniedException::class.java)
132-
}
133-
}
134-
135-
@Test
136-
fun `通知条件の追加、取得、更新`() {
137-
runTest(testDispatcher) {
138-
val cond = "test"
139-
val updatedCond = "updated"
140-
val packageName = "com.sample.www"
141-
val app = InstalledApp("sample", packageName)
142-
143-
// 追加
144-
saveFilterConditionUseCase(SaveFilterConditionUseCase.Args(app, cond))
145-
assertThat(loadFilterConditionUseCase(app)).isEqualTo(
146-
FilterCondition(
147-
packageName,
148-
false,
149-
cond
150-
)
151-
)
152-
153-
// メッセージ条件の更新
154-
saveFilterConditionUseCase(SaveFilterConditionUseCase.Args(app, updatedCond))
155-
assertThat(loadFilterConditionUseCase(app)).isEqualTo(
156-
FilterCondition(
157-
packageName,
158-
false,
159-
updatedCond
160-
)
161-
)
162-
163-
// サマリー条件の更新
164-
toggleIgnoreSummaryUseCase.invoke(ToggleIgnoreSummaryUseCase.Args(app))
165-
assertThat(loadFilterConditionUseCase(app)).isEqualTo(
166-
FilterCondition(
167-
packageName,
168-
true,
169-
updatedCond
170-
)
171-
)
172-
}
173-
}
174-
175-
@Test
176-
fun `IPアドレスの追加、更新_成功、成功`() {
177-
val host = "192.168.11.4"
178-
val port = 5555
179-
val addr = "$host:$port"
180-
assertThat(saveAddressUseCase(addr).getOrNull()).isNotNull()
181-
assertThat(loadAddressUseCase()).isEqualTo(addr)
182-
183-
val updatedHost = "192.168.11.2"
184-
val updatedPort = 3456
185-
val updatedAddr = "$updatedHost:$updatedPort"
186-
assertThat(saveAddressUseCase(updatedAddr).getOrNull()).isNotNull()
187-
assertThat(loadAddressUseCase()).isEqualTo(updatedAddr)
188-
}
189-
190-
@Test
191-
fun `IPアドレスの追加、更新_成功、失敗`() {
192-
val host = "192.168.11.4"
193-
val port = 5555
194-
val addr = "$host:$port"
195-
assertThat(saveAddressUseCase(addr).getOrNull()).isNotNull()
196-
assertThat(loadAddressUseCase()).isEqualTo(addr)
197-
198-
val updatedHost = "192.168.11.2"
199-
val updatedAddr = "$updatedHost:"
200-
assertThat(saveAddressUseCase(updatedAddr).exceptionOrNull()).isNotNull()
201-
assertThat(loadAddressUseCase()).isEqualTo(addr)
202-
}
203-
204-
@Test
205-
fun `IPアドレスの追加_失敗_hostなし`() {
206-
val port = 5555
207-
val addr = ":$port"
208-
assertThat(saveAddressUseCase(addr).exceptionOrNull()).isNotNull()
209-
}
210-
211-
@Test
212-
fun `IPアドレスの追加_失敗_portなし`() {
213-
val host = "192.168.11.4"
214-
val addr = "$host:"
215-
assertThat(saveAddressUseCase(addr).exceptionOrNull()).isNotNull()
216-
}
217-
218-
@Test
219-
fun `IPアドレスの追加_失敗_portが数値じゃない`() {
220-
val host = "192.168.11.4"
221-
val addr = "$host:test"
222-
assertThat(saveAddressUseCase(addr).exceptionOrNull()).isNotNull()
223-
}
224-
225-
@Test
226-
fun `通知送信_失敗`() {
227-
runTest(testDispatcher) {
228-
assertThat(notifyUseCase("通知テスト").exceptionOrNull()).isNotNull()
229-
}
230-
}
231-
232-
@Test
233-
@LocalOnly
234-
fun `通知送信_成功`() {
235-
// CI環境で実行しないようにする
236-
assumeTrue("Local only", System.getenv("CI") == null)
237-
238-
runTest(testDispatcher) {
239-
val host = "192.168.10.18" // テスト環境のIPアドレスに変更する
240-
val port = 8484
241-
val addr = "$host:$port"
242-
saveAddressUseCase(addr)
243-
assertThat(notifyUseCase("通知テスト").getOrNull()).isNotNull()
244-
}
245-
}
246-
24785
@Test
24886
fun `バックアップ、復元`() {
24987
val uri = Uri.fromFile(File.createTempFile(ExportFileName, null, exportFile))
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package me.nya_n.notificationnotifier
2+
3+
@Target(AnnotationTarget.FUNCTION)
4+
@Retention(AnnotationRetention.RUNTIME)
5+
annotation class LocalOnly
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package me.nya_n.notificationnotifier
2+
3+
import com.google.common.truth.Truth.assertThat
4+
import io.mockk.Runs
5+
import io.mockk.every
6+
import io.mockk.just
7+
import io.mockk.mockk
8+
import io.mockk.mockkStatic
9+
import kotlinx.coroutines.ExperimentalCoroutinesApi
10+
import kotlinx.coroutines.test.UnconfinedTestDispatcher
11+
import kotlinx.coroutines.test.runTest
12+
import me.nya_n.notificationnotifier.data.repository.AppRepository
13+
import me.nya_n.notificationnotifier.data.repository.UserSettingsRepository
14+
import me.nya_n.notificationnotifier.domain.usecase.NotifyUseCase
15+
import me.nya_n.notificationnotifier.domain.usecase.SaveAddressUseCase
16+
import me.nya_n.notificationnotifier.domain.usecase.impl.LoadAppUseCaseImpl
17+
import me.nya_n.notificationnotifier.domain.usecase.impl.NotifyUseCaseImpl
18+
import me.nya_n.notificationnotifier.domain.usecase.impl.SaveAddressUseCaseImpl
19+
import me.nya_n.notificationnotifier.model.AppException.PermissionDeniedException
20+
import me.nya_n.notificationnotifier.model.InstalledApp
21+
import me.nya_n.notificationnotifier.model.UserSettings
22+
import org.junit.Assume.assumeTrue
23+
import org.junit.Before
24+
import org.junit.Test
25+
26+
@Suppress("NonAsciiCharacters", "RemoveRedundantBackticks")
27+
class UseCaseTest {
28+
@OptIn(ExperimentalCoroutinesApi::class)
29+
private val testDispatcher = UnconfinedTestDispatcher()
30+
private val userSettingsRepository: UserSettingsRepository = mockk()
31+
private val appRepository: AppRepository = mockk()
32+
33+
private lateinit var loadAppUseCase: LoadAppUseCaseImpl
34+
private lateinit var saveAddressUseCase: SaveAddressUseCase
35+
private lateinit var notifyUseCase: NotifyUseCase
36+
37+
@Before
38+
fun setUp() {
39+
loadAppUseCase = LoadAppUseCaseImpl(userSettingsRepository, appRepository, testDispatcher)
40+
saveAddressUseCase = SaveAddressUseCaseImpl(userSettingsRepository)
41+
notifyUseCase = NotifyUseCaseImpl(userSettingsRepository, testDispatcher)
42+
43+
mockkStatic(android.text.TextUtils::class)
44+
every { android.text.TextUtils.isDigitsOnly(any()) } answers {
45+
val str = it.invocation.args[0] as? CharSequence
46+
str?.all { char -> char.isDigit() } == true
47+
}
48+
}
49+
50+
@Test
51+
fun `インストール済みアプリの取得_許可あり`() {
52+
every { userSettingsRepository.getUserSettings() } returns UserSettings("", 0, true)
53+
every { appRepository.loadInstalledAppList() } returns listOf(InstalledApp("", ""))
54+
55+
val ret = loadAppUseCase.loadInstalledAppList()
56+
assertThat(ret.getOrNull()).apply {
57+
isNotNull()
58+
isNotEmpty()
59+
}
60+
}
61+
62+
@Test
63+
fun `インストール済みアプリの取得_許可なし`() {
64+
every { userSettingsRepository.getUserSettings() } returns UserSettings("", 0, false)
65+
every { appRepository.loadInstalledAppList() } throws PermissionDeniedException()
66+
67+
val ret = loadAppUseCase.loadInstalledAppList()
68+
assertThat(ret.exceptionOrNull()).apply {
69+
isNotNull()
70+
isInstanceOf(PermissionDeniedException::class.java)
71+
}
72+
}
73+
74+
@Test
75+
fun `IPアドレスの追加_成功`() {
76+
every { userSettingsRepository.getUserSettings() } returns UserSettings(
77+
"192.168.10.18",
78+
8484,
79+
true
80+
)
81+
every { userSettingsRepository.saveUserSettings(any()) } just Runs
82+
83+
assertThat(saveAddressUseCase("192.168.10.18:8484").getOrNull()).isNotNull()
84+
}
85+
86+
@Test
87+
fun `IPアドレスの追加_失敗_portなし`() {
88+
assertThat(saveAddressUseCase("192.168.11.4").exceptionOrNull()).isNotNull()
89+
}
90+
91+
@Test
92+
fun `IPアドレスの追加_失敗_hostなし`() {
93+
assertThat(saveAddressUseCase(":8484").exceptionOrNull()).isNotNull()
94+
}
95+
96+
@Test
97+
fun `IPアドレスの追加_失敗_portが数値じゃない`() {
98+
assertThat(saveAddressUseCase("192.168.10.18:not_number").exceptionOrNull()).isNotNull()
99+
}
100+
101+
@Test
102+
fun `通知送信_失敗`() {
103+
runTest(testDispatcher) {
104+
assertThat(notifyUseCase("通知テスト").exceptionOrNull()).isNotNull()
105+
}
106+
}
107+
108+
@Test
109+
@LocalOnly
110+
fun `通知送信_成功`() {
111+
// CI環境で実行しないようにする
112+
assumeTrue("Local only", System.getenv("CI") == null)
113+
114+
// テスト環境のIPアドレスに変更する
115+
every { userSettingsRepository.getUserSettings() } returns UserSettings(
116+
"192.168.10.18",
117+
8484,
118+
true
119+
)
120+
121+
runTest(testDispatcher) {
122+
assertThat(notifyUseCase("通知テスト").getOrNull()).isNotNull()
123+
}
124+
}
125+
}

0 commit comments

Comments
 (0)