blob: 41d5c70de62716a328228870b07c4f0461d020ea [file] [log] [blame]
Copybara854996b2021-09-07 19:36:02 +00001// Copyright 2019 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5import {assert} from 'chai';
6import {extractGridData} from './extract-grid-data.js';
7import {extractFieldValuesFromIssue as fieldExtractor,
8 extractTypeForFieldName as typeExtractor} from 'reducers/projectV0.js';
9
10const extractFieldValuesFromIssue = fieldExtractor({});
11const extractTypeForFieldName = typeExtractor({});
12
13
14describe('extract headings from x and y attributes', () => {
15 it('no attributes set', () => {
16 const issues = [
17 {'localId': 1, 'projectName': 'test'},
18 {'localId': 2, 'projectName': 'test'},
19 ];
20
21 const data = extractGridData({
22 issues,
23 extractFieldValuesFromIssue,
24 });
25
26 const expectedIssues = new Map([
27 ['All + All', [
28 {'localId': 1, 'projectName': 'test'},
29 {'localId': 2, 'projectName': 'test'},
30 ]],
31 ]);
32
33 assert.deepEqual(data.xHeadings, ['All']);
34 assert.deepEqual(data.yHeadings, ['All']);
35 assert.deepEqual(data.groupedIssues, expectedIssues);
36 });
37
38 it('extract headings from Attachments attribute', () => {
39 const issues = [
40 {'attachmentCount': 1}, {'attachmentCount': 0},
41 {'attachmentCount': 1},
42 ];
43
44 const data = extractGridData({issues, extractFieldValuesFromIssue},
45 {xFieldName: 'Attachments'});
46
47 const expectedIssues = new Map([
48 ['0 + All', [{'attachmentCount': 0}]],
49 ['1 + All', [{'attachmentCount': 1}, {'attachmentCount': 1}]],
50 ]);
51
52 assert.deepEqual(data.xHeadings, ['0', '1']);
53 assert.deepEqual(data.yHeadings, ['All']);
54 assert.deepEqual(data.groupedIssues, expectedIssues);
55 });
56
57 it('extract headings from Blocked attribute', () => {
58 const issues = [
59 {'blockedOnIssueRefs': [{'localId': 21}]},
60 {'otherIssueProperty': 'issueProperty'},
61 ];
62 const data = extractGridData({issues, extractFieldValuesFromIssue},
63 {xFieldName: 'Blocked', yFieldName: ''});
64
65 const expectedIssues = new Map();
66 expectedIssues.set('Yes + All',
67 [{'blockedOnIssueRefs': [{'localId': 21}]}]);
68 expectedIssues.set('No + All', [{'otherIssueProperty': 'issueProperty'}]);
69
70 assert.deepEqual(data.xHeadings, ['No', 'Yes']);
71 assert.deepEqual(data.yHeadings, ['All']);
72 assert.deepEqual(data.groupedIssues, expectedIssues);
73 });
74
75 it('extract headings from BlockedOn attribute', () => {
76 const issues = [
77 {'otherIssueProperty': 'issueProperty'},
78 {'blockedOnIssueRefs': [
79 {'localId': 3, 'projectName': 'test-projectB'}]},
80 {'blockedOnIssueRefs': [
81 {'localId': 3, 'projectName': 'test-projectA'}]},
82 {'blockedOnIssueRefs': [
83 {'localId': 3, 'projectName': 'test-projectA'}]},
84 {'blockedOnIssueRefs': [
85 {'localId': 1, 'projectName': 'test-projectA'}]},
86 ];
87
88 const data = extractGridData({issues, extractFieldValuesFromIssue},
89 {xFieldName: 'BlockedOn', yFieldName: ''});
90
91 const expectedIssues = new Map();
92 expectedIssues.set('test-projectB:3 + All', [{'blockedOnIssueRefs':
93 [{'localId': 3, 'projectName': 'test-projectB'}]}]);
94 expectedIssues.set('test-projectA:3 + All', [{'blockedOnIssueRefs':
95 [{'localId': 3, 'projectName': 'test-projectA'}]},
96 {'blockedOnIssueRefs':
97 [{'localId': 3, 'projectName': 'test-projectA'}]}]);
98 expectedIssues.set('test-projectA:1 + All', [{'blockedOnIssueRefs':
99 [{'localId': 1, 'projectName': 'test-projectA'}]}]);
100 expectedIssues.set('---- + All', [{'otherIssueProperty': 'issueProperty'}]);
101
102 assert.deepEqual(data.xHeadings, ['----', 'test-projectA:1',
103 'test-projectA:3', 'test-projectB:3']);
104 assert.deepEqual(data.yHeadings, ['All']);
105 assert.deepEqual(data.groupedIssues, expectedIssues);
106 });
107
108 it('extract headings from Blocking attribute', () => {
109 const issues = [
110 {'otherIssueProperty': 'issueProperty'},
111 {'blockingIssueRefs': [
112 {'localId': 1, 'projectName': 'test-projectA'}]},
113 {'blockingIssueRefs': [
114 {'localId': 1, 'projectName': 'test-projectA'}]},
115 {'blockingIssueRefs': [
116 {'localId': 3, 'projectName': 'test-projectA'}]},
117 {'blockingIssueRefs': [
118 {'localId': 3, 'projectName': 'test-projectB'}]},
119 ];
120 const data = extractGridData({issues, extractFieldValuesFromIssue},
121 {xFieldName: 'Blocking', yFieldName: ''});
122
123 const expectedIssues = new Map();
124 expectedIssues.set('test-projectA:1 + All', [{'blockingIssueRefs':
125 [{'localId': 1, 'projectName': 'test-projectA'}]},
126 {'blockingIssueRefs':
127 [{'localId': 1, 'projectName': 'test-projectA'}]}]);
128 expectedIssues.set('test-projectA:3 + All', [{'blockingIssueRefs':
129 [{'localId': 3, 'projectName': 'test-projectA'}]}]);
130 expectedIssues.set('test-projectB:3 + All', [{'blockingIssueRefs':
131 [{'localId': 3, 'projectName': 'test-projectB'}]}]);
132 expectedIssues.set('---- + All', [{'otherIssueProperty': 'issueProperty'}]);
133
134 assert.deepEqual(data.xHeadings, ['----', 'test-projectA:1',
135 'test-projectA:3', 'test-projectB:3']);
136 assert.deepEqual(data.yHeadings, ['All']);
137 assert.deepEqual(data.groupedIssues, expectedIssues);
138 });
139
140 it('extract headings from Component attribute', () => {
141 const issues = [
142 {'otherIssueProperty': 'issueProperty'},
143 {'componentRefs': [{'path': 'UI'}]},
144 {'componentRefs': [{'path': 'API'}]},
145 {'componentRefs': [{'path': 'UI'}]},
146 ];
147 const data = extractGridData({issues, extractFieldValuesFromIssue},
148 {xFieldName: 'Component', yFieldName: ''});
149
150 const expectedIssues = new Map();
151 expectedIssues.set('UI + All', [{'componentRefs': [{'path': 'UI'}]},
152 {'componentRefs': [{'path': 'UI'}]}]);
153 expectedIssues.set('API + All', [{'componentRefs': [{'path': 'API'}]}]);
154 expectedIssues.set('---- + All', [{'otherIssueProperty': 'issueProperty'}]);
155
156 assert.deepEqual(data.xHeadings, ['----', 'API', 'UI']);
157 assert.deepEqual(data.yHeadings, ['All']);
158 assert.deepEqual(data.groupedIssues, expectedIssues);
159 });
160
161 it('extract headings from Reporter attribute', () => {
162 const issues = [
163 {'reporterRef': {'displayName': 'testA@google.com'}},
164 {'reporterRef': {'displayName': 'testB@google.com'}},
165 ];
166 const data = extractGridData({issues, extractFieldValuesFromIssue},
167 {xFieldName: '', yFieldName: 'Reporter'});
168
169 const expectedIssues = new Map();
170 expectedIssues.set('All + testA@google.com',
171 [{'reporterRef': {'displayName': 'testA@google.com'}}]);
172 expectedIssues.set('All + testB@google.com',
173 [{'reporterRef': {'displayName': 'testB@google.com'}}]);
174
175 assert.deepEqual(data.xHeadings, ['All']);
176 assert.deepEqual(data.yHeadings, ['testA@google.com', 'testB@google.com']);
177 assert.deepEqual(data.groupedIssues, expectedIssues);
178 });
179
180 it('extract headings from Stars attribute', () => {
181 const issues = [
182 {'starCount': 1}, {'starCount': 6}, {'starCount': 1},
183 ];
184 const data = extractGridData({issues, extractFieldValuesFromIssue},
185 {xFieldName: '', yFieldName: 'Stars'});
186
187 const expectedIssues = new Map();
188 expectedIssues.set('All + 1', [{'starCount': 1}, {'starCount': 1}]);
189 expectedIssues.set('All + 6', [{'starCount': 6}]);
190
191 assert.deepEqual(data.xHeadings, ['All']);
192 assert.deepEqual(data.yHeadings, ['1', '6']);
193 assert.deepEqual(data.groupedIssues, expectedIssues);
194 });
195
196 it('extract headings from Status in order of statusDefs provided', () => {
197 const issues = [
198 {'statusRef': {'status': 'New'}},
199 {'statusRef': {'status': '1Unknown'}},
200 {'statusRef': {'status': 'Accepted'}},
201 {'statusRef': {'status': 'New'}},
202 {'statusRef': {'status': 'UltraNew'}},
203 ];
204 const statusDefs = [
205 {status: 'UltraNew'}, {status: 'New'}, {status: 'Unused'},
206 {status: 'Accepted'},
207 ];
208
209 const data = extractGridData({issues, extractFieldValuesFromIssue},
210 {yFieldName: 'Status', extractTypeForFieldName, statusDefs});
211
212 const expectedIssues = new Map();
213 expectedIssues.set(
214 'All + Accepted', [{'statusRef': {'status': 'Accepted'}}]);
215 expectedIssues.set(
216 'All + New',
217 [{'statusRef': {'status': 'New'}}, {'statusRef': {'status': 'New'}}]);
218 expectedIssues.set(
219 'All + UltraNew', [{'statusRef': {'status': 'UltraNew'}}]);
220 expectedIssues.set(
221 'All + 1Unknown', [{'statusRef': {'status': '1Unknown'}}]);
222 assert.deepEqual(data.xHeadings, ['All']);
223 assert.deepEqual(
224 data.yHeadings, ['UltraNew', 'New', 'Accepted', '1Unknown']);
225 assert.deepEqual(data.groupedIssues, expectedIssues);
226 });
227
228 it('extract headings from the Type attribute', () => {
229 const issues = [
230 {'labelRefs': [{'label': 'Pri-2'}, {'label': 'Milestone-2000Q1'}]},
231 {'labelRefs': [{'label': 'Type-Defect'}]},
232 {'labelRefs': [{'label': 'Type-Defect'}]},
233 {'labelRefs': [{'label': 'Type-Enhancement'}]},
234 ];
235 const data = extractGridData({issues, extractFieldValuesFromIssue},
236 {yFieldName: 'Type'});
237
238 const expectedIssues = new Map();
239 expectedIssues.set('All + Defect', [
240 {'labelRefs': [{'label': 'Type-Defect'}]},
241 {'labelRefs': [{'label': 'Type-Defect'}]},
242 ]);
243 expectedIssues.set('All + Enhancement', [{'labelRefs':
244 [{'label': 'Type-Enhancement'}]}]);
245 expectedIssues.set('All + ----', [{'labelRefs':
246 [{'label': 'Pri-2'}, {'label': 'Milestone-2000Q1'}]}]);
247
248 assert.deepEqual(data.xHeadings, ['All']);
249 assert.deepEqual(data.yHeadings, ['----', 'Defect', 'Enhancement']);
250 assert.deepEqual(data.groupedIssues, expectedIssues);
251 });
252
253 it('puts predefined labels ahead of ad hoc labels', () => {
254 const issues = [
255 {'labelRefs': [{'label': 'Pri-2'}, {'label': 'Type-Defect'}]},
256 {'labelRefs': [{'label': 'Type-Defect'}]},
257 {'labelRefs': [{'label': 'Type-Enhancement'}]},
258 {'labelRefs': [{'label': 'Type-AAA'}]},
259 ];
260 const labelPrefixValueMap = new Map([
261 ['Pri', new Set(['2'])],
262 ['Type', new Set(['Defect', 'Enhancement'])],
263 ]);
264
265 const data = extractGridData({issues, extractFieldValuesFromIssue},
266 {xFieldName: 'Type', yFieldName: 'Pri', labelPrefixValueMap});
267
268 assert.deepEqual(data.xHeadings, ['Defect', 'Enhancement', 'AAA']);
269 assert.deepEqual(data.yHeadings, ['----', '2']);
270 });
271
272 it('has priority order of predefined, empty, then ad hoc labels', () => {
273 const issues = [
274 {'labelRefs': [{'label': 'Pri-2'}, {'label': 'Milestone-2000Q1'}]},
275 {'labelRefs': [{'label': 'Type-Defect'}]},
276 {'labelRefs': [{'label': 'Type-Enhancement'}]},
277 {'labelRefs': [{'label': 'Type-AAA'}]},
278 ];
279 const labelPrefixValueMap = new Map([
280 ['Pri', new Set(['2'])],
281 ['Type', new Set(['Defect', 'Enhancement'])],
282 ]);
283
284 const data = extractGridData({issues, extractFieldValuesFromIssue},
285 {xFieldName: 'Type', yFieldName: 'Pri', labelPrefixValueMap});
286
287 assert.deepEqual(data.xHeadings, ['Defect', 'Enhancement', '----', 'AAA']);
288 });
289});