| <!DOCTYPE html> |
| <!-- |
| @license |
| Copyright (C) 2016 The Android Open Source Project |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| |
| <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes"> |
| <title>gr-message</title> |
| |
| <script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script> |
| <script src="../../../bower_components/web-component-tester/browser.js"></script> |
| <link rel="import" href="../../../test/common-test-setup.html"/> |
| <link rel="import" href="gr-message.html"> |
| |
| <script>void(0);</script> |
| |
| <test-fixture id="basic"> |
| <template> |
| <gr-message></gr-message> |
| </template> |
| </test-fixture> |
| |
| <script> |
| suite('gr-message tests', () => { |
| let element; |
| |
| setup(done => { |
| stub('gr-rest-api-interface', { |
| getLoggedIn() { return Promise.resolve(false); }, |
| getConfig() { return Promise.resolve({}); }, |
| }); |
| element = fixture('basic'); |
| flush(done); |
| }); |
| |
| test('reply event', done => { |
| element.message = { |
| id: '47c43261_55aa2c41', |
| author: { |
| _account_id: 1115495, |
| name: 'Andrew Bonventre', |
| email: 'andybons@chromium.org', |
| }, |
| date: '2016-01-12 20:24:49.448000000', |
| message: 'Uploaded patch set 1.', |
| _revision_number: 1, |
| }; |
| |
| element.addEventListener('reply', e => { |
| assert.deepEqual(e.detail.message, element.message); |
| done(); |
| }); |
| flushAsynchronousOperations(); |
| MockInteractions.tap(element.$$('.replyContainer gr-button')); |
| }); |
| |
| test('autogenerated prefix hiding', () => { |
| element.message = { |
| tag: 'autogenerated:gerrit:test', |
| updated: '2016-01-12 20:24:49.448000000', |
| }; |
| |
| assert.isTrue(element.isAutomated); |
| assert.isFalse(element.hidden); |
| |
| element.hideAutomated = true; |
| |
| assert.isTrue(element.hidden); |
| }); |
| |
| test('reviewer message treated as autogenerated', () => { |
| element.message = { |
| tag: 'autogenerated:gerrit:test', |
| updated: '2016-01-12 20:24:49.448000000', |
| reviewer: {}, |
| }; |
| |
| assert.isTrue(element.isAutomated); |
| assert.isFalse(element.hidden); |
| |
| element.hideAutomated = true; |
| |
| assert.isTrue(element.hidden); |
| }); |
| |
| test('batch reviewer message treated as autogenerated', () => { |
| element.message = { |
| type: 'REVIEWER_UPDATE', |
| updated: '2016-01-12 20:24:49.448000000', |
| reviewer: {}, |
| }; |
| |
| assert.isTrue(element.isAutomated); |
| assert.isFalse(element.hidden); |
| |
| element.hideAutomated = true; |
| |
| assert.isTrue(element.hidden); |
| }); |
| |
| test('tag that is not autogenerated prefix does not hide', () => { |
| element.message = { |
| tag: 'something', |
| updated: '2016-01-12 20:24:49.448000000', |
| }; |
| |
| assert.isFalse(element.isAutomated); |
| assert.isFalse(element.hidden); |
| |
| element.hideAutomated = true; |
| |
| assert.isFalse(element.hidden); |
| }); |
| |
| test('reply button hidden unless logged in', () => { |
| const message = { |
| message: 'Uploaded patch set 1.', |
| }; |
| assert.isFalse(element._computeShowReplyButton(message, false)); |
| assert.isTrue(element._computeShowReplyButton(message, true)); |
| }); |
| |
| test('_computeShowOnBehalfOf', () => { |
| const message = { |
| message: '...', |
| }; |
| assert.isNotOk(element._computeShowOnBehalfOf(message)); |
| message.author = {_account_id: 1115495}; |
| assert.isNotOk(element._computeShowOnBehalfOf(message)); |
| message.real_author = {_account_id: 1115495}; |
| assert.isNotOk(element._computeShowOnBehalfOf(message)); |
| message.real_author._account_id = 123456; |
| assert.isOk(element._computeShowOnBehalfOf(message)); |
| message.updated_by = message.author; |
| delete message.author; |
| assert.isOk(element._computeShowOnBehalfOf(message)); |
| delete message.updated_by; |
| assert.isNotOk(element._computeShowOnBehalfOf(message)); |
| }); |
| |
| ['Trybot-Ready', 'Tryjob-Request', 'Commit-Queue'].forEach(label => { |
| test(`${label} ignored for color voting`, () => { |
| element.message = { |
| author: {}, |
| expanded: false, |
| message: `Patch Set 1: ${label}+1`, |
| }; |
| assert.isNotOk( |
| Polymer.dom(element.root).querySelector('.negativeVote')); |
| assert.isNotOk( |
| Polymer.dom(element.root).querySelector('.positiveVote')); |
| }); |
| }); |
| |
| test('votes', () => { |
| element.message = { |
| author: {}, |
| expanded: false, |
| message: 'Patch Set 1: Verified+1 Code-Review-2 Trybot-Ready+1', |
| _revision_number: 1, |
| }; |
| element.comments = {}; |
| element.labelExtremes = { |
| 'Verified': {max: 1, min: -1}, |
| 'Code-Review': {max: 2, min: -2}, |
| 'Trybot-Ready': {max: 3, min: 0}, |
| }; |
| flushAsynchronousOperations(); |
| const scoreChips = Polymer.dom(element.root).querySelectorAll('.score'); |
| assert.equal(scoreChips.length, 3); |
| |
| assert.isTrue(scoreChips[0].classList.contains('positive')); |
| assert.isTrue(scoreChips[0].classList.contains('max')); |
| |
| assert.isTrue(scoreChips[1].classList.contains('negative')); |
| assert.isTrue(scoreChips[1].classList.contains('min')); |
| |
| assert.isTrue(scoreChips[2].classList.contains('positive')); |
| assert.isFalse(scoreChips[2].classList.contains('min')); |
| }); |
| |
| test('false negative vote', () => { |
| element.message = { |
| author: {}, |
| expanded: false, |
| message: 'Patch Set 1: Cherry Picked from branch stable-2.14.', |
| }; |
| element.labelExtremes = {}; |
| const scoreChips = Polymer.dom(element.root).querySelectorAll('.score'); |
| assert.equal(scoreChips.length, 0); |
| }); |
| |
| suite('_consumeMessage', () => { |
| const assertConsumeFailed = str => { |
| element._consumeMessage(str); |
| assert.isFalse(element._successfulParse); |
| }; |
| |
| test('no message body', () => { |
| assertConsumeFailed(''); |
| }); |
| |
| test('known old schema', () => { |
| const str = 'Patch Set 1: Looks good to me, approved; Verified'; |
| assertConsumeFailed(str); |
| }); |
| |
| test('known old schema 2', () => { |
| const str = [ |
| 'Patch Set 2: Looks good to me', |
| '', |
| 'Patch set 2 compiles, and runs as expected.', |
| ].join('\n'); |
| assertConsumeFailed(str); |
| }); |
| |
| test('known old schema 3', () => { |
| const str = 'Patch Set 2: (1 inline comment)'; |
| assertConsumeFailed(str); |
| }); |
| |
| test('known old schema 4', () => { |
| const str = [ |
| 'Patch Set 2: Looks good to me', |
| '', |
| '(1 inline comment)', |
| ].join('\n'); |
| assertConsumeFailed(str); |
| }); |
| |
| test('just change message', () => { |
| const str = [ |
| 'Patch Set 2:', |
| '', |
| 'I think you should reconsider this approach.', |
| 'It really makes no sense.', |
| ].join('\n'); |
| |
| element._consumeMessage(str); |
| |
| assert.isTrue(element._successfulParse); |
| assert.equal(element._parsedPatchNum, '2'); |
| assert.equal(element._parsedCommentCount, ''); |
| assert.deepEqual(element._parsedVotes, []); |
| assert.equal(element._parsedChangeMessage, [ |
| 'I think you should reconsider this approach.', |
| 'It really makes no sense.', |
| ].join('\n')); |
| }); |
| |
| test('just votes', () => { |
| element._consumeMessage('Patch Set 2: Code-Review-Label+1 Verified+1'); |
| |
| assert.isTrue(element._successfulParse); |
| assert.equal(element._parsedPatchNum, '2'); |
| assert.equal(element._parsedCommentCount, ''); |
| assert.deepEqual(element._parsedVotes, [ |
| {label: 'Code-Review-Label', value: '+1'}, |
| {label: 'Verified', value: '+1'}, |
| ]); |
| assert.equal(element._parsedChangeMessage, ''); |
| }); |
| |
| test('just comments', () => { |
| const str = [ |
| 'Patch Set 2:', |
| '', |
| '(8 comments)', |
| ].join('\n'); |
| |
| element._consumeMessage(str); |
| |
| assert.isTrue(element._successfulParse); |
| assert.equal(element._parsedPatchNum, '2'); |
| assert.equal(element._parsedCommentCount, '8'); |
| assert.deepEqual(element._parsedVotes, []); |
| assert.equal(element._parsedChangeMessage, ''); |
| }); |
| |
| test('vote with comments and change message', () => { |
| const str = [ |
| 'Patch Set 2: Code-Review-Label+1 Verified+1', |
| '', |
| '(1 comment)', |
| '', |
| 'LGTM', |
| '', |
| 'Nice work, just one nit.', |
| ].join('\n'); |
| |
| element._consumeMessage(str); |
| |
| assert.isTrue(element._successfulParse); |
| assert.equal(element._parsedPatchNum, '2'); |
| assert.equal(element._parsedCommentCount, '1'); |
| assert.deepEqual(element._parsedVotes, [ |
| {label: 'Code-Review-Label', value: '+1'}, |
| {label: 'Verified', value: '+1'}, |
| ]); |
| assert.equal(element._parsedChangeMessage, [ |
| 'LGTM', |
| '', |
| 'Nice work, just one nit.', |
| ].join('\n')); |
| }); |
| |
| test('vote with change message', () => { |
| const str = [ |
| 'Patch Set 2: Code-Review-Label+2 Verified+1', |
| '', |
| 'LGTM', |
| '', |
| 'Nice work.', |
| ].join('\n'); |
| |
| element._consumeMessage(str); |
| |
| assert.isTrue(element._successfulParse); |
| assert.equal(element._parsedPatchNum, '2'); |
| assert.equal(element._parsedCommentCount, ''); |
| assert.deepEqual(element._parsedVotes, [ |
| {label: 'Code-Review-Label', value: '+2'}, |
| {label: 'Verified', value: '+1'}, |
| ]); |
| assert.equal(element._parsedChangeMessage, [ |
| 'LGTM', |
| '', |
| 'Nice work.', |
| ].join('\n')); |
| }); |
| }); |
| }); |
| </script> |