<!DOCTYPE html>
<!--
Copyright 2019 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->

<script src="/bower_components/webcomponentsjs/webcomponents-loader.js"></script>
<script src="/bower_components/web-component-tester/browser.js"></script>
<link rel="import" href="/dashboard/spa/cp-icons.html">
<link rel="import" href="/dashboard/spa/element-base.html">
<link rel="import" href="/dashboard/spa/menu-input.html">
<link rel="import" href="/dashboard/spa/report-template-request.html">
<link rel="import" href="/dashboard/spa/timeseries-descriptor.html">
<link rel="import" href="/dashboard/spa/utils.html">
<script src="/dashboard/spa/import-module.js"></script>

<test-fixture id="test">
  <template>
    <report-template state-path="test"></report-template>
  </template>
</test-fixture>

<script>
'use strict';
suite('report-template', function() {
  let originalFetch;
  let templateBody;
  setup(() => {
    originalFetch = window.fetch;
    window.fetch = async(url, options) => {
      return {
        async json() {
          if (url === cp.ReportTemplateRequest.URL) {
            templateBody = new Map(options.body);
            return [];
          }
          if (url === cp.TestSuitesRequest.URL) {
            return ['suite'];
          }
          if (url === cp.DescribeRequest.URL) {
            return {
              bots: ['master:bot'],
              measurements: ['measurement'],
              cases: ['case'],
            };
          }
        },
      };
    };
  });
  teardown(() => {
    window.fetch = originalFetch;
  });

  test('canSave', async function() {
    const {default: ReportTemplate} = await importModule(
        './report-template.js');
    assert.isTrue(ReportTemplate.canSave(
        'name', 'owner@chromium.org', {selectedOptions: ['avg']}, [{
          label: 'label',
          suite: {selectedOptions: ['suite']},
          measurement: {selectedOptions: ['measurement']},
          bot: {selectedOptions: ['bot']},
        }]));
    assert.isFalse(ReportTemplate.canSave(
        '', 'owner@chromium.org', {selectedOptions: ['avg']}, [{
          label: 'label',
          suite: {selectedOptions: ['suite']},
          measurement: {selectedOptions: ['measurement']},
          bot: {selectedOptions: ['bot']},
        }]));
    assert.isFalse(ReportTemplate.canSave(
        'name', '', {selectedOptions: ['avg']}, [{
          label: 'label',
          suite: {selectedOptions: ['suite']},
          measurement: {selectedOptions: ['measurement']},
          bot: {selectedOptions: ['bot']},
        }]));
    assert.isFalse(ReportTemplate.canSave(
        'name', 'owner@chromium.org', {selectedOptions: []}, [{
          label: 'label',
          suite: {selectedOptions: ['suite']},
          measurement: {selectedOptions: ['measurement']},
          bot: {selectedOptions: ['bot']},
        }]));
    assert.isFalse(ReportTemplate.canSave(
        'name', 'owner@chromium.org', {selectedOptions: ['avg']}, [{
          label: '',
          suite: {selectedOptions: ['suite']},
          measurement: {selectedOptions: ['measurement']},
          bot: {selectedOptions: ['bot']},
        }]));
    assert.isFalse(ReportTemplate.canSave(
        'name', 'owner@chromium.org', {selectedOptions: ['avg']}, [{
          label: 'label',
          suite: {selectedOptions: []},
          measurement: {selectedOptions: ['measurement']},
          bot: {selectedOptions: ['bot']},
        }]));
    assert.isFalse(ReportTemplate.canSave(
        'name', 'owner@chromium.org', {selectedOptions: ['avg']}, [{
          label: 'label',
          suite: {selectedOptions: ['suite']},
          measurement: {selectedOptions: []},
          bot: {selectedOptions: ['bot']},
        }]));
    assert.isFalse(ReportTemplate.canSave(
        'name', 'owner@chromium.org', {selectedOptions: ['avg']}, [{
          label: 'label',
          suite: {selectedOptions: ['suite']},
          measurement: {selectedOptions: ['measurement', 'another']},
          bot: {selectedOptions: ['bot']},
        }]));
    assert.isFalse(ReportTemplate.canSave(
        'name', 'owner@chromium.org', {selectedOptions: ['avg']}, [{
          label: 'label',
          suite: {selectedOptions: ['suite']},
          measurement: {selectedOptions: ['measurement']},
          bot: {selectedOptions: []},
        }]));
  });

  test('addRemoveRow', async function() {
    const {default: ReportTemplate} = await importModule(
        './report-template.js');
    const template = fixture('test');
    template.dispatch(Redux.CHAIN(
        Redux.ENSURE('test'),
        Redux.UPDATE('test', ReportTemplate.buildState({
          id: 42,
          name: 'test name',
          owners: 'me@chromium.org',
          rows: [
            ReportTemplate.newTemplateRow({
              label: 'label',
              suites: ['suite'],
              measurement: 'measurement',
              bots: ['master:bot'],
              cases: ['case'],
            }),
          ],
          statistic: cp.MenuInput.buildState({
            options: ['avg', 'std'],
            selectedOptions: ['avg'],
          }),
          url: 'http://example.com',
        }))));
    await cp.afterRender();
    assert.lengthOf(template.rows, 1);

    template.shadowRoot.querySelector('iron-icon').click();
    await cp.afterRender();
    assert.lengthOf(template.rows, 2);

    template.shadowRoot.querySelectorAll('iron-icon')[3].click();
    await cp.afterRender();
    assert.lengthOf(template.rows, 1);
  });

  test('save', async function() {
    const {default: ReportTemplate} = await importModule(
        './report-template.js');
    const template = fixture('test');
    template.dispatch(Redux.CHAIN(
        Redux.ENSURE('test'),
        Redux.UPDATE('test', ReportTemplate.buildState({
          id: 42,
          name: 'test name',
          owners: 'me@chromium.org',
          rows: [
            ReportTemplate.newTemplateRow({
              label: 'label',
              suites: ['suite'],
              measurement: 'measurement',
              bots: ['master:bot'],
              cases: ['case'],
            }),
          ],
          statistic: cp.MenuInput.buildState({
            options: ['avg', 'std'],
            selectedOptions: ['avg'],
          }),
          url: 'http://example.com',
        }))));
    await cp.afterRender();
    template.$.save.click();
    await cp.afterRender();
    assert.strictEqual('42', templateBody.get('id'));
    assert.strictEqual('test name', templateBody.get('name'));
    assert.strictEqual('me@chromium.org', templateBody.get('owners'));
    assert.deepEqual(JSON.parse(templateBody.get('template')), {
      url: 'http://example.com',
      statistics: ['avg'],
      rows: [{
        label: 'label',
        suites: ['suite'],
        measurement: 'measurement',
        bots: ['master:bot'],
        cases: ['case'],
      }],
    });
  });
});
</script>
