Viktar Donich | 95c868e | 2017-01-18 22:22:15 -0800 | [diff] [blame] | 1 | <!DOCTYPE html> |
| 2 | <!-- |
| 3 | Copyright (C) 2017 The Android Open Source Project |
| 4 | |
| 5 | Licensed under the Apache License, Version 2.0 (the "License"); |
| 6 | you may not use this file except in compliance with the License. |
| 7 | You may obtain a copy of the License at |
| 8 | |
| 9 | http://www.apache.org/licenses/LICENSE-2.0 |
| 10 | |
| 11 | Unless required by applicable law or agreed to in writing, software |
| 12 | distributed under the License is distributed on an "AS IS" BASIS, |
| 13 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 14 | See the License for the specific language governing permissions and |
| 15 | limitations under the License. |
| 16 | --> |
| 17 | |
| 18 | <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes"> |
| 19 | <title>gr-reviewer-updates-parser</title> |
| 20 | |
Viktar Donich | 29e1ce5 | 2017-03-28 17:02:44 -0700 | [diff] [blame] | 21 | <script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script> |
Viktar Donich | 95c868e | 2017-01-18 22:22:15 -0800 | [diff] [blame] | 22 | <script src="../../../bower_components/web-component-tester/browser.js"></script> |
| 23 | |
| 24 | <link rel="import" href="../../../bower_components/iron-test-helpers/iron-test-helpers.html"> |
| 25 | |
| 26 | <script src="../../../scripts/util.js"></script> |
| 27 | <script src="gr-reviewer-updates-parser.js"></script> |
| 28 | |
| 29 | <script> |
| 30 | suite('gr-reviewer-updates-parser tests', function() { |
| 31 | var sandbox; |
| 32 | var instance; |
| 33 | |
| 34 | setup(function() { |
| 35 | sandbox = sinon.sandbox.create(); |
| 36 | }); |
| 37 | |
| 38 | teardown(function() { |
| 39 | sandbox.restore(); |
| 40 | }); |
| 41 | |
Viktar Donich | 0f1296ff | 2017-02-02 12:39:52 -0800 | [diff] [blame] | 42 | test('ignores changes without messages', function() { |
| 43 | var change = {}; |
| 44 | sandbox.stub( |
| 45 | GrReviewerUpdatesParser.prototype, '_filterRemovedMessages'); |
| 46 | sandbox.stub( |
| 47 | GrReviewerUpdatesParser.prototype, '_groupUpdates'); |
| 48 | sandbox.stub( |
| 49 | GrReviewerUpdatesParser.prototype, '_formatUpdates'); |
| 50 | assert.strictEqual(GrReviewerUpdatesParser.parse(change), change); |
| 51 | assert.isFalse( |
| 52 | GrReviewerUpdatesParser.prototype._filterRemovedMessages.called); |
| 53 | assert.isFalse( |
| 54 | GrReviewerUpdatesParser.prototype._groupUpdates.called); |
| 55 | assert.isFalse( |
| 56 | GrReviewerUpdatesParser.prototype._formatUpdates.called); |
| 57 | }); |
| 58 | |
| 59 | test('ignores changes without reviewer updates', function() { |
| 60 | var change = { |
| 61 | messages: [], |
| 62 | }; |
| 63 | sandbox.stub( |
| 64 | GrReviewerUpdatesParser.prototype, '_filterRemovedMessages'); |
| 65 | sandbox.stub( |
| 66 | GrReviewerUpdatesParser.prototype, '_groupUpdates'); |
| 67 | sandbox.stub( |
| 68 | GrReviewerUpdatesParser.prototype, '_formatUpdates'); |
| 69 | assert.strictEqual(GrReviewerUpdatesParser.parse(change), change); |
| 70 | assert.isFalse( |
| 71 | GrReviewerUpdatesParser.prototype._filterRemovedMessages.called); |
| 72 | assert.isFalse( |
| 73 | GrReviewerUpdatesParser.prototype._groupUpdates.called); |
| 74 | assert.isFalse( |
| 75 | GrReviewerUpdatesParser.prototype._formatUpdates.called); |
| 76 | }); |
| 77 | |
| 78 | test('ignores changes with empty reviewer updates', function() { |
| 79 | var change = { |
| 80 | messages: [], |
| 81 | reviewer_updates: [], |
| 82 | }; |
| 83 | sandbox.stub( |
| 84 | GrReviewerUpdatesParser.prototype, '_filterRemovedMessages'); |
| 85 | sandbox.stub( |
| 86 | GrReviewerUpdatesParser.prototype, '_groupUpdates'); |
| 87 | sandbox.stub( |
| 88 | GrReviewerUpdatesParser.prototype, '_formatUpdates'); |
| 89 | assert.strictEqual(GrReviewerUpdatesParser.parse(change), change); |
| 90 | assert.isFalse( |
| 91 | GrReviewerUpdatesParser.prototype._filterRemovedMessages.called); |
| 92 | assert.isFalse( |
| 93 | GrReviewerUpdatesParser.prototype._groupUpdates.called); |
| 94 | assert.isFalse( |
| 95 | GrReviewerUpdatesParser.prototype._formatUpdates.called); |
| 96 | }); |
| 97 | |
Viktar Donich | 95c868e | 2017-01-18 22:22:15 -0800 | [diff] [blame] | 98 | test('filter removed messages', function() { |
| 99 | var change = { |
| 100 | messages: [ |
| 101 | { |
| 102 | message: 'msg1', |
| 103 | tag: 'autogenerated:gerrit:deleteReviewer', |
| 104 | }, |
| 105 | { |
| 106 | message: 'msg2', |
| 107 | tag: 'foo', |
| 108 | } |
| 109 | ], |
| 110 | }; |
| 111 | instance = new GrReviewerUpdatesParser(change); |
| 112 | instance._filterRemovedMessages(); |
| 113 | assert.deepEqual(instance.result, { |
| 114 | messages: [{ |
| 115 | message: 'msg2', |
| 116 | tag: 'foo', |
| 117 | }], |
| 118 | }); |
| 119 | }); |
| 120 | |
| 121 | test('group reviewer updates', function() { |
| 122 | var reviewer1 = {_account_id: 1}; |
| 123 | var reviewer2 = {_account_id: 2}; |
| 124 | var date1 = '2017-01-26 12:11:50.000000000'; |
| 125 | var date2 = '2017-01-26 12:11:55.000000000'; // Within threshold. |
| 126 | var date3 = '2017-01-26 12:33:50.000000000'; |
| 127 | var date4 = '2017-01-26 12:44:50.000000000'; |
| 128 | var makeItem = function(state, reviewer, opt_date, opt_author) { |
| 129 | return { |
| 130 | reviewer: reviewer, |
| 131 | updated: opt_date || date1, |
| 132 | updated_by: opt_author || reviewer1, |
| 133 | state: state, |
| 134 | }; |
| 135 | }; |
| 136 | var change = { |
| 137 | reviewer_updates: [ |
| 138 | makeItem('REVIEWER', reviewer1), // New group. |
| 139 | makeItem('CC', reviewer2), // Appended. |
| 140 | makeItem('REVIEWER', reviewer2, date2), // Overrides previous one. |
| 141 | |
| 142 | makeItem('CC', reviewer1, date2, reviewer2), // New group. |
| 143 | |
| 144 | makeItem('REMOVED', reviewer2, date3), // Group has no state change. |
| 145 | makeItem('REVIEWER', reviewer2, date3), |
| 146 | |
| 147 | makeItem('CC', reviewer1, date4), // No change, removed. |
| 148 | makeItem('REVIEWER', reviewer1, date4), // Forms new group |
| 149 | makeItem('REMOVED', reviewer2, date4), // Should be grouped. |
| 150 | ], |
| 151 | }; |
| 152 | |
| 153 | instance = new GrReviewerUpdatesParser(change); |
| 154 | instance._groupUpdates(); |
| 155 | change = instance.result; |
| 156 | |
| 157 | assert.equal(change.reviewer_updates.length, 3); |
| 158 | assert.equal(change.reviewer_updates[0].updates.length, 2); |
| 159 | assert.equal(change.reviewer_updates[1].updates.length, 1); |
| 160 | assert.equal(change.reviewer_updates[2].updates.length, 2); |
| 161 | |
| 162 | assert.equal(change.reviewer_updates[0].date, date1); |
| 163 | assert.deepEqual(change.reviewer_updates[0].author, reviewer1); |
| 164 | assert.deepEqual(change.reviewer_updates[0].updates, [ |
| 165 | { |
| 166 | reviewer: reviewer1, |
| 167 | state: 'REVIEWER', |
| 168 | }, |
| 169 | { |
| 170 | reviewer: reviewer2, |
| 171 | state: 'REVIEWER', |
| 172 | }, |
| 173 | ]); |
| 174 | |
| 175 | assert.equal(change.reviewer_updates[1].date, date2); |
| 176 | assert.deepEqual(change.reviewer_updates[1].author, reviewer2); |
| 177 | assert.deepEqual(change.reviewer_updates[1].updates, [ |
| 178 | { |
| 179 | reviewer: reviewer1, |
| 180 | state: 'CC', |
| 181 | prev_state: 'REVIEWER', |
| 182 | }, |
| 183 | ]); |
| 184 | |
| 185 | assert.equal(change.reviewer_updates[2].date, date4); |
| 186 | assert.deepEqual(change.reviewer_updates[2].author, reviewer1); |
| 187 | assert.deepEqual(change.reviewer_updates[2].updates, [ |
| 188 | { |
| 189 | reviewer: reviewer1, |
| 190 | prev_state: 'CC', |
| 191 | state: 'REVIEWER', |
| 192 | }, |
| 193 | { |
| 194 | reviewer: reviewer2, |
| 195 | prev_state: 'REVIEWER', |
| 196 | state: 'REMOVED', |
| 197 | }, |
| 198 | ]); |
| 199 | }); |
| 200 | |
| 201 | test('format reviewer updates', function() { |
| 202 | var reviewer1 = {_account_id: 1}; |
| 203 | var reviewer2 = {_account_id: 2}; |
| 204 | var makeItem = function(prev, state, opt_reviewer) { |
| 205 | return { |
| 206 | reviewer: opt_reviewer || reviewer1, |
| 207 | prev_state: prev, |
| 208 | state: state, |
| 209 | }; |
| 210 | }; |
| 211 | var makeUpdate = function(items) { |
| 212 | return { |
| 213 | author: reviewer1, |
| 214 | updated: '', |
| 215 | updates: items, |
| 216 | }; |
| 217 | }; |
| 218 | var change = { |
| 219 | reviewer_updates: [ |
| 220 | makeUpdate([ |
| 221 | makeItem(undefined, 'CC'), |
| 222 | makeItem(undefined, 'CC', reviewer2) |
| 223 | ]), |
| 224 | makeUpdate([ |
| 225 | makeItem('CC', 'REVIEWER'), |
| 226 | makeItem('REVIEWER', 'REMOVED'), |
| 227 | makeItem('REMOVED', 'REVIEWER'), |
| 228 | makeItem(undefined, 'REVIEWER', reviewer2), |
| 229 | ]), |
| 230 | ], |
| 231 | }; |
| 232 | |
| 233 | instance = new GrReviewerUpdatesParser(change); |
| 234 | instance._formatUpdates(); |
| 235 | |
| 236 | assert.equal(change.reviewer_updates.length, 2); |
| 237 | assert.equal(change.reviewer_updates[0].updates.length, 1); |
| 238 | assert.equal(change.reviewer_updates[1].updates.length, 3); |
| 239 | |
| 240 | var items = change.reviewer_updates[0].updates; |
| 241 | assert.equal(items[0].message, 'added to CC: '); |
| 242 | assert.deepEqual(items[0].reviewers, [reviewer1, reviewer2]); |
| 243 | |
| 244 | items = change.reviewer_updates[1].updates; |
| 245 | assert.equal(items[0].message, 'moved from CC to REVIEWER: '); |
| 246 | assert.deepEqual(items[0].reviewers, [reviewer1]); |
| 247 | assert.equal(items[1].message, 'removed from REVIEWER: '); |
| 248 | assert.deepEqual(items[1].reviewers, [reviewer1]); |
| 249 | assert.equal(items[2].message, 'added to REVIEWER: '); |
| 250 | assert.deepEqual(items[2].reviewers, [reviewer1, reviewer2]); |
| 251 | }); |
| 252 | }); |
| 253 | </script> |