| // 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. |
| |
| import {assert} from 'chai'; |
| import {MrUpload} from './mr-upload.js'; |
| |
| let element; |
| let preventDefault; |
| let mockEvent; |
| |
| |
| describe('mr-upload', () => { |
| beforeEach(() => { |
| element = document.createElement('mr-upload'); |
| document.body.appendChild(element); |
| |
| preventDefault = sinon.stub(); |
| |
| mockEvent = (properties) => { |
| return Object.assign({ |
| preventDefault: preventDefault, |
| }, properties); |
| }; |
| }); |
| |
| afterEach(() => { |
| document.body.removeChild(element); |
| }); |
| |
| it('initializes', () => { |
| assert.instanceOf(element, MrUpload); |
| }); |
| |
| it('reset clears files', () => { |
| element.files = [new File([''], 'filename.txt'), new File([''], 'hello')]; |
| |
| element.reset(); |
| |
| assert.deepEqual(element.files, []); |
| }); |
| |
| it('editing file selector adds files', () => { |
| const files = [ |
| new File([''], 'filename.txt'), |
| new File([''], 'hello'), |
| ]; |
| assert.deepEqual(element.files, []); |
| |
| // NOTE: There is currently no way to use JavaScript to set the value of |
| // an HTML file input. |
| |
| element._filesChanged({ |
| currentTarget: { |
| files: files, |
| }, |
| }); |
| |
| assert.deepEqual(element.files, files); |
| }); |
| |
| it('files are rendered', async () => { |
| element.files = [ |
| new File([''], 'filename.txt'), |
| new File([''], 'hello'), |
| new File([''], 'file.png'), |
| ]; |
| |
| await element.updateComplete; |
| |
| const items = element.shadowRoot.querySelectorAll('li'); |
| |
| assert.equal(items.length, 3); |
| |
| assert.include(items[0].textContent, 'filename.txt'); |
| assert.include(items[1].textContent, 'hello'); |
| assert.include(items[2].textContent, 'file.png'); |
| }); |
| |
| it('clicking removes file', async () => { |
| element.files = [ |
| new File([''], 'filename.txt'), |
| new File([''], 'hello'), |
| new File([''], 'file.png'), |
| ]; |
| |
| await element.updateComplete; |
| |
| let items = element.shadowRoot.querySelectorAll('li'); |
| |
| assert.equal(items.length, 3); |
| |
| items[1].querySelector('button').click(); |
| |
| await element.updateComplete; |
| |
| items = element.shadowRoot.querySelectorAll('li'); |
| |
| assert.equal(items.length, 2); |
| |
| assert.include(items[0].textContent, 'filename.txt'); |
| assert.include(items[1].textContent, 'file.png'); |
| |
| // Make sure clicking works even for children targets. |
| items[0].querySelector('i.material-icons').click(); |
| |
| await element.updateComplete; |
| |
| items = element.shadowRoot.querySelectorAll('li'); |
| |
| assert.equal(items.length, 1); |
| |
| assert.include(items[0].textContent, 'file.png'); |
| }); |
| |
| it('duplicate files are ignored', () => { |
| const file1 = new File([''], 'filename.txt'); |
| const file2 = new File([''], 'woahhh'); |
| const file3 = new File([''], 'filename'); |
| |
| element.files = [file1, file2]; |
| |
| element._addFiles([file2, file3]); |
| |
| assert.deepEqual(element.files, [file1, file2, file3]); |
| }); |
| |
| it('dragging file into window expands element', () => { |
| assert.isFalse(element.expanded); |
| assert.deepEqual(element.files, []); |
| |
| element._onDragIntoWindow(mockEvent({dataTransfer: {files: [ |
| new File([''], 'filename.txt'), |
| new File([''], 'hello'), |
| ]}})); |
| |
| assert.isTrue(element.expanded); |
| assert.deepEqual(element.files, []); |
| assert.isTrue(preventDefault.calledOnce); |
| |
| element._onDragOutOfWindow(mockEvent({dataTransfer: {files: [ |
| new File([''], 'filename.txt'), |
| new File([''], 'hello'), |
| ]}})); |
| |
| assert.isFalse(element.expanded); |
| assert.deepEqual(element.files, []); |
| assert.isTrue(preventDefault.calledTwice); |
| }); |
| |
| it('dragging non-file into window does not expands element', () => { |
| assert.isFalse(element.expanded); |
| |
| element._onDragIntoWindow(mockEvent( |
| {dataTransfer: {files: [], items: [{kind: 'notFile'}]}}, |
| )); |
| |
| assert.isFalse(element.expanded); |
| assert.isFalse(preventDefault.called); |
| |
| element._onDragOutOfWindow(mockEvent( |
| {dataTransfer: {files: [], items: [{kind: 'notFile'}]}}, |
| )); |
| |
| assert.isFalse(element.expanded); |
| assert.isFalse(preventDefault.called); |
| }); |
| |
| it('dragging file over element highlights it', () => { |
| assert.isFalse(element.highlighted); |
| assert.deepEqual(element.files, []); |
| |
| element._onDragInto(mockEvent({dataTransfer: {files: [ |
| new File([''], 'filename.txt'), |
| new File([''], 'hello'), |
| ]}})); |
| |
| assert.isTrue(element.highlighted); |
| assert.deepEqual(element.files, []); |
| assert.isTrue(preventDefault.calledOnce); |
| |
| element._onDragLeave(mockEvent({dataTransfer: {files: [ |
| new File([''], 'filename.txt'), |
| new File([''], 'hello'), |
| ]}})); |
| |
| assert.isFalse(element.highlighted); |
| assert.deepEqual(element.files, []); |
| assert.isTrue(preventDefault.calledTwice); |
| }); |
| |
| it('dropping file over element selects it', () => { |
| const files = [ |
| new File([''], 'filename.txt'), |
| new File([''], 'hello'), |
| ]; |
| assert.deepEqual(element.files, []); |
| |
| element._onDrop(mockEvent({dataTransfer: {files: files}})); |
| |
| assert.isTrue(preventDefault.calledOnce); |
| assert.deepEqual(element.files, files); |
| }); |
| |
| it('loadFiles loads files', async () => { |
| element.files = [ |
| new File(['some content'], 'filename.txt'), |
| new File([''], 'hello'), |
| ]; |
| |
| const uploads = await element.loadFiles(); |
| |
| assert.deepEqual(uploads, [ |
| {content: 'c29tZSBjb250ZW50', filename: 'filename.txt'}, |
| {content: '', filename: 'hello'}, |
| ]); |
| }); |
| }); |