Skip to content

Commit 15c3aa4

Browse files
authored
Merge branch 'dev' into feature/dao-test-test
2 parents c26691d + be198e1 commit 15c3aa4

File tree

9 files changed

+257
-73
lines changed

9 files changed

+257
-73
lines changed

.github/workflows/dev-test.yml

Lines changed: 43 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,36 @@
11
name: Unit Test
2-
32
on:
43
pull_request:
54
branches: [ "dev" ]
6-
75
jobs:
86
unit_test:
97
runs-on: ubuntu-latest
10-
118
steps:
129
- name: Checkout
1310
uses: actions/checkout@v3
14-
1511
- name: Get changed files
1612
id: changed_files
1713
uses: tj-actions/changed-files@v45
18-
1914
- name: Filter out test files
2015
id: test_files
2116
run: |
2217
echo "Changed files: ${{ steps.changed_files.outputs.all_changed_files }}"
23-
2418
TEST_FILES=$(echo "${{ steps.changed_files.outputs.all_changed_files }}" \
2519
| tr ' ' '\n' \
2620
| grep -E '^.+/src/test/(java|kotlin)/.+\.(kt|java)$' || true)
2721
echo "Filtered by grep: $TEST_FILES"
28-
2922
TEST_FILES=$(echo "$TEST_FILES" \
3023
| sed -E 's/^(.+)\/src\/test\/(java|kotlin)\/(.+)\.(kt|java)$/\1 \3/' \
3124
| sed 's/\//./g')
3225
echo "Processed by sed: $TEST_FILES"
33-
3426
TEST_FILES_SINGLE_LINE=$(echo "$TEST_FILES" | tr '\n' ' ')
3527
echo "TEST_FILES=$TEST_FILES_SINGLE_LINE" >> $GITHUB_ENV
36-
3728
echo "$TEST_FILES" > test_files.txt
38-
3929
if [ -n "$(cat test_files.txt | xargs)" ]; then
4030
echo "any_changed=true" >> $GITHUB_ENV
4131
else
4232
echo "any_changed=false" >> $GITHUB_ENV
4333
fi
44-
4534
- name: Debug Changed Files
4635
run: |
4736
if [ -f test_files.txt ]; then
@@ -53,35 +42,63 @@ jobs:
5342
5443
# Check the "any_changed" environment variable
5544
echo "files changed: ${{ env.any_changed }}"
56-
5745
- name: setup JDK
5846
if: env.any_changed == 'true'
5947
uses: actions/setup-java@v4
60-
6148
with:
6249
distribution: 'corretto'
6350
java-version: '17'
64-
6551
- name: setup Android SDK
6652
if: env.any_changed == 'true'
6753
uses: android-actions/setup-android@v3
68-
6954
- name: Run unit tests
7055
if: env.any_changed == 'true'
7156
run: |
7257
chmod +x gradlew
73-
cat test_files.txt | while IFS=$'\n' read -r LINE; do
74-
MODULE=$(echo "$LINE" | awk '{print $1}')
75-
TEST_CLASS=$(echo "$LINE" | awk '{print $2}')
76-
77-
MODULE=$(echo "$MODULE" | sed 's|\.|:|g')
78-
79-
echo "MODULE: $MODULE"
80-
echo "TEST_CLASS: $TEST_CLASS"
58+
while IFS=$'\n' read -r LINE; do
59+
60+
# 1) 원본 변수 추출
61+
MODULE_RAW=$(echo "$LINE" | awk '{print $1}') # 예: "core.data"
62+
TEST_CLASS_RAW=$(echo "$LINE" | awk '{print $2}') # 예: "kr.co.data.dummy.DummyInstances"
63+
echo "MODULE_RAW: $MODULE_RAW"
64+
echo "TEST_CLASS_RAW: $TEST_CLASS_RAW"
65+
66+
# 2) Gradle 태스크용 모듈(예: "core.data" -> "core:data")
67+
MODULE_GRADLE=$(echo "$MODULE_RAW" | sed 's|\.|:|g')
68+
69+
# 3) 파일 경로용 모듈(예: "core.data" -> "core/data")
70+
MODULE_PATH=$(echo "$MODULE_RAW" | sed 's|\.|/|g')
71+
72+
# 클래스 경로도 마찬가지
73+
CLASS_PATH=$(echo "$TEST_CLASS_RAW" | sed 's|\.|/|g')
74+
75+
# 4) 실제로 찾을 .kt 파일 경로
76+
KT_FILE_JAVA="${MODULE_PATH}/src/test/java/${CLASS_PATH}.kt"
77+
KT_FILE_KOTLIN="${MODULE_PATH}/src/test/kotlin/${CLASS_PATH}.kt"
78+
echo "KT_FILE_JAVA: $KT_FILE_JAVA"
79+
echo "KT_FILE_KOTLIN: $KT_FILE_KOTLIN"
80+
if [ -f "$KT_FILE_JAVA" ]; then
81+
if ! grep -q '@Test' "$KT_FILE_JAVA"; then
82+
echo "No @Test found in $KT_FILE_JAVA. Skipping..."
83+
continue
84+
fi
85+
SELECTED_FILE="$KT_FILE_JAVA"
86+
elif [ -f "$KT_FILE_KOTLIN" ]; then
87+
if ! grep -q '@Test' "$KT_FILE_KOTLIN"; then
88+
echo "No @Test found in $KT_FILE_KOTLIN. Skipping..."
89+
continue
90+
fi
91+
SELECTED_FILE="$KT_FILE_KOTLIN"
92+
else
93+
echo "No .kt file found in java/kotlin folder. Skipping..."
94+
continue
95+
fi
96+
97+
# 5) @Test가 있는 파일을 찾았다면 Gradle 실행
98+
echo "Running: ./gradlew :$MODULE_GRADLE:testDebugUnitTest --tests \"$TEST_CLASS_RAW\""
99+
./gradlew :"$MODULE_GRADLE":testDebugUnitTest --tests "$TEST_CLASS_RAW" --scan || exit 1
100+
done < test_files.txt
81101
82-
echo "Running: ./gradlew :$MODULE:testDebugUnitTest --tests \"$TEST_CLASS\""
83-
./gradlew :$MODULE:testDebugUnitTest --tests "$TEST_CLASS" --scan || exit 1
84-
done
85102
86103
- name: Test Result
87104
uses: EnricoMi/publish-unit-test-result-action@v2

