Skip to content

Add act/Docker integration tests for subprocess boundary and _extract…#43

Merged
wpak-ai merged 6 commits into
cppalliance:developfrom
henry0816191:feature/act-integration-tests
May 29, 2026
Merged

Add act/Docker integration tests for subprocess boundary and _extract…#43
wpak-ai merged 6 commits into
cppalliance:developfrom
henry0816191:feature/act-integration-tests

Conversation

@henry0816191
Copy link
Copy Markdown
Collaborator

@henry0816191 henry0816191 commented May 28, 2026

Summary

Adds optional pytest integration coverage for the real act/Docker subprocess path (w4_issue_02 / Test 31). Unit tests mock act extensively; these tests validate JobExecutor.run(), localci run, and _extract_error() against live act output.

Changes

  • Integration test package (cli/tests/integration/)
    • test_act_subprocess.py — success run and failing run with _extract_error() checked against captured act stdout/stderr
    • test_localci_run.pylocalci run for success, failure, and invalid workflow (no traceback on parse errors)
    • conftest.py — skip when act/Docker missing; pull/tag catthehacker/ubuntu:act-24.04 for CLI runs
  • Fixtures (cli/tests/fixtures/integration/project/)
    • Minimal workflows: test.yml (echo), test-fail.yml (exit 1), invalid.yml (malformed YAML)
    • Minimal .localci.yml (cache off, single parallel job)
  • Pytest config (cli/pyproject.toml) — integration marker; norecursedirs excludes integration from default collection
  • CI (.github/workflows/ci.yml)
    • Unit matrix: pytest -m "not integration"
    • New job Integration (act + Docker): install act v0.2.76, pull runner image, run integration tests
  • Docs (cli/README.md) — how to run unit vs integration tests

Design notes

  • Workflows use strategy.matrix.include (one entry) because WorkflowAnalyzer only produces runnable matrix entries that way.
  • Executor tests map act’s image directly; CLI tests tag the derived capy-ubuntu-latest-gcc15:latest name so the orchestrator finds a local image.
  • test_run_invalid_workflow does not require act/Docker (parse fails before execution).

Test plan

  • cd cli && pytest -m "not integration" — unit tests pass
  • pytest tests/integration -m integration — invalid-workflow test passes without act; others skip or run when act/Docker available
  • CI: unit job (3.10–3.12) and Integration (act + Docker) job green on GHA

Related

Summary by CodeRabbit

  • Tests

    • Added a comprehensive integration test suite exercising CLI runs and subprocess execution (success, failure, invalid workflow), plus fixtures and session-level setup that require containerized execution.
  • Documentation

    • Updated development testing instructions with explicit unit, coverage (excluding integration), and a separate integration test command.
  • Chores

    • Split CI into unit and integration runs, added a dedicated integration job with a longer timeout and pinned workflow tooling; adjusted test commands to exclude integration tests from unit runs.

Review Change Stack

@henry0816191 henry0816191 self-assigned this May 28, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 28, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds Docker-backed integration tests and CI separation: pytest now defines an integration marker and unit tests exclude it; CI gains a separate integration job installing act and running tests/integration. Fixtures, conftest setup, JobExecutor subprocess tests, and CLI end-to-end tests exercise success, failure, and invalid workflows.

Changes

Integration Test Coverage for Act Subprocess Boundary

