describe('Tabs', function() { var plugin; var $html; var template = `
`; afterEach(function() { plugin.destroy(); $html.remove(); }); describe('constructor()', function() { it('stores the element and plugin options', function() { $html = $(template).appendTo('body'); plugin = new Foundation.Tabs($html.find('[data-tabs]'), {}); plugin.$element.should.be.an('object'); plugin.options.should.be.an('object'); }); }); describe('init()', function() { it('sets ARIA attributes', function() { $html = $(template).appendTo('body'); plugin = new Foundation.Tabs($html.find('[data-tabs]'), {}); // Panels $html.find('#panel1').should.have.attr('role', 'tabpanel'); $html.find('#panel1').should.have.attr('aria-labelledby', $html.find('[href="#panel1"]').attr('id')); $html.find('#panel1').should.not.have.attr('aria-hidden'); $html.find('#panel2').should.have.attr('aria-hidden', 'true'); // Links $html.find('[href="#panel1"]').should.have.attr('role', 'tab'); $html.find('[href="#panel1"]').should.have.attr('aria-controls', $html.find('panel1').attr('id')); $html.find('[href="#panel1"]').should.have.attr('aria-selected', 'true'); $html.find('[href="#panel2"]').should.have.attr('aria-selected', 'false'); // Tab list items $html.find('[href="#panel1"]').parent().should.have.attr('role', 'presentation'); }); }); describe('selectTab()', function() { it('opens the selected tab via jQuery element', function() { $html = $(template).appendTo('body'); plugin = new Foundation.Tabs($html.find('[data-tabs]'), {}); plugin.selectTab($html.find('#panel2')); $html.find('#panel2').should.be.visible; }); it('opens the selected tab via id string', function() { $html = $(template).appendTo('body'); plugin = new Foundation.Tabs($html.find('[data-tabs]'), {}); plugin.selectTab('#panel2'); $html.find('#panel2').should.be.visible; }); it('opens the selected tab with data-tabs-target attribute', function() { $html = $(template).appendTo('body'); plugin = new Foundation.Tabs($html.find('[data-tabs]'), {}); plugin.selectTab('#/panel3'); $html.find('#panel3').should.be.visible; }); }); describe('_handleTabChange()', function() { it('opens the selected tab', function() { $html = $(template).appendTo('body'); plugin = new Foundation.Tabs($html.find('[data-tabs]'), {}); plugin.selectTab('#panel2'); $html.find('#panel2').should.be.visible; $html.find('#panel2').should.have.class('is-active'); }); it('sets ARIA attributes for open tab', function() { $html = $(template).appendTo('body'); plugin = new Foundation.Tabs($html.find('[data-tabs]'), {}); plugin.selectTab('#panel2'); $html.find('#panel2').should.have.not.attr('aria-hidden'); $html.find('[href="#panel2"]').should.have.attr('aria-selected', 'true'); }); it('hides the open tab', function() { $html = $(template).appendTo('body'); plugin = new Foundation.Tabs($html.find('[data-tabs]'), {}); plugin.selectTab('#panel2'); $html.find('#panel1').should.be.hidden; $html.find('#panel1').should.not.have.class('is-active'); }); it('sets ARIA attributes for closed tab', function() { $html = $(template).appendTo('body'); plugin = new Foundation.Tabs($html.find('[data-tabs]'), {}); plugin.selectTab('#panel2'); $html.find('#panel1').should.be.have.attr('aria-hidden', 'true'); $html.find('[href="#panel1"]').should.be.have.attr('aria-selected', 'false'); }); it('fires change.zf.tabs event with target as data', function(done) { $html = $(template).appendTo('body'); plugin = new Foundation.Tabs($html.find('[data-tabs]'), {}); $html.one('change.zf.tabs', function(e, $target) { e.stopPropagation(); $html.find('[href="#panel2"]').parent()[0].should.be.equal($target[0]); done(); }); plugin.selectTab('#panel2'); }); }); describe('keyboard events', function() { it('switches to next tab on ARROW_RIGHT', function() { $html = $(template).appendTo('body'); plugin = new Foundation.Tabs($html.find('[data-tabs]'), {}); $html.find('[href="#panel1"]').focus() .trigger(window.mockKeyboardEvent('ARROW_RIGHT')); $html.find('#panel2').should.be.visible; $html.find('#panel2').should.have.class('is-active'); }); it('switches to next tab on ARROW_DOWN', function() { $html = $(template).appendTo('body'); plugin = new Foundation.Tabs($html.find('[data-tabs]'), {}); $html.find('[href="#panel1"]').focus() .trigger(window.mockKeyboardEvent('ARROW_DOWN')); $html.find('#panel2').should.be.visible; $html.find('#panel2').should.have.class('is-active'); }); it('switches to previous tab on ARROW_LEFT', function() { $html = $(template).appendTo('body'); plugin = new Foundation.Tabs($html.find('[data-tabs]'), {}); $html.find('[href="#panel2"]').focus() .trigger(window.mockKeyboardEvent('ARROW_LEFT')); $html.find('#panel1').should.be.visible; $html.find('#panel1').should.have.class('is-active'); }); it('switches to previous tab on ARROW_UP', function() { $html = $(template).appendTo('body'); plugin = new Foundation.Tabs($html.find('[data-tabs]'), {}); $html.find('[href="#panel2"]').focus() .trigger(window.mockKeyboardEvent('ARROW_UP')); $html.find('#panel1').should.be.visible; $html.find('#panel1').should.have.class('is-active'); }); }); });