Repository navigation
Expand file tree
/
Copy pathgroup-by-multi-keys.test.js
More file actions
130 lines (116 loc) · 3.67 KB
/
Copy pathgroup-by-multi-keys.test.js
File metadata and controls
130 lines (116 loc) · 3.67 KB
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
const groupByMultiKeys = require("./group-by-multi-keys");
describe("groupByMultiKeys", () => {
const records = [
{
id: 0,
firstName: "Anirudh",
lastName: "Nimmagadda",
age: 29,
emails: ["anirudh1@example.com"],
},
{
id: 1,
firstName: "Anirudh",
emails: ["anirudh2@example.com"],
},
{
id: 2,
firstName: "Ani",
lastName: "N",
emails: ["anirudh1@example.com", "anirudh2@example.com"],
},
{
id: 3,
firstName: "John",
lastName: "Smith",
age: 42,
emails: ["jsmith1@example.com"],
},
{
id: 4,
firstName: "John",
lastName: "S",
emails: ["jsmith1@example.com", "jsmith2@example.com"],
},
{
id: 5,
firstName: "James",
lastName: "R",
emails: ["james@example.com"],
},
];
it("throws when supplied anything but an array and a function", () => {
expect(() => groupByMultiKeys()).toThrow(TypeError);
expect(() => groupByMultiKeys([])).toThrow(TypeError);
expect(() => groupByMultiKeys([], {})).toThrow(TypeError);
});
it("groups records by generated key", () => {
const grouped = groupByMultiKeys(records, (r) => r.firstName);
expect(
grouped.map((records) => records.map(({ id }) => id))
).toIncludeSameMembers([[0, 1], [2], [3, 4], [5]]);
});
test("if multiple keys are generated per record, it groups records when *any* of their generated keys match", () => {
// records with the same email belong to the same person
const grouped = groupByMultiKeys(records, (r) => r.emails);
expect(
grouped.map((records) => records.map(({ id }) => id))
).toIncludeSameMembers([[0, 1, 2], [3, 4], [5]]);
});
it("works fine when records have multiple overlapping keys", () => {
const anotherUser = {
id: 6,
firstName: "John",
emails: [
"jsmith1@example.com",
"jsmith2@example.com",
"jsmith3@example.com",
"jsmith4@example.com",
],
};
const allRecords = records.concat(anotherUser);
const grouped = groupByMultiKeys(allRecords, (user) => user.emails);
expect(
grouped.map((records) => records.map(({ id }) => id))
).toIncludeSameMembers([[0, 1, 2], [3, 4, 6], [5]]);
});
test("does not overwrite any existing keys in record objects when adding the temporary group key to them", () => {
let grouped;
const recordsCopy = records.map((r) => ({ ...r }));
grouped = groupByMultiKeys(recordsCopy, (user) => user.emails);
grouped.forEach((group) =>
group.forEach((recordAfterGrouping) => {
const { id } = recordAfterGrouping;
const correspondingRecordBeforeGrouping = records.find(
(r) => r.id === id
);
expect(recordAfterGrouping).toStrictEqual(
correspondingRecordBeforeGrouping
);
})
);
// because the temporary group key is added with attrname '__groupKey' by default
const recordsWithAGroupKeyAttributeAdded = records.map((r) => ({
...r,
__groupKey: "Some nonsense",
}));
const recordsWithAGroupKeyAttributeAddedCopy = recordsWithAGroupKeyAttributeAdded.map(
(r) => ({ ...r })
);
grouped = groupByMultiKeys(
recordsWithAGroupKeyAttributeAddedCopy,
(user) => user.emails
);
grouped.forEach((group) =>
group.forEach((recordAfterGrouping) => {
const { id } = recordAfterGrouping;
const correspondingRecordBeforeGrouping = recordsWithAGroupKeyAttributeAddedCopy.find(
(r) => r.id === id
);
expect(recordAfterGrouping).toStrictEqual(
correspondingRecordBeforeGrouping
);
})
);
});
});