Layer / File(s) Summary
Test marker configuration and CI workflow
.github/workflows/ci.yml, cli/README.md, cli/pyproject.toml
Pytest integration marker added; README documents unit, coverage, and integration commands; CI test job excludes integration tests and a new integration job installs act, verifies it, and runs pytest -m integration.
Test workflow fixtures and config
cli/tests/fixtures/integration/project/.github/workflows/..., cli/tests/fixtures/integration/project/.localci.yml
Adds three workflow fixtures (test.yml success, test-fail.yml failure, invalid.yml parse error) and .localci.yml that configures single-job parallelism, Linux-only, disabled cache/auto-build, log dir, and execution timeouts.
Integration test fixtures and environment setup
cli/tests/integration/conftest.py
Conftest provides act/Docker availability checks, session-scoped skipping, pulls & tags the act runner image, copies fixture project to temp dirs, rewrites .localci.yml logs path, and exposes project/logs fixtures.
JobExecutor integration tests with act subprocess
cli/tests/integration/test_act_subprocess.py
Tests analyze fixture workflows, build act commands, run them via JobExecutor, and assert job PASSED/FAILED status, exit codes, captured output, log file creation, and that error extraction matches failing act output.
CLI integration tests for localci run command
cli/tests/integration/test_localci_run.py
End-to-end CLI tests invoke localci run via CliRunner against fixtures, assert exit codes (0/1), ensure no raw tracebacks on failures, check failure/parse messages, and validate produced ExecutionSummary (last-run.json).
sequenceDiagram
  participant CI as GitHub Actions CI
  participant Unit as pytest (unit)
  participant Integration as pytest (integration job)
  participant Act as act
  participant Docker as Docker

  CI->>Unit: run `test` job (pytest -m "not integration")
  CI->>Integration: run `integration` job (install act, run pytest -m integration)
  Integration->>Act: invoke act to execute workflows
  Act->>Docker: run workflow steps in Docker containers
  Act->>Integration: stream captured output/logs
  Integration->>CI: report integration test results
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Suggested reviewers

  • jonathanMLDev
  • wpak-ai

"A rabbit hops through Docker's den,
With workflows real, no mocks again,
Act echoes true and failures show,
Logs and summaries from files we know,
Tests now guard the act-bound flow."

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 40.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title is partially related but truncated—it cuts off mid-word ('_extract…'), making the primary objective unclear despite accurately referencing the key components (act, Docker, integration tests, subprocess boundary). Complete the title to clearly convey the full objective; e.g., 'Add act/Docker integration tests for subprocess boundary and error extraction' or similar.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check ✅ Passed All acceptance criteria from issue #39 are met: integration test suite created, minimal fixture workflows (success, fail, invalid), integration tests marked with pytest.mark.integration, conftest skips tests when act/Docker unavailable, and CI job added with act/Docker setup.
Out of Scope Changes check ✅ Passed All changes align with issue #39 objectives: integration test infrastructure, fixture workflows, pytest config, CI job setup, and documentation. No unrelated modifications detected.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/ci.yml:
- Around line 45-50: The workflow uses floating action tags and persists
checkout credentials; update the uses entries for actions/checkout and
actions/setup-python to their full commit SHA pins (replace values like
actions/checkout@v4 and actions/setup-python@v5 with the corresponding
full-length commit SHAs), add persist-credentials: false under the
actions/checkout step to disable credential persistence, and replace the current
act installer invocation (the curl .../nektos/act/master/install.sh | bash
pattern) with a safe, pinned install flow: fetch a specific release/tag or
commit of nektos/act, verify integrity (e.g., checksum/signature) and run the
installer without piping from an unpinned branch.
- Around line 55-58: Replace the mutable master URL used by the curl in the CI
step that installs act with a tag-pinned raw script URL so the executed
installer is immutable; specifically update the curl target that currently
points to "raw.githubusercontent.com/nektos/act/master/install.sh" (the line
invoking curl in the "Install act" step) to the tag-refed raw URL that
corresponds to the installer version being passed (e.g., the v0.2.76 tag) so the
downloaded script matches the intended release.

In `@cli/tests/integration/test_act_subprocess.py`:
- Around line 18-31: The helper functions are using the module-level
FIXTURE_PROJECT which breaks per-test isolation; modify _workflow_path and
_build_and_run to accept a project_dir (or project_path) parameter and use that
instead of FIXTURE_PROJECT, then update all call sites (including the other
occurrences referenced) to pass the per-test copied project path provided by
conftest; ensure _workflow_path(name, project_dir) builds the Path from
project_dir / ".github/workflows" / name and _build_and_run(workflow_name,
logs_dir, act_runner_image, project_dir) sets project_dir from the passed-in
argument before running the analyzer and building entry.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: fe8f5be5-49b9-4608-ba1b-cc3359789726

