| /** | |
| * @license | |
| * Copyright 2017 Google LLC | |
| * SPDX-License-Identifier: Apache-2.0 | |
| */ | |
| import '../../../test/common-test-setup'; | |
| import {GrReviewerUpdatesParser} from './gr-reviewer-updates-parser'; | |
| import {parseDate} from '../../../utils/date-util'; | |
| import {assert} from '@open-wc/testing'; | |
| suite('gr-reviewer-updates-parser tests', () => { | |
| test('ignores changes without messages', () => { | |
| const change = {}; | |
| sinon.stub( | |
| GrReviewerUpdatesParser.prototype, '_filterRemovedMessages'); | |
| sinon.stub( | |
| GrReviewerUpdatesParser.prototype, '_groupUpdates'); | |
| sinon.stub( | |
| GrReviewerUpdatesParser.prototype, '_formatUpdates'); | |
| assert.strictEqual(GrReviewerUpdatesParser.parse(change), change); | |
| assert.isFalse( | |
| GrReviewerUpdatesParser.prototype._filterRemovedMessages.called); | |
| assert.isFalse( | |
| GrReviewerUpdatesParser.prototype._groupUpdates.called); | |
| assert.isFalse( | |
| GrReviewerUpdatesParser.prototype._formatUpdates.called); | |
| }); | |
| test('ignores changes without reviewer updates', () => { | |
| const change = { | |
| messages: [], | |
| }; | |
| sinon.stub( | |
| GrReviewerUpdatesParser.prototype, '_filterRemovedMessages'); | |
| sinon.stub( | |
| GrReviewerUpdatesParser.prototype, '_groupUpdates'); | |
| sinon.stub( | |
| GrReviewerUpdatesParser.prototype, '_formatUpdates'); | |
| assert.strictEqual(GrReviewerUpdatesParser.parse(change), change); | |
| assert.isFalse( | |
| GrReviewerUpdatesParser.prototype._filterRemovedMessages.called); | |
| assert.isFalse( | |
| GrReviewerUpdatesParser.prototype._groupUpdates.called); | |
| assert.isFalse( | |
| GrReviewerUpdatesParser.prototype._formatUpdates.called); | |
| }); | |
| test('ignores changes with empty reviewer updates', () => { | |
| const change = { | |
| messages: [], | |
| reviewer_updates: [], | |
| }; | |
| sinon.stub( | |
| GrReviewerUpdatesParser.prototype, '_filterRemovedMessages'); | |
| sinon.stub( | |
| GrReviewerUpdatesParser.prototype, '_groupUpdates'); | |
| sinon.stub( | |
| GrReviewerUpdatesParser.prototype, '_formatUpdates'); | |
| assert.strictEqual(GrReviewerUpdatesParser.parse(change), change); | |
| assert.isFalse( | |
| GrReviewerUpdatesParser.prototype._filterRemovedMessages.called); | |
| assert.isFalse( | |
| GrReviewerUpdatesParser.prototype._groupUpdates.called); | |
| assert.isFalse( | |
| GrReviewerUpdatesParser.prototype._formatUpdates.called); | |
| }); | |
| test('filter removed messages', () => { | |
| const change = { | |
| messages: [ | |
| { | |
| message: 'msg1', | |
| tag: 'autogenerated:gerrit:deleteReviewer', | |
| }, | |
| { | |
| message: 'msg2', | |
| tag: 'foo', | |
| }, | |
| ], | |
| }; | |
| const instance = new GrReviewerUpdatesParser(change); | |
| instance._filterRemovedMessages(); | |
| assert.deepEqual(instance.result, { | |
| messages: [{ | |
| message: 'msg2', | |
| tag: 'foo', | |
| }], | |
| }); | |
| }); | |
| test('group reviewer updates', () => { | |
| const reviewer1 = {_account_id: 1}; | |
| const reviewer2 = {_account_id: 2}; | |
| const date1 = '2017-01-26 12:11:50.000000000'; | |
| const date2 = '2017-01-26 12:11:55.000000000'; // Within threshold. | |
| const date3 = '2017-01-26 12:33:50.000000000'; | |
| const date4 = '2017-01-26 12:44:50.000000000'; | |
| const makeItem = function(state, reviewer, date, author) { | |
| return { | |
| reviewer, | |
| updated: date || date1, | |
| updated_by: author || reviewer1, | |
| state, | |
| }; | |
| }; | |
| let change = { | |
| reviewer_updates: [ | |
| makeItem('REVIEWER', reviewer1), // New group. | |
| makeItem('CC', reviewer2), // Appended. | |
| makeItem('REVIEWER', reviewer2, date2), // Overrides previous one. | |
| makeItem('CC', reviewer1, date2, reviewer2), // New group. | |
| makeItem('REMOVED', reviewer2, date3), // Group has no state change. | |
| makeItem('REVIEWER', reviewer2, date3), | |
| makeItem('CC', reviewer1, date4), // No change, removed. | |
| makeItem('REVIEWER', reviewer1, date4), // Forms new group | |
| makeItem('REMOVED', reviewer2, date4), // Should be grouped. | |
| ], | |
| }; | |
| const instance = new GrReviewerUpdatesParser(change); | |
| instance._groupUpdates(); | |
| change = instance.result; | |
| assert.equal(change.reviewer_updates.length, 3); | |
| assert.equal(change.reviewer_updates[0].updates.length, 2); | |
| assert.equal(change.reviewer_updates[1].updates.length, 1); | |
| assert.equal(change.reviewer_updates[2].updates.length, 2); | |
| assert.equal(change.reviewer_updates[0].date, date1); | |
| assert.deepEqual(change.reviewer_updates[0].author, reviewer1); | |
| assert.deepEqual(change.reviewer_updates[0].updates, [ | |
| { | |
| reviewer: reviewer1, | |
| state: 'REVIEWER', | |
| }, | |
| { | |
| reviewer: reviewer2, | |
| state: 'REVIEWER', | |
| }, | |
| ]); | |
| assert.equal(change.reviewer_updates[1].date, date2); | |
| assert.deepEqual(change.reviewer_updates[1].author, reviewer2); | |
| assert.deepEqual(change.reviewer_updates[1].updates, [ | |
| { | |
| reviewer: reviewer1, | |
| state: 'CC', | |
| prev_state: 'REVIEWER', | |
| }, | |
| ]); | |
| assert.equal(change.reviewer_updates[2].date, date4); | |
| assert.deepEqual(change.reviewer_updates[2].author, reviewer1); | |
| assert.deepEqual(change.reviewer_updates[2].updates, [ | |
| { | |
| reviewer: reviewer1, | |
| prev_state: 'CC', | |
| state: 'REVIEWER', | |
| }, | |
| { | |
| reviewer: reviewer2, | |
| prev_state: 'REVIEWER', | |
| state: 'REMOVED', | |
| }, | |
| ]); | |
| }); | |
| test('format reviewer updates', () => { | |
| const reviewer1 = {_account_id: 1}; | |
| const reviewer2 = {_account_id: 2}; | |
| const makeItem = function(prev, state, reviewer) { | |
| return { | |
| reviewer: reviewer || reviewer1, | |
| prev_state: prev, | |
| state, | |
| }; | |
| }; | |
| const makeUpdate = function(items) { | |
| return { | |
| author: reviewer1, | |
| updated: '', | |
| updates: items, | |
| }; | |
| }; | |
| const change = { | |
| reviewer_updates: [ | |
| makeUpdate([ | |
| makeItem(undefined, 'CC'), | |
| makeItem(undefined, 'CC', reviewer2), | |
| ]), | |
| makeUpdate([ | |
| makeItem('CC', 'REVIEWER'), | |
| makeItem('REVIEWER', 'REMOVED'), | |
| makeItem('REMOVED', 'REVIEWER'), | |
| makeItem(undefined, 'REVIEWER', reviewer2), | |
| ]), | |
| ], | |
| }; | |
| const instance = new GrReviewerUpdatesParser(change); | |
| instance._formatUpdates(); | |
| assert.equal(change.reviewer_updates.length, 2); | |
| assert.equal(change.reviewer_updates[0].updates.length, 1); | |
| assert.equal(change.reviewer_updates[1].updates.length, 3); | |
| let items = change.reviewer_updates[0].updates; | |
| assert.equal(items[0].message, 'Added to cc: '); | |
| assert.deepEqual(items[0].reviewers, [reviewer1, reviewer2]); | |
| items = change.reviewer_updates[1].updates; | |
| assert.equal(items[0].message, 'Moved from cc to reviewer: '); | |
| assert.deepEqual(items[0].reviewers, [reviewer1]); | |
| assert.equal(items[1].message, 'Removed from reviewer: '); | |
| assert.deepEqual(items[1].reviewers, [reviewer1]); | |
| assert.equal(items[2].message, 'Added to reviewer: '); | |
| assert.deepEqual(items[2].reviewers, [reviewer1, reviewer2]); | |
| }); | |
| test('_advanceUpdates', () => { | |
| const T0 = parseDate('2017-02-17 19:04:18.000000000').getTime(); | |
| const tplus = delta => new Date(T0 + delta) | |
| .toISOString() | |
| .replace('T', ' ') | |
| .replace('Z', '000000'); | |
| const change = { | |
| reviewer_updates: [{ | |
| date: tplus(0), | |
| type: 'REVIEWER_UPDATE', | |
| updates: [{ | |
| message: 'same time update', | |
| }], | |
| }, { | |
| date: tplus(200), | |
| type: 'REVIEWER_UPDATE', | |
| updates: [{ | |
| message: 'update within threshold', | |
| }], | |
| }, { | |
| date: tplus(600), | |
| type: 'REVIEWER_UPDATE', | |
| updates: [{ | |
| message: 'update between messages', | |
| }], | |
| }, { | |
| date: tplus(1000), | |
| type: 'REVIEWER_UPDATE', | |
| updates: [{ | |
| message: 'late update', | |
| }], | |
| }], | |
| messages: [{ | |
| id: '6734489eb9d642de28dbf2bcf9bda875923800d8', | |
| date: tplus(0), | |
| message: 'Uploaded patch set 1.', | |
| }, { | |
| id: '6734489eb9d642de28dbf2bcf9bda875923800d8', | |
| date: tplus(800), | |
| message: 'Uploaded patch set 2.', | |
| }], | |
| }; | |
| const instance = new GrReviewerUpdatesParser(change); | |
| instance._advanceUpdates(); | |
| const updates = instance.result.reviewer_updates; | |
| assert.isBelow(parseDate(updates[0].date).getTime(), T0); | |
| assert.isBelow(parseDate(updates[1].date).getTime(), T0); | |
| assert.equal(updates[2].date, tplus(100)); | |
| assert.equal(updates[3].date, tplus(500)); | |
| }); | |
| }); | |