@@ -21,13 +21,27 @@ import kotlinx.coroutines.CoroutineScope
2121import kotlinx.coroutines.channels.Channel
2222import kotlinx.coroutines.flow.MutableStateFlow
2323import kotlinx.coroutines.runBlocking
24- import org.junit.jupiter.api.DisplayName
2524import java.util.UUID
2625import kotlin.test.Test
2726import kotlin.test.assertEquals
2827import kotlin.test.assertNull
2928
3029internal class CoderProtocolHandlerTest {
30+
31+ private companion object {
32+ val AGENT_RIKER = AgentTestData (name = " Riker" , id = " 9a920eee-47fb-4571-9501-e4b3120c12f2" )
33+ val AGENT_BILL = AgentTestData (name = " Bill" , id = " fb3daea4-da6b-424d-84c7-36b90574cfef" )
34+ val AGENT_BOB = AgentTestData (name = " Bob" , id = " b0e4c54d-9ba9-4413-8512-11ca1e826a24" )
35+
36+ val ALL_AGENTS = mapOf (
37+ AGENT_BOB .name to AGENT_BOB .id,
38+ AGENT_BILL .name to AGENT_BILL .id,
39+ AGENT_RIKER .name to AGENT_RIKER .id
40+ )
41+
42+ val SINGLE_AGENT = mapOf (AGENT_BOB .name to AGENT_BOB .id)
43+ }
44+
3145 private val context = CoderToolboxContext (
3246 mockk<ToolboxUi >(relaxed = true ),
3347 mockk<EnvironmentUiPageManager >(),
@@ -51,128 +65,171 @@ internal class CoderProtocolHandlerTest {
5165 MutableStateFlow (false )
5266 )
5367
54- private val agents =
55- mapOf (
56- " agent_name_bob" to " b0e4c54d-9ba9-4413-8512-11ca1e826a24" ,
57- " agent_name_bill" to " fb3daea4-da6b-424d-84c7-36b90574cfef" ,
58- " agent_name_riker" to " 9a920eee-47fb-4571-9501-e4b3120c12f2" ,
59- )
60- private val agentBob =
61- mapOf (
62- " agent_name_bob" to " b0e4c54d-9ba9-4413-8512-11ca1e826a24" ,
63- )
64-
6568 @Test
66- @DisplayName( " given a ws with multiple agents, expect the correct agent to be resolved if it matches the agent_name query param " )
67- fun getMatchingAgent () {
68- val ws = DataGen .workspace( " ws " , agents = agents)
69-
70- val tests =
71- listOf (
72- Pair (
73- mapOf ( " agent_name " to " agent_name_riker " ),
74- " 9a920eee-47fb-4571-9501-e4b3120c12f2 "
75- ),
76- Pair (
77- mapOf (" agent_name" to " agent_name_bill " ),
78- " fb3daea4-da6b-424d-84c7-36b90574cfef "
79- ),
80- Pair (
81- mapOf ( " agent_name " to " agent_name_bob " ) ,
82- " b0e4c54d-9ba9-4413-8512-11ca1e826a24 "
83- )
69+ fun ` given a workspace with multiple agents when getMatchingAgent is called with a valid agent name then it correctly resolves resolves an agent` () {
70+ val ws = DataGen .workspace( " ws " , agents = ALL_AGENTS )
71+
72+ val testCases = listOf (
73+ AgentMatchTestCase (
74+ " resolves agent with name Riker " ,
75+ mapOf ( " agent_name " to AGENT_RIKER .name),
76+ AGENT_RIKER .uuid
77+ ),
78+ AgentMatchTestCase (
79+ " resolves agent with name Bill " ,
80+ mapOf (" agent_name" to AGENT_BILL .name ),
81+ AGENT_BILL .uuid
82+ ),
83+ AgentMatchTestCase (
84+ " resolves agent with name Bob " ,
85+ mapOf ( " agent_name " to AGENT_BOB .name),
86+ AGENT_BOB .uuid
8487 )
88+ )
89+
8590 runBlocking {
86- tests.forEach {
87- assertEquals(UUID .fromString(it.second), protocolHandler.getMatchingAgent(it.first, ws)?.id)
91+ testCases.forEach { testCase ->
92+ assertEquals(
93+ testCase.expectedAgentId,
94+ protocolHandler.getMatchingAgent(testCase.params, ws)?.id,
95+ " Failed: ${testCase.description} "
96+ )
8897 }
8998 }
9099 }
91100
92101 @Test
93- @DisplayName(" given a ws with only multiple agents expect the agent resolution to fail if none match the agent_name query param" )
94- fun failsToGetMatchingAgent () {
95- val ws = DataGen .workspace(" ws" , agents = agents)
96- val tests =
97- listOf (
98- Triple (emptyMap(), MissingArgumentException ::class , " Unable to determine" ),
99- Triple (mapOf (" agent_name" to " " ), MissingArgumentException ::class , " Unable to determine" ),
100- Triple (mapOf (" agent_name" to null ), MissingArgumentException ::class , " Unable to determine" ),
101- Triple (mapOf (" agent_name" to " not-an-agent-name" ), IllegalArgumentException ::class , " agent with ID" ),
102- Triple (
103- mapOf (" agent_name" to " agent_name_homer" ),
104- IllegalArgumentException ::class ,
105- " agent with name"
106- )
102+ fun `given a workspace with multiple agents when getMatchingAgent is called with invalid agent names then no agent is resolved` () {
103+ val ws = DataGen .workspace(" ws" , agents = ALL_AGENTS )
104+
105+ val testCases = listOf (
106+ AgentNullResultTestCase (
107+ " empty parameters (i.e. no agent name) does not return any agent" ,
108+ emptyMap()
109+ ),
110+ AgentNullResultTestCase (
111+ " empty agent_name does not return any agent" ,
112+ mapOf (" agent_name" to " " )
113+ ),
114+ AgentNullResultTestCase (
115+ " null agent_name does not return any agent" ,
116+ mapOf (" agent_name" to null )
117+ ),
118+ AgentNullResultTestCase (
119+ " non-existent agent does not return any agent" ,
120+ mapOf (" agent_name" to " agent_name_homer" )
121+ ),
122+ AgentNullResultTestCase (
123+ " UUID instead of name does not return any agent" ,
124+ mapOf (" agent_name" to " not-an-agent-name" )
107125 )
126+ )
127+
108128 runBlocking {
109- tests.forEach {
110- assertNull(protocolHandler.getMatchingAgent(it.first, ws)?.id)
129+ testCases.forEach { testCase ->
130+ assertNull(
131+ protocolHandler.getMatchingAgent(testCase.params, ws)?.id,
132+ " Failed: ${testCase.description} "
133+ )
111134 }
112135 }
113136 }
114137
115138 @Test
116- @DisplayName(" given a ws with only one agent, the agent is selected even when agent_name query param was not provided" )
117- fun getsFirstAgentWhenOnlyOne () {
118- val ws = DataGen .workspace(" ws" , agents = agentBob)
119- val tests =
120- listOf (
139+ fun `given a workspace with a single agent when getMatchingAgent is called with an empty agent name then the default agent is resolved` () {
140+ val ws = DataGen .workspace(" ws" , agents = SINGLE_AGENT )
141+
142+ val testCases = listOf (
143+ AgentMatchTestCase (
144+ " empty parameters (i.e. no agent name) auto-selects the one and only agent available" ,
121145 emptyMap(),
146+ AGENT_BOB .uuid
147+ ),
148+ AgentMatchTestCase (
149+ " empty agent_name auto-selects the one and only agent available" ,
122150 mapOf (" agent_name" to " " ),
123- mapOf (" agent_name" to null )
151+ AGENT_BOB .uuid
152+ ),
153+ AgentMatchTestCase (
154+ " null agent_name auto-selects the one and only agent available" ,
155+ mapOf (" agent_name" to null ),
156+ AGENT_BOB .uuid
124157 )
158+ )
159+
125160 runBlocking {
126- tests .forEach {
161+ testCases .forEach { testCase ->
127162 assertEquals(
128- UUID .fromString(" b0e4c54d-9ba9-4413-8512-11ca1e826a24" ),
129- protocolHandler.getMatchingAgent(
130- it,
131- ws,
132- )?.id,
163+ testCase.expectedAgentId,
164+ protocolHandler.getMatchingAgent(testCase.params, ws)?.id,
165+ " Failed: ${testCase.description} "
133166 )
134167 }
135168 }
136169 }
137170
138171 @Test
139- @DisplayName(" given a ws with only one agent, the agent is NOT selected when agent_name query param was provided but does not match" )
140- fun failsToGetAgentWhenOnlyOne () {
141- val wsWithAgentBob = DataGen .workspace(" ws" , agents = agentBob)
142- val tests =
143- listOf (
144- Triple (
145- mapOf (" agent_name" to " agent_name_garfield" ),
146- IllegalArgumentException ::class ,
147- " agent with name"
148- ),
149- )
172+ fun `given a workspace with a single agent when getMatchingAgent is called with an invalid agent name then no agent is resolved` () {
173+ val ws = DataGen .workspace(" ws" , agents = SINGLE_AGENT )
174+
175+ val testCase = AgentNullResultTestCase (
176+ " non-matching agent_name with single agent" ,
177+ mapOf (" agent_name" to " agent_name_garfield" )
178+ )
179+
150180 runBlocking {
151- tests.forEach {
152- assertNull(protocolHandler.getMatchingAgent(it.first, wsWithAgentBob))
153- }
181+ assertNull(
182+ protocolHandler.getMatchingAgent(testCase.params, ws),
183+ " Failed: ${testCase.description} "
184+ )
154185 }
155186 }
156187
157188 @Test
158- @DisplayName(" fails to resolve any agent when the workspace has no agents" )
159- fun failsToGetAgentWhenWorkspaceHasNoAgents () {
160- val wsWithoutAgents = DataGen .workspace(" ws" )
161- val tests =
162- listOf (
163- Triple (emptyMap(), IllegalArgumentException ::class , " has no agents" ),
164- Triple (mapOf (" agent_name" to " " ), IllegalArgumentException ::class , " has no agents" ),
165- Triple (mapOf (" agent_name" to null ), IllegalArgumentException ::class , " has no agents" ),
166- Triple (
167- mapOf (" agent_name" to " agent_name_riker" ),
168- IllegalArgumentException ::class ,
169- " has no agents"
170- ),
189+ fun `given a workspace with no agent when getMatchingAgent is called then no agent is resolved` () {
190+ val ws = DataGen .workspace(" ws" )
191+
192+ val testCases = listOf (
193+ AgentNullResultTestCase (
194+ " empty parameters (i.e. no agent name) does not return any agent" ,
195+ emptyMap()
196+ ),
197+ AgentNullResultTestCase (
198+ " empty agent_name does not return any agent" ,
199+ mapOf (" agent_name" to " " )
200+ ),
201+ AgentNullResultTestCase (
202+ " null agent_name does not return any agent" ,
203+ mapOf (" agent_name" to null )
204+ ),
205+ AgentNullResultTestCase (
206+ " valid agent_name does not return any agent" ,
207+ mapOf (" agent_name" to AGENT_RIKER .name)
171208 )
209+ )
210+
172211 runBlocking {
173- tests.forEach {
174- assertNull(protocolHandler.getMatchingAgent(it.first, wsWithoutAgents))
212+ testCases.forEach { testCase ->
213+ assertNull(
214+ protocolHandler.getMatchingAgent(testCase.params, ws),
215+ " Failed: ${testCase.description} "
216+ )
175217 }
176218 }
177219 }
178- }
220+
221+ internal data class AgentTestData (val name : String , val id : String ) {
222+ val uuid: UUID get() = UUID .fromString(id)
223+ }
224+
225+ internal data class AgentMatchTestCase (
226+ val description : String ,
227+ val params : Map <String , String ?>,
228+ val expectedAgentId : UUID
229+ )
230+
231+ internal data class AgentNullResultTestCase (
232+ val description : String ,
233+ val params : Map <String , String ?>
234+ )
235+ }
0 commit comments