diff --git a/pom.xml b/pom.xml
index 8179704..62433dd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,14 +26,15 @@
com.embabel.agent
- embabel-agent-starter
+ embabel-agent-starter-shell
${embabel-agent.version}
com.embabel.agent
- embabel-agent-starter-shell
+ embabel-agent-test
${embabel-agent.version}
+ test
diff --git a/src/test/java/com/embabel/template/agent/WriteAndReviewAgentIntegrationTest.java b/src/test/java/com/embabel/template/agent/WriteAndReviewAgentIntegrationTest.java
new file mode 100644
index 0000000..5cc324f
--- /dev/null
+++ b/src/test/java/com/embabel/template/agent/WriteAndReviewAgentIntegrationTest.java
@@ -0,0 +1,52 @@
+package com.embabel.template.agent;
+
+import com.embabel.agent.api.common.autonomy.AgentInvocation;
+import com.embabel.agent.domain.io.UserInput;
+import com.embabel.agent.testing.integration.EmbabelMockitoIntegrationTest;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.BeforeAll;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * Use framework superclass to test the complete workflow of writing and reviewing a story.
+ * This will run under Spring Boot against an AgentPlatform instance
+ * that has loaded all our agents.
+ */
+class WriteAndReviewAgentIntegrationTest extends EmbabelMockitoIntegrationTest {
+
+ @BeforeAll
+ static void setUp() {
+ // Set shell configuration to non-interactive mode
+ System.setProperty("embabel.agent.shell.interactive.enabled", "false");
+ }
+
+ @Test
+ void shouldExecuteCompleteWorkflow() {
+ var input = new UserInput("Write about artificial intelligence");
+
+ var story = new Story("AI will transform our world...");
+ var reviewedStory = new ReviewedStory(story, "Excellent exploration of AI themes.", Personas.REVIEWER);
+
+ whenCreateObject(prompt -> prompt.contains("Craft a short story"), Story.class)
+ .thenReturn(story);
+
+ // The second call uses generateText
+ whenGenerateText(prompt -> prompt.contains("You will be given a short story to review"))
+ .thenReturn(reviewedStory.review());
+
+ var invocation = AgentInvocation.create(agentPlatform, ReviewedStory.class);
+ var reviewedStoryResult = invocation.invoke(input);
+
+ assertNotNull(reviewedStoryResult);
+ assertTrue(reviewedStoryResult.getContent().contains(story.text()),
+ "Expected story content to be present: " + reviewedStoryResult.getContent());
+ assertEquals(reviewedStory, reviewedStoryResult,
+ "Expected review to match: " + reviewedStoryResult);
+
+ verifyCreateObjectMatching(prompt -> prompt.contains("Craft a short story"), Story.class,
+ llm -> llm.getLlm().getTemperature() == 0.7 && llm.getToolGroups().isEmpty());
+ verifyGenerateTextMatching(prompt -> prompt.contains("You will be given a short story to review"));
+ verifyNoMoreInteractions();
+ }
+}