Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import android.content.Context
import android.content.res.TypedArray
import android.util.AttributeSet
import android.view.View
import android.widget.Button
import android.widget.FrameLayout
import androidx.annotation.VisibleForTesting
import androidx.core.content.withStyledAttributes
Expand Down Expand Up @@ -194,6 +195,7 @@ internal class ChatHeadView @JvmOverloads constructor(
info: AccessibilityNodeInfoCompat
) {
super.onInitializeAccessibilityNodeInfo(host, info)
info.className = Button::class.java.name
info.addAction(AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_CLICK)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package com.glia.widgets.view.head

import android.view.accessibility.AccessibilityNodeInfo
import android.widget.Button
import androidx.core.view.ViewCompat
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
import com.glia.widgets.di.ControllerFactory
import com.glia.widgets.di.Dependencies
import com.glia.widgets.di.UseCaseFactory
import com.glia.widgets.engagement.domain.IsCurrentEngagementCallVisualizerUseCase
import com.glia.widgets.helper.ResourceProvider
import io.reactivex.rxjava3.core.Observable
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment

@RunWith(RobolectricTestRunner::class)
internal class ChatHeadViewTest {

private lateinit var chatHeadView: ChatHeadView

@Before
fun setUp() {
val application = RuntimeEnvironment.getApplication()

Dependencies.resourceProvider = ResourceProvider(application)

val localeProvider = mock<com.glia.widgets.locale.LocaleProvider>()
whenever(localeProvider.getLocaleObservable()) doReturn Observable.never()
whenever(localeProvider.getString(
org.mockito.kotlin.any<Int>(),
org.mockito.kotlin.any<List<com.glia.widgets.locale.StringKeyPair>>()
)) doReturn "Back to the Engagement. Floating Button."
Dependencies.localeProvider = localeProvider

val controllerFactory = mock<ControllerFactory>()
val chatHeadController = mock<ChatHeadContract.Controller>()
whenever(controllerFactory.chatHeadController) doReturn chatHeadController
Dependencies.controllerFactory = controllerFactory

val useCaseFactory = mock<UseCaseFactory>()
val isCallVisualizerUseCase = mock<IsCurrentEngagementCallVisualizerUseCase>()
whenever(useCaseFactory.isCurrentEngagementCallVisualizer) doReturn isCallVisualizerUseCase
Dependencies.useCaseFactory = useCaseFactory

chatHeadView = ChatHeadView(application)
}

@Test
fun `accessibility node info has Button className`() {
val delegate = ViewCompat.getAccessibilityDelegate(chatHeadView)
?: error("Accessibility delegate must be set on ChatHeadView")
val nodeInfo = obtainNodeInfo()
delegate.onInitializeAccessibilityNodeInfo(chatHeadView, nodeInfo)

assertEquals(Button::class.java.name, nodeInfo.className)
}

@Test
fun `accessibility node info has ACTION_CLICK action`() {
val delegate = ViewCompat.getAccessibilityDelegate(chatHeadView)
?: error("Accessibility delegate must be set on ChatHeadView")
val nodeInfo = obtainNodeInfo()
delegate.onInitializeAccessibilityNodeInfo(chatHeadView, nodeInfo)

val hasClickAction = nodeInfo.actionList.any { it.id == AccessibilityNodeInfoCompat.ACTION_CLICK }
assertTrue("ACTION_CLICK must be present in accessibility actions", hasClickAction)
}

@Suppress("DEPRECATION")
private fun obtainNodeInfo(): AccessibilityNodeInfoCompat =
AccessibilityNodeInfoCompat.wrap(AccessibilityNodeInfo.obtain())
}