From c99e6c34722c8928778dc85df7ab4a042f51ea19 Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Tue, 17 Mar 2020 10:52:11 -0400 Subject: [PATCH] fix(import-preview): COMPASS-4212: handle edge cases where we can't show a preview --- .../import-preview/import-preview.jsx | 11 +- .../import-preview/import-preview.spec.js | 100 ++++++++++++++++++ src/modules/import.js | 2 +- 3 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 src/components/import-preview/import-preview.spec.js diff --git a/src/components/import-preview/import-preview.jsx b/src/components/import-preview/import-preview.jsx index a42b4de..6ffb5af 100644 --- a/src/components/import-preview/import-preview.jsx +++ b/src/components/import-preview/import-preview.jsx @@ -127,9 +127,18 @@ class ImportPreview extends PureComponent { }; render() { - if (!this.props.loaded) { + const { loaded, fields, values } = this.props; + + if (!loaded) { + debug('Preview unavailable: not loaded yet'); return null; } + + if (!Array.isArray(fields) || !Array.isArray(values)) { + debug('Preview unavailable: Fields or values is not an array', { fields, values }); + return null; + } + return (
Specify Fields and Types
diff --git a/src/components/import-preview/import-preview.spec.js b/src/components/import-preview/import-preview.spec.js new file mode 100644 index 0000000..7220468 --- /dev/null +++ b/src/components/import-preview/import-preview.spec.js @@ -0,0 +1,100 @@ +import React from 'react'; +import { mount } from 'enzyme'; + +import ImportPreview from './'; +import createStyler from 'utils/styler.js'; +import styles from './import-preview.less'; + +let onFieldCheckedChangedSpy; +let setFieldTypeSpy; + +describe('ImportPreview [Component]', () => { + describe('not loaded', () => { + let component; + + before(() => { + onFieldCheckedChangedSpy = sinon.spy(); + setFieldTypeSpy = sinon.spy(); + + component = mount( + + ); + }); + + it('should not render', () => { + const style = createStyler(styles, 'import-preview'); + expect(component.find(`.${style()}`)).to.not.be.present(); + }); + + after(() => { + component = null; + onFieldCheckedChangedSpy = null; + setFieldTypeSpy = null; + }); + }); + describe('no fields', () => { + let component; + + before(() => { + onFieldCheckedChangedSpy = sinon.spy(); + setFieldTypeSpy = sinon.spy(); + + component = mount( + + ); + }); + + it('should not render', () => { + const style = createStyler(styles, 'import-preview'); + expect(component.find(`.${style()}`)).to.not.be.present(); + }); + + after(() => { + component = null; + onFieldCheckedChangedSpy = null; + setFieldTypeSpy = null; + }); + }); + + describe('no fields', () => { + let component; + + before(() => { + onFieldCheckedChangedSpy = sinon.spy(); + setFieldTypeSpy = sinon.spy(); + + component = mount( + + ); + }); + + it('should not render', () => { + const style = createStyler(styles, 'import-preview'); + expect(component.find(`.${style()}`)).to.not.be.present(); + }); + + after(() => { + component = null; + onFieldCheckedChangedSpy = null; + setFieldTypeSpy = null; + }); + }); +}); diff --git a/src/modules/import.js b/src/modules/import.js index 84feab0..d64bada 100644 --- a/src/modules/import.js +++ b/src/modules/import.js @@ -367,7 +367,7 @@ const loadPreviewDocs = ( * actually need it. */ const source = fs.createReadStream(fileName, {encoding: 'utf8', end: 20 * 1024}); - const dest = createPreviewWritable(); + const dest = createPreviewWritable(fileType, delimiter, fileIsMultilineJSON); stream.pipeline( source, createPeekStream(fileType, delimiter, fileIsMultilineJSON),