Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
cometchat avatar

Cometchat Android V6 Testing

  • 5 installs
  • 70 repo stars
  • Updated June 23, 2026
  • cometchat/cometchat-skills

Tests CometChat v6 components and ViewModels with unit tests, Compose UI tests, Espresso, Maestro, and CI configuration.

About

This skill covers testing CometChat v6 by unit-testing ViewModels and the shared core module, writing Compose UI tests and Espresso tests for Views, and running Maestro end-to-end flows. A developer uses it to add test coverage and wire it into CI.

  • Unit tests for ViewModels plus Compose UI and Espresso tests
  • Maestro E2E flows and CI configuration

Cometchat Android V6 Testing by the numbers

  • 5 all-time installs (skills.sh)
  • Ranked #1,611 of 2,153 Testing & QA skills by installs in the Skillselion catalog
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/cometchat/cometchat-skills --skill cometchat-android-v6-testing

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs5
repo stars70
Last updatedJune 23, 2026
Repositorycometchat/cometchat-skills

What it does

Tests CometChat v6 components and ViewModels with unit tests, Compose UI tests, Espresso, Maestro, and CI configuration.

Files

SKILL.mdMarkdownGitHub ↗
Companion skills: cometchat-android-v6-extensions (ViewModel/DataSource architecture), cometchat-android-v6-compose-components, cometchat-android-v6-kotlin-components

Purpose

Test CometChat UIKit v6 components and ViewModels — unit tests for the shared core module, Compose UI tests, Espresso tests for Views, and end-to-end tests with Maestro.

Use this skill when

  • Writing unit tests for CometChat ViewModels
  • Writing Compose UI tests for CometChat components
  • Writing Espresso tests for Kotlin Views components
  • Setting up Maestro flows for end-to-end testing
  • Configuring CI for CometChat test suites

Do not use this skill when

  • Debugging runtime issues (use cometchat-android-v6-troubleshooting)
  • Working with component APIs (use cometchat-*-components)

1. Test Dependencies

From chatuikit-compose/build.gradle.kts:

dependencies {
    // Unit testing
    testImplementation("junit:junit:4.13.2")
    testImplementation("io.kotest:kotest-runner-junit5:5.x")
    testImplementation("io.kotest:kotest-assertions-core:5.x")
    testImplementation("io.kotest:kotest-property:5.x")
    testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.x")
    testImplementation("androidx.arch.core:core-testing:2.x")
    testImplementation("androidx.lifecycle:lifecycle-runtime-testing:2.x")
    testImplementation("org.mockito:mockito-core:5.x")
    testImplementation("org.mockito.kotlin:mockito-kotlin:5.x")

    // Android instrumented testing
    androidTestImplementation("androidx.test.ext:junit:1.x")
    androidTestImplementation("androidx.test.espresso:espresso-core:3.x")
    androidTestImplementation("androidx.compose.ui:ui-test-junit4")
    androidTestImplementation(platform("androidx.compose:compose-bom:2024.x.x"))

    // Debug-only Compose tooling
    debugImplementation("androidx.compose.ui:ui-tooling")
    debugImplementation("androidx.compose.ui:ui-test-manifest")
}

Enable JUnit Platform for Kotest:

android {
    testOptions {
        unitTests.all {
            it.useJUnitPlatform()
        }
    }
}

2. Unit Testing ViewModels

ViewModels live in chatuikit-core and are shared across both stacks. Test them with coroutines-test and Mockito:

import kotlinx.coroutines.test.runTest
import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever

class CometChatConversationsViewModelTest {

    @Test
    fun `loadConversations emits success state`() = runTest {
        val mockDataSource = mock<ConversationListDataSource>()
        // Setup mock responses...

        val viewModel = CometChatConversationsViewModel(/* inject mocks */)

        // Collect state and assert
        viewModel.uiState.test {
            val state = awaitItem()
            // Assert state is success with expected data
        }
    }
}

2.1 Testing Events

import com.cometchat.uikit.core.events.CometChatEvents
import com.cometchat.uikit.core.events.CometChatMessageEvent

