var listen = require('../src/listen'); var simulant = require('simulant'); describe('good-listener', function() { before(function() { global.node = document.createElement('div'); global.node.setAttribute('id', 'foo'); global.node.setAttribute('class', 'foo'); document.body.appendChild(global.node); }); after(function() { document.body.innerHTML = ''; }); describe('listen', function() { it('should throw an error since arguments were not passed', function(done) { try { listen(); } catch(error) { assert.equal(error.message, 'Missing required arguments'); done(); } }); it('should throw an error since "target" was invalid', function(done) { try { listen(null, 'click', function() {}); } catch(error) { assert.equal(error.message, 'First argument must be a String, HTMLElement, HTMLCollection, or NodeList'); done(); } }); it('should throw an error since "type" was invalid', function(done) { try { listen('.btn', false, function() {}); } catch(error) { assert.equal(error.message, 'Second argument must be a String'); done(); } }); it('should throw an error since "callback" was invalid', function(done) { try { listen('.btn', 'click', []); } catch(error) { assert.equal(error.message, 'Third argument must be a Function'); done(); } }); }); describe('listenNode', function() { before(function() { global.target = document.querySelector('#foo'); global.spy = sinon.spy(global.target, 'removeEventListener'); }); after(function() { global.spy.restore(); }); it('should add an event listener', function(done) { listen(global.target, 'click', function() { done(); }); simulant.fire(global.target, simulant('click')); }); it('should remove an event listener', function() { var listener = listen(global.target, 'click', function() {}); listener.destroy(); assert.ok(global.spy.calledOnce); }); }); describe('listenNodeList', function() { before(function() { global.targets = document.querySelectorAll('.foo'); global.spy = sinon.spy(global.targets[0], 'removeEventListener'); }); after(function() { global.spy.restore(); }); it('should add an event listener', function(done) { listen(global.targets, 'click', function() { done(); }); simulant.fire(global.targets[0], simulant('click')); }); it('should remove an event listener', function() { var listener = listen(global.targets, 'click', function() {}); listener.destroy(); assert.ok(global.spy.calledOnce); }); }); describe('listenSelector', function() { before(function() { global.target = document.querySelector('.foo'); global.spy = sinon.spy(document.body, 'removeEventListener'); }); after(function() { global.spy.restore(); }); it('should add an event listener', function(done) { listen('.foo', 'click', function() { done(); }); simulant.fire(global.target, simulant('click')); }); it('should remove an event listener', function() { var listener = listen('.foo', 'click', function() {}); listener.destroy(); assert.ok(global.spy.calledOnce); }); }); });