📥 Commits

Reviewing files that changed from the base of the PR and between 4d7311a and 8763ff1.

📒 Files selected for processing (11)
  • .github/workflows/ci.yml
  • cli/README.md
  • cli/pyproject.toml
  • cli/tests/fixtures/integration/project/.github/workflows/invalid.yml
  • cli/tests/fixtures/integration/project/.github/workflows/test-fail.yml
  • cli/tests/fixtures/integration/project/.github/workflows/test.yml
  • cli/tests/fixtures/integration/project/.localci.yml
  • cli/tests/integration/__init__.py
  • cli/tests/integration/conftest.py
  • cli/tests/integration/test_act_subprocess.py
  • cli/tests/integration/test_localci_run.py

Comment thread .github/workflows/ci.yml Outdated
Comment thread .github/workflows/ci.yml
Comment thread cli/tests/integration/test_act_subprocess.py Outdated
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 28, 2026

Actionable comments posted: 0

@henry0816191
Copy link
Copy Markdown
Collaborator Author

@coderabbitai continue to review

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 28, 2026

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Get PR details and changed files
gh pr view 43 --repo cppalliance/local-ci-test-system --json files,headRefName,baseRefName

echo "=== List files in the repo ==="
fd . cli/tests/integration --type f 2>/dev/null || echo "not found locally"
fd . cli/tests/fixtures/integration --type f 2>/dev/null || echo "not found locally"

echo "=== conftest.py ==="
cat cli/tests/integration/conftest.py 2>/dev/null || echo "file not found"

echo "=== test_act_subprocess.py ==="
cat cli/tests/integration/test_act_subprocess.py 2>/dev/null || echo "file not found"

echo "=== test_localci_run.py ==="
cat cli/tests/integration/test_localci_run.py 2>/dev/null || echo "file not found"

echo "=== workflow fixtures ==="
cat "cli/tests/fixtures/integration/project/.github/workflows/test.yml" 2>/dev/null || echo "not found"
cat "cli/tests/fixtures/integration/project/.github/workflows/test-fail.yml" 2>/dev/null || echo "not found"
cat "cli/tests/fixtures/integration/project/.github/workflows/invalid.yml" 2>/dev/null || echo "not found"
cat "cli/tests/fixtures/integration/project/.localci.yml" 2>/dev/null || echo "not found"

echo "=== pyproject.toml ==="
cat cli/pyproject.toml 2>/dev/null || echo "not found"

echo "=== CI workflow ==="
cat .github/workflows/ci.yml 2>/dev/null || echo "not found"

echo "=== README ==="
cat cli/README.md 2>/dev/null || echo "not found"

Length of output: 18789


🏁 Script executed:

#!/bin/bash
echo "=== localci run CLI args ==="
rg -n "timeout|logs_dir|log_file" cli/localci/core/executor.py -A2 -B2 2>/dev/null | head -80

echo "=== Check if JobExecutor creates logs_dir ==="
rg -n "logs_dir|mkdir|makedirs" cli/localci/core/executor.py 2>/dev/null | head -40

echo "=== localci run click command signature ==="
rg -n "timeout|parallel|no.cache" cli/localci/cli/ -A1 -B1 2>/dev/null | head -60

echo "=== _extract_error method ==="
rg -n "_extract_error" cli/localci/core/executor.py -A10 2>/dev/null | head -40

echo "=== JobStatus ==="
rg -n "class JobStatus|PASSED|FAILED" cli/localci/core/executor.py 2>/dev/null | head -20

echo "=== ExecutionSummary.load ==="
rg -n "class ExecutionSummary|def load|last.run" cli/localci/core/results.py 2>/dev/null | head -30

