Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame] | 1 | // Copyright 2019 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | import {assert} from 'chai'; |
| 6 | import sinon from 'sinon'; |
| 7 | import {MrCommentList} from './mr-comment-list.js'; |
| 8 | |
| 9 | |
| 10 | let element; |
| 11 | |
| 12 | describe('mr-comment-list', () => { |
| 13 | beforeEach(() => { |
| 14 | element = document.createElement('mr-comment-list'); |
| 15 | document.body.appendChild(element); |
| 16 | element.comments = [ |
| 17 | { |
| 18 | canFlag: true, |
| 19 | localId: 898395, |
| 20 | canDelete: true, |
| 21 | projectName: 'chromium', |
| 22 | commenter: { |
| 23 | displayName: 'user@example.com', |
| 24 | userId: '12345', |
| 25 | }, |
| 26 | content: 'foo', |
| 27 | sequenceNum: 1, |
| 28 | timestamp: 1549319989, |
| 29 | }, |
| 30 | { |
| 31 | canFlag: true, |
| 32 | localId: 898395, |
| 33 | canDelete: true, |
| 34 | projectName: 'chromium', |
| 35 | commenter: { |
| 36 | displayName: 'user@example.com', |
| 37 | userId: '12345', |
| 38 | }, |
| 39 | content: 'foo', |
| 40 | sequenceNum: 2, |
| 41 | timestamp: 1549320089, |
| 42 | }, |
| 43 | { |
| 44 | canFlag: true, |
| 45 | localId: 898395, |
| 46 | canDelete: true, |
| 47 | projectName: 'chromium', |
| 48 | commenter: { |
| 49 | displayName: 'user@example.com', |
| 50 | userId: '12345', |
| 51 | }, |
| 52 | content: 'foo', |
| 53 | sequenceNum: 3, |
| 54 | timestamp: 1549320189, |
| 55 | }, |
| 56 | ]; |
| 57 | |
| 58 | // Stub RAF to execute immediately. |
| 59 | sinon.stub(window, 'requestAnimationFrame').callsFake((func) => func()); |
| 60 | }); |
| 61 | |
| 62 | afterEach(() => { |
| 63 | document.body.removeChild(element); |
| 64 | window.requestAnimationFrame.restore(); |
| 65 | }); |
| 66 | |
| 67 | it('initializes', () => { |
| 68 | assert.instanceOf(element, MrCommentList); |
| 69 | }); |
| 70 | |
| 71 | it('scrolls to comment', async () => { |
| 72 | await element.updateComplete; |
| 73 | |
| 74 | const commentElements = element.shadowRoot.querySelectorAll('mr-comment'); |
| 75 | const commentElement = commentElements[commentElements.length - 1]; |
| 76 | sinon.stub(commentElement, 'scrollIntoView'); |
| 77 | |
| 78 | element.focusId = 'c3'; |
| 79 | |
| 80 | await element.updateComplete; |
| 81 | |
| 82 | assert.isTrue(element._hideComments); |
| 83 | assert.isTrue(commentElement.scrollIntoView.calledOnce); |
| 84 | |
| 85 | commentElement.scrollIntoView.restore(); |
| 86 | }); |
| 87 | |
| 88 | it('scrolls to hidden comment', async () => { |
| 89 | await element.updateComplete; |
| 90 | |
| 91 | element.focusId = 'c1'; |
| 92 | |
| 93 | await element.updateComplete; |
| 94 | |
| 95 | assert.isFalse(element._hideComments); |
| 96 | // TODO: Check that the comment has been scrolled into view. |
| 97 | }); |
| 98 | |
| 99 | it('doesnt scroll to unknown comment', async () => { |
| 100 | await element.updateComplete; |
| 101 | |
| 102 | element.focusId = 'c100'; |
| 103 | |
| 104 | await element.updateComplete; |
| 105 | |
| 106 | assert.isTrue(element._hideComments); |
| 107 | }); |
| 108 | }); |