diff options
author | Phil Hughes <me@iamphill.com> | 2016-08-10 13:54:04 +0100 |
---|---|---|
committer | Phil Hughes <me@iamphill.com> | 2016-08-17 17:17:39 +0100 |
commit | 954b0daeda5b43e6dd237f6f5a6d951853f265b2 (patch) | |
tree | 694261ff63465118d942049ad84ed8e4ddaa6601 | |
parent | 9a579e829186e5d49f60a4ae0e70823a629c0059 (diff) | |
download | gitlab-ce-954b0daeda5b43e6dd237f6f5a6d951853f265b2.tar.gz |
Added JS spec tests for store & models
-rw-r--r-- | app/assets/javascripts/boards/stores/boards_store.js.es6 | 3 | ||||
-rw-r--r-- | spec/javascripts/boards/boards_store_spec.js.es6 | 155 | ||||
-rw-r--r-- | spec/javascripts/boards/issue_spec.js.es6 | 83 | ||||
-rw-r--r-- | spec/javascripts/boards/list_spec.js.es6 | 89 | ||||
-rw-r--r-- | spec/javascripts/boards/mock_data.js.es6 | 53 |
5 files changed, 382 insertions, 1 deletions
diff --git a/app/assets/javascripts/boards/stores/boards_store.js.es6 b/app/assets/javascripts/boards/stores/boards_store.js.es6 index ea223ff8174..e4d3d2cff2f 100644 --- a/app/assets/javascripts/boards/stores/boards_store.js.es6 +++ b/app/assets/javascripts/boards/stores/boards_store.js.es6 @@ -31,9 +31,10 @@ this.removeBlankState(); }, updateNewListDropdown: function () { - const data = $('.js-new-board-list').data('glDropdown').renderedData; + let data = $('.js-new-board-list').data('glDropdown'); if (data) { + data = data.renderedData; $('.js-new-board-list').data('glDropdown').renderData(data); } }, diff --git a/spec/javascripts/boards/boards_store_spec.js.es6 b/spec/javascripts/boards/boards_store_spec.js.es6 new file mode 100644 index 00000000000..c3c979a2a7f --- /dev/null +++ b/spec/javascripts/boards/boards_store_spec.js.es6 @@ -0,0 +1,155 @@ +//= require jquery +//= require jquery_ujs +//= require jquery.cookie +//= require vue +//= require vue-resource +//= require lib/utils/url_utility +//= require boards/models/issue +//= require boards/models/label +//= require boards/models/list +//= require boards/models/user +//= require boards/services/board_service +//= require boards/stores/boards_store +//= require ./mock_data + +(() => { + beforeEach(() => { + gl.boardService = new BoardService('/test/issue-boards/board'); + BoardsStore.create(); + + $.cookie('issue_board_welcome_hidden', 'false'); + }); + + describe('Store', () => { + it('starts with a blank state', () => { + expect(BoardsStore.state.lists.length).toBe(0); + }); + + describe('lists', () => { + it('creates new list without persisting to DB', () => { + BoardsStore.addList(listObj); + + expect(BoardsStore.state.lists.length).toBe(1); + }); + + it('finds list by ID', () => { + BoardsStore.addList(listObj); + const list = BoardsStore.findList('id', 1); + + expect(list.id).toBe(1); + }); + + it('finds list by type', () => { + BoardsStore.addList(listObj); + const list = BoardsStore.findList('type', 'label'); + + expect(list).toBeDefined(); + }); + + it('gets issue when new list added', (done) => { + BoardsStore.addList(listObj); + const list = BoardsStore.findList('id', 1); + + expect(BoardsStore.state.lists.length).toBe(1); + + setTimeout(() => { + expect(list.issues.length).toBe(1); + done(); + }, 0); + }); + + it('persists new list', (done) => { + BoardsStore.new({ + title: 'Test', + type: 'label', + label: { + id: 1, + title: 'Testing', + color: 'red', + description: 'testing;' + } + }); + expect(BoardsStore.state.lists.length).toBe(1); + + setTimeout(() => { + const list = BoardsStore.findList('id', 1); + expect(list).toBeDefined(); + expect(list.id).toBe(1); + expect(list.position).toBe(0); + done(); + }, 0); + }); + + it('check for blank state adding', () => { + expect(BoardsStore.shouldAddBlankState()).toBe(true); + }); + + it('check for blank state not adding', () => { + BoardsStore.addList(listObj); + expect(BoardsStore.shouldAddBlankState()).toBe(false); + }); + + it('check for blank state adding when backlog & done list exist', () => { + BoardsStore.addList({ + list_type: 'backlog' + }); + BoardsStore.addList({ + list_type: 'done' + }); + + expect(BoardsStore.shouldAddBlankState()).toBe(true); + }); + + it('adds the blank state', () => { + BoardsStore.addBlankState(); + + const list = BoardsStore.findList('type', 'blank'); + expect(list).toBeDefined(); + }); + + it('removes list from state', () => { + BoardsStore.addList(listObj); + + expect(BoardsStore.state.lists.length).toBe(1); + + BoardsStore.removeList(1); + + expect(BoardsStore.state.lists.length).toBe(0); + }); + + it('moves the position of lists', () => { + BoardsStore.addList(listObj); + BoardsStore.addList(listObjDuplicate); + + expect(BoardsStore.state.lists.length).toBe(2); + + BoardsStore.moveList(0, 1); + + const list = BoardsStore.findList('id', 1); + expect(list.position).toBe(1); + }); + + it('moves an issue from one list to another', (done) => { + BoardsStore.addList(listObj); + BoardsStore.addList(listObjDuplicate); + + expect(BoardsStore.state.lists.length).toBe(2); + + setTimeout(() => { + const list = BoardsStore.findList('id', 1); + const listTwo = BoardsStore.findList('id', 2); + + expect(list.issues.length).toBe(1); + expect(listTwo.issues.length).toBe(1); + + BoardsStore.moveCardToList(1, 2, 1); + + expect(list.issues.length).toBe(0); + expect(listTwo.issues.length).toBe(1); + + done(); + }); + }); + }); + }); +})(); diff --git a/spec/javascripts/boards/issue_spec.js.es6 b/spec/javascripts/boards/issue_spec.js.es6 new file mode 100644 index 00000000000..b31bd74302a --- /dev/null +++ b/spec/javascripts/boards/issue_spec.js.es6 @@ -0,0 +1,83 @@ +//= require jquery +//= require jquery_ujs +//= require jquery.cookie +//= require vue +//= require vue-resource +//= require lib/utils/url_utility +//= require boards/models/issue +//= require boards/models/label +//= require boards/models/list +//= require boards/models/user +//= require boards/services/board_service +//= require boards/stores/boards_store +//= require ./mock_data + +describe('Issue model', () => { + let issue; + + beforeEach(() => { + gl.boardService = new BoardService('/test/issue-boards/board'); + BoardsStore.create(); + + issue = new Issue({ + title: 'Testing', + iid: 1, + confidential: false, + labels: [{ + id: 1, + title: 'test', + color: 'red', + description: 'testing' + }] + }); + }); + + it('has label', () => { + expect(issue.labels.length).toBe(1); + }); + + it('add new label', () => { + issue.addLabel({ + id: 2, + title: 'bug', + color: 'blue', + description: 'bugs!' + }); + expect(issue.labels.length).toBe(2); + }); + + it('does not add existing label', () => { + issue.addLabel({ + id: 2, + title: 'test', + color: 'blue', + description: 'bugs!' + }); + + expect(issue.labels.length).toBe(1); + }); + + it('finds label', () => { + const label = issue.findLabel(issue.labels[0]); + expect(label).toBeDefined(); + }); + + it('removes label', () => { + const label = issue.findLabel(issue.labels[0]); + issue.removeLabel(label); + expect(issue.labels.length).toBe(0); + }); + + it('removes multiple labels', () => { + issue.addLabel({ + id: 2, + title: 'bug', + color: 'blue', + description: 'bugs!' + }); + expect(issue.labels.length).toBe(2); + + issue.removeLabels([issue.labels[0], issue.labels[1]]); + expect(issue.labels.length).toBe(0); + }); +}); diff --git a/spec/javascripts/boards/list_spec.js.es6 b/spec/javascripts/boards/list_spec.js.es6 new file mode 100644 index 00000000000..3773fd22c26 --- /dev/null +++ b/spec/javascripts/boards/list_spec.js.es6 @@ -0,0 +1,89 @@ +//= require jquery +//= require jquery_ujs +//= require jquery.cookie +//= require vue +//= require vue-resource +//= require lib/utils/url_utility +//= require boards/models/issue +//= require boards/models/label +//= require boards/models/list +//= require boards/models/user +//= require boards/services/board_service +//= require boards/stores/boards_store +//= require ./mock_data + +describe('List model', () => { + let list; + + beforeEach(() => { + gl.boardService = new BoardService('/test/issue-boards/board'); + BoardsStore.create(); + + list = new List(listObj); + }); + + it('gets issues when created', (done) => { + setTimeout(() => { + expect(list.issues.length).toBe(1); + done(); + }, 0); + }); + + it('saves list and returns ID', (done) => { + list = new List({ + title: 'test', + label: { + id: 1, + title: 'test', + color: 'red' + } + }); + list.save(); + + setTimeout(() => { + expect(list.id).toBe(1); + expect(list.type).toBe('label'); + expect(list.position).toBe(0); + done(); + }, 0); + }); + + it('destroys the list', (done) => { + BoardsStore.addList(listObj); + list = BoardsStore.findList('id', 1); + expect(BoardsStore.state.lists.length).toBe(1); + list.destroy(); + + setTimeout(() => { + expect(BoardsStore.state.lists.length).toBe(0); + done(); + }, 0); + }); + + it('can\'t search when not backlog', () => { + expect(list.canSearch()).toBe(false); + }); + + it('can search when backlog', () => { + list.type = 'backlog'; + expect(list.canSearch()).toBe(true); + }); + + it('gets issue from list', (done) => { + setTimeout(() => { + const issue = list.findIssue(1); + expect(issue).toBeDefined(); + done(); + }, 0); + }); + + it('removes issue', (done) => { + setTimeout(() => { + const issue = list.findIssue(1); + expect(list.issues.length).toBe(1); + list.removeIssue(issue); + expect(list.issues.length).toBe(0); + done(); + }, 0); + }); +}); diff --git a/spec/javascripts/boards/mock_data.js.es6 b/spec/javascripts/boards/mock_data.js.es6 new file mode 100644 index 00000000000..642ade87e1f --- /dev/null +++ b/spec/javascripts/boards/mock_data.js.es6 @@ -0,0 +1,53 @@ +const listObj = { + id: 1, + position: 0, + title: 'Test', + list_type: 'label', + label: { + id: 1, + title: 'Testing', + color: 'red', + description: 'testing;' + } +}; + +const listObjDuplicate = { + id: 2, + position: 1, + title: 'Test', + list_type: 'label', + label: { + id: 2, + title: 'Testing', + color: 'red', + description: 'testing;' + } +}; + +const BoardsMockData = { + 'GET': { + '/test/issue-boards/board/lists{/id}/issues.json': [{ + title: 'Testing', + iid: 1, + confidential: false, + labels: [] + }] + }, + 'POST': { + '/test/issue-boards/board/lists{/id}.json': listObj + }, + 'PUT': { + '/test/issue-boards/board/lists{/id}.json': {} + }, + 'DELETE': { + '/test/issue-boards/board/lists{/id}.json': {} + } +}; + +Vue.http.interceptors.push((request, next) => { + const body = BoardsMockData[request.method][request.url]; + + next(request.respondWith(JSON.stringify(body), { + status: 200 + })); +}); |