Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame^] | 1 | // 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 | |
| 5 | import {assert} from 'chai'; |
| 6 | import {extractGridData} from './extract-grid-data.js'; |
| 7 | import {extractFieldValuesFromIssue as fieldExtractor, |
| 8 | extractTypeForFieldName as typeExtractor} from 'reducers/projectV0.js'; |
| 9 | |
| 10 | const extractFieldValuesFromIssue = fieldExtractor({}); |
| 11 | const extractTypeForFieldName = typeExtractor({}); |
| 12 | |
| 13 | |
| 14 | describe('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 | }); |