<!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="/node_modules/@webcomponents/webcomponentsjs/custom-elements-es5-adapter.js"></script>

<script src="/node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
<script src="/components/wct-browser-legacy/browser.js"></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 type="module">
import '../../../test/common-test-setup.js';
import '../../plugins/gr-plugin-host/gr-plugin-host.js';
import './gr-reply-dialog.js';
import {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';
import {resetPlugins} from '../../../test/test-utils.js';
import {pluginLoader} from '../../shared/gr-js-api-interface/gr-plugin-loader.js';
import {_testOnly_initGerritPluginApi} from '../../shared/gr-js-api-interface/gr-gerrit.js';

_testOnly_initGerritPluginApi();

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',
      ],
    };
    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.shadowRoot
        .querySelector('gr-button.send'));
    assert.isFalse(sendStub.called);
    flushAsynchronousOperations();

    element.$.ccs.$.entry.setText('test@test.test');
    MockInteractions.tap(element.shadowRoot
        .querySelector('gr-button.send'));
    assert.isTrue(sendStub.called);
  });

  test('lgtm plugin', done => {
    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.shadowRoot
            .querySelector('gr-endpoint-decorator'), '_import');
    pluginLoader.awaitPluginsLoaded().then(() => {
      Promise.all(importSpy.returnValues).then(() => {
        flush(() => {
          const textarea = element.$.textarea.getNativeTextarea();
          textarea.value = 'LGTM';
          textarea.dispatchEvent(new CustomEvent(
              'input', {bubbles: true, composed: true}));
          const labelScoreRows = dom(element.$.labelScores.root)
              .querySelector('gr-label-score-row[name="Code-Review"]');
          const selectedBtn = dom(labelScoreRows.root)
              .querySelector('gr-button[data-value="+1"].iron-selected');
          assert.isOk(selectedBtn);
          done();
        });
      });
    });
  });
});
</script>
