| <!DOCTYPE html> | |
| <!-- | |
| @license | |
| Copyright (C) 2015 The Android Open Source Project | |
| Licensed under the Apache License, Version 2.0 (the "License"); | |
| you may not use this file except in compliance with the License. | |
| You may obtain a copy of the License at | |
| http://www.apache.org/licenses/LICENSE-2.0 | |
| Unless required by applicable law or agreed to in writing, software | |
| distributed under the License is distributed on an "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| See the License for the specific language governing permissions and | |
| limitations under the License. | |
| --> | |
| <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes"> | |
| <title>gr-diff-comment-thread</title> | |
| <script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script> | |
| <script src="../../../bower_components/web-component-tester/browser.js"></script> | |
| <link rel="import" href="../../../test/common-test-setup.html"/> | |
| <script src="../../../scripts/util.js"></script> | |
| <link rel="import" href="gr-diff-comment-thread.html"> | |
| <script>void(0);</script> | |
| <test-fixture id="basic"> | |
| <template> | |
| <gr-diff-comment-thread></gr-diff-comment-thread> | |
| </template> | |
| </test-fixture> | |
| <test-fixture id="withComment"> | |
| <template> | |
| <gr-diff-comment-thread></gr-diff-comment-thread> | |
| </template> | |
| </test-fixture> | |
| <script> | |
| suite('gr-diff-comment-thread tests', () => { | |
| let element; | |
| let sandbox; | |
| setup(() => { | |
| sandbox = sinon.sandbox.create(); | |
| stub('gr-rest-api-interface', { | |
| getLoggedIn() { return Promise.resolve(false); }, | |
| }); | |
| sandbox = sinon.sandbox.create(); | |
| element = fixture('basic'); | |
| }); | |
| teardown(() => { | |
| sandbox.restore(); | |
| }); | |
| test('comments are sorted correctly', () => { | |
| const comments = [ | |
| { | |
| message: 'i like you, too', | |
| in_reply_to: 'sallys_confession', | |
| __date: new Date('2015-12-25'), | |
| }, { | |
| id: 'sallys_confession', | |
| message: 'i like you, jack', | |
| updated: '2015-12-24 15:00:20.396000000', | |
| }, { | |
| id: 'sally_to_dr_finklestein', | |
| message: 'i’m running away', | |
| updated: '2015-10-31 09:00:20.396000000', | |
| }, { | |
| id: 'sallys_defiance', | |
| in_reply_to: 'sally_to_dr_finklestein', | |
| message: 'i will poison you so i can get away', | |
| updated: '2015-10-31 15:00:20.396000000', | |
| }, { | |
| id: 'dr_finklesteins_response', | |
| in_reply_to: 'sally_to_dr_finklestein', | |
| message: 'no i will pull a thread and your arm will fall off', | |
| updated: '2015-10-31 11:00:20.396000000', | |
| }, { | |
| id: 'sallys_mission', | |
| message: 'i have to find santa', | |
| updated: '2015-12-24 15:00:20.396000000', | |
| }, | |
| ]; | |
| const results = element._sortedComments(comments); | |
| assert.deepEqual(results, [ | |
| { | |
| id: 'sally_to_dr_finklestein', | |
| message: 'i’m running away', | |
| updated: '2015-10-31 09:00:20.396000000', | |
| }, { | |
| id: 'dr_finklesteins_response', | |
| in_reply_to: 'sally_to_dr_finklestein', | |
| message: 'no i will pull a thread and your arm will fall off', | |
| updated: '2015-10-31 11:00:20.396000000', | |
| }, { | |
| id: 'sallys_defiance', | |
| in_reply_to: 'sally_to_dr_finklestein', | |
| message: 'i will poison you so i can get away', | |
| updated: '2015-10-31 15:00:20.396000000', | |
| }, { | |
| id: 'sallys_confession', | |
| message: 'i like you, jack', | |
| updated: '2015-12-24 15:00:20.396000000', | |
| }, { | |
| id: 'sallys_mission', | |
| message: 'i have to find santa', | |
| updated: '2015-12-24 15:00:20.396000000', | |
| }, { | |
| message: 'i like you, too', | |
| in_reply_to: 'sallys_confession', | |
| __date: new Date('2015-12-25'), | |
| }, | |
| ]); | |
| }); | |
| test('addOrEditDraft w/ edit draft', () => { | |
| element.comments = [{ | |
| id: 'jacks_reply', | |
| message: 'i like you, too', | |
| in_reply_to: 'sallys_confession', | |
| updated: '2015-12-25 15:00:20.396000000', | |
| __draft: true, | |
| }]; | |
| const commentElStub = sandbox.stub(element, '_commentElWithDraftID', | |
| () => { return {}; }); | |
| const addDraftStub = sandbox.stub(element, 'addDraft'); | |
| element.addOrEditDraft(123); | |
| assert.isTrue(commentElStub.called); | |
| assert.isFalse(addDraftStub.called); | |
| }); | |
| test('addOrEditDraft w/o edit draft', () => { | |
| element.comments = []; | |
| const commentElStub = sandbox.stub(element, '_commentElWithDraftID', | |
| () => { return {}; }); | |
| const addDraftStub = sandbox.stub(element, 'addDraft'); | |
| element.addOrEditDraft(123); | |
| assert.isFalse(commentElStub.called); | |
| assert.isTrue(addDraftStub.called); | |
| }); | |
| test('_hideActions', () => { | |
| let showActions = true; | |
| const lastComment = {}; | |
| assert.equal(element._hideActions(showActions, lastComment), false); | |
| showActions = false; | |
| assert.equal(element._hideActions(showActions, lastComment), true); | |
| showActions = true; | |
| lastComment.__draft = true; | |
| assert.equal(element._hideActions(showActions, lastComment), true); | |
| }); | |
| test('setting project name loads the project config', done => { | |
| const projectName = 'foo/bar/baz'; | |
| const getProjectStub = sandbox.stub(element.$.restAPI, 'getProjectConfig') | |
| .returns(Promise.resolve({})); | |
| element.projectName = projectName; | |
| flush(() => { | |
| assert.isTrue(getProjectStub.calledWithExactly(projectName)); | |
| done(); | |
| }); | |
| }); | |
| test('optionally show file path', () => { | |
| // Path info doesn't exist when showFilePath is false. Because it's in a | |
| // dom-if it is not yet in the dom. | |
| assert.isNotOk(element.$$('.pathInfo')); | |
| sandbox.stub(Gerrit.Nav, 'getUrlForDiffById'); | |
| element.changeNum = 123; | |
| element.projectName = 'test project'; | |
| element.path = 'path/to/file'; | |
| element.patchNum = 3; | |
| element.lineNum = 5; | |
| element.showFilePath = true; | |
| flushAsynchronousOperations(); | |
| assert.isOk(element.$$('.pathInfo')); | |
| assert.notEqual(getComputedStyle(element.$$('.pathInfo')).display, | |
| 'none'); | |
| assert.isTrue(Gerrit.Nav.getUrlForDiffById.lastCall.calledWithExactly( | |
| element.changeNum, element.projectName, element.path, | |
| element.patchNum, null, element.lineNum)); | |
| }); | |
| test('_computeDisplayPath', () => { | |
| const path = 'path/to/file'; | |
| assert.equal(element._computeDisplayPath(path), 'path/to/file'); | |
| element.lineNum = 5; | |
| assert.equal(element._computeDisplayPath(path), 'path/to/file#5'); | |
| }); | |
| }); | |
| suite('comment action tests', () => { | |
| let element; | |
| let sandbox; | |
| setup(() => { | |
| sandbox = sinon.sandbox.create(); | |
| stub('gr-rest-api-interface', { | |
| getLoggedIn() { return Promise.resolve(false); }, | |
| saveDiffDraft() { | |
| return Promise.resolve({ | |
| ok: true, | |
| text() { | |
| return Promise.resolve(')]}\'\n' + | |
| JSON.stringify({ | |
| id: '7afa4931_de3d65bd', | |
| path: '/path/to/file.txt', | |
| line: 5, | |
| in_reply_to: 'baf0414d_60047215', | |
| updated: '2015-12-21 02:01:10.850000000', | |
| message: 'Done', | |
| })); | |
| }, | |
| }); | |
| }, | |
| deleteDiffDraft() { return Promise.resolve({ok: true}); }, | |
| }); | |
| element = fixture('withComment'); | |
| element.comments = [{ | |
| author: { | |
| name: 'Mr. Peanutbutter', | |
| email: 'tenn1sballchaser@aol.com', | |
| }, | |
| id: 'baf0414d_60047215', | |
| line: 5, | |
| message: 'is this a crossover episode!?', | |
| updated: '2015-12-08 19:48:33.843000000', | |
| path: '/path/to/file.txt', | |
| }]; | |
| flushAsynchronousOperations(); | |
| }); | |
| teardown(() => { | |
| sandbox.restore(); | |
| }); | |
| test('reply', () => { | |
| const commentEl = element.$$('gr-diff-comment'); | |
| const reportStub = sandbox.stub(element.$.reporting, | |
| 'recordDraftInteraction'); | |
| assert.ok(commentEl); | |
| const replyBtn = element.$.replyBtn; | |
| MockInteractions.tap(replyBtn); | |
| flushAsynchronousOperations(); | |
| const drafts = element._orderedComments.filter(c => { | |
| return c.__draft == true; | |
| }); | |
| assert.equal(drafts.length, 1); | |
| assert.notOk(drafts[0].message, 'message should be empty'); | |
| assert.equal(drafts[0].in_reply_to, 'baf0414d_60047215'); | |
| assert.isTrue(reportStub.calledOnce); | |
| }); | |
| test('quote reply', () => { | |
| const commentEl = element.$$('gr-diff-comment'); | |
| const reportStub = sandbox.stub(element.$.reporting, | |
| 'recordDraftInteraction'); | |
| assert.ok(commentEl); | |
| const quoteBtn = element.$.quoteBtn; | |
| MockInteractions.tap(quoteBtn); | |
| flushAsynchronousOperations(); | |
| const drafts = element._orderedComments.filter(c => { | |
| return c.__draft == true; | |
| }); | |
| assert.equal(drafts.length, 1); | |
| assert.equal(drafts[0].message, '> is this a crossover episode!?\n\n'); | |
| assert.equal(drafts[0].in_reply_to, 'baf0414d_60047215'); | |
| assert.isTrue(reportStub.calledOnce); | |
| }); | |
| test('quote reply multiline', () => { | |
| const reportStub = sandbox.stub(element.$.reporting, | |
| 'recordDraftInteraction'); | |
| element.comments = [{ | |
| author: { | |
| name: 'Mr. Peanutbutter', | |
| email: 'tenn1sballchaser@aol.com', | |
| }, | |
| id: 'baf0414d_60047215', | |
| line: 5, | |
| message: 'is this a crossover episode!?\nIt might be!', | |
| updated: '2015-12-08 19:48:33.843000000', | |
| }]; | |
| flushAsynchronousOperations(); | |
| const commentEl = element.$$('gr-diff-comment'); | |
| assert.ok(commentEl); | |
| const quoteBtn = element.$.quoteBtn; | |
| MockInteractions.tap(quoteBtn); | |
| flushAsynchronousOperations(); | |
| const drafts = element._orderedComments.filter(c => { | |
| return c.__draft == true; | |
| }); | |
| assert.equal(drafts.length, 1); | |
| assert.equal(drafts[0].message, | |
| '> is this a crossover episode!?\n> It might be!\n\n'); | |
| assert.equal(drafts[0].in_reply_to, 'baf0414d_60047215'); | |
| assert.isTrue(reportStub.calledOnce); | |
| }); | |
| test('ack', done => { | |
| const reportStub = sandbox.stub(element.$.reporting, | |
| 'recordDraftInteraction'); | |
| element.changeNum = '42'; | |
| element.patchNum = '1'; | |
| const commentEl = element.$$('gr-diff-comment'); | |
| assert.ok(commentEl); | |
| const ackBtn = element.$.ackBtn; | |
| MockInteractions.tap(ackBtn); | |
| flush(() => { | |
| const drafts = element.comments.filter(c => { | |
| return c.__draft == true; | |
| }); | |
| assert.equal(drafts.length, 1); | |
| assert.equal(drafts[0].message, 'Ack'); | |
| assert.equal(drafts[0].in_reply_to, 'baf0414d_60047215'); | |
| assert.equal(drafts[0].unresolved, false); | |
| assert.isTrue(reportStub.calledOnce); | |
| done(); | |
| }); | |
| }); | |
| test('done', done => { | |
| const reportStub = sandbox.stub(element.$.reporting, | |
| 'recordDraftInteraction'); | |
| element.changeNum = '42'; | |
| element.patchNum = '1'; | |
| const commentEl = element.$$('gr-diff-comment'); | |
| assert.ok(commentEl); | |
| const doneBtn = element.$.doneBtn; | |
| MockInteractions.tap(doneBtn); | |
| flush(() => { | |
| const drafts = element.comments.filter(c => { | |
| return c.__draft == true; | |
| }); | |
| assert.equal(drafts.length, 1); | |
| assert.equal(drafts[0].message, 'Done'); | |
| assert.equal(drafts[0].in_reply_to, 'baf0414d_60047215'); | |
| assert.isFalse(drafts[0].unresolved); | |
| assert.isTrue(reportStub.calledOnce); | |
| done(); | |
| }); | |
| }); | |
| test('save', done => { | |
| element.changeNum = '42'; | |
| element.patchNum = '1'; | |
| element.path = '/path/to/file.txt'; | |
| const commentEl = element.$$('gr-diff-comment'); | |
| assert.ok(commentEl); | |
| const saveOrDiscardStub = sandbox.stub(); | |
| element.addEventListener('thread-changed', saveOrDiscardStub); | |
| element.$$('gr-diff-comment')._fireSave(); | |
| flush(() => { | |
| assert.isTrue(saveOrDiscardStub.called); | |
| assert.equal(saveOrDiscardStub.lastCall.args[0].detail.rootId, | |
| 'baf0414d_60047215'); | |
| assert.equal(element.rootId, 'baf0414d_60047215'); | |
| assert.equal(saveOrDiscardStub.lastCall.args[0].detail.path, | |
| '/path/to/file.txt'); | |
| done(); | |
| }); | |
| }); | |
| test('please fix', done => { | |
| element.changeNum = '42'; | |
| element.patchNum = '1'; | |
| const commentEl = element.$$('gr-diff-comment'); | |
| assert.ok(commentEl); | |
| commentEl.addEventListener('create-fix-comment', () => { | |
| const drafts = element._orderedComments.filter(c => { | |
| return c.__draft == true; | |
| }); | |
| assert.equal(drafts.length, 1); | |
| assert.equal( | |
| drafts[0].message, '> is this a crossover episode!?\n\nPlease Fix'); | |
| assert.equal(drafts[0].in_reply_to, 'baf0414d_60047215'); | |
| assert.isTrue(drafts[0].unresolved); | |
| done(); | |
| }); | |
| commentEl.fire('create-fix-comment', {comment: commentEl.comment}, | |
| {bubbles: false}); | |
| }); | |
| test('discard', done => { | |
| element.changeNum = '42'; | |
| element.patchNum = '1'; | |
| element.path = '/path/to/file.txt'; | |
| element.push('comments', element._newReply( | |
| element.comments[0].id, | |
| element.comments[0].line, | |
| element.comments[0].path, | |
| 'it’s pronouced jiff, not giff')); | |
| flushAsynchronousOperations(); | |
| const saveOrDiscardStub = sandbox.stub(); | |
| element.addEventListener('thread-changed', saveOrDiscardStub); | |
| const draftEl = | |
| Polymer.dom(element.root).querySelectorAll('gr-diff-comment')[1]; | |
| assert.ok(draftEl); | |
| draftEl.addEventListener('comment-discard', () => { | |
| const drafts = element.comments.filter(c => { | |
| return c.__draft == true; | |
| }); | |
| assert.equal(drafts.length, 0); | |
| assert.isTrue(saveOrDiscardStub.called); | |
| assert.equal(saveOrDiscardStub.lastCall.args[0].detail.rootId, | |
| element.rootId); | |
| assert.equal(saveOrDiscardStub.lastCall.args[0].detail.path, | |
| element.path); | |
| done(); | |
| }); | |
| draftEl.fire('comment-discard', {comment: draftEl.comment}, | |
| {bubbles: false}); | |
| }); | |
| test('discard with a single comment still fires event with previous rootId', | |
| done => { | |
| element.changeNum = '42'; | |
| element.patchNum = '1'; | |
| element.path = '/path/to/file.txt'; | |
| element.comments = []; | |
| element.addOrEditDraft('1'); | |
| flushAsynchronousOperations(); | |
| const rootId = element.rootId; | |
| assert.isOk(rootId); | |
| const saveOrDiscardStub = sandbox.stub(); | |
| element.addEventListener('thread-changed', saveOrDiscardStub); | |
| const draftEl = | |
| Polymer.dom(element.root).querySelectorAll('gr-diff-comment')[0]; | |
| assert.ok(draftEl); | |
| draftEl.addEventListener('comment-discard', () => { | |
| assert.equal(element.comments.length, 0); | |
| assert.isTrue(saveOrDiscardStub.called); | |
| assert.equal(saveOrDiscardStub.lastCall.args[0].detail.rootId, | |
| rootId); | |
| assert.equal(saveOrDiscardStub.lastCall.args[0].detail.path, | |
| element.path); | |
| done(); | |
| }); | |
| draftEl.fire('comment-discard', {comment: draftEl.comment}, | |
| {bubbles: false}); | |
| }); | |
| test('first editing comment does not add __otherEditing attribute', () => { | |
| element.comments = [{ | |
| author: { | |
| name: 'Mr. Peanutbutter', | |
| email: 'tenn1sballchaser@aol.com', | |
| }, | |
| id: 'baf0414d_60047215', | |
| line: 5, | |
| message: 'is this a crossover episode!?', | |
| updated: '2015-12-08 19:48:33.843000000', | |
| __draft: true, | |
| }]; | |
| const replyBtn = element.$.replyBtn; | |
| MockInteractions.tap(replyBtn); | |
| flushAsynchronousOperations(); | |
| const editing = element._orderedComments.filter(c => { | |
| return c.__editing == true; | |
| }); | |
| assert.equal(editing.length, 1); | |
| assert.equal(!!editing[0].__otherEditing, false); | |
| }); | |
| test('When not editing other comments, local storage not set' + | |
| ' after discard', done => { | |
| element.changeNum = '42'; | |
| element.patchNum = '1'; | |
| element.comments = [{ | |
| author: { | |
| name: 'Mr. Peanutbutter', | |
| email: 'tenn1sballchaser@aol.com', | |
| }, | |
| id: 'baf0414d_60047215', | |
| line: 5, | |
| message: 'is this a crossover episode!?', | |
| updated: '2015-12-08 19:48:31.843000000', | |
| }, | |
| { | |
| author: { | |
| name: 'Mr. Peanutbutter', | |
| email: 'tenn1sballchaser@aol.com', | |
| }, | |
| __draftID: '1', | |
| in_reply_to: 'baf0414d_60047215', | |
| line: 5, | |
| message: 'yes', | |
| updated: '2015-12-08 19:48:32.843000000', | |
| __draft: true, | |
| __editing: true, | |
| }, | |
| { | |
| author: { | |
| name: 'Mr. Peanutbutter', | |
| email: 'tenn1sballchaser@aol.com', | |
| }, | |
| __draftID: '2', | |
| in_reply_to: 'baf0414d_60047215', | |
| line: 5, | |
| message: 'no', | |
| updated: '2015-12-08 19:48:33.843000000', | |
| __draft: true, | |
| }]; | |
| const storageStub = sinon.stub(element.$.storage, 'setDraftComment'); | |
| flushAsynchronousOperations(); | |
| const draftEl = | |
| Polymer.dom(element.root).querySelectorAll('gr-diff-comment')[1]; | |
| assert.ok(draftEl); | |
| draftEl.addEventListener('comment-discard', () => { | |
| assert.isFalse(storageStub.called); | |
| storageStub.restore(); | |
| done(); | |
| }); | |
| draftEl.fire('comment-discard', {comment: draftEl.comment}, | |
| {bubbles: false}); | |
| }); | |
| test('comment-update', () => { | |
| const commentEl = element.$$('gr-diff-comment'); | |
| const updatedComment = { | |
| id: element.comments[0].id, | |
| foo: 'bar', | |
| }; | |
| commentEl.fire('comment-update', {comment: updatedComment}); | |
| assert.strictEqual(element.comments[0], updatedComment); | |
| }); | |
| suite('jack and sally comment data test consolidation', () => { | |
| setup(() => { | |
| element.comments = [ | |
| { | |
| id: 'jacks_reply', | |
| message: 'i like you, too', | |
| in_reply_to: 'sallys_confession', | |
| updated: '2015-12-25 15:00:20.396000000', | |
| unresolved: false, | |
| }, { | |
| id: 'sallys_confession', | |
| in_reply_to: 'nonexistent_comment', | |
| message: 'i like you, jack', | |
| updated: '2015-12-24 15:00:20.396000000', | |
| }, { | |
| id: 'sally_to_dr_finklestein', | |
| in_reply_to: 'nonexistent_comment', | |
| message: 'i’m running away', | |
| updated: '2015-10-31 09:00:20.396000000', | |
| }, { | |
| id: 'sallys_defiance', | |
| message: 'i will poison you so i can get away', | |
| updated: '2015-10-31 15:00:20.396000000', | |
| }]; | |
| }); | |
| test('orphan replies', () => { | |
| assert.equal(4, element._orderedComments.length); | |
| }); | |
| test('keyboard shortcuts', () => { | |
| const expandCollapseStub = | |
| sinon.stub(element, '_expandCollapseComments'); | |
| MockInteractions.pressAndReleaseKeyOn(element, 69, null, 'e'); | |
| assert.isTrue(expandCollapseStub.lastCall.calledWith(false)); | |
| MockInteractions.pressAndReleaseKeyOn(element, 69, 'shift', 'e'); | |
| assert.isTrue(expandCollapseStub.lastCall.calledWith(true)); | |
| }); | |
| test('comment in_reply_to is either null or most recent comment', () => { | |
| element._createReplyComment(element.comments[3], 'dummy', true); | |
| flushAsynchronousOperations(); | |
| assert.equal(element._orderedComments.length, 5); | |
| assert.equal(element._orderedComments[4].in_reply_to, 'jacks_reply'); | |
| }); | |
| test('resolvable comments', () => { | |
| assert.isFalse(element.unresolved); | |
| element._createReplyComment(element.comments[3], 'dummy', true, true); | |
| flushAsynchronousOperations(); | |
| assert.isTrue(element.unresolved); | |
| }); | |
| test('_setInitialExpandedState', () => { | |
| element.unresolved = true; | |
| element._setInitialExpandedState(); | |
| for (let i = 0; i < element.comments.length; i++) { | |
| assert.isFalse(element.comments[i].collapsed); | |
| } | |
| element.unresolved = false; | |
| element._setInitialExpandedState(); | |
| for (let i = 0; i < element.comments.length; i++) { | |
| assert.isTrue(element.comments[i].collapsed); | |
| } | |
| for (let i = 0; i < element.comments.length; i++) { | |
| element.comments[i].robot_id = 123; | |
| } | |
| element._setInitialExpandedState(); | |
| for (let i = 0; i < element.comments.length; i++) { | |
| assert.isFalse(element.comments[i].collapsed); | |
| } | |
| }); | |
| }); | |
| test('_computeHostClass', () => { | |
| assert.equal(element._computeHostClass(true), 'unresolved'); | |
| assert.equal(element._computeHostClass(false), ''); | |
| }); | |
| test('addDraft sets unresolved state correctly', () => { | |
| let unresolved = true; | |
| element.comments = []; | |
| element.addDraft(null, null, unresolved); | |
| assert.equal(element.comments[0].unresolved, true); | |
| unresolved = false; // comment should get added as actually resolved. | |
| element.comments = []; | |
| element.addDraft(null, null, unresolved); | |
| assert.equal(element.comments[0].unresolved, false); | |
| element.comments = []; | |
| element.addDraft(); | |
| assert.equal(element.comments[0].unresolved, true); | |
| }); | |
| test('_newDraft', () => { | |
| element.commentSide = 'left'; | |
| element.patchNum = 3; | |
| const draft = element._newDraft(); | |
| assert.equal(draft.__commentSide, 'left'); | |
| assert.equal(draft.patchNum, 3); | |
| }); | |
| test('new comment gets created', () => { | |
| element.comments = []; | |
| element.addOrEditDraft(1); | |
| assert.equal(element.comments.length, 1); | |
| // Mock a submitted comment. | |
| element.comments[0].id = element.comments[0].__draftID; | |
| element.comments[0].__draft = false; | |
| element.addOrEditDraft(1); | |
| assert.equal(element.comments.length, 2); | |
| }); | |
| test('unresolved label', () => { | |
| element.unresolved = false; | |
| assert.isTrue(element.$.unresolvedLabel.hasAttribute('hidden')); | |
| element.unresolved = true; | |
| assert.isFalse(element.$.unresolvedLabel.hasAttribute('hidden')); | |
| }); | |
| test('draft comments are at the end of orderedComments', () => { | |
| element.comments = [{ | |
| author: { | |
| name: 'Mr. Peanutbutter', | |
| email: 'tenn1sballchaser@aol.com', | |
| }, | |
| id: 2, | |
| line: 5, | |
| message: 'Earlier draft', | |
| updated: '2015-12-08 19:48:33.843000000', | |
| __draft: true, | |
| }, | |
| { | |
| author: { | |
| name: 'Mr. Peanutbutter2', | |
| email: 'tenn1sballchaser@aol.com', | |
| }, | |
| id: 1, | |
| line: 5, | |
| message: 'This comment was left last but is not a draft', | |
| updated: '2015-12-10 19:48:33.843000000', | |
| }, | |
| { | |
| author: { | |
| name: 'Mr. Peanutbutter2', | |
| email: 'tenn1sballchaser@aol.com', | |
| }, | |
| id: 3, | |
| line: 5, | |
| message: 'Later draft', | |
| updated: '2015-12-09 19:48:33.843000000', | |
| __draft: true, | |
| }]; | |
| assert.equal(element._orderedComments[0].id, '1'); | |
| assert.equal(element._orderedComments[1].id, '2'); | |
| assert.equal(element._orderedComments[2].id, '3'); | |
| }); | |
| }); | |
| </script> |