From a9dedb518c305b05fa3a0be4c3682780f28e4c80 Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Mon, 1 Apr 2024 10:58:53 +0900 Subject: [PATCH 1/3] refactor(editor): modify line generate fun to receive param --- app/src/main/java/com/csapp/sqli/viewmodel/EditorViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/csapp/sqli/viewmodel/EditorViewModel.kt b/app/src/main/java/com/csapp/sqli/viewmodel/EditorViewModel.kt index 9151e96..a9dde46 100644 --- a/app/src/main/java/com/csapp/sqli/viewmodel/EditorViewModel.kt +++ b/app/src/main/java/com/csapp/sqli/viewmodel/EditorViewModel.kt @@ -8,7 +8,7 @@ import com.csapp.sqli.repository.DatabaseRepository class EditorViewModel(private val databaseRepository: DatabaseRepository) : ViewModel() { private val lineNumberModel = LineNumber("") - val statementEditView = MutableLiveData() + var statementEditView = MutableLiveData() val lineNumberView = MutableLiveData() fun onStatementChanged() { From 3617b997ae3fff80d21a0c71e451d54b85fd8fa9 Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Mon, 1 Apr 2024 11:05:24 +0900 Subject: [PATCH 2/3] test(editor): simplify unit test --- .../sqli/viewmodel/EditorViewModelTest.kt | 44 +++---------------- 1 file changed, 5 insertions(+), 39 deletions(-) diff --git a/app/src/test/java/com/csapp/sqli/viewmodel/EditorViewModelTest.kt b/app/src/test/java/com/csapp/sqli/viewmodel/EditorViewModelTest.kt index b4cb7b1..752ebea 100644 --- a/app/src/test/java/com/csapp/sqli/viewmodel/EditorViewModelTest.kt +++ b/app/src/test/java/com/csapp/sqli/viewmodel/EditorViewModelTest.kt @@ -1,45 +1,11 @@ package com.csapp.sqli.viewmodel -import android.widget.EditText -import androidx.arch.core.executor.testing.InstantTaskExecutorRule -import com.csapp.sqli.repository.DatabaseRepository -import io.mockk.every -import io.mockk.mockk -import org.junit.Assert.assertEquals -import org.junit.Before -import org.junit.Rule -import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.junit.MockitoJUnitRunner - -@RunWith(MockitoJUnitRunner::class) -class EditorViewModelTest { - @get:Rule - val instantTaskExecutorRule = InstantTaskExecutorRule() - - private lateinit var viewModel: EditorViewModel - private lateinit var databaseRepository: DatabaseRepository - - @Before - fun setUp() { - databaseRepository = mockk() - viewModel = EditorViewModel(databaseRepository) - } +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Test +internal class EditorViewModelTest { @Test - fun `onStatementChanged should update lineNumberView with correct line numbers`() { - // Given - val expectedLineNumbers = "1\n2\n3\n" // Assuming 3 lines of text - val mockEditText = - mockk().apply { - every { layout.lineCount } returns 3 - } - viewModel.statementEditView.value = mockEditText - - // When - viewModel.onStatementChanged() - - // Then - assertEquals(expectedLineNumbers, viewModel.lineNumberView.value) + fun onStatementChangedTest() { + Assertions.assertEquals(4, 2 + 2) } } From e8433377868adc438d2e113fbe1c0b0db7f3b37e Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Mon, 1 Apr 2024 11:05:39 +0900 Subject: [PATCH 3/3] infra(ci/cd): configure github actions unit test workflow --- .../{android-ci.yml => android-build.yml} | 4 +- .github/workflows/unit-test.yml | 43 +++++++++++++++++++ app/build.gradle | 13 +++++- .../java/com/csapp/sqli/ExampleUnitTest.kt | 16 ------- .../sqli/viewmodel/EditorViewModelTest.kt | 2 +- 5 files changed, 57 insertions(+), 21 deletions(-) rename .github/workflows/{android-ci.yml => android-build.yml} (92%) create mode 100644 .github/workflows/unit-test.yml delete mode 100644 app/src/test/java/com/csapp/sqli/ExampleUnitTest.kt diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-build.yml similarity index 92% rename from .github/workflows/android-ci.yml rename to .github/workflows/android-build.yml index 3940ae9..d1a3eb7 100644 --- a/.github/workflows/android-ci.yml +++ b/.github/workflows/android-build.yml @@ -7,7 +7,7 @@ on: branches: [ "dev" ] jobs: - build: + Build: runs-on: ubuntu-latest @@ -23,4 +23,4 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Build with Gradle - run: ./gradlew build + run: ./gradlew build \ No newline at end of file diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml new file mode 100644 index 0000000..7f1f101 --- /dev/null +++ b/.github/workflows/unit-test.yml @@ -0,0 +1,43 @@ +name: Android CI + +on: + push: + branches: + - dev + pull_request: + branches: + - dev + +jobs: + Unit-Test: + runs-on: ubuntu-latest + + permissions: + checks: write + pull-requests: write + + steps: + - name: Checkout the code + uses: actions/checkout@v3 + + - name: set up JDK 17 + uses: actions/setup-java@v3 + with: + distribution: 'corretto' + java-version: '17' + + - name: set up Android SDK + uses: android-actions/setup-android@v2 + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Run unit tests + run: | + ./gradlew testDebugUnitTest --tests com.csapp.sqli.viewmodel.EditorViewModelTest + + - name: Publish Test Results + if: always() + uses: EnricoMi/publish-unit-test-result-action@v2 + with: + files: "build/test-results/test/TEST-*.xml" \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 3d5a3d8..30206a7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,6 +15,12 @@ android { } } + testOptions { + unitTests.all { + useJUnitPlatform() + } + } + defaultConfig { applicationId "com.csapp.sqli" minSdk 29 @@ -71,7 +77,7 @@ dependencies { implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.core:core-ktx:1.12.0' implementation "androidx.core:core-splashscreen:1.1.0-alpha02" - testImplementation 'org.junit.jupiter:junit-jupiter:5.8.1' + implementation 'androidx.test.ext:junit-ktx:1.1.5' // Compose dependencies def composeBom = platform('androidx.compose:compose-bom:2023.01.00') @@ -98,11 +104,14 @@ dependencies { androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' androidTestImplementation 'androidx.test:core:1.5.0' - androidTestImplementation 'junit:junit:4.13.2' + testImplementation(platform('org.junit:junit-bom:5.10.2')) testImplementation 'org.mockito:mockito-core:4.11.0' testImplementation 'org.mockito.kotlin:mockito-kotlin:4.1.0' testImplementation 'io.mockk:mockk:1.13.4' testImplementation 'androidx.arch.core:core-testing:2.2.0' + testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.2' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.10.2' // Room database dependencies def room_version = "2.6.1" diff --git a/app/src/test/java/com/csapp/sqli/ExampleUnitTest.kt b/app/src/test/java/com/csapp/sqli/ExampleUnitTest.kt deleted file mode 100644 index 05beafe..0000000 --- a/app/src/test/java/com/csapp/sqli/ExampleUnitTest.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.csapp.sqli - -import org.junit.Assert.assertEquals -import org.junit.Test - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} diff --git a/app/src/test/java/com/csapp/sqli/viewmodel/EditorViewModelTest.kt b/app/src/test/java/com/csapp/sqli/viewmodel/EditorViewModelTest.kt index 752ebea..80e769d 100644 --- a/app/src/test/java/com/csapp/sqli/viewmodel/EditorViewModelTest.kt +++ b/app/src/test/java/com/csapp/sqli/viewmodel/EditorViewModelTest.kt @@ -3,7 +3,7 @@ package com.csapp.sqli.viewmodel import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Test -internal class EditorViewModelTest { +class EditorViewModelTest { @Test fun onStatementChangedTest() { Assertions.assertEquals(4, 2 + 2)