diff --git a/src/scripts/src/choices.test.js b/src/scripts/src/choices.test.js index 3c5695b..9a7e1cd 100644 --- a/src/scripts/src/choices.test.js +++ b/src/scripts/src/choices.test.js @@ -1,10 +1,150 @@ -// import { expect } from 'chai'; -// import sinon from 'sinon'; +import { expect } from 'chai'; +import { spy } from 'sinon'; + +import Choices from './choices'; describe('choices', () => { + let instance; + let passedElement; + describe('public methods', () => { - describe('init', () => {}); - describe('destroy', () => {}); + describe('init', () => { + const callbackOnInitSpy = spy(); + + beforeEach(() => { + passedElement = document.createElement('input'); + passedElement.type = 'text'; + passedElement.className = 'js-choices'; + document.body.appendChild(passedElement); + + instance = new Choices(passedElement, { + callbackOnInit: callbackOnInitSpy, + }); + }); + + describe('already initalised', () => { + beforeEach(() => { + instance.initialised = true; + instance.init(); + }); + + it('doesn\'t set initialise flag', () => { + expect(instance.initialised).to.not.equal(false); + }); + }); + + describe('not already initalised', () => { + let createTemplatesSpy; + let createInputSpy; + let storeSubscribeSpy; + let renderSpy; + let addEventListenersSpy; + + beforeEach(() => { + createTemplatesSpy = spy(instance, '_createTemplates'); + createInputSpy = spy(instance, '_createInput'); + storeSubscribeSpy = spy(instance.store, 'subscribe'); + renderSpy = spy(instance, 'render'); + addEventListenersSpy = spy(instance, '_addEventListeners'); + + instance.initialised = false; + instance.init(); + }); + + it('sets initialise flag', () => { + expect(instance.initialised).to.equal(true); + }); + + it('creates templates', () => { + expect(createTemplatesSpy.called).to.equal(true); + }); + + it('creates input', () => { + expect(createInputSpy.called).to.equal(true); + }); + + it('subscribes to store', () => { + expect(storeSubscribeSpy.called).to.equal(true); + }); + + it('fires initial render', () => { + expect(renderSpy.called).to.equal(true); + }); + + it('adds event listeners', () => { + expect(addEventListenersSpy.called).to.equal(true); + }); + + it('fires callback', () => { + expect(callbackOnInitSpy.called).to.equal(true); + }); + }); + }); + + describe('destroy', () => { + beforeEach(() => { + passedElement = document.createElement('input'); + passedElement.type = 'text'; + passedElement.className = 'js-choices'; + document.body.appendChild(passedElement); + + instance = new Choices(passedElement); + }); + + describe('not already initalised', () => { + beforeEach(() => { + instance.initialised = false; + instance.destroy(); + }); + + it('doesn\'t set initialise flag', () => { + expect(instance.initialised).to.not.equal(true); + }); + }); + + describe('already initalised', () => { + let removeEventListenersSpy; + let passedElementRevealSpy; + let containerOuterRevertSpy; + let clearStoreSpy; + + beforeEach(() => { + removeEventListenersSpy = spy(instance, '_removeEventListeners'); + passedElementRevealSpy = spy(instance.passedElement, 'reveal'); + containerOuterRevertSpy = spy(instance.containerOuter, 'revert'); + clearStoreSpy = spy(instance, 'clearStore'); + + instance.initialised = true; + instance.destroy(); + }); + + + it('removes event listeners', () => { + expect(removeEventListenersSpy.called).to.equal(true); + }); + + it('reveals passed element', () => { + expect(passedElementRevealSpy.called).to.equal(true); + }); + + it('reverts outer container', () => { + expect(containerOuterRevertSpy.called).to.equal(true); + }); + + it('clears store', () => { + expect(clearStoreSpy.called).to.equal(true); + }); + + it('nullifys templates config', () => { + expect(instance.config.templates).to.equal(null); + }); + + it('resets initialise flag', () => { + expect(instance.initialised).to.equal(false); + }); + }); + }); + describe('renderGroups', () => {}); describe('renderChoices', () => {}); describe('renderItems', () => {});