*** Settings *** Documentation End-to-end integration test for Scientific Paper Writer Library Process Library OperatingSystem Library String Resource ${CURDIR}/v2_paths.resource Suite Setup Setup Test Environment Suite Teardown Cleanup Test Environment *** Variables *** ${CONFIG_FILE} ${CURDIR}/../examples/scientific_paper_writer.yaml ${CONTEXT_DIR} ${TEMPDIR}/paper_e2e_contexts ${CONTEXT_NAME} paper_e2e_${TEST_ID} ${TEST_ID} ${EMPTY} *** Test Cases *** Scientific Paper Writer Full Workflow [Documentation] Test the complete workflow from intro through multiple stages [Tags] integration e2e slow [Timeout] 10 minutes # Test 1: Intro stage Log Testing intro stage... ${result}= Run Paper Command Hello Should Contain ${result.stdout} Paper Writer # Test 2: Advance to discovery Log Advancing to discovery stage... ${result}= Run Paper Command !next discovery Should Be Equal As Integers ${result.rc} 0 # Verify we're now in discovery stage ${stage_check}= Run Paper Command !stage Should Contain ${stage_check.stdout} discovery # Test 3: Commands work Log Testing commands... ${result}= Run Paper Command !stages Should Contain ${result.stdout} discovery Should Contain ${result.stdout} brainstorming # Test 4: Test help command Log Testing help command... ${result}= Run Paper Command !help Should Contain ${result.stdout} Available Commands Should Contain ${result.stdout} !next Should Contain ${result.stdout} !accept # Test 5: Skip to brainstorming with mock data Log Setting up mock paper details and advancing to brainstorming... ${result}= Run Paper Command !next brainstorming Should Be Equal As Integers ${result.rc} 0 # Verify we're now in brainstorming stage ${stage_check}= Run Paper Command !stage Should Contain ${stage_check.stdout} brainstorming # Test 6: Test brainstorming stage Log Testing brainstorming stage... ${result}= Run Paper Command I want to write about the impact of machine learning on healthcare, focusing on diagnostic imaging and patient outcomes timeout=90s Length Should Be Greater Than ${result.stdout} 50 # Test 7: Verify stage may have advanced (brainstorming stage might auto-advance after LLM response) # So we don't check for specific stage here anymore # Test 8: Advance toward later stages (using structure or latex_generation as targets) Log Advancing toward later stages... ${result}= Run Paper Command !next structure timeout=120s Should Be Equal As Integers ${result.rc} 0 # Test 9: Verify stage list command works Log Verifying stage list command... ${result}= Run Paper Command !stages Should Contain ${result.stdout} structure Should Contain ${result.stdout} latex_generation Log End-to-end test completed successfully Scientific Paper Writer LaTeX Generation [Documentation] Test LaTeX generation using pre-populated context [Tags] integration e2e latex code_blocks [Timeout] 5 minutes ${ctx}= Set Variable latex_test_${TEST_ID} # Import the brainstorming context fixture Log Importing brainstorming context fixture... ${result}= Run Process ${PYTHON} -m cleveragents context import ... ${ctx} ... ${V2_PAPER_CONTEXTS_DIR}/03_brainstorming.json ... --context-dir ${CONTEXT_DIR} ... stderr=STDOUT ... timeout=30s Should Be Equal As Integers ${result.rc} 0 Log Context imported: ${result.stdout} # Advance to latex_generation stage Log Advancing to latex_generation stage... ${result}= Run Process ${PYTHON} -m cleveragents actor run ... -c ${CONFIG_FILE} ... --context ${ctx} ... --context-dir ${CONTEXT_DIR} ... --unsafe ... --allow-rxpy-in-run-mode ... test-actor !next latex_generation ... stderr=STDOUT ... timeout=180s Should Be Equal As Integers ${result.rc} 0 # Note: Stage may auto-advance after !next is called # Generate LaTeX document (send message that should trigger LaTeX generation) # The exact stage doesn't matter - the system should generate LaTeX when asked Log Generating LaTeX document... ${result}= Run Process ${PYTHON} -m cleveragents actor run ... -c ${CONFIG_FILE} ... --context ${ctx} ... --context-dir ${CONTEXT_DIR} ... --unsafe ... --allow-rxpy-in-run-mode ... test-actor Generate the complete LaTeX document ... stderr=STDOUT ... timeout=180s Should Be Equal As Integers ${result.rc} 0 # System should produce SOME output (not just echo the input) Should Not Be Equal ${result.stdout} Generate the complete LaTeX document # Verify LaTeX structure Log Verifying LaTeX document structure... Should Contain ${result.stdout} \\documentclass Should Contain ${result.stdout} \\begin{document} Should Contain ${result.stdout} \\end{document} Should Contain ${result.stdout} \\section # Verify context was updated Log Verifying context is accessible... ${result}= Run Process ${PYTHON} -m cleveragents actor run ... -c ${CONFIG_FILE} ... --context ${ctx} ... --context-dir ${CONTEXT_DIR} ... --unsafe ... --allow-rxpy-in-run-mode ... test-actor !context ... stderr=STDOUT ... timeout=30s Should Contain ${result.stdout} latex_source Log LaTeX generation test completed Scientific Paper Writer Stage Navigation [Documentation] Test stage navigation and command processing [Tags] integration commands code_blocks [Timeout] 3 minutes ${ctx}= Set Variable stage_nav_${TEST_ID} # Start at intro ${result}= Run Process ${PYTHON} -m cleveragents actor run ... -c ${CONFIG_FILE} ... --context ${ctx} ... --context-dir ${CONTEXT_DIR} ... --unsafe ... --allow-rxpy-in-run-mode ... test-actor !stages ... stderr=STDOUT ... timeout=20s Should Contain ${result.stdout} intro # Test !next command ${result}= Run Process ${PYTHON} -m cleveragents actor run ... -c ${CONFIG_FILE} ... --context ${ctx} ... --context-dir ${CONTEXT_DIR} ... --unsafe ... --allow-rxpy-in-run-mode ... test-actor !next ... stderr=STDOUT ... timeout=20s Should Be Equal As Integers ${result.rc} 0 # Verify we advanced from intro (stage may auto-advance past discovery to brainstorming) ${stage_check}= Run Process ${PYTHON} -m cleveragents actor run ... -c ${CONFIG_FILE} ... --context ${ctx} ... --context-dir ${CONTEXT_DIR} ... --unsafe ... --allow-rxpy-in-run-mode ... test-actor !stage ... stderr=STDOUT ... timeout=20s Should Not Contain ${stage_check.stdout} intro # Test !help command ${result}= Run Process ${PYTHON} -m cleveragents actor run ... -c ${CONFIG_FILE} ... --context ${ctx} ... --context-dir ${CONTEXT_DIR} ... --unsafe ... --allow-rxpy-in-run-mode ... test-actor !help ... stderr=STDOUT ... timeout=20s Should Contain ${result.stdout} Available Commands Should Contain ${result.stdout} !next Should Contain ${result.stdout} !accept # Test !stage command ${result}= Run Process ${PYTHON} -m cleveragents actor run ... -c ${CONFIG_FILE} ... --context ${ctx} ... --context-dir ${CONTEXT_DIR} ... --unsafe ... --allow-rxpy-in-run-mode ... test-actor !stage ... stderr=STDOUT ... timeout=20s Should Contain ${result.stdout} Current Stage Should Contain ${result.stdout} Purpose *** Keywords *** Setup Test Environment ${timestamp}= Get Time epoch Set Suite Variable ${TEST_ID} ${timestamp} Set Suite Variable ${CONTEXT_NAME} paper_e2e_${TEST_ID} Create Directory ${CONTEXT_DIR} Log Test environment setup complete with ID: ${TEST_ID} Cleanup Test Environment Run Keyword And Ignore Error Remove Directory ${CONTEXT_DIR} recursive=True Log Test environment cleaned up Run Paper Command [Arguments] ${command} ${timeout}=30s [Documentation] Run a command against the paper writer with the persistent context ${result}= Run Process ${PYTHON} -m cleveragents actor run ... -c ${CONFIG_FILE} ... --context ${CONTEXT_NAME} ... --context-dir ${CONTEXT_DIR} ... --unsafe ... --allow-rxpy-in-run-mode ... test-actor ${command} ... stderr=STDOUT ... timeout=${timeout} Log Command: ${command} Log Output: ${result.stdout} RETURN ${result} Should Contain Any [Arguments] ${text} @{patterns} [Documentation] Check if text contains at least one of the patterns FOR ${pattern} IN @{patterns} ${status}= Run Keyword And Return Status Should Contain ${text} ${pattern} ignore_case=True IF ${status} RETURN END Fail Text does not contain any of: @{patterns} Length Should Be Greater Than [Arguments] ${text} ${min_length} [Documentation] Check if text length is greater than minimum ${length}= Get Length ${text} Should Be True ${length} > ${min_length} Text length ${length} is not greater than ${min_length}