| 
48 | 48 | import org.springframework.ai.content.Media;  | 
49 | 49 | import org.springframework.ai.converter.ListOutputConverter;  | 
50 | 50 | import org.springframework.ai.converter.StructuredOutputConverter;  | 
 | 51 | +import org.springframework.ai.template.TemplateRenderer;  | 
51 | 52 | import org.springframework.ai.tool.ToolCallback;  | 
52 | 53 | import org.springframework.ai.tool.function.FunctionToolCallback;  | 
53 | 54 | import org.springframework.core.ParameterizedTypeReference;  | 
 | 
60 | 61 | import static org.assertj.core.api.Assertions.assertThatThrownBy;  | 
61 | 62 | import static org.mockito.BDDMockito.given;  | 
62 | 63 | import static org.mockito.Mockito.mock;  | 
 | 64 | +import static org.mockito.Mockito.when;  | 
63 | 65 | 
 
  | 
64 | 66 | /**  | 
65 | 67 |  * Unit tests for {@link DefaultChatClient}.  | 
@@ -124,6 +126,51 @@ void whenPromptWithOptionsThenReturn() {  | 
124 | 126 | 		assertThat(spec.getChatOptions()).isEqualTo(chatOptions);  | 
125 | 127 | 	}  | 
126 | 128 | 
 
  | 
 | 129 | +	@Test  | 
 | 130 | +	void testMutate() {  | 
 | 131 | +		var media = mock(Media.class);  | 
 | 132 | +		var toolCallback = mock(ToolCallback.class);  | 
 | 133 | +		var advisor = mock(Advisor.class);  | 
 | 134 | +		var templateRenderer = mock(TemplateRenderer.class);  | 
 | 135 | +		var chatOptions = mock(ChatOptions.class);  | 
 | 136 | +		var copyChatOptions = mock(ChatOptions.class);  | 
 | 137 | +		when(chatOptions.copy()).thenReturn(copyChatOptions);  | 
 | 138 | +		var toolContext = new HashMap<String, Object>();  | 
 | 139 | +		var userMessage1 = mock(UserMessage.class);  | 
 | 140 | +		var userMessage2 = mock(UserMessage.class);  | 
 | 141 | + | 
 | 142 | +		DefaultChatClientBuilder defaultChatClientBuilder = new DefaultChatClientBuilder(mock(ChatModel.class));  | 
 | 143 | +		defaultChatClientBuilder.addMessages(List.of(userMessage1, userMessage2));  | 
 | 144 | +		ChatClient originalChatClient = defaultChatClientBuilder.defaultAdvisors(advisor)  | 
 | 145 | +			.defaultOptions(chatOptions)  | 
 | 146 | +			.defaultUser(u -> u.text("original user {userParams}").param("userParams", "user value2").media(media))  | 
 | 147 | +			.defaultSystem(s -> s.text("original system {sysParams}").param("sysParams", "system value1"))  | 
 | 148 | +			.defaultTemplateRenderer(templateRenderer)  | 
 | 149 | +			.defaultToolNames("toolName1", "toolName2")  | 
 | 150 | +			.defaultToolCallbacks(toolCallback)  | 
 | 151 | +			.defaultToolContext(toolContext)  | 
 | 152 | +			.build();  | 
 | 153 | +		var originalSpec = (DefaultChatClient.DefaultChatClientRequestSpec) originalChatClient.prompt();  | 
 | 154 | + | 
 | 155 | +		ChatClient mutateChatClient = originalChatClient.mutate().build();  | 
 | 156 | +		var mutateSpec = (DefaultChatClient.DefaultChatClientRequestSpec) mutateChatClient.prompt();  | 
 | 157 | + | 
 | 158 | +		assertThat(mutateSpec).isNotSameAs(originalSpec);  | 
 | 159 | + | 
 | 160 | +		assertThat(mutateSpec.getMessages()).hasSize(2).containsOnly(userMessage1, userMessage2);  | 
 | 161 | +		assertThat(mutateSpec.getAdvisors()).hasSize(1).containsOnly(advisor);  | 
 | 162 | +		assertThat(mutateSpec.getChatOptions()).isEqualTo(copyChatOptions);  | 
 | 163 | +		assertThat(mutateSpec.getUserText()).isEqualTo("original user {userParams}");  | 
 | 164 | +		assertThat(mutateSpec.getUserParams()).containsEntry("userParams", "user value2");  | 
 | 165 | +		assertThat(mutateSpec.getMedia()).hasSize(1).containsOnly(media);  | 
 | 166 | +		assertThat(mutateSpec.getSystemText()).isEqualTo("original system {sysParams}");  | 
 | 167 | +		assertThat(mutateSpec.getSystemParams()).containsEntry("sysParams", "system value1");  | 
 | 168 | +		assertThat(mutateSpec.getTemplateRenderer()).isEqualTo(templateRenderer);  | 
 | 169 | +		assertThat(mutateSpec.getToolNames()).containsExactly("toolName1", "toolName2");  | 
 | 170 | +		assertThat(mutateSpec.getToolCallbacks()).containsExactly(toolCallback);  | 
 | 171 | +		assertThat(mutateSpec.getToolContext()).isEqualTo(toolContext);  | 
 | 172 | +	}  | 
 | 173 | + | 
127 | 174 | 	@Test  | 
128 | 175 | 	void whenMutateChatClientRequest() {  | 
129 | 176 | 		ChatClient chatClient = new DefaultChatClientBuilder(mock(ChatModel.class)).build();  | 
 | 
0 commit comments