| <!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> |