@Test
fun `emitting message event is received by collector`() = runTest {
    val events = mutableListOf<CometChatMessageEvent>()

    val job = launch {
        CometChatEvents.messageEvents.collect { events.add(it) }
    }

    CometChatEvents.emitMessageEventSync(
        CometChatMessageEvent.MessageSent(mockMessage, MessageStatus.SUCCESS)
    )

    advanceUntilIdle()
    assertEquals(1, events.size)
    job.cancel()
}

3. Compose UI Testing

import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick

class CometChatConversationsTest {

    @get:Rule
    val composeTestRule = createComposeRule()

    @Test
    fun conversationsList_displaysTitle() {
        composeTestRule.setContent {
            CometChatTheme {
                CometChatConversations()
            }
        }

        // Assert UI elements
        composeTestRule.onNodeWithText("Chats").assertExists()
    }

    @Test
    fun conversationItem_clickNavigates() {
        var clickedConversation: Conversation? = null

        composeTestRule.setContent {
            CometChatTheme {
                CometChatConversations(
                    onItemClick = { clickedConversation = it }
                )
            }
        }

        // Interact and assert
        // composeTestRule.onNodeWithText("User Name").performClick()
        // assertNotNull(clickedConversation)
    }
}

4. Espresso Testing (Kotlin Views)

import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.*
import androidx.test.ext.junit.rules.ActivityScenarioRule

class ConversationsActivityTest {

    @get:Rule
    val activityRule = ActivityScenarioRule(ConversationsActivity::class.java)

    @Test
    fun conversationsList_isDisplayed() {
        onView(withId(R.id.conversations))
            .check(matches(isDisplayed()))
    }
}

5. Property-Based Testing with Kotest

The project uses Kotest for property-based tests (e.g., MessageAdapterPropertyTest.kt):

import io.kotest.core.spec.style.FunSpec
import io.kotest.property.forAll
import io.kotest.property.Arb
import io.kotest.property.arbitrary.string

class BubbleFactoryKeyTest : FunSpec({

    test("factory key format is always category_type") {
        forAll(Arb.string(1..20), Arb.string(1..20)) { category, type ->
            val key = BubbleFactory.getKey(category, type)
            key == "${category}_${type}"
        }
    }
})

6. Maestro End-to-End Testing

The master-app-jetpack/ai-testing/ directory contains Maestro test configurations:

# maestro/login_flow.yaml
appId: com.example.jetpackuikit
---
- launchApp
- tapOn: "Login"
- inputText: "superhero1"
- tapOn: "Submit"
- assertVisible: "Chats"

Run with:

maestro test maestro/login_flow.yaml

7. CI Configuration

7.1 GitHub Actions

name: Test
on: [push, pull_request]
jobs:
  unit-tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'
      - run: ./gradlew testDebugUnitTest

  instrumented-tests:
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'
      - uses: reactivecircus/android-emulator-runner@v2
        with:
          api-level: 34
          script: ./gradlew connectedDebugAndroidTest

8. Test Organization

Test TypeLocationFrameworkWhat to Test
Unit testschatuikit-core/src/test/JUnit + Kotest + MockitoViewModels, DataSources, Repositories, Events
Unit testschatuikit-compose/src/test/JUnit + KotestBubbleFactory, style resolution
Compose UI testschatuikit-compose/src/androidTest/Compose TestComponent rendering, interactions
Views UI testschatuikit-kotlin/src/androidTest/EspressoComponent rendering, interactions
E2E testsmaster-app-*/ai-testing/MaestroFull user flows

Hard rules

  • ALWAYS use CometChatTheme {} wrapper in Compose test setContent blocks — components depend on CompositionLocal values
  • Use runTest from kotlinx-coroutines-test for testing coroutines and SharedFlow
  • Use useJUnitPlatform() in test options for Kotest compatibility
  • Mock DataSources and Repositories when unit testing ViewModels — do NOT make real SDK calls in tests
  • CometChat SDK must NOT be initialized in unit tests — mock all SDK interactions
  • For Compose UI tests, use createComposeRule() not createAndroidComposeRule() unless you need Activity context

Related skills

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.