Length of output: 8461



@henry0816191 Here is the full review of PR #43.


Review: Add act/Docker Integration Tests (#43)

The overall structure is well thought out — fixtures are isolated, markers are properly configured, and the test scenarios cover the key behavioral boundaries. Below are the findings organized by severity.


🔴 High — .github/workflows/ci.yml | Install script fetched without integrity check

- name: Install act
  env:
    ACT_VERSION: v0.2.76
  run: |
    curl -sSfL -o /tmp/act-install.sh \
      "https://raw.githubusercontent.com/nektos/act/${ACT_VERSION}/install.sh"
    bash /tmp/act-install.sh -b /usr/local/bin "${ACT_VERSION}"

Downloading and executing a shell script from the internet without a checksum is a supply chain risk. Even though the version is pinned in the URL, raw.githubusercontent.com content is mutable (e.g., force-pushed tags). Consider one of:

  1. Pin via SHA in the URL (using a commit SHA instead of a version tag):
    curl -sSfL -o /tmp/act-install.sh \
      "https://raw.githubusercontent.com/nektos/act/<commit-sha>/install.sh"
    sha256sum --check <<< "<expected-sha256>  /tmp/act-install.sh"
  2. Use a verified GitHub release binary directly, checking the published SHA:
    curl -sSfL -o /tmp/act.tar.gz \
      "https://github.com/nektos/act/releases/download/${ACT_VERSION}/act_Linux_x86_64.tar.gz"
    echo "<sha256>  /tmp/act.tar.gz" | sha256sum --check
    tar -xz -C /usr/local/bin /tmp/act.tar.gz act

🟠 Medium — .github/workflows/ci.yml | Integration job runs in parallel with unit tests

The integration job has no needs: dependency on test. This means integration tests can run (and consume Docker resources) even when unit tests fail, wasting CI minutes and potentially producing confusing mixed-failure signals.

  integration:
    name: Integration (act + Docker)
    runs-on: ubuntu-latest
    needs: [test]          # ← add this

🟠 Medium — .github/workflows/ci.yml | No timeout-minutes on the integration job

A hung Docker pull or a stalled act process could block the runner indefinitely. Add a job-level timeout:

  integration:
    name: Integration (act + Docker)
    runs-on: ubuntu-latest
    needs: [test]
    timeout-minutes: 30

🟠 Medium — cli/tests/integration/conftest.py | yaml.dump() may reorder .localci.yml keys

config_path.write_text(yaml.dump(config, default_flow_style=False))

PyYAML's yaml.dump() sorts keys alphabetically by default (sort_keys=True). This changes the key ordering in the rewritten .localci.yml, which could cause subtle issues if the application reads keys in a particular order or the file is compared to the fixture source. Add sort_keys=False:

config_path.write_text(yaml.dump(config, default_flow_style=False, sort_keys=False))

🟠 Medium — cli/tests/integration/conftest.py | integration_logs_dir uses _ = integration_project to force fixture ordering

`@pytest.fixture`
def integration_logs_dir(tmp_path: Path, integration_project: Path) -> Path:
    """Logs directory configured for the copied integration project."""
    _ = integration_project         # ← forces fixture to run; unused otherwise
    return tmp_path / "logs"

This works but is a code smell. The intent is to ensure the integration_project fixture (which creates tmp_path / "logs") has run before this one returns. A cleaner approach is to have the integration_project fixture return a named tuple or dataclass that bundles both paths, so the dependency is explicit and the side-effect is self-documenting:

# Alternative: return both from integration_project
`@pytest.fixture`
def integration_project(tmp_path: Path) -> tuple[Path, Path]:
    dest = tmp_path / "project"
    ...
    logs_dir = tmp_path / "logs"
    logs_dir.mkdir(parents=True, exist_ok=True)
    ...
    return dest, logs_dir

Or at minimum, add a comment explaining why integration_project is consumed:

`@pytest.fixture`
def integration_logs_dir(tmp_path: Path, integration_project: Path) -> Path:
    # integration_project fixture creates tmp_path/logs and rewrites .localci.yml
    # to point at it; we depend on it here to guarantee that setup runs first.
    return tmp_path / "logs"

🟡 Low — cli/tests/integration/test_act_subprocess.py | Bare tuple return type

def _build_and_run(
    workflow_name: str,
    logs_dir: Path,
    act_runner_image: str,
    project_dir: Path,
) -> tuple:          # ← untyped

Add a specific return annotation (adjust to match the actual types from JobExecutor):

) -> tuple[JobResult, MatrixEntry]:

