From 1035a2b8c84f30421de94fd9b4aba815af9b5a0f Mon Sep 17 00:00:00 2001 From: Bitmap Date: Sat, 9 Mar 2024 19:13:14 +0530 Subject: [PATCH] - Updated Compose version from 1.3.0 to 1.6.0 - Added UI Test Dependencies - Added Workflow to automatically run test cases on commit. --- .github/workflows/workflow.yml | 34 +++++++++++ build.gradle.kts | 7 ++- gradle.properties | 2 +- src/jvmMain/kotlin/Main.kt | 8 +-- src/jvmMain/kotlin/{theme => ui}/Styles.kt | 2 +- .../kotlin/{theme => ui}/Typography.kt | 2 +- .../components/CheckboxWithText.kt | 10 ++- .../components/ChooseFileTextField.kt | 4 +- .../components/CustomTextField.kt | 4 +- src/jvmMain/kotlin/utils/Constant.kt | 3 +- src/jvmMain/kotlin/utils/TestTags.kt | 6 ++ .../ui/components/CheckboxWithTextTest.kt | 61 +++++++++++++++++++ 12 files changed, 127 insertions(+), 16 deletions(-) create mode 100644 .github/workflows/workflow.yml rename src/jvmMain/kotlin/{theme => ui}/Styles.kt (98%) rename src/jvmMain/kotlin/{theme => ui}/Typography.kt (99%) rename src/jvmMain/kotlin/{theme => ui}/components/CheckboxWithText.kt (91%) rename src/jvmMain/kotlin/{theme => ui}/components/ChooseFileTextField.kt (98%) rename src/jvmMain/kotlin/{theme => ui}/components/CustomTextField.kt (98%) create mode 100644 src/jvmMain/kotlin/utils/TestTags.kt create mode 100644 src/jvmTest/kotlin/ui/components/CheckboxWithTextTest.kt diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml new file mode 100644 index 0000000..3f8efca --- /dev/null +++ b/.github/workflows/workflow.yml @@ -0,0 +1,34 @@ +name: Run Tests + +on: + push: + branches: + - main + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK + uses: actions/setup-java@v2 + with: + distribution: 'adopt' + java-version: '11' + + - name: Set execute permissions for gradlew + run: chmod +x ./gradlew + + - name: Cache Gradle dependencies + uses: actions/cache@v2 + with: + path: ~/.gradle/caches + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: Run tests + run: ./gradlew test diff --git a/build.gradle.kts b/build.gradle.kts index 2806e83..1275e6a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -26,7 +26,12 @@ kotlin { api("com.esotericsoftware:kryo:4.0.1") } } - val jvmTest by getting + val jvmTest by getting { + dependencies { + implementation(compose.desktop.uiTestJUnit4) + implementation(compose.desktop.currentOs) + } + } val resourcesDir = "src/common/resources" } } diff --git a/gradle.properties b/gradle.properties index b70abdd..362b3b4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ kotlin.code.style=official kotlin.version=1.8.0 agp.version=7.3.0 -compose.version=1.3.0 \ No newline at end of file +compose.version=1.6.0 \ No newline at end of file diff --git a/src/jvmMain/kotlin/Main.kt b/src/jvmMain/kotlin/Main.kt index 346c3d3..f6eeaa1 100644 --- a/src/jvmMain/kotlin/Main.kt +++ b/src/jvmMain/kotlin/Main.kt @@ -20,10 +20,10 @@ import androidx.compose.ui.window.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import local.FileStorageHelper -import theme.Styles -import theme.components.CheckboxWithText -import theme.components.ChooseFileTextField -import theme.components.CustomTextField +import ui.Styles +import ui.components.CheckboxWithText +import ui.components.ChooseFileTextField +import ui.components.CustomTextField import utils.* import java.awt.Desktop import java.awt.FileDialog diff --git a/src/jvmMain/kotlin/theme/Styles.kt b/src/jvmMain/kotlin/ui/Styles.kt similarity index 98% rename from src/jvmMain/kotlin/theme/Styles.kt rename to src/jvmMain/kotlin/ui/Styles.kt index 4d61e80..9a47e0a 100644 --- a/src/jvmMain/kotlin/theme/Styles.kt +++ b/src/jvmMain/kotlin/ui/Styles.kt @@ -1,4 +1,4 @@ -package theme +package ui import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight diff --git a/src/jvmMain/kotlin/theme/Typography.kt b/src/jvmMain/kotlin/ui/Typography.kt similarity index 99% rename from src/jvmMain/kotlin/theme/Typography.kt rename to src/jvmMain/kotlin/ui/Typography.kt index 22249f2..1934935 100644 --- a/src/jvmMain/kotlin/theme/Typography.kt +++ b/src/jvmMain/kotlin/ui/Typography.kt @@ -1,4 +1,4 @@ -package theme +package ui import androidx.compose.material.Typography import androidx.compose.ui.text.TextStyle diff --git a/src/jvmMain/kotlin/theme/components/CheckboxWithText.kt b/src/jvmMain/kotlin/ui/components/CheckboxWithText.kt similarity index 91% rename from src/jvmMain/kotlin/theme/components/CheckboxWithText.kt rename to src/jvmMain/kotlin/ui/components/CheckboxWithText.kt index 2635fab..ed92aea 100644 --- a/src/jvmMain/kotlin/theme/components/CheckboxWithText.kt +++ b/src/jvmMain/kotlin/ui/components/CheckboxWithText.kt @@ -1,4 +1,4 @@ -package theme.components +package ui.components import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.TooltipArea @@ -16,12 +16,14 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.shadow import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.loadSvgPainter import androidx.compose.ui.res.useResource import androidx.compose.ui.unit.DpOffset import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import theme.Styles +import ui.Styles +import utils.TestTags @OptIn(ExperimentalFoundationApi::class) @Composable @@ -32,10 +34,12 @@ fun CheckboxWithText(label: String, isChecked: Boolean, onCheckedChange: (Boolea modifier = Modifier.padding(end = 16.dp) ) { Checkbox( + modifier = Modifier.testTag(TestTags.CHECKBOX_TAG), checked = isChecked, onCheckedChange = { onCheckedChange.invoke(it) }, ) Text( + modifier = Modifier.testTag(TestTags.TEXT_TAG), text = label, style = Styles.TextStyleMedium(14.sp), ) @@ -60,7 +64,7 @@ fun CheckboxWithText(label: String, isChecked: Boolean, onCheckedChange: (Boolea alignment = Alignment.BottomEnd, offset = DpOffset.Zero // tooltip offset ) - ){ + ) { Icon( painter = useResource("info.svg") { loadSvgPainter(it, density) }, contentDescription = "Info", diff --git a/src/jvmMain/kotlin/theme/components/ChooseFileTextField.kt b/src/jvmMain/kotlin/ui/components/ChooseFileTextField.kt similarity index 98% rename from src/jvmMain/kotlin/theme/components/ChooseFileTextField.kt rename to src/jvmMain/kotlin/ui/components/ChooseFileTextField.kt index 2251698..fbd5434 100644 --- a/src/jvmMain/kotlin/theme/components/ChooseFileTextField.kt +++ b/src/jvmMain/kotlin/ui/components/ChooseFileTextField.kt @@ -1,4 +1,4 @@ -package theme.components +package ui.components import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.border @@ -15,7 +15,7 @@ import androidx.compose.ui.res.useResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import theme.Styles +import ui.Styles @Composable fun ChooseFileTextField(value: String, label: String, onSelect: () -> Unit) { diff --git a/src/jvmMain/kotlin/theme/components/CustomTextField.kt b/src/jvmMain/kotlin/ui/components/CustomTextField.kt similarity index 98% rename from src/jvmMain/kotlin/theme/components/CustomTextField.kt rename to src/jvmMain/kotlin/ui/components/CustomTextField.kt index 434d2b4..a4c1d73 100644 --- a/src/jvmMain/kotlin/theme/components/CustomTextField.kt +++ b/src/jvmMain/kotlin/ui/components/CustomTextField.kt @@ -1,4 +1,4 @@ -package theme.components +package ui.components import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.border @@ -22,7 +22,7 @@ import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import theme.Styles +import ui.Styles @Composable fun CustomTextField(value: String, label: String, forPassword: Boolean = true, onValueChange: (String) -> Unit) { diff --git a/src/jvmMain/kotlin/utils/Constant.kt b/src/jvmMain/kotlin/utils/Constant.kt index 0ea7285..aca1089 100644 --- a/src/jvmMain/kotlin/utils/Constant.kt +++ b/src/jvmMain/kotlin/utils/Constant.kt @@ -16,4 +16,5 @@ object FileDialogType{ object SigningMode{ const val DEBUG = 1 const val RELEASE = 2 -} \ No newline at end of file +} + diff --git a/src/jvmMain/kotlin/utils/TestTags.kt b/src/jvmMain/kotlin/utils/TestTags.kt new file mode 100644 index 0000000..e9000ee --- /dev/null +++ b/src/jvmMain/kotlin/utils/TestTags.kt @@ -0,0 +1,6 @@ +package utils + +object TestTags { + const val CHECKBOX_TAG = "CHECKBOX_TAG" + const val TEXT_TAG = "TEXT_TAG" +} \ No newline at end of file diff --git a/src/jvmTest/kotlin/ui/components/CheckboxWithTextTest.kt b/src/jvmTest/kotlin/ui/components/CheckboxWithTextTest.kt new file mode 100644 index 0000000..c3fb360 --- /dev/null +++ b/src/jvmTest/kotlin/ui/components/CheckboxWithTextTest.kt @@ -0,0 +1,61 @@ +package ui.components + +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.test.* +import androidx.compose.ui.test.junit4.createComposeRule +import org.junit.Rule +import org.junit.Test +import utils.TestTags + +class CheckboxWithTextTest { + + @get:Rule + val rule = createComposeRule() + + @Test + fun `check checkbox toggle and label text`() { + rule.setContent { + var checkedState by remember { mutableStateOf(false) } + CheckboxWithText( + "Checkbox Label with Text", + checkedState, + onCheckedChange = { + checkedState = it + }, + toolTipText = "Test Tooltip" + ) + } + + // Check For Label Text + rule.onNodeWithTag(TestTags.TEXT_TAG).assertTextEquals("Checkbox Label with Text") + + // Verify checkbox toggle + rule.onNodeWithTag(TestTags.CHECKBOX_TAG).performClick() + rule.onNodeWithTag(TestTags.CHECKBOX_TAG).assertIsOn() + } + + @Test + fun `check checkbox toggle functionality`() { + rule.setContent { + var checkedState by remember { mutableStateOf(false) } + CheckboxWithText( + "Checkbox Label with Text", + checkedState, + onCheckedChange = { + checkedState = it + } + ) + } + + // Verify checkbox toggle + val checkbox = rule.onNodeWithTag(TestTags.CHECKBOX_TAG) + checkbox.performClick() + checkbox.assertIsOn() + checkbox.performClick() + checkbox.assertIsOff() + } + +} \ No newline at end of file