| // Copyright 2022 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import { CURRENT_VERSION, State } from '../src/state'; |
| import { FakeWebviewAPi, logDataForTest } from './util'; |
| import { LoggingView } from '../components/view'; |
| import * as constant from '../src/constants'; |
| import chai from 'chai'; |
| import chaiDom from 'chai-dom'; // not esm |
| import { LogControl } from '../components/log_control'; |
| import { Filter, FilterExpression } from '../src/filter'; |
| import { LogViewActions } from '../components/log_view_actions'; |
| import { WRAP_LOG_TEXT_ATTR } from '../components/log_list'; |
| |
| before(function () { |
| chai.should(); |
| chai.use(chaiDom); |
| }); |
| |
| describe('LoggingView', () => { |
| const filterText = 'moniker:core/foo'; |
| let root: HTMLElement; |
| let vscode: FakeWebviewAPi; |
| let state: State; |
| |
| beforeEach(() => { |
| root = document.createElement('div'); |
| document.body.appendChild(root); |
| vscode = new FakeWebviewAPi(); |
| state = new State(vscode); |
| }); |
| |
| afterEach(() => { |
| root.remove(); |
| }); |
| |
| describe('#constructor', () => { |
| it('crates view with a log list container and a log action container', () => { |
| new LoggingView(state, root); |
| root.children.length.should.equal(2); |
| root.children[0].id.should.equal('log-action-container'); |
| root.children[1].id.should.equal('log-list-container'); |
| }); |
| |
| it('creates log action container with a log control and log view actions', () => { |
| new LoggingView(state, root); |
| const container = root.children[0]; |
| container.children.length.should.equal(2); |
| container.children[0].tagName.toLowerCase().should.equal('log-control'); |
| container.children[1].tagName.toLowerCase().should.equal('log-view-actions'); |
| }); |
| |
| it('initializes log control with the current state filters', async () => { |
| vscode.setState({ |
| version: CURRENT_VERSION, |
| filter: filterText, |
| fields: constant.LOGS_HEADERS, |
| wrappingLogs: true |
| }); |
| new LoggingView(new State(vscode), root); |
| let logControl = root.getElementsByTagName('log-control')[0] as LogControl; |
| await logControl.updateComplete; |
| logControl.value.should.equal(filterText); |
| }); |
| |
| it('initializes log actions view with the current state wrapping logs', async () => { |
| vscode.setState({ |
| version: CURRENT_VERSION, |
| filter: filterText, |
| fields: constant.LOGS_HEADERS, |
| wrappingLogs: true |
| }); |
| new LoggingView(new State(vscode), root); |
| let logViewActions = root.getElementsByTagName('log-view-actions')[0] as LogViewActions; |
| await logViewActions.updateComplete; |
| logViewActions.wrappingLogs.should.be.true; |
| }); |
| |
| it('crates log list container with log list', () => { |
| new LoggingView(state, root); |
| const container = root.children[1]; |
| container.children.length.should.equal(1); |
| container.children[0].id.should.equal('log-list'); |
| }); |
| }); |
| |
| describe('log control integration', () => { |
| it('updates the state on log control filter changes', async () => { |
| new LoggingView(state, root); |
| let logControl = root.getElementsByTagName('log-control')[0] as LogControl; |
| await logControl.updateComplete; |
| const searchBox = logControl.shadowRoot!.querySelector('#search') as HTMLInputElement; |
| searchBox.value = filterText; |
| searchBox.dispatchEvent(new KeyboardEvent('keypress', { 'key': 'Enter' })); |
| await logControl.updateComplete; |
| state.currentFilter.should.deep.equal(new FilterExpression([ |
| [ |
| new Filter({ |
| category: 'moniker', |
| operator: 'contains', |
| subCategory: undefined, |
| values: ['core/foo'], |
| not: false |
| }), |
| ] |
| ])); |
| state.currentFilterText.should.deep.equal(filterText); |
| }); |
| }); |
| |
| describe('log actions view integration', () => { |
| it('clears the log list when the clear button is clicked', async () => { |
| const view = new LoggingView(state, root); |
| const logList = root.querySelector('#log-list') as HTMLElement; |
| view.addLog(logDataForTest('core/foo')); |
| logList.children.length.should.equal(2); |
| |
| let logViewActions = root.getElementsByTagName('log-view-actions')[0] as LogViewActions; |
| await logViewActions.updateComplete; |
| let clearButton = logViewActions.shadowRoot!.querySelector('#clear') as HTMLDivElement; |
| clearButton.click(); |
| logList.children.length.should.equal(1); |
| }); |
| |
| it('updates the state and log list when the wrap logs button is clicked', async () => { |
| const view = new LoggingView(state, root); |
| const logList = root.querySelector('#log-list') as HTMLElement; |
| view.addLog(logDataForTest('core/foo')); |
| logList.children.length.should.equal(2); |
| |
| let logViewActions = root.getElementsByTagName('log-view-actions')[0] as LogViewActions; |
| await logViewActions.updateComplete; |
| let wrapLogsButton = logViewActions.shadowRoot!.querySelector('#wrap-logs') as HTMLDivElement; |
| |
| // Clicking the button for the first should update the other elements to true. |
| // Since we started on true (default state value). |
| wrapLogsButton.click(); |
| await logViewActions.updateComplete; |
| |
| state.shouldWrapLogs.should.be.false; |
| logList.hasAttribute(WRAP_LOG_TEXT_ATTR).should.be.false; |
| |
| // Clicking the button again should update the other elements to false. |
| wrapLogsButton.click(); |
| await logViewActions.updateComplete; |
| |
| state.shouldWrapLogs.should.be.true; |
| logList.hasAttribute(WRAP_LOG_TEXT_ATTR).should.be.true; |
| }); |
| }); |
| }); |