skills/tinystruct-patterns/references/testing.md
Use these patterns when writing unit tests for your applications with JUnit 5. Essential for verifying action logic, routing registration, and HTTP mode behavior.
ActionRegistry is a singleton. To test an application:
Settings object (triggers init() and annotation processing).app.invoke(path, args) to test logic directly.For tests involving the built-in HTTP server:
HttpServer in a background thread.ApplicationManager.call("start", context, Action.Mode.CLI) to boot.Socket.URLRequest and HTTPHandler to perform actual requests.import org.junit.jupiter.api.*;
import org.tinystruct.system.Settings;
class MyAppTest {
private MyApp app;
@BeforeEach
void setUp() {
app = new MyApp();
app.setConfiguration(new Settings());
app.init(); // triggers @Action annotation processing and registers all actions
}
@Test
void testHello() throws Exception {
Object result = app.invoke("hello");
Assertions.assertEquals("Hello!", result);
}
@Test
void testGreet() throws Exception {
Object result = app.invoke("greet", new Object[]{"James"});
Assertions.assertEquals("Hello, James!", result);
}
}
@Test
void testRouting() {
ActionRegistry registry = ActionRegistry.getInstance();
Action action = registry.getAction("greet/James");
Assertions.assertNotNull(action);
}
Reference: src/test/java/org/tinystruct/system/HttpServerHttpModeTest.java
// Pattern:
// 1. Start server in thread
// 2. Poll for port availability
// 3. Send HTTP request via HTTPHandler
// 4. Assert response body/status