UNPKG

kdf

Version:

KD: a non-document focused UI Framework for web applications.

775 lines (498 loc) 24.8 kB
{assert, expect} = require 'chai' sinon = require 'sinon' KDListViewController = require '../../../src/components/list/listviewcontroller.coffee' KDListView = require '../../../src/components/list/listview.coffee' KDListItemView = require '../../../src/components/list/listitemview.coffee' KDView = require '../../../src/core/view.coffee' _ = require '../../../libs/underscore-min.1.3.js' describe 'KDListViewController', -> beforeEach -> @sinon = sinon.sandbox.create() afterEach -> @sinon.restore() describe 'constructor', -> it 'should instantiate without error', -> viewController = new KDListViewController assert.isDefined viewController context 'when there is a listview', -> it 'should set listview', -> listViewStub = sinon.createStubInstance KDListView viewController = new KDListViewController { view: listViewStub } assert.equal viewController.listView, listViewStub context 'when scrollview is off', -> it "shouldn't have scrollView if there is a scrollview option as false", -> viewController = new KDListViewController { scrollView: off } assert.isUndefined viewController.scrollView context 'when scrollview is on', -> context 'if customScrollView wanted', -> it 'has customScrollView', -> viewController = new KDListViewController { scrollView: on, useCustomScrollView: on } assert.isDefined viewController.customScrollView context 'if customScrollView not wanted', -> it "it doesn't have customScrollView", -> viewController = new KDListViewController { scrollView: on, useCustomScrollView: off } assert.isUndefined viewController.customScrollView context 'when wrapper is on', -> it "has wrapper (= mainView) view as KDView", -> viewController = new KDListViewController { wrapper: on } assert.instanceOf viewController.mainView, KDView context 'when wrapper is off', -> it "has a mainview as KDListView", -> viewController = new KDListViewController { wrapper: off } assert.instanceOf viewController.mainView, KDListView context 'when there is keyNav', -> it "has a 'KeyDownOnList' listener", -> viewController = new KDListViewController { keyNav: yes } assert.isDefined viewController._e, 'KeyDownOnList' describe 'loadView', -> context 'when scrollView wanted', -> it 'has a scrollView', -> viewController = new KDListViewController { scrollView: on } assert.isDefined viewController.scrollView context 'when customScrollView wanted', -> it 'has a customScrollView', -> viewController = new KDListViewController { scrollView: on, useCustomScrollView: yes } assert.isDefined viewController.customScrollView context "when scrollView doesn't wanted", -> viewController = new KDListViewController { scrollView: off } assert.isUndefined viewController.scrollView context 'when it starts with lazyLoader', -> it 'shows lazy loader', -> viewController = new KDListViewController scrollView : off startWithLazyLoader : yes sinon.spy viewController, 'showLazyLoader' viewController.loadView() assert viewController.showLazyLoader.calledOnce context 'when there is noItemFoundWidget', -> it 'shows no item view', -> viewController = new KDListViewController scrollView : off noItemFoundWidget : new KDView sinon.spy viewController, 'putNoItemView' viewController.loadView() assert viewController.putNoItemView.calledOnce it "instantiates list items", -> viewController = new KDListViewController scrollView : off noItemFoundWidget : new KDView sinon.spy viewController, 'instantiateListItems' viewController.loadView() assert viewController.instantiateListItems.calledOnce describe 'instantiateListItems', -> it "should call listview's addItem method", -> listViewStub = sinon.createStubInstance KDListView viewController = new KDListViewController { view: listViewStub } items = [1, 2] listViewStub.addItem = (item) -> item * 2 result = viewController.instantiateListItems items assert.deepEqual result, [2, 4] context 'when it instantiates new items', -> it "emits 'AllItemsAddedToList'", -> listViewStub = sinon.createStubInstance KDListView viewController = new KDListViewController { view: listViewStub } sinon.spy(viewController, 'emit') listViewStub.addItem = (item) -> item * 2 viewController.instantiateListItems [1, 2] assert viewController.emit.calledWith 'AllItemsAddedToList' describe 'getIndex', -> realItemCountFn = KDListViewController::getItemCount before -> KDListViewController::getItemCount = -> 10 after -> KDListViewController::getItemCount = realItemCountFn context 'when it is last to first', -> it 'returns from bottom', -> listViewStub = sinon.createStubInstance KDListView viewController = new KDListViewController { view: listViewStub, lastToFirst: yes } expected = viewController.getIndex 2 assert.equal expected, 7 context 'when it is not last to first', -> it 'returns from top', -> listViewStub = sinon.createStubInstance KDListView viewController = new KDListViewController { view: listViewStub, lastToFirst: no } expected = viewController.getIndex 2 assert.equal expected, 2 describe 'putNoItemView', -> it 'adds noItemFoundWidget', -> listViewStub = sinon.createStubInstance KDListView widget = sinon.stub() viewController = new KDListViewController view : listViewStub noItemFoundWidget : widget viewController.putNoItemView() assert listViewStub.addSubView.withArgs(widget).calledOnce describe 'addItem', -> it "adds item to its list view", -> listViewStub = sinon.createStubInstance KDListView viewController = new KDListViewController { view: listViewStub } viewController.addItem 1, 2 assert listViewStub.addItem.withArgs(1, 2).calledOnce context 'when there is no args', -> it "doesn't add item to its list view", -> listViewStub = sinon.createStubInstance KDListView viewController = new KDListViewController { view: listViewStub } viewController.addItem assert.notOk listViewStub.addItem.called describe 'removeItem', -> beforeEach -> @listViewStub = sinon.createStubInstance KDListView @viewController = new KDListViewController view : @listViewStub it "adds item to its list view", -> itemInstanceStub = sinon.stub() @viewController.removeItem itemInstanceStub, 1, 2 assert @listViewStub.removeItem.withArgs(itemInstanceStub, 1, 2).calledOnce it "doesn't add item to its list view when args don't exist", -> @viewController.removeItem assert.notOk @listViewStub.removeItem.called describe 'registerItem', -> context 'when there is an id', -> it 'registers itemView with that index', -> itemView = new KDListItemView {}, {id: 2} viewController = new KDListViewController viewController.registerItem itemView assert.equal viewController.itemsIndexed[2], itemView context 'when there is no id', -> it "doesn't register itemView to ordered list", -> itemView = new KDListItemView {}, {} viewController = new KDListViewController viewController.registerItem itemView values = _.values viewController.itemsIndexed assert.equal values.indexOf(itemView), -1 context 'when there is selection option', -> it 'registers a click event', -> itemView = new KDListItemView {}, {id: 1} viewController = new KDListViewController { selection: on } viewController.registerItem itemView assert.isDefined itemView._e['click'] context 'when there is either keyNav or multipleSelection', -> it 'registers a mousedown event', -> itemView = new KDListItemView {}, {id: 1} viewController = new KDListViewController { keyNav: on } viewController.registerItem itemView assert.isDefined itemView._e['mousedown'] it 'registers a mouseenter event', -> itemView = new KDListItemView {}, {id: 1} viewController = new KDListViewController { multipleSelection: on } viewController.registerItem itemView assert.isDefined itemView._e['mouseenter'] describe 'unregisterItem', -> context 'when it is starting', -> it 'emits event', -> itemView = new KDListItemView {}, {id: 1} viewController = new KDListViewController { multipleSelection: on } sinon.spy viewController, 'emit' viewController.unregisterItem itemView, 0 assert.ok viewController.emit.calledWith 'UnregisteringItem' assert.isDefined viewController._e['UnregisteringItem'] context 'if there is data on the instance', -> it 'removes item from itemsIndexed', -> viewController = new KDListViewController itemClass : KDListItemView viewController.addItem {title: Date.now(), id: i}, i for i in [0...5] item = viewController.getListItems()[1] viewController.unregisterItem item, 1 assert.isUndefined viewController.itemsIndexed[1] describe 'removeAllItems', -> beforeEach -> @viewController = new KDListViewController itemClass : KDListItemView lastToFirst : no for i in [0...5] @viewController.addItem {title: Date.now(), id: i}, i @viewController.removeAllItems() it 'cleans items from controller', -> assert.deepEqual @viewController.itemsIndexed, {} it "cleans items from itemView", -> assert.deepEqual @viewController.getListItems(), [] describe 'moveItemToIndex', -> beforeEach -> @viewController = new KDListViewController itemClass : KDListItemView lastToFirst : no for i in [0...5] @viewController.addItem {title: Date.now(), id: i}, i it 'moves item to given index', -> item = @viewController.getListItems()[2] @viewController.moveItemToIndex item, 3 assert.equal @viewController.getListItems()[3], item it 'appends item if index is greater than length', -> item = @viewController.getListItems()[1] @viewController.moveItemToIndex item, 1000 assert.equal @viewController.getListItems()[4], item it 'prepends item if index is less than length', -> item = @viewController.getListItems()[1] @viewController.moveItemToIndex item, -1000 assert.equal @viewController.getListItems()[0], item context 'MOUSE EVENTS', -> beforeEach -> @viewController = new KDListViewController itemClass : KDListItemView lastToFirst : no for i in [0...5] @viewController.addItem {title: Date.now(), id: i}, i describe 'mouseDownHappenedOnItem', -> context 'when the item is selected', -> beforeEach -> @item = @viewController.getListItems()[2] @viewController.selectSingleItem @item @viewController.mouseDownHappenedOnItem @item it "unsets mouse down", -> assert.equal @viewController.mouseDown, no it "has a null mousedown temp item", -> assert.isNull @viewController.mouseDownTempItem context "when the item is not selected", -> beforeEach -> @item = @viewController.getListItems()[2] @viewController.mouseDownHappenedOnItem @item it "sets mouse down", -> assert.equal @viewController.mouseDown, yes it "sets mousedown temp item to itemview", -> assert.equal @viewController.mouseDownTempItem, @item it "has a mouse down timer", -> assert.isDefined @viewController.mouseDownTimer describe 'mouseUpHappened', -> beforeEach -> @item = @viewController.getListItems()[2] @viewController.selectSingleItem @item @viewController.mouseDownHappenedOnItem @item after -> window.clearTimeout.restore() it 'clears timeout', -> sinon.spy window, 'clearTimeout' @viewController.mouseUpHappened() assert.ok window.clearTimeout.calledWith @viewController.mouseDownTimer it 'unsets mouse down', -> @viewController.mouseUpHappened() assert.equal @viewController.mouseDown, no it "has a null mousedown temp item", -> @viewController.mouseUpHappened() assert.isNull @viewController.mouseDownTempItem describe 'mouseEnterHappenedOnItem', -> beforeEach -> @item = @viewController.getListItems()[2] after -> window.clearTimeout.restore() it 'clears timeout', -> sinon.spy window, 'clearTimeout' @viewController.mouseEnterHappenedOnItem @item assert.ok window.clearTimeout.calledWith @viewController.mouseDownTimer context 'when mouse is down', -> beforeEach -> # simulate mousedown @viewController.mouseDown = yes it 'deselects all items unless a special key is pressed', -> @viewController.selectItem @item assert.equal @viewController.selectedItems.length, 1 @viewController.mouseEnterHappenedOnItem @item, {metaKey: off, shiftKey: off, ctrlKey: off} assert.equal @viewController.selectedItems.length, 0 it "doesn't deselects all items if a special key is pressed", -> @viewController.selectItem @item assert.equal @viewController.selectedItems.length, 1 @viewController.mouseDownHappenedOnItem @item, {metaKey: yes} assert.equal @viewController.selectedItems.length, 1 it "selects items between 2 selected items", -> otherItem = @viewController.getListItems()[0] # simulate mouseDown on first item of the list items # so that we can try and see if the mouseEnterHappenedOnItem # is delegating to range select method. @viewController.mouseDownHappenedOnItem otherItem @viewController.mouseEnterHappenedOnItem @item, {metaKey: on} assert.equal @viewController.selectedItems.length, 3 context 'when mouse is not down', -> beforeEach -> @viewController.mouseDown = no # simulate anti-mouseDown after -> @viewController.emit.restore() it 'emits event', -> sinon.spy @viewController, 'emit' @viewController.mouseEnterHappenedOnItem @item assert.ok @viewController.emit.calledWith('MouseEnterHappenedOnItem', @item) context 'KEY EVENTS', -> describe 'keyDownPerformed', -> beforeEach -> @viewController = new KDListViewController it 'selects items when event has a special key', -> sinon.spy @viewController, 'selectItemBelowOrAbove' event = {which: 40} @viewController.keyDownPerformed null, event assert.ok @viewController.selectItemBelowOrAbove.calledWith event it 'emits event', -> sinon.spy @viewController, 'emit' @viewController.keyDownPerformed null, {which: 38} assert.ok @viewController.emit.calledWith "KeyDownOnListHandled", @viewController.selectedItems context 'ITEM SELECTION', -> beforeEach -> @viewController = new KDListViewController itemClass : KDListItemView lastToFirst : no # multipleSelection : yes for i in [0...5] @viewController.addItem { title: Date.now(), id: i }, i describe 'selectItem', -> beforeEach -> @item = @viewController.getListItems()[0] context 'when there is no item', -> it 'returns immediately', -> assert.isUndefined @viewController.selectItem() context 'when multipleSelection is not on', -> it 'deselects all items', -> otherItem = @viewController.getListItems()[2] @viewController.selectedItems.push @item @viewController.selectItem otherItem, { shiftKey: on } # it shoulda been 2 if multiple selection was enabled assert.equal @viewController.selectedItems.length, 1 context 'when shift key is pressed', -> it 'selects range', -> @viewController.setOptions { multipleSelection: yes } newItem = @viewController.getListItems()[2] @viewController.selectItem newItem @viewController.selectItem @item, { shiftKey: on } secondItem = @viewController.getListItems()[1] assert.ok _.contains @viewController.selectedItems, secondItem assert.equal @viewController.selectedItems.length, 3 context 'when metaKey and multipleSelection are on', -> beforeEach -> @viewController.setOptions { multipleSelection: on } @newItem = @viewController.getListItems()[1] @viewController.selectedItems.push @item it "doesn't deselect", -> @viewController.selectItem @newItem, { metaKey: on } assert.equal @viewController.selectedItems.length, 2 it "deselects single item", -> @viewController.selectedItems.push @newItem @viewController.selectItem @item, { metaKey: on } assert.notOk _.contains @viewController.selectedItems, @item assert.ok _.contains @viewController.selectedItems, @newItem describe 'selectItemBelowOrAbove', -> context 'when up key is pressed', -> it "selects above", -> item = @viewController.getListItems()[2] aboveItem = @viewController.getListItems()[1] @viewController.selectItem item @viewController.selectItemBelowOrAbove { which: 38 } { selectedItems } = @viewController assert.equal selectedItems.length, 1 assert.ok _.contains selectedItems, aboveItem context 'when down key is pressed', -> it "selects below", -> item = @viewController.getListItems()[2] belowItem = @viewController.getListItems()[3] @viewController.selectItem item @viewController.selectItemBelowOrAbove { which: 40 } { selectedItems } = @viewController assert.equal selectedItems.length, 1 assert.ok _.contains selectedItems, belowItem context 'when it is at the beginning of the list', -> it "doesn't select above", -> item = @viewController.getListItems()[0] @viewController.selectItem item @viewController.selectItemBelowOrAbove { which: 38 } { selectedItems } = @viewController assert.equal selectedItems.length, 1 assert.ok _.contains selectedItems, item context 'when it is at the end of the list', -> it "doesn't select below", -> item = @viewController.getListItems()[4] @viewController.selectItem item @viewController.selectItemBelowOrAbove { which: 40 } { selectedItems } = @viewController assert.equal selectedItems.length, 1 assert.ok _.contains selectedItems, item context 'when a special key is pressed', -> it "deselects item if it is selected", -> item = @viewController.getListItems()[2] @viewController.selectItem item # go up first @viewController.selectItemBelowOrAbove { which: 40, metaKey: on } assert.equal @viewController.selectedItems.length, 2 # then go down @viewController.selectItemBelowOrAbove { which: 38, metaKey: on } assert.equal @viewController.selectedItems.length, 1 describe 'selectNextItem', -> context 'when item is not given', -> it 'selects first item from selectedItems', -> item = @viewController.getListItems()[2] nextItem = @viewController.getListItems()[3] @viewController.selectItem item @viewController.selectNextItem() { selectedItems } = @viewController assert.equal selectedItems.length, 1 assert.ok _.contains selectedItems, nextItem context 'when item is given', -> it 'selects next element', -> item = @viewController.getListItems()[3] nextItem = @viewController.getListItems()[4] @viewController.selectNextItem item { selectedItems } = @viewController assert.equal selectedItems.length, 1 assert.ok _.contains selectedItems, nextItem describe 'selectPrevItem', -> context 'when item is not given', -> it 'selects first item from selectedItems', -> item = @viewController.getListItems()[2] prevItem = @viewController.getListItems()[1] @viewController.selectItem item @viewController.selectPrevItem() { selectedItems } = @viewController assert.equal selectedItems.length, 1 assert.ok _.contains selectedItems, prevItem context 'when item is given', -> it 'selects next element', -> item = @viewController.getListItems()[3] prevItem = @viewController.getListItems()[2] @viewController.selectPrevItem item { selectedItems } = @viewController assert.equal selectedItems.length, 1 assert.ok _.contains selectedItems, prevItem describe 'deselectAllItems', -> it 'deselect all items', -> item = @viewController.getListItems()[3] @viewController.selectItem item @viewController.deselectAllItems() assert.equal @viewController.selectedItems, 0 assert.notOk _.contains @viewController.selectedItems, item describe 'deselectSingleItem', -> it 'deselects single item', -> item = @viewController.getListItems()[3] @viewController.selectItem item @viewController.deselectSingleItem item assert.equal @viewController.selectedItems, 0 assert.notOk _.contains @viewController.selectedItems, item context 'when item is the last element', -> it 'unsets listview class', -> item = @viewController.getListItems()[4] @viewController.selectItem item sinon.spy @viewController.listView, 'unsetClass' @viewController.deselectSingleItem item assert.ok @viewController.listView.unsetClass.calledWith 'last-item-selected' describe 'selectSingleItem', -> @viewController = new KDListViewController selectable : yes it 'selects the item', -> item = @viewController.getListItems()[2] @viewController.selectSingleItem item assert.ok _.contains @viewController.selectedItems, item context 'when item is the last element', -> it 'sets listview class', -> item = @viewController.getListItems()[4] sinon.spy @viewController.listView, 'setClass' @viewController.selectSingleItem item assert.ok @viewController.listView.setClass.calledWith 'last-item-selected' describe 'selectAllItems', -> it 'selects all items', -> item = @viewController.getListItems()[1] anotherItem = @viewController.getListItems()[4] @viewController.selectAllItems() assert.equal @viewController.selectedItems.length, 5 assert.ok _.contains @viewController.selectedItems, item assert.ok _.contains @viewController.selectedItems, anotherItem describe 'selectItemsByRange', -> it 'selects items by range', -> item = @viewController.getListItems()[1] anotherItem = @viewController.getListItems()[4] @viewController.selectItemsByRange item, anotherItem assert.equal @viewController.selectedItems.length, 4 assert.ok _.contains @viewController.selectedItems, item assert.ok _.contains @viewController.selectedItems, anotherItem describe 'LAZY LOADER', -> describe 'createLazyLoader', -> it 'creates lazy loader', -> viewController = new KDListViewController wrapper = viewController.scrollView or viewController.getView() viewController.createLazyLoader() assert.ok _.contains wrapper.subViews, viewController.lazyLoader