55
66package org.opensearch.alerting.transport
77
8+ import com.carrotsearch.randomizedtesting.ThreadFilter
9+ import com.carrotsearch.randomizedtesting.annotations.ThreadLeakFilters
810import org.junit.Before
911import org.mockito.ArgumentCaptor
1012import org.mockito.ArgumentMatchers.any
1113import org.mockito.Mockito
14+ import org.mockito.Mockito.never
1215import org.mockito.Mockito.verify
16+ import org.opensearch.action.search.SearchRequest
1317import org.opensearch.action.support.ActionFilters
1418import org.opensearch.alerting.AlertingPlugin.Companion.TENANT_ID_HEADER
1519import org.opensearch.alerting.settings.AlertingSettings
@@ -34,8 +38,13 @@ import java.util.concurrent.CompletableFuture
3438import java.util.concurrent.CompletionStage
3539import org.mockito.Mockito.`when` as whenever
3640
41+ @ThreadLeakFilters(filters = [TransportGetMonitorActionTests .CoroutineThreadFilter ::class ])
3742class TransportGetMonitorActionTests : OpenSearchTestCase () {
3843
44+ class CoroutineThreadFilter : ThreadFilter {
45+ override fun reject (t : Thread ): Boolean = t.name.startsWith(" DefaultDispatcher-worker" )
46+ }
47+
3948 private lateinit var client: Client
4049 private lateinit var sdkClient: SdkClient
4150 private lateinit var transportService: TransportService
@@ -133,6 +142,29 @@ class TransportGetMonitorActionTests : OpenSearchTestCase() {
133142 verify(listener).onFailure(any())
134143 }
135144
145+ fun `test multi-tenancy enabled skips getAssociatedWorkflows search` () {
146+ val settings = Settings .builder()
147+ .put(" plugins.alerting.multi_tenancy_enabled" , true )
148+ .build()
149+
150+ val action = createAction(settings)
151+ // Invoke the private getAssociatedWorkflows method via reflection
152+ val method = action.javaClass.getDeclaredMethod(" getAssociatedWorkflows" , String ::class .java, kotlin.coroutines.Continuation ::class .java)
153+ method.isAccessible = true
154+
155+ // Use runBlocking to call the suspend function
156+ val result = kotlinx.coroutines.runBlocking {
157+ kotlin.coroutines.intrinsics.suspendCoroutineUninterceptedOrReturn<List <* >> { cont ->
158+ method.invoke(action, " test-monitor-id" , cont)
159+ }
160+ }
161+
162+ // Should return empty list without searching
163+ assertTrue(result.isEmpty())
164+ // client.search should never be called
165+ verify(client, never()).search(any(SearchRequest ::class .java), any())
166+ }
167+
136168 private fun invokeDoExecute (
137169 action : TransportGetMonitorAction ,
138170 request : GetMonitorRequest ,
0 commit comments