🟡 Low — cli/tests/integration/test_localci_run.py | test_run_invalid_workflow is marked integration but doesn't require act/Docker

def test_run_invalid_workflow(
    integration_project: Path,
    monkeypatch: pytest.MonkeyPatch,
) -> None:
    """Parse errors occur before act/Docker; no capy_image_tag fixture required."""

This test explicitly documents that it doesn't need act or Docker. It will be skipped in default runs (-m "not integration") but will also be skipped in environments where act is unavailable yet the integration suite is requested. If the intent is that this test always runs (since it's a pure parse-error test), it could be moved to the unit test suite. If it must stay here for organizational reasons, a comment explaining the deliberate omission of require_act_and_docker is helpful (the existing docstring is a good start, but could be more explicit about the consequence).


🟡 Low — cli/tests/integration/conftest.py | Hardcoded 600 s pull timeout is not configurable

pull = subprocess.run(
    ["docker", "pull", ACT_RUNNER_IMAGE],
    ...
    timeout=600,
)

Consider making this a module-level constant alongside INTEGRATION_TIMEOUT:

DOCKER_PULL_TIMEOUT = 600

✅ What's done well

  • norecursedirs = ["integration"] and -m "not integration" correctly gate integration tests from default runs.
  • scope="session" on require_act_and_docker, act_runner_image, and capy_image_tag avoids repeating expensive Docker operations per test.
  • persist-credentials: false on all checkout steps is a good security practice.
  • JobExecutor.__init__ already calls self.logs_dir.mkdir(parents=True, exist_ok=True), so there is no risk of tmp_path / "logs" being missing when passed to _build_and_run — this is handled correctly.
  • The invalid.yml fixture correctly uses an unclosed YAML list (on: [push) to trigger a parse error before any act/Docker involvement.
  • test_run_invalid_workflow correctly avoids the capy_image_tag fixture, preventing unnecessary Docker operations for a parse-time failure test.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
cli/tests/integration/conftest.py (1)

49-54: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Handle docker pull timeout as a skip, not an error.

cli/tests/integration/conftest.py’s act_runner_image calls subprocess.run(..., timeout=DOCKER_PULL_TIMEOUT) but only handles returncode; a timeout raises subprocess.TimeoutExpired and will fail the session instead of skipping integration tests.

Proposed fix
 def act_runner_image(require_act_and_docker: None) -> str:
     """Pull the act runner image used for ubuntu-latest jobs."""
-    pull = subprocess.run(
-        ["docker", "pull", ACT_RUNNER_IMAGE],
-        capture_output=True,
-        text=True,
-        timeout=DOCKER_PULL_TIMEOUT,
-    )
+    try:
+        pull = subprocess.run(
+            ["docker", "pull", ACT_RUNNER_IMAGE],
+            capture_output=True,
+            text=True,
+            timeout=DOCKER_PULL_TIMEOUT,
+        )
+    except subprocess.TimeoutExpired:
+        pytest.skip(
+            f"docker pull timed out after {DOCKER_PULL_TIMEOUT}s for {ACT_RUNNER_IMAGE}"
+        )
     if pull.returncode != 0:
         pytest.skip(
             f"could not pull {ACT_RUNNER_IMAGE}: "
             f"{pull.stderr.strip() or pull.stdout.strip()}"
         )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cli/tests/integration/conftest.py` around lines 49 - 54, The docker pull call
in act_runner_image can raise subprocess.TimeoutExpired and should cause tests
to be skipped instead of failing; wrap the subprocess.run([...],
timeout=DOCKER_PULL_TIMEOUT) call in a try/except that catches
subprocess.TimeoutExpired and calls pytest.skip with a clear message (include
DOCKER_PULL_TIMEOUT and ACT_RUNNER_IMAGE in the message) so integration tests
are skipped when the pull times out; keep the existing returncode handling for
non-zero exits.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@cli/tests/integration/conftest.py`:
- Around line 49-54: The docker pull call in act_runner_image can raise
subprocess.TimeoutExpired and should cause tests to be skipped instead of
failing; wrap the subprocess.run([...], timeout=DOCKER_PULL_TIMEOUT) call in a
try/except that catches subprocess.TimeoutExpired and calls pytest.skip with a
clear message (include DOCKER_PULL_TIMEOUT and ACT_RUNNER_IMAGE in the message)
so integration tests are skipped when the pull times out; keep the existing
returncode handling for non-zero exits.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 602e3d68-97a2-4794-8656-56ba419c0256

📥 Commits

Reviewing files that changed from the base of the PR and between fb6a264 and cdbab8e.

📒 Files selected for processing (4)
  • .github/workflows/ci.yml
  • cli/tests/integration/conftest.py
  • cli/tests/integration/test_act_subprocess.py
  • cli/tests/integration/test_localci_run.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • cli/tests/integration/test_act_subprocess.py

@henry0816191 henry0816191 requested a review from bradjin8 May 28, 2026 22:37
Copy link
Copy Markdown
Collaborator

@bradjin8 bradjin8 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Strong addition for #39 — real act/Docker coverage and a high-value _extract_error check in test_act_subprocess.py. CI layout (unit vs integration job, pinned act binary, needs: [test]) looks good.

Please address the inline comments (mainly docker timeout handling and end-to-end failure assertions on the localci run path) before I approve. Happy to re-review after updates.

Comment thread cli/tests/integration/conftest.py Outdated
Comment thread cli/tests/integration/conftest.py Outdated
Comment thread cli/tests/integration/test_localci_run.py
Comment thread cli/tests/integration/conftest.py
Comment thread cli/tests/integration/test_act_subprocess.py Outdated
Comment thread cli/pyproject.toml
Comment thread .github/workflows/ci.yml Outdated
Comment thread cli/README.md
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@cli/tests/integration/test_localci_run.py`:
- Around line 84-90: The strict equality assertion comparing job.error_message
to JobExecutor._extract_error(captured) is brittle; change it to a containment
check so the normalized stored message can match even if the extracted text has
extra status lines. Replace the equality assertion with: assert
job.error_message in JobExecutor._extract_error(captured), keeping the same
variables (job.error_message, JobExecutor._extract_error, captured).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 16c53ed0-4452-4bf5-8bba-09b7548b2d4d

📥 Commits

Reviewing files that changed from the base of the PR and between cdbab8e and 2e71982.

📒 Files selected for processing (5)
  • .github/workflows/ci.yml
  • cli/README.md
  • cli/tests/integration/conftest.py
  • cli/tests/integration/test_act_subprocess.py
  • cli/tests/integration/test_localci_run.py
💤 Files with no reviewable changes (1)
  • .github/workflows/ci.yml
✅ Files skipped from review due to trivial changes (1)
  • cli/README.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • cli/tests/integration/test_act_subprocess.py

Comment thread cli/tests/integration/test_localci_run.py
@henry0816191 henry0816191 requested a review from bradjin8 May 29, 2026 16:09
@bradjin8 bradjin8 requested a review from wpak-ai May 29, 2026 17:09
@wpak-ai wpak-ai merged commit 5ca159b into cppalliance:develop May 29, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add Integration Test Coverage for Act Subprocess Boundary

3 participants