 c7f07dca19
			
		
	
	c7f07dca19
	
	
	
		
			
			Previously, nested components (that are never standalone) were making their own requests for comments, creating unecessary duplicate API requests. Some requests were made to the rest API directly (for example, gr-change-view requested comments this way), and some were through the gr-comment-api, which also helped handle comment manipulation and reorganization. Instead of ad-hoc comment requesting, move all comment requests to the top level (standalone) component, and use an object prototype to generate _changeComments as a property on gr-comment-api. This is an immutable object that can be passed to the inner components (file list, etc), and includes the methods needed to manipulate comments into the forms necessary. When a child component needs to trigger a refresh of the comments, fire an event that the parent event handles (see gr-file-list l.867). Bug: Issue 6953 Change-Id: Ic4b6cf16520baae65d8cf956c311a60f2a70a2e1
		
			
				
	
	
		
			239 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			239 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <!DOCTYPE html>
 | |
| <!--
 | |
| Copyright (C) 2017 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-comment-api</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"/>
 | |
| 
 | |
| <link rel="import" href="./gr-comment-api.html">
 | |
| 
 | |
| <script>void(0);</script>
 | |
| 
 | |
| <test-fixture id="basic">
 | |
|   <template>
 | |
|     <gr-comment-api></gr-comment-api>
 | |
|   </template>
 | |
| </test-fixture>
 | |
| 
 | |
| <script>
 | |
