<!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">
<meta charset="utf-8">
<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>
