forked from Siteimprove/alfa-integrations
-
Notifications
You must be signed in to change notification settings - Fork 0
/
chai.ts
72 lines (64 loc) · 1.87 KB
/
chai.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/// <reference types="chai" />
import { Question, Rule } from "@siteimprove/alfa-act";
import { Asserter, Assertion, Handler } from "@siteimprove/alfa-assert";
import { Future } from "@siteimprove/alfa-future";
import { Hashable } from "@siteimprove/alfa-hash";
import { Mapper } from "@siteimprove/alfa-mapper";
import * as assert from "@siteimprove/alfa-assert";
declare global {
namespace Chai {
interface Assertion {
accessible<
I,
T extends Hashable,
Q extends Question.Metadata = {},
S = T
>(
options?: assert.Assertion.Options<I, T, Q, S>
): Promise<void>;
}
}
}
/**
* @public
*/
export namespace Chai {
export function createPlugin<
I,
J,
T extends Hashable,
Q extends Question.Metadata = {},
S = T
>(
transform: Mapper<I, Future.Maybe<J>>,
rules: Iterable<Rule<J, T, Q, S>>,
handlers: Iterable<Handler<J, T, Q, S>> = [],
options: Asserter.Options<J, T, Q, S> = {}
): globalThis.Chai.ChaiPlugin {
const asserter = Asserter.of(rules, handlers, options);
return (chai) => {
chai.Assertion.addMethod(
"accessible",
async function (options: Assertion.Options<J, T, Q, S> = {}) {
const input = await transform(this._obj);
const result = await asserter
.expect(input, options)
.to.be.accessible();
const message = result.isOk() ? result.get() : result.getErr();
this.assert(
result.isOk(),
`expected #{this} to be accessible${
result.isErr() ? ` but ${message}` : ""
}`,
`expected #{this} to not be accessible${
result.isOk() ? ` but ${message}` : ""
}`,
/* Expected */ true,
/* Actual */ result.isOk(),
/* Show diff */ false
);
}
);
};
}
}