| // Copyright 2019 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import {assert} from 'chai'; |
| import sinon from 'sinon'; |
| import * as ui from './ui.js'; |
| |
| |
| describe('ui', () => { |
| describe('reducers', () => { |
| describe('snackbarsReducer', () => { |
| it('adds snackbar', () => { |
| let state = ui.snackbarsReducer([], |
| {type: 'SHOW_SNACKBAR', id: 'one', text: 'A snackbar'}); |
| |
| assert.deepEqual(state, [{id: 'one', text: 'A snackbar'}]); |
| |
| state = ui.snackbarsReducer(state, |
| {type: 'SHOW_SNACKBAR', id: 'two', text: 'Another snack'}); |
| |
| assert.deepEqual(state, [ |
| {id: 'one', text: 'A snackbar'}, |
| {id: 'two', text: 'Another snack'}, |
| ]); |
| }); |
| |
| it('removes snackbar', () => { |
| let state = [ |
| {id: 'one', text: 'A snackbar'}, |
| {id: 'two', text: 'Another snack'}, |
| ]; |
| |
| state = ui.snackbarsReducer(state, |
| {type: 'HIDE_SNACKBAR', id: 'one'}); |
| |
| assert.deepEqual(state, [ |
| {id: 'two', text: 'Another snack'}, |
| ]); |
| |
| state = ui.snackbarsReducer(state, |
| {type: 'HIDE_SNACKBAR', id: 'two'}); |
| |
| assert.deepEqual(state, []); |
| }); |
| |
| it('does not remove non-existent snackbar', () => { |
| let state = [ |
| {id: 'one', text: 'A snackbar'}, |
| {id: 'two', text: 'Another snack'}, |
| ]; |
| |
| state = ui.snackbarsReducer(state, |
| {action: 'HIDE_SNACKBAR', id: 'whatever'}); |
| |
| assert.deepEqual(state, [ |
| {id: 'one', text: 'A snackbar'}, |
| {id: 'two', text: 'Another snack'}, |
| ]); |
| }); |
| }); |
| }); |
| |
| describe('selectors', () => { |
| it('snackbars', () => { |
| assert.deepEqual(ui.snackbars({ui: {snackbars: []}}), []); |
| assert.deepEqual(ui.snackbars({ui: {snackbars: [ |
| {text: 'Snackbar one', id: 'one'}, |
| {text: 'Snackbar two', id: 'two'}, |
| ]}}), [ |
| {text: 'Snackbar one', id: 'one'}, |
| {text: 'Snackbar two', id: 'two'}, |
| ]); |
| }); |
| }); |
| |
| describe('action creators', () => { |
| describe('showSnackbar', () => { |
| it('produces action', () => { |
| const action = ui.showSnackbar('id', 'text'); |
| const dispatch = sinon.stub(); |
| |
| action(dispatch); |
| |
| sinon.assert.calledWith(dispatch, |
| {type: 'SHOW_SNACKBAR', text: 'text', id: 'id'}); |
| }); |
| |
| it('hides snackbar after timeout', () => { |
| const clock = sinon.useFakeTimers(0); |
| |
| const action = ui.showSnackbar('id', 'text', 1000); |
| const dispatch = sinon.stub(); |
| |
| action(dispatch); |
| |
| sinon.assert.neverCalledWith(dispatch, |
| {type: 'HIDE_SNACKBAR', id: 'id'}); |
| |
| clock.tick(1000); |
| |
| sinon.assert.calledWith(dispatch, {type: 'HIDE_SNACKBAR', id: 'id'}); |
| |
| clock.restore(); |
| }); |
| |
| it('does not setTimeout when no timeout specified', () => { |
| sinon.stub(window, 'setTimeout'); |
| |
| ui.showSnackbar('id', 'text', 0); |
| |
| sinon.assert.notCalled(window.setTimeout); |
| |
| window.setTimeout.restore(); |
| }); |
| }); |
| |
| it('hideSnackbar produces action', () => { |
| assert.deepEqual(ui.hideSnackbar('one'), |
| {type: 'HIDE_SNACKBAR', id: 'one'}); |
| }); |
| }); |
| }); |