From 67c4f89e2b4cceeb06d57cc57ef725602cc1159c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Jul 2026 21:38:30 +0000 Subject: [PATCH 1/7] Initial plan From 3adfe9cd9cdd9f2c770f65244cd8733ce6d4ca1f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Jul 2026 21:40:07 +0000 Subject: [PATCH 2/7] test: cover review-thread regressions --- .../__pycache__/__init__.cpython-312.pyc | Bin 1619 -> 1651 bytes .../__pycache__/components.cpython-312.pyc | Bin 13576 -> 13608 bytes .../__pycache__/engine.cpython-312.pyc | Bin 16831 -> 16863 bytes .../__pycache__/variables.cpython-312.pyc | Bin 12098 -> 12130 bytes tests/test_automation_review_regressions.py | 77 ++++++++++++++++++ 5 files changed, 77 insertions(+) create mode 100644 tests/test_automation_review_regressions.py diff --git a/src/automation/__pycache__/__init__.cpython-312.pyc b/src/automation/__pycache__/__init__.cpython-312.pyc index 9015d49520b64ad123d1a134ae6e9f4230bef41a..13cc071d0b1381a310c6cea941fde09fd17fba17 100644 GIT binary patch delta 57 zcmcc2^O=Y1G%qg~0}!O$+Q{{YRnba6BR@A)zo;}XFSSU&JijPgzc{t149JF3li#wY F0RSOk6ixsD delta 25 fcmey&bD4+hG%qg~0}$-y+{pEal~HOkFIyS_TQvq{ diff --git a/src/automation/__pycache__/components.cpython-312.pyc b/src/automation/__pycache__/components.cpython-312.pyc index f489f903fdb3b1f4c4ffa55042a4ff2748da8332..9ee5369ecca6317866048b84b767223f5136921b 100644 GIT binary patch delta 58 zcmeCkT9L(dnwOW00SMA=ZREPbtZ1X3k)NBYUsRfxms+G>o?n!$Uz}Q024q92&G(r# F4FNkq6lwqf delta 26 gcmZ3H)se+@nwOW00SI<;ZsfYc%qX+@KeMJG0B9%&fB*mh diff --git a/src/automation/__pycache__/engine.cpython-312.pyc b/src/automation/__pycache__/engine.cpython-312.pyc index 8def6afa67e608c45d74d7e263d4969a4d73700f..6a0fea32427ed48d70dcdde92325409c65a78314 100644 GIT binary patch delta 60 zcmdnr%y_?U_b86*G%qg~0}!O$+Q=2crf997k)NBYUsRfxms+G>o?n!$Uz}Q024q92&GBrH FH2^yr6np>x delta 26 gcmaD9cPNhQG%qg~0}$-y+{hKe#wfkHp6#&)0Bk}Bk^lez diff --git a/tests/test_automation_review_regressions.py b/tests/test_automation_review_regressions.py new file mode 100644 index 0000000..2dbbe55 --- /dev/null +++ b/tests/test_automation_review_regressions.py @@ -0,0 +1,77 @@ +from automation import __doc__ as automation_doc +from automation.components import Component, ComponentInput, ComponentRegistry, FunctionComponent +from automation.engine import AutomationDefinition, AutomationEngine, RunStatus +from automation.variables import GeneratorVariable + + +def test_collect_includes_peeked_value(): + variable = GeneratorVariable.from_iterable([1, 2, 3]) + + assert variable.peek() == 1 + assert variable.collect() == [1, 2, 3] + + +class _LifecycleComponent(Component): + def __init__(self, events, label): + self._events = events + self._label = label + + def setup(self) -> None: + self._events.append(f"{self._label}-setup") + + def teardown(self) -> None: + self._events.append(f"{self._label}-teardown") + + def execute(self, input_: ComponentInput): + return self._ok(input_.payload) + + +def test_register_replaces_component_with_teardown(): + events = [] + registry = ComponentRegistry() + + registry.register("step", _LifecycleComponent(events, "old")) + registry.register("step", _LifecycleComponent(events, "new")) + + assert events == ["old-setup", "old-teardown", "new-setup"] + + +def test_function_component_returns_traceback_on_failure(): + def broken(_input): + raise RuntimeError("boom") + + output = FunctionComponent(broken, name="broken").execute( + ComponentInput(name="broken", payload=None) + ) + + assert output.success is False + assert output.error is not None + assert "Traceback" in output.error + assert "RuntimeError: boom" in output.error + + +def test_missing_variables_fail_run_instead_of_being_silently_dropped(): + engine = AutomationEngine() + engine.register_fn("echo", lambda input_: input_.payload) + engine.define( + AutomationDefinition( + name="uses-missing-variable", + triggers=["demo"], + steps=["echo"], + variables=["missing"], + ) + ) + + [result] = engine.trigger_type("demo", payload="hello") + + assert result.status is RunStatus.FAILED + assert result.error is not None + assert "Variable 'missing' not found in registry" in result.error + assert result.outputs[0].component == "__engine__" + assert result.outputs[0].success is False + + +def test_quick_start_uses_package_imports(): + assert automation_doc is not None + assert "from automation import AutomationEngine" in automation_doc + assert "from src.automation import" not in automation_doc From c17a1c2a48076474897d0e1ff2e8a81c560b80c0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Jul 2026 21:40:39 +0000 Subject: [PATCH 3/7] test: align regression helper naming --- tests/test_automation_review_regressions.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_automation_review_regressions.py b/tests/test_automation_review_regressions.py index 2dbbe55..48c7865 100644 --- a/tests/test_automation_review_regressions.py +++ b/tests/test_automation_review_regressions.py @@ -37,7 +37,8 @@ def test_register_replaces_component_with_teardown(): def test_function_component_returns_traceback_on_failure(): - def broken(_input): + def broken(input_): + del input_ raise RuntimeError("boom") output = FunctionComponent(broken, name="broken").execute( From 5f83d91e9ade7c3fe5f6b196aefc0ba6a366224d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Jul 2026 21:41:06 +0000 Subject: [PATCH 4/7] test: finalize review regression coverage --- tests/test_automation_review_regressions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_automation_review_regressions.py b/tests/test_automation_review_regressions.py index 48c7865..4306b97 100644 --- a/tests/test_automation_review_regressions.py +++ b/tests/test_automation_review_regressions.py @@ -38,7 +38,7 @@ def test_register_replaces_component_with_teardown(): def test_function_component_returns_traceback_on_failure(): def broken(input_): - del input_ + assert input_.name == "broken" raise RuntimeError("boom") output = FunctionComponent(broken, name="broken").execute( From 4829c8dda69bb3b9e6922f95807f26c0a6136a1b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Jul 2026 21:41:34 +0000 Subject: [PATCH 5/7] test: harden review regression checks --- tests/test_automation_review_regressions.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/test_automation_review_regressions.py b/tests/test_automation_review_regressions.py index 4306b97..e154028 100644 --- a/tests/test_automation_review_regressions.py +++ b/tests/test_automation_review_regressions.py @@ -32,8 +32,9 @@ def test_register_replaces_component_with_teardown(): registry.register("step", _LifecycleComponent(events, "old")) registry.register("step", _LifecycleComponent(events, "new")) + assert registry.deregister("step") is True - assert events == ["old-setup", "old-teardown", "new-setup"] + assert events == ["old-setup", "old-teardown", "new-setup", "new-teardown"] def test_function_component_returns_traceback_on_failure(): @@ -63,8 +64,10 @@ def test_missing_variables_fail_run_instead_of_being_silently_dropped(): ) ) - [result] = engine.trigger_type("demo", payload="hello") + results = engine.trigger_type("demo", payload="hello") + assert len(results) == 1 + result = results[0] assert result.status is RunStatus.FAILED assert result.error is not None assert "Variable 'missing' not found in registry" in result.error From 0b73eb65122614d60d917d23083ee4c02daf6ce4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Jul 2026 21:41:57 +0000 Subject: [PATCH 6/7] test: tighten quick-start regression assertion --- tests/test_automation_review_regressions.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_automation_review_regressions.py b/tests/test_automation_review_regressions.py index e154028..e1e4c8c 100644 --- a/tests/test_automation_review_regressions.py +++ b/tests/test_automation_review_regressions.py @@ -76,6 +76,7 @@ def test_missing_variables_fail_run_instead_of_being_silently_dropped(): def test_quick_start_uses_package_imports(): - assert automation_doc is not None + assert isinstance(automation_doc, str) + assert automation_doc.strip() assert "from automation import AutomationEngine" in automation_doc assert "from src.automation import" not in automation_doc From b4fdc4bfa7b5fc1470097e5273c34a6c45f87a4a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Jul 2026 21:42:37 +0000 Subject: [PATCH 7/7] test: clean up review regression helpers --- tests/test_automation_review_regressions.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/test_automation_review_regressions.py b/tests/test_automation_review_regressions.py index e1e4c8c..844291f 100644 --- a/tests/test_automation_review_regressions.py +++ b/tests/test_automation_review_regressions.py @@ -11,7 +11,7 @@ def test_collect_includes_peeked_value(): assert variable.collect() == [1, 2, 3] -class _LifecycleComponent(Component): +class LifecycleHelperComponent(Component): def __init__(self, events, label): self._events = events self._label = label @@ -30,8 +30,8 @@ def test_register_replaces_component_with_teardown(): events = [] registry = ComponentRegistry() - registry.register("step", _LifecycleComponent(events, "old")) - registry.register("step", _LifecycleComponent(events, "new")) + registry.register("step", LifecycleHelperComponent(events, "old")) + registry.register("step", LifecycleHelperComponent(events, "new")) assert registry.deregister("step") is True assert events == ["old-setup", "old-teardown", "new-setup", "new-teardown"] @@ -70,6 +70,7 @@ def test_missing_variables_fail_run_instead_of_being_silently_dropped(): result = results[0] assert result.status is RunStatus.FAILED assert result.error is not None + assert "KeyError" in result.error assert "Variable 'missing' not found in registry" in result.error assert result.outputs[0].component == "__engine__" assert result.outputs[0].success is False