|   suite('gr-comment-api tests', () => {
 | |
|     const PARENT = 'PARENT';
 | |
| 
 | |
|     let element;
 | |
|     let sandbox;
 | |
| 
 | |
|     setup(() => {
 | |
|       sandbox = sinon.sandbox.create();
 | |
|       element = fixture('basic');
 | |
|     });
 | |
| 
 | |
|     teardown(() => { sandbox.restore(); });
 | |
| 
 | |
|     test('loads logged-out', () => {
 | |
|       const changeNum = 1234;
 | |
| 
 | |
|       sandbox.stub(element.$.restAPI, 'getLoggedIn')
 | |
|           .returns(Promise.resolve(false));
 | |
|       sandbox.stub(element.$.restAPI, 'getDiffComments')
 | |
|           .returns(Promise.resolve({
 | |
|             'foo.c': [{id: '123', message: 'foo bar', in_reply_to: '321'}],
 | |
|           }));
 | |
|       sandbox.stub(element.$.restAPI, 'getDiffRobotComments')
 | |
|           .returns(Promise.resolve({'foo.c': [{id: '321', message: 'done'}]}));
 | |
|       sandbox.stub(element.$.restAPI, 'getDiffDrafts')
 | |
|           .returns(Promise.resolve({}));
 | |
| 
 | |
|       return element.loadAll(changeNum).then(() => {
 | |
|         assert.isTrue(element.$.restAPI.getDiffComments.calledWithExactly(
 | |
|             changeNum));
 | |
|         assert.isTrue(element.$.restAPI.getDiffRobotComments.calledWithExactly(
 | |
|             changeNum));
 | |
|         assert.isTrue(element.$.restAPI.getDiffDrafts.calledWithExactly(
 | |
|             changeNum));
 | |
|         assert.isOk(element._changeComments._comments);
 | |
|         assert.isOk(element._changeComments._robotComments);
 | |
|         assert.deepEqual(element._changeComments._drafts, {});
 | |
|       });
 | |
|     });
 | |
| 
 | |
|     test('loads logged-in', () => {
 | |
|       const changeNum = 1234;
 | |
| 
 | |
|       sandbox.stub(element.$.restAPI, 'getLoggedIn')
 | |
|           .returns(Promise.resolve(true));
 | |
|       sandbox.stub(element.$.restAPI, 'getDiffComments')
 | |
|           .returns(Promise.resolve({
 | |
|             'foo.c': [{id: '123', message: 'foo bar', in_reply_to: '321'}],
 | |
|           }));
 | |
|       sandbox.stub(element.$.restAPI, 'getDiffRobotComments')
 | |
|           .returns(Promise.resolve({'foo.c': [{id: '321', message: 'done'}]}));
 | |
|       sandbox.stub(element.$.restAPI, 'getDiffDrafts')
 | |
|           .returns(Promise.resolve({'foo.c': [{id: '555', message: 'ack'}]}));
 | |
| 
 | |
|       return element.loadAll(changeNum).then(() => {
 | |
|         assert.isTrue(element.$.restAPI.getDiffComments.calledWithExactly(
 | |
|             changeNum));
 | |
|         assert.isTrue(element.$.restAPI.getDiffRobotComments.calledWithExactly(
 | |
|             changeNum));
 | |
|         assert.isTrue(element.$.restAPI.getDiffDrafts.calledWithExactly(
 | |
|             changeNum));
 | |
|         assert.isOk(element._changeComments._comments);
 | |
|         assert.isOk(element._changeComments._robotComments);
 | |
|         assert.notDeepEqual(element._changeComments._drafts, {});
 | |
|       });
 | |
|     });
 | |
| 
 | |
|     suite('_changeComment methods', () => {
 | |
|       setup(done => {
 | |
|         const changeNum = 1234;
 | |
|         element.loadAll(changeNum).then(() => {
 | |
|           done();
 | |
|         });
 | |
|       });
 | |
| 
 | |
|       test('_isInBaseOfPatchRange', () => {
 | |
|         const comment = {patch_set: 1};
 | |
|         const patchRange = {basePatchNum: 1, patchNum: 2};
 | |
|         assert.isTrue(element._changeComments._isInBaseOfPatchRange(comment,
 | |
|             patchRange));
 | |
| 
 | |
|         patchRange.basePatchNum = PARENT;
 | |
|         assert.isFalse(element._changeComments._isInBaseOfPatchRange(comment,
 | |
|             patchRange));
 | |
| 
 | |
|         comment.side = PARENT;
 | |
|         assert.isFalse(element._changeComments._isInBaseOfPatchRange(comment,
 | |
|             patchRange));
 | |
| 
 | |
|         comment.patch_set = 2;
 | |
|         assert.isTrue(element._changeComments._isInBaseOfPatchRange(comment,
 | |
|             patchRange));
 | |
|       });
 | |
| 
 | |
|       test('_isInRevisionOfPatchRange', () => {
 | |
|         const comment = {patch_set: 123};
 | |
|         const patchRange = {basePatchNum: 122, patchNum: 124};
 | |
|         assert.isFalse(element._changeComments._isInRevisionOfPatchRange(
 | |
|             comment, patchRange));
 | |
| 
 | |
|         patchRange.patchNum = 123;
 | |
|         assert.isTrue(element._changeComments._isInRevisionOfPatchRange(
 | |
|             comment, patchRange));
 | |
| 
 | |
|         comment.side = PARENT;
 | |
|         assert.isFalse(element._changeComments._isInRevisionOfPatchRange(
 | |
|             comment, patchRange));
 | |
|       });
 | |
| 
 | |
|       suite('comment ranges and paths', () => {
 | |
|         setup(() => {
 | |
|           element._changeComments._drafts = {};
 | |
|           element._changeComments._robotComments = {
 | |
|             'file/one': [
 | |
|               {patch_set: 2, side: PARENT},
 | |
|               {patch_set: 2},
 | |
|             ],
 | |
|           };
 | |
|           element._changeComments._comments = {
 | |
|             'file/one': [
 | |
|               {patch_set: 2, side: PARENT},
 | |
|               {patch_set: 2},
 | |
|             ],
 | |
|             'file/two': [
 | |
|               {patch_set: 2},
 | |
|               {patch_set: 3},
 | |
|             ],
 | |
|             'file/three': [
 | |
|               {patch_set: 2, side: PARENT},
 | |
|               {patch_set: 3},
 | |
|             ],
 | |
|             'file/four': [
 | |
|               {patch_set: 5, side: PARENT},
 | |
|               {patch_set: 5},
 | |
|             ],
 | |
|           };
 | |
|         });
 | |
| 
 | |
|         test('getPaths', () => {
 | |
|           const patchRange = {basePatchNum: 1, patchNum: 4};
 | |
|           let paths = element._changeComments.getPaths(patchRange);
 | |
|           assert.equal(Object.keys(paths).length, 0);
 | |
| 
 | |
|           patchRange.basePatchNum = PARENT;
 | |
|           patchRange.patchNum = 3;
 | |
|           paths = element._changeComments.getPaths(patchRange);
 | |
|           assert.notProperty(paths, 'file/one');
 | |
|           assert.property(paths, 'file/two');
 | |
|           assert.property(paths, 'file/three');
 | |
|           assert.notProperty(paths, 'file/four');
 | |
| 
 | |
|           patchRange.patchNum = 2;
 | |
|           paths = element._changeComments.getPaths(patchRange);
 | |
|           assert.property(paths, 'file/one');
 | |
|           assert.property(paths, 'file/two');
 | |
|           assert.property(paths, 'file/three');
 | |
|           assert.notProperty(paths, 'file/four');
 | |
| 
 | |
|           paths = element._changeComments.getPaths();
 | |
|           assert.property(paths, 'file/one');
 | |
|           assert.property(paths, 'file/two');
 | |
|           assert.property(paths, 'file/three');
 | |
|           assert.property(paths, 'file/four');
 | |
|         });
 | |
| 
 | |
|         test('getCommentsForPath', () => {
 | |
|           const patchRange = {basePatchNum: 1, patchNum: 3};
 | |
|           let path = 'file/one';
 | |
|           let comments = element._changeComments.getCommentsForPath(path,
 | |
|               patchRange);
 | |
|           assert.equal(comments.meta.changeNum, 1234);
 | |
|           assert.equal(comments.left.length, 0);
 | |
|           assert.equal(comments.right.length, 0);
 | |
| 
 | |
|           path = 'file/two';
 | |
|           comments = element._changeComments.getCommentsForPath(path,
 | |
|               patchRange);
 | |
|           assert.equal(comments.left.length, 0);
 | |
|           assert.equal(comments.right.length, 1);
 | |
| 
 | |
|           patchRange.basePatchNum = 2;
 | |
|           comments = element._changeComments.getCommentsForPath(path,
 | |
|               patchRange);
 | |
|           assert.equal(comments.left.length, 1);
 | |
|           assert.equal(comments.right.length, 1);
 | |
| 
 | |
|           patchRange.basePatchNum = PARENT;
 | |
|           path = 'file/three';
 | |
|           comments = element._changeComments.getCommentsForPath(path,
 | |
|               patchRange);
 | |
|           assert.equal(comments.left.length, 0);
 | |
|           assert.equal(comments.right.length, 1);
 | |
|         });
 | |
| 
 | |
|         test('getAllCommentsForPath', () => {
 | |
|           const path = 'file/one';
 | |
|           const comments = element._changeComments.getAllCommentsForPath(path);
 | |
|           assert.deepEqual(comments.length, 4);
 | |
|         });
 | |
|       });
 | |
|     });
 | |
|   });
 | |
| </script>
 |