-
Notifications
You must be signed in to change notification settings - Fork 63
/
countBy.spec.ts
68 lines (61 loc) · 1.83 KB
/
countBy.spec.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
import { countBy, filter, pipe, toAsync } from "../src";
import { AsyncFunctionException } from "../src/_internal/error";
type Obj = {
category: "clothes" | "pants" | "shoes";
desc?: string;
};
const given: Obj[] = [
{ category: "clothes", desc: "good" },
{ category: "pants", desc: "bad" },
{ category: "shoes", desc: "not bad" },
{ category: "shoes", desc: "great" },
{ category: "pants", desc: "good" },
];
const then1 = {
clothes: 1,
pants: 2,
shoes: 2,
};
const then2 = {
pants: 2,
shoes: 2,
};
describe("countBy", function () {
describe("sync", function () {
it("should be counted by callback to the 'Iterable'", function () {
const res = countBy((a) => a.category, given);
expect(res).toEqual(then1);
});
it("should be able to be used as a curried function in the pipeline", function () {
const res = pipe(
given,
filter((a) => a.category !== "clothes"),
countBy((a) => a.category),
);
expect(res).toEqual(then2);
});
it("should throw an error when the callback is asynchronous", function () {
const res = () =>
pipe(
given,
filter((a) => a.category !== "clothes"),
countBy((a) => Promise.resolve(a.category)),
);
expect(res).toThrowError(new AsyncFunctionException());
});
});
describe("async", function () {
it("should be counted by callback to the 'AsyncIterable'", async function () {
const res = await countBy((a) => a.category, toAsync(given));
expect(res).toEqual(then1);
});
it("should be able to be used as a curried function in the pipeline", async function () {
const res = await pipe(
toAsync(given),
filter((a) => a.category !== "clothes"),
countBy((a) => a.category),
);
expect(res).toEqual(then2);
});
});
});