From ab749415c9d1296cba2e92a3dfac540e9167af38 Mon Sep 17 00:00:00 2001 From: Stuart Casarotto Date: Wed, 11 Apr 2018 09:39:04 -0500 Subject: [PATCH 1/5] improve matcher and added tests --- package.json | 2 +- .../{utils => test-utils}/constants.js | 0 .../create-page-object.js | 14 ++--- src/__tests__/utils/matcher-test.js | 56 +++++++++++++++++++ src/utils.js | 20 +++++-- 5 files changed, 79 insertions(+), 13 deletions(-) rename src/__tests__/{utils => test-utils}/constants.js (100%) rename src/__tests__/{utils => test-utils}/create-page-object.js (88%) create mode 100644 src/__tests__/utils/matcher-test.js diff --git a/package.json b/package.json index 918a452..6489538 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "babel" ], "testPathIgnorePatterns": [ - "src/__tests__/utils" + "src/__tests__/test-utils" ] }, "lint-staged": { diff --git a/src/__tests__/utils/constants.js b/src/__tests__/test-utils/constants.js similarity index 100% rename from src/__tests__/utils/constants.js rename to src/__tests__/test-utils/constants.js diff --git a/src/__tests__/utils/create-page-object.js b/src/__tests__/test-utils/create-page-object.js similarity index 88% rename from src/__tests__/utils/create-page-object.js rename to src/__tests__/test-utils/create-page-object.js index 571eb92..74d0c0f 100644 --- a/src/__tests__/utils/create-page-object.js +++ b/src/__tests__/test-utils/create-page-object.js @@ -1,7 +1,9 @@ +import $ from 'jquery'; import React from 'react'; import sinon from 'sinon'; import { ReactWrapper, shallow, mount } from 'enzyme'; import { frameworks, countries } from './constants'; +import TestUtils from 'react-dom/test-utils'; export default class PageObjectBase { handleChange = sinon.spy(); @@ -38,14 +40,13 @@ export default class PageObjectBase { } get portal() { - return new ReactWrapper(this.mountedComponent.instance().select.dropdownRef, true); + return $('.PowerSelect__Tether'); } get isOpened() { let wrapper = this.mountedComponent; let hasOpenClass = this.container.hasClass('PowerSelect--open'); let isDropdownVisible = this.portal.exists(); - return isDropdownVisible && hasOpenClass; } @@ -54,7 +55,7 @@ export default class PageObjectBase { } get trigger() { - return new ReactWrapper(this.mountedComponent.instance().select.triggerRef, true); + return this.mountedComponent.find('SelectTrigger'); } get isDisabled() { @@ -98,11 +99,8 @@ export default class PageObjectBase { } enterSearchText(string) { - this.portal.find('.PowerSelect__SearchInput').simulate('change', { - target: { - value: string, - }, - }); + let input = document.querySelector('input.PowerSelect__SearchInput'); + TestUtils.Simulate.change(input, { target: { value: string } }); } getVisibleOptions() { diff --git a/src/__tests__/utils/matcher-test.js b/src/__tests__/utils/matcher-test.js new file mode 100644 index 0000000..7bae4f1 --- /dev/null +++ b/src/__tests__/utils/matcher-test.js @@ -0,0 +1,56 @@ +// /* global describe, it, expect */ +import { matcher } from './../../utils'; + +describe('matcher()', () => { + it('should match string', () => { + const option = 'option'; + expect(matcher({ option, searchTerm: '' })).toBe(true); + expect(matcher({ option, searchTerm: 'opt' })).toBe(true); + expect(matcher({ option, searchTerm: 'opt ' })).toBe(true); + expect(matcher({ option, searchTerm: 'a' })).toBe(false); + }); + it('should match number', () => { + const option = 1234567; + expect(matcher({ option, searchTerm: '' })).toBe(true); + expect(matcher({ option, searchTerm: '12' })).toBe(true); + expect(matcher({ option, searchTerm: '12 ' })).toBe(true); + expect(matcher({ option, searchTerm: '9' })).toBe(false); + }); + it('should match not undefined', () => { + const option = undefined; + expect(matcher({ option, searchTerm: '' })).toBe(false); + expect(matcher({ option, searchTerm: 'opt' })).toBe(false); + expect(matcher({ option, searchTerm: '12' })).toBe(false); + }); + it('should match not null', () => { + const option = null; + expect(matcher({ option, searchTerm: '' })).toBe(false); + expect(matcher({ option, searchTerm: 'opt' })).toBe(false); + expect(matcher({ option, searchTerm: '12' })).toBe(false); + }); + + const option = { name: 'Matthew Stevens', age: 6, id: null }; + it('should match string in object', () => { + expect(matcher({ option, searchTerm: '', searchIndices: 'name' })).toBe(true); + expect(matcher({ option, searchTerm: 'mAt', searchIndices: 'name' })).toBe(true); + expect(matcher({ option, searchTerm: 'mat', searchIndices: 'name' })).toBe(true); + expect(matcher({ option, searchTerm: 'mat ', searchIndices: 'name' })).toBe(true); + expect(matcher({ option, searchTerm: 'b', searchIndices: 'name' })).toBe(false); + }); + it('should match number in object', () => { + expect(matcher({ option, searchTerm: '', searchIndices: 'age' })).toBe(true); + expect(matcher({ option, searchTerm: '6', searchIndices: 'age' })).toBe(true); + expect(matcher({ option, searchTerm: '6 ', searchIndices: 'age' })).toBe(true); + expect(matcher({ option, searchTerm: '1', searchIndices: 'age' })).toBe(false); + }); + it('should match not undefined in object', () => { + expect(matcher({ option, searchTerm: '', searchIndices: 'gender' })).toBe(false); + expect(matcher({ option, searchTerm: 'opt', searchIndices: 'gender' })).toBe(false); + expect(matcher({ option, searchTerm: '12', searchIndices: 'gender' })).toBe(false); + }); + it('should match not null in object', () => { + expect(matcher({ option, searchTerm: '', searchIndices: 'id' })).toBe(false); + expect(matcher({ option, searchTerm: 'opt', searchIndices: 'id' })).toBe(false); + expect(matcher({ option, searchTerm: '12', searchIndices: 'id' })).toBe(false); + }); +}); diff --git a/src/utils.js b/src/utils.js index e2454b1..08f80d3 100644 --- a/src/utils.js +++ b/src/utils.js @@ -2,14 +2,26 @@ import React, { isValidElement, cloneElement } from 'react'; export const matcher = ({ option, searchTerm = '', searchIndices }) => { searchTerm = searchTerm.trim().toLowerCase(); - if (typeof option === 'string') { - return option.toLowerCase().indexOf(searchTerm) !== -1; - } + if (searchIndices) { return makeArray(searchIndices).some(index => { - return (option[index] || '').toLowerCase().indexOf(searchTerm) !== -1; + let value = option[index]; + return ( + !isNone(value) && + String(value) + .toLowerCase() + .indexOf(searchTerm) !== -1 + ); }); } + + return ( + !isNone(option) && + String(option) + .toLowerCase() + .indexOf(searchTerm) !== -1 + ); + return true; }; From 74f151e24e5ae89987eff085f1d7af0701219669 Mon Sep 17 00:00:00 2001 From: Stuart Casarotto Date: Wed, 11 Apr 2018 10:34:07 -0500 Subject: [PATCH 2/5] finished updating test --- src/PowerSelect/__tests__/PowerSelect-test.js | 4 ++-- src/PowerSelectMultiple/__tests__/PowerSelectMultiple-test.js | 4 ++-- src/TypeAhead/__tests__/TypeAhead-test.js | 4 ++-- src/utils.js | 2 ++ 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/PowerSelect/__tests__/PowerSelect-test.js b/src/PowerSelect/__tests__/PowerSelect-test.js index de7045d..a11bbc7 100644 --- a/src/PowerSelect/__tests__/PowerSelect-test.js +++ b/src/PowerSelect/__tests__/PowerSelect-test.js @@ -1,8 +1,8 @@ // /* global describe, it, expect */ import React from 'react'; import sinon from 'sinon'; -import PageObjectBase from '../../__tests__/utils/create-page-object'; -import { frameworks, countries, KEY_CODES } from '../../__tests__/utils/constants'; +import PageObjectBase from '../../__tests__/test-utils//create-page-object'; +import { frameworks, countries, KEY_CODES } from '../../__tests__/test-utils//constants'; import PowerSelect from '../index'; class PowerSelectPageObject extends PageObjectBase { diff --git a/src/PowerSelectMultiple/__tests__/PowerSelectMultiple-test.js b/src/PowerSelectMultiple/__tests__/PowerSelectMultiple-test.js index d34d540..240641b 100644 --- a/src/PowerSelectMultiple/__tests__/PowerSelectMultiple-test.js +++ b/src/PowerSelectMultiple/__tests__/PowerSelectMultiple-test.js @@ -1,8 +1,8 @@ // /* global describe, it, expect */ import React from 'react'; import sinon from 'sinon'; -import PageObjectBase from '../../__tests__/utils/create-page-object'; -import { frameworks, countries, KEY_CODES } from '../../__tests__/utils/constants'; +import PageObjectBase from '../../__tests__/test-utils//create-page-object'; +import { frameworks, countries, KEY_CODES } from '../../__tests__/test-utils//constants'; import PowerSelectMultiple from '../index'; class PowerSelectMultiplePageObject extends PageObjectBase { diff --git a/src/TypeAhead/__tests__/TypeAhead-test.js b/src/TypeAhead/__tests__/TypeAhead-test.js index be55908..99607c2 100644 --- a/src/TypeAhead/__tests__/TypeAhead-test.js +++ b/src/TypeAhead/__tests__/TypeAhead-test.js @@ -1,8 +1,8 @@ // /* global describe, it, expect */ import React from 'react'; import sinon from 'sinon'; -import PageObjectBase from '../../__tests__/utils/create-page-object'; -import { frameworks, countries, KEY_CODES } from '../../__tests__/utils/constants'; +import PageObjectBase from '../../__tests__/test-utils//create-page-object'; +import { frameworks, countries, KEY_CODES } from '../../__tests__/test-utils//constants'; import TypeAhead from '../index'; class TypeAheadPageObject extends PageObjectBase { diff --git a/src/utils.js b/src/utils.js index 08f80d3..376784b 100644 --- a/src/utils.js +++ b/src/utils.js @@ -25,6 +25,8 @@ export const matcher = ({ option, searchTerm = '', searchIndices }) => { return true; }; +export const isNone = value => value === null || value === undefined; + export const makeArray = obj => { if (obj === null || obj === undefined) { return []; From 71799eb007f6a575e9452920683b139ae0e42ef2 Mon Sep 17 00:00:00 2001 From: Stuart Casarotto Date: Wed, 11 Apr 2018 10:41:39 -0500 Subject: [PATCH 3/5] Update PowerSelect-test.js --- src/PowerSelect/__tests__/PowerSelect-test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PowerSelect/__tests__/PowerSelect-test.js b/src/PowerSelect/__tests__/PowerSelect-test.js index a11bbc7..0f9b0e0 100644 --- a/src/PowerSelect/__tests__/PowerSelect-test.js +++ b/src/PowerSelect/__tests__/PowerSelect-test.js @@ -1,8 +1,8 @@ // /* global describe, it, expect */ import React from 'react'; import sinon from 'sinon'; -import PageObjectBase from '../../__tests__/test-utils//create-page-object'; -import { frameworks, countries, KEY_CODES } from '../../__tests__/test-utils//constants'; +import PageObjectBase from '../../__tests__/test-utils/create-page-object'; +import { frameworks, countries, KEY_CODES } from '../../__tests__/test-utils/constants'; import PowerSelect from '../index'; class PowerSelectPageObject extends PageObjectBase { From b78f08d1415a6fa954307d384f5453821bdba036 Mon Sep 17 00:00:00 2001 From: Stuart Casarotto Date: Wed, 11 Apr 2018 10:41:53 -0500 Subject: [PATCH 4/5] Update PowerSelectMultiple-test.js --- src/PowerSelectMultiple/__tests__/PowerSelectMultiple-test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PowerSelectMultiple/__tests__/PowerSelectMultiple-test.js b/src/PowerSelectMultiple/__tests__/PowerSelectMultiple-test.js index 240641b..dc2f7e7 100644 --- a/src/PowerSelectMultiple/__tests__/PowerSelectMultiple-test.js +++ b/src/PowerSelectMultiple/__tests__/PowerSelectMultiple-test.js @@ -1,8 +1,8 @@ // /* global describe, it, expect */ import React from 'react'; import sinon from 'sinon'; -import PageObjectBase from '../../__tests__/test-utils//create-page-object'; -import { frameworks, countries, KEY_CODES } from '../../__tests__/test-utils//constants'; +import PageObjectBase from '../../__tests__/test-utils/create-page-object'; +import { frameworks, countries, KEY_CODES } from '../../__tests__/test-utils/constants'; import PowerSelectMultiple from '../index'; class PowerSelectMultiplePageObject extends PageObjectBase { From a05b8530683fc28bd5109339cee23092cae1d3eb Mon Sep 17 00:00:00 2001 From: Stuart Casarotto Date: Wed, 11 Apr 2018 10:42:20 -0500 Subject: [PATCH 5/5] Update TypeAhead-test.js --- src/TypeAhead/__tests__/TypeAhead-test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/TypeAhead/__tests__/TypeAhead-test.js b/src/TypeAhead/__tests__/TypeAhead-test.js index 99607c2..58a11e2 100644 --- a/src/TypeAhead/__tests__/TypeAhead-test.js +++ b/src/TypeAhead/__tests__/TypeAhead-test.js @@ -1,8 +1,8 @@ // /* global describe, it, expect */ import React from 'react'; import sinon from 'sinon'; -import PageObjectBase from '../../__tests__/test-utils//create-page-object'; -import { frameworks, countries, KEY_CODES } from '../../__tests__/test-utils//constants'; +import PageObjectBase from '../../__tests__/test-utils/create-page-object'; +import { frameworks, countries, KEY_CODES } from '../../__tests__/test-utils/constants'; import TypeAhead from '../index'; class TypeAheadPageObject extends PageObjectBase {