# test.govlab/quality/core/selectors/failure.selector.test.ts

> 16 lines of code and 0 definitions.

Tree: Codebase Testing
Language: typescript
Canonical: https://banes-lab.com/anatomy/testing#file-testing-test-govlab-quality-core-selectors-failure-selector-test-ts
Source text: https://banes-lab.com/source/testing/test.govlab/quality/core/selectors/failure.selector.test.ts.txt

Listed in [test.govlab/quality/core/selectors](https://banes-lab.com/api/source/testing/test.govlab/quality/core/selectors.md), after [test.govlab/quality/core/selectors/exclusions.selector.test.ts](https://banes-lab.com/source/testing/test.govlab/quality/core/selectors/exclusions.selector.test.ts.md) and before [test.govlab/quality/core/selectors/record.selector.test.ts](https://banes-lab.com/source/testing/test.govlab/quality/core/selectors/record.selector.test.ts.md).

## Contained in

- [test.govlab/quality/core/selectors](https://banes-lab.com/anatomy/testing/folder-testing-test-govlab-quality-core-selectors.md)

## Source

```typescript
import { errnoCode, exitDetail, spawnDetail, tailLines } from "@govlab/quality/core/selectors/failure.selector.ts";
import { expect, test } from "vitest";

test("tailLines keeps the last lines joined, or the fallback when the text is blank", () => {
    expect(tailLines("a\nb\nc\nd", "none")).toBe("b c d");
    expect(tailLines("   ", "none")).toBe("none");
});

test("exitDetail prefers stderr and falls back to stdout", () => {
    expect(exitDetail({ status: 1, stderr: "bad", stdout: "out" })).toBe("bad");
    expect(exitDetail({ status: 1, stderr: "", stdout: "out" })).toBe("out");
});

test("errnoCode and spawnDetail read the error code beside the message", () => {
    const error = Object.assign(new Error("spawn x ENOENT"), { code: "ENOENT" });
    expect(errnoCode(error)).toBe("ENOENT");
    expect(spawnDetail(error)).toBe("ENOENT spawn x ENOENT");
    expect(errnoCode(new Error("plain"))).toBe("");
});
```
