Migrate all repos into monorepo context folders
Bahn: aisupport, Analyse-O2C-C2S, awesome-bahn-mcp-servers, beam-mcp,
Confluence_Bot, db-planet-mcp-server, O2C-Harness, project-audit,
Projekt-KIQ-HP, teamlandkarte-mcp
Dhive: Jury-Voting
Privat: CV, NoteGraph (NOTE: NoteGraph needs complete redo after consolidation)
Shared: AI-Orchestrator, OrgMyLife, power_skills_and_more
Shared/references: symphony (read-only)
Bahn repos remain available as independent remotes - this monorepo
pulls them in via subtree, the originals are untouched.
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
"""Tests for workflow loader."""
|
||||
|
||||
import pytest
|
||||
|
||||
from ai_orchestrator.workflow import (
|
||||
MissingWorkflowFileError,
|
||||
WorkflowFrontMatterNotAMapError,
|
||||
WorkflowParseError,
|
||||
load_workflow,
|
||||
parse_workflow,
|
||||
)
|
||||
|
||||
|
||||
class TestParseWorkflow:
|
||||
"""Tests for parse_workflow function."""
|
||||
|
||||
def test_full_workflow_with_front_matter(self):
|
||||
content = """---
|
||||
tracker:
|
||||
kind: linear
|
||||
project_slug: my-project
|
||||
polling:
|
||||
interval_ms: 15000
|
||||
---
|
||||
You are working on {{ issue.identifier }}: {{ issue.title }}
|
||||
"""
|
||||
result = parse_workflow(content)
|
||||
assert result.config["tracker"]["kind"] == "linear"
|
||||
assert result.config["tracker"]["project_slug"] == "my-project"
|
||||
assert result.config["polling"]["interval_ms"] == 15000
|
||||
assert "{{ issue.identifier }}" in result.prompt_template
|
||||
|
||||
def test_no_front_matter(self):
|
||||
content = "Just a prompt template with {{ issue.title }}"
|
||||
result = parse_workflow(content)
|
||||
assert result.config == {}
|
||||
assert result.prompt_template == content
|
||||
|
||||
def test_empty_front_matter(self):
|
||||
content = """---
|
||||
---
|
||||
Hello {{ issue.identifier }}"""
|
||||
result = parse_workflow(content)
|
||||
assert result.config == {}
|
||||
assert "Hello" in result.prompt_template
|
||||
|
||||
def test_front_matter_not_a_map(self):
|
||||
content = """---
|
||||
- item1
|
||||
- item2
|
||||
---
|
||||
prompt body"""
|
||||
with pytest.raises(WorkflowFrontMatterNotAMapError):
|
||||
parse_workflow(content)
|
||||
|
||||
def test_invalid_yaml(self):
|
||||
content = """---
|
||||
invalid: yaml: content: [
|
||||
---
|
||||
prompt"""
|
||||
with pytest.raises(WorkflowParseError):
|
||||
parse_workflow(content)
|
||||
|
||||
def test_prompt_is_trimmed(self):
|
||||
content = """---
|
||||
key: value
|
||||
---
|
||||
|
||||
Some prompt with whitespace
|
||||
|
||||
"""
|
||||
result = parse_workflow(content)
|
||||
assert result.prompt_template == "Some prompt with whitespace"
|
||||
|
||||
|
||||
class TestLoadWorkflow:
|
||||
"""Tests for load_workflow function."""
|
||||
|
||||
def test_missing_file(self, tmp_path):
|
||||
with pytest.raises(MissingWorkflowFileError):
|
||||
load_workflow(tmp_path / "nonexistent.md")
|
||||
|
||||
def test_valid_file(self, tmp_path):
|
||||
workflow_file = tmp_path / "WORKFLOW.md"
|
||||
workflow_file.write_text("""---
|
||||
tracker:
|
||||
kind: linear
|
||||
---
|
||||
Hello {{ issue.title }}""")
|
||||
|
||||
result = load_workflow(workflow_file)
|
||||
assert result.config["tracker"]["kind"] == "linear"
|
||||
assert "Hello" in result.prompt_template
|
||||
Reference in New Issue
Block a user