Skip to content

Every ExUnit test is dead in CI: the only mix test sits behind a needs: edge to a failing job #836

Description

@hyperpolymath

The finding

Every ExUnit test in this repository is dead in CI. Not failing — never
executed, while the workflow, the job and the check-run all still appear.

There is exactly one mix test invocation in the whole tree:

.github/workflows/tests.yml:347   run: mix test --include integration

It lives in the integration-tests job, which declares needs: [build-images].
Build Test Images fails. A needs: edge to a failing job does not fail the
dependent job — it makes it skipped.

Measured on the run for 3bf9674a:

Build Test Images    failure
Integration Tests    skipped      <- the only home of mix test

Why this matters more than a red suite

A red suite is visible. A needs:-skipped job looks like it participated: it is
listed, it has a name, it reports a conclusion. And a skipped conclusion
satisfies a required status check, so this can sit behind a green ruleset
indefinitely.

Concretely, it already has: test/unified-api-adapter-contract_test.exs is the
ABI wire-contract guard that #120 repointed from the dead src/abi/Types.idr
onto the live src/Hypatia/ABI/Types.idr, closing instance 21 of the
guard-reads-the-wrong-thing trap. That fix is correct in the tree and vacuous
in CI
, and nothing anywhere said so.

Note also that mix test excludes 242 :verisim_data tests unconditionally
(test/test_helper.exs), so even once it runs, the denominator is ~83%.

Acceptance criteria

  1. Integration Tests reaches conclusion success on a run against main — not
    skipped, not cancelled. Either fix build-images, or move mix test out
    from behind it into a job with no dependency on image building. The Elixir
    unit suite does not need ArangoDB; only the :integration-tagged subset does.
  2. The fix is proven by a mutant: break one assertion in
    test/unified-api-adapter-contract_test.exs (e.g. change one expected
    connector name), push, and confirm the check goes red. Revert and confirm
    green. A suite that cannot be made to fail is not evidence it runs.
  3. The run prints its denominator — the N tests, M failures line must appear
    in the log with N > 0. A zero-test run exits 0 and reads as success.
  4. A workflow-level assertion that no job carrying a test runner can resolve
    skipped silently: either drop the needs: edge, or add a final job with
    if: always() that fails when needs.integration-tests.result == 'skipped'.
  5. State plainly in the job or the README whether the 242 :verisim_data tests
    are in scope. If they stay excluded, the exclusion is named, not implicit.

Probe for re-checking this class of fault anywhere

git grep -n 'mix test\|cargo test\|zig build test\|bun test' -- .github/workflows
gh run view <run-id> --repo O/R --json jobs --jq '.jobs[]|"\(.conclusion)\t\(.name)"' | sort

Ask "did it execute", never "does it exist".

Found while preparing #835.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething is broken or behaves incorrectly

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions