|  | <!DOCTYPE html> | 
|  | <!-- | 
|  | @license | 
|  | Copyright (C) 2015 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-reply-dialog</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="../../plugins/gr-plugin-host/gr-plugin-host.html"> | 
|  | <link rel="import" href="gr-reply-dialog.html"> | 
|  |  | 
|  | <script>void(0);</script> | 
|  |  | 
|  | <test-fixture id="basic"> | 
|  | <template> | 
|  | <gr-reply-dialog></gr-reply-dialog> | 
|  | </template> | 
|  | </test-fixture> | 
|  |  | 
|  | <test-fixture id="plugin-host"> | 
|  | <template> | 
|  | <gr-plugin-host></gr-plugin-host> | 
|  | </template> | 
|  | </test-fixture> | 
|  |  | 
|  | <script> | 
|  | suite('gr-reply-dialog tests', () => { | 
|  | let element; | 
|  | let changeNum; | 
|  | let patchNum; | 
|  |  | 
|  | let sandbox; | 
|  |  | 
|  | const setupElement = element => { | 
|  | element.change = { | 
|  | _number: changeNum, | 
|  | labels: { | 
|  | 'Verified': { | 
|  | values: { | 
|  | '-1': 'Fails', | 
|  | ' 0': 'No score', | 
|  | '+1': 'Verified', | 
|  | }, | 
|  | default_value: 0, | 
|  | }, | 
|  | 'Code-Review': { | 
|  | values: { | 
|  | '-2': 'Do not submit', | 
|  | '-1': 'I would prefer that you didn\'t submit this', | 
|  | ' 0': 'No score', | 
|  | '+1': 'Looks good to me, but someone else must approve', | 
|  | '+2': 'Looks good to me, approved', | 
|  | }, | 
|  | all: [{_account_id: 42, value: 0}], | 
|  | default_value: 0, | 
|  | }, | 
|  | }, | 
|  | }; | 
|  | element.patchNum = patchNum; | 
|  | element.permittedLabels = { | 
|  | 'Code-Review': [ | 
|  | '-1', | 
|  | ' 0', | 
|  | '+1', | 
|  | ], | 
|  | 'Verified': [ | 
|  | '-1', | 
|  | ' 0', | 
|  | '+1', | 
|  | ], | 
|  | }; | 
|  | element.serverConfig = {note_db_enabled: true}; | 
|  | sandbox.stub(element, 'fetchChangeUpdates') | 
|  | .returns(Promise.resolve({isLatest: true})); | 
|  | }; | 
|  |  | 
|  | setup(() => { | 
|  | sandbox = sinon.sandbox.create(); | 
|  |  | 
|  | changeNum = 42; | 
|  | patchNum = 1; | 
|  |  | 
|  | stub('gr-rest-api-interface', { | 
|  | getConfig() { return Promise.resolve({}); }, | 
|  | getAccount() { return Promise.resolve({_account_id: 42}); }, | 
|  | }); | 
|  |  | 
|  | element = fixture('basic'); | 
|  | setupElement(element); | 
|  |  | 
|  | // Allow the elements created by dom-repeat to be stamped. | 
|  | flushAsynchronousOperations(); | 
|  | }); | 
|  |  | 
|  | teardown(() => { | 
|  | sandbox.restore(); | 
|  | }); | 
|  |  | 
|  | test('_submit blocked when invalid email is supplied to ccs', () => { | 
|  | const sendStub = sandbox.stub(element, 'send').returns(Promise.resolve()); | 
|  | // Stub the below function to avoid side effects from the send promise | 
|  | // resolving. | 
|  | sandbox.stub(element, '_purgeReviewersPendingRemove'); | 
|  |  | 
|  | element.$$('#ccs').$.entry.setText('test'); | 
|  | MockInteractions.tap(element.$$('gr-button.send')); | 
|  | assert.isFalse(sendStub.called); | 
|  | flushAsynchronousOperations(); | 
|  |  | 
|  | element.$$('#ccs').$.entry.setText('test@test.test'); | 
|  | MockInteractions.tap(element.$$('gr-button.send')); | 
|  | assert.isTrue(sendStub.called); | 
|  | }); | 
|  |  | 
|  | test('lgtm plugin', done => { | 
|  | Gerrit._resetPlugins(); | 
|  | const pluginHost = fixture('plugin-host'); | 
|  | pluginHost.config = { | 
|  | plugin: { | 
|  | js_resource_paths: [], | 
|  | html_resource_paths: [ | 
|  | new URL('test/plugin.html?' + Math.random(), | 
|  | window.location.href).toString(), | 
|  | ], | 
|  | }, | 
|  | }; | 
|  | element = fixture('basic'); | 
|  | setupElement(element); | 
|  | const importSpy = | 
|  | sandbox.spy(element.$$('gr-endpoint-decorator'), '_import'); | 
|  | Gerrit.awaitPluginsLoaded().then(() => { | 
|  | Promise.all(importSpy.returnValues).then(() => { | 
|  | flush(() => { | 
|  | const textarea = element.$.textarea.getNativeTextarea(); | 
|  | textarea.value = 'LGTM'; | 
|  | textarea.dispatchEvent(new CustomEvent('input', {bubbles: true})); | 
|  | const labelScoreRows = Polymer.dom(element.$.labelScores.root) | 
|  | .querySelector('gr-label-score-row[name="Code-Review"]'); | 
|  | const selectedBtn = Polymer.dom(labelScoreRows.root) | 
|  | .querySelector('gr-button[value="+1"].iron-selected'); | 
|  | assert.isOk(selectedBtn); | 
|  | done(); | 
|  | }); | 
|  | }); | 
|  | }); | 
|  | }); | 
|  | }); | 
|  | </script> |