core/data/build.gradle.kts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ plugins {
44
alias(libs.plugins.seedocs.library)
55
}
66

7-
android {
8-
setNamespace("core.data")
9-
}
7+
setNamespace("core.data")
108

119
dependencies {
1210
api(projects.core.model)

core/data/src/main/java/kr/co/data/di/RepositoryModule.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package kr.co.data.di
22

3-
import kr.co.data.mapper.BookmarkMapper
3+
import kr.co.data.mapper.BookmarkFileMapper
44
import kr.co.data.mapper.FileInfoMapper
55
import kr.co.data.mapper.RecentFileMapper
66
import kr.co.data.repository.BookmarkRepository
@@ -13,7 +13,7 @@ val repositoryModule =
1313
module {
1414

1515
factory { RecentFileMapper() }
16-
factory { BookmarkMapper() }
16+
factory { BookmarkFileMapper() }
1717
factory { FileInfoMapper() }
1818

1919
single<RecentRepository> {
@@ -27,7 +27,7 @@ val repositoryModule =
2727
single<BookmarkRepository> {
2828
BookmarkRepositoryImpl(
2929
dao = get(),
30-
toBookmark = get<BookmarkMapper>(),
30+
toBookmark = get<BookmarkFileMapper>(),
3131
toFileInfo = get<FileInfoMapper>()
3232
)
3333
}

core/data/src/main/java/kr/co/data/mapper/BookmarkMapper.kt renamed to core/data/src/main/java/kr/co/data/mapper/BookmarkFileMapper.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import kr.co.database.model.BookmarkFile
55
import kr.co.database.model.FileType
66
import kr.co.model.FileInfo
77

8-
internal class BookmarkMapper : Mapper<FileInfo, BookmarkFile> {
8+
internal class BookmarkFileMapper : Mapper<FileInfo, BookmarkFile> {
99
override fun invoke(from: FileInfo): BookmarkFile =
1010
BookmarkFile(
1111
name = from.name,

core/data/src/main/java/kr/co/data/repository/BookmarkRepositoryImpl.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ package kr.co.data.repository
22

33
import kotlinx.coroutines.flow.Flow
44
import kotlinx.coroutines.flow.map
5-
import kr.co.data.mapper.BookmarkMapper
5+
import kr.co.data.mapper.BookmarkFileMapper
66
import kr.co.data.mapper.FileInfoMapper
77
import kr.co.database.dao.BookmarkFileDao
88
import kr.co.model.FileInfo
99

1010
internal class BookmarkRepositoryImpl(
1111
private val dao: BookmarkFileDao,
12-
private val toBookmark: BookmarkMapper,
12+
private val toBookmark: BookmarkFileMapper,
1313
private val toFileInfo: FileInfoMapper,
1414
) : BookmarkRepository {
1515
override suspend fun insert(bookmarkFile: FileInfo) =
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package kr.co.data.dummy
2+
3+
import kr.co.database.model.BookmarkFile
4+
import kr.co.database.model.FileType
5+
import kr.co.database.model.RecentFile
6+
import kr.co.model.FileInfo
7+
import org.junit.Ignore
8+
import java.time.LocalDateTime
9+
10+
@Ignore("test instance")
11+
internal object DummyInstances {
12+
val PDF_DUMMY = FileInfo(
13+
name = "DUMMY.pdf",
14+
path = "",
15+
type = FileInfo.Type.PDF,
16+
isDirectory = false,
17+
isHidden = false,
18+
size = 0,
19+
createdAt = LocalDateTime.of(2024,6,2,2,0),
20+
lastModified = LocalDateTime.of(2024,6,2,2,0)
21+
)
22+
23+
val RECENT_DUMMY = RecentFile(
24+
name = "DUMMY.pdf",
25+
path = "",
26+
type = FileType.PDF,
27+
size = 0,
28+
createdAt = LocalDateTime.of(2024,6,2,2,0),
29+
lastModified = LocalDateTime.of(2024,6,2,2,0)
30+
)
31+
32+
val BOOKMARK_DUMMY = BookmarkFile(
33+
name = "DUMMY.pdf",
34+
path = "",
35+
type = FileType.PDF,
36+
size = 0,
37+
createdAt = LocalDateTime.of(2024,6,2,2,0),
38+
lastModified = LocalDateTime.of(2024,6,2,2,0)
39+
)
40+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package kr.co.data.mapper
2+
3+
import junit.framework.TestCase.assertEquals
4+
import kr.co.data.dummy.DummyInstances
5+
import kr.co.testing.util.assertsEquals
6+
import org.junit.Test
7+
8+
internal class MapperTest {
9+
10+
private val bookmarkFileMapper = BookmarkFileMapper()
11+
private val recentFileMapper = RecentFileMapper()
12+
private val fileInfoMapper = FileInfoMapper()
13+
14+
@Test
15+
fun `Given a file when invoke is called then bookmark file is returned`() {
16+
val file = DummyInstances.PDF_DUMMY
17+
val bookmarkFile = DummyInstances.BOOKMARK_DUMMY
18+
19+
val result = bookmarkFileMapper(file)
20+
21+
assertEquals(bookmarkFile.copy(updatedAt = result.updatedAt), result)
22+
}
23+
24+
@Test
25+
fun `Given a file when invoke is called then recent file is returned`() {
26+
val file = DummyInstances.PDF_DUMMY
27+
val recentFile = DummyInstances.RECENT_DUMMY
28+
29+
val result = recentFileMapper(file)
30+
31+
assertEquals(recentFile.copy(updatedAt = result.updatedAt), result)
32+
}
33+
34+
@Test
35+
fun `Given a file when invoke is called then file info is returned`() {
36+
val bookmarkFile = DummyInstances.BOOKMARK_DUMMY
37+
val recentFile = DummyInstances.RECENT_DUMMY
38+
val file = DummyInstances.PDF_DUMMY
39+
40+
val result = fileInfoMapper(bookmarkFile)
41+
val result2 = fileInfoMapper(recentFile)
42+
43+
assertsEquals(
44+
file to result,
45+
file to result2
46+
)
47+
}
48+
}

core/data/src/test/kotlin/kr/co/data/repository/BookmarkRepositoryImplTest.kt

Lines changed: 15 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,19 @@ import io.mockk.MockKAnnotations
44
import io.mockk.Runs
55
import io.mockk.coEvery
66
import io.mockk.coVerify
7+
import io.mockk.every
78
import io.mockk.impl.annotations.MockK
89
import io.mockk.just
10+
import io.mockk.verify
911
import kotlinx.coroutines.flow.flowOf
1012
import kotlinx.coroutines.test.runTest
11-
import kr.co.data.mapper.BookmarkMapper
13+
import kr.co.data.dummy.DummyInstances
14+
import kr.co.data.mapper.BookmarkFileMapper
1215
import kr.co.data.mapper.FileInfoMapper
1316
import kr.co.database.dao.BookmarkFileDao
14-
import kr.co.database.model.BookmarkFile
15-
import kr.co.database.model.FileType
16-
import kr.co.model.FileInfo
1717
import kr.co.testing.util.testWithItem
1818
import org.junit.Before
1919
import org.junit.Test
20-
import java.time.LocalDateTime
2120
import kotlin.test.assertEquals
2221

2322
internal class BookmarkRepositoryImplTest {
@@ -26,7 +25,7 @@ internal class BookmarkRepositoryImplTest {
2625
private lateinit var dao: BookmarkFileDao
2726

2827
@MockK
29-
private lateinit var toBookmark : BookmarkMapper
28+
private lateinit var toBookmark : BookmarkFileMapper
3029

3130
@MockK
3231
private lateinit var toFileInfo : FileInfoMapper
@@ -41,10 +40,10 @@ internal class BookmarkRepositoryImplTest {
4140

4241
@Test
4342
fun `Given a file when insert is called then dao insert is called`() = runTest {
44-
val file = PDF_DUMMY
45-
val bookmarkFile = BOOKMARK_DUMMY
43+
val file = DummyInstances.PDF_DUMMY
44+
val bookmarkFile = DummyInstances.BOOKMARK_DUMMY
4645

47-
coEvery { toBookmark(file) } returns bookmarkFile
46+
every { toBookmark(file) } returns bookmarkFile
4847
coEvery { dao.insert(bookmarkFile) } just Runs
4948

5049
repository.insert(file)
@@ -54,51 +53,29 @@ internal class BookmarkRepositoryImplTest {
5453

5554
@Test
5655
fun `Given a unit when get is called then dao get is called`() = runTest {
57-
val bookmarkFiles = listOf(BOOKMARK_DUMMY)
58-
val files = listOf(PDF_DUMMY)
56+
val bookmarkFiles = listOf(DummyInstances.BOOKMARK_DUMMY)
57+
val files = listOf(DummyInstances.PDF_DUMMY)
5958

6059
coEvery { dao.get() } returns flowOf(bookmarkFiles)
61-
coEvery { toFileInfo(BOOKMARK_DUMMY) } returns PDF_DUMMY
60+
coEvery { toFileInfo(DummyInstances.BOOKMARK_DUMMY) } returns DummyInstances.PDF_DUMMY
6261

6362
repository.get().testWithItem {
6463
assertEquals(files, this)
6564
}
6665

67-
coVerify { dao.get() }
66+
verify { dao.get() }
6867
}
6968

7069
@Test
7170
fun `Given a file when delete is called then dao delete is called`() = runTest {
72-
val file = PDF_DUMMY
73-
val bookmarkFile = BOOKMARK_DUMMY
71+
val file = DummyInstances.PDF_DUMMY
72+
val bookmarkFile = DummyInstances.BOOKMARK_DUMMY
7473

75-
coEvery { toBookmark(file) } returns bookmarkFile
74+
every { toBookmark(file) } returns bookmarkFile
7675
coEvery { dao.delete(bookmarkFile) } just Runs
7776

7877
repository.delete(file)
7978

8079
coVerify { dao.delete(bookmarkFile) }
8180
}
82-
83-
private companion object {
84-
val PDF_DUMMY = FileInfo(
85-
name = "DUMMY.pdf",
86-
path = "",
87-
type = FileInfo.Type.PDF,
88-
isDirectory = false,
89-
isHidden = false,
90-
size = 0,
91-
createdAt = LocalDateTime.of(2024,6,2,2,0),
92-
lastModified = LocalDateTime.of(2024,6,2,2,0)
93-
)
94-
95-
val BOOKMARK_DUMMY = BookmarkFile(
96-
name = "DUMMY.pdf",
97-
path = "",
98-
type = FileType.PDF,
99-
size = 0,
100-
createdAt = LocalDateTime.of(2024,6,2,2,0),
101-
lastModified = LocalDateTime.of(2024,6,2,2,0)
102-
)
103-
}
10481
}

0 commit comments

Comments
 (0)