| <!DOCTYPE html> | 
 | <!-- | 
 | @license | 
 | 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-repo-detail-list</title> | 
 |  | 
 | <script src="../../../bower_components/page/page.js"></script> | 
 | <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-repo-detail-list.html"> | 
 |  | 
 | <script>void(0);</script> | 
 |  | 
 | <test-fixture id="basic"> | 
 |   <template> | 
 |     <gr-repo-detail-list></gr-repo-detail-list> | 
 |   </template> | 
 | </test-fixture> | 
 |  | 
 | <script> | 
 |   let counter; | 
 |   const branchGenerator = () => { | 
 |     return { | 
 |       ref: `refs/heads/test${++counter}`, | 
 |       revision: '9c9d08a438e55e52f33b608415e6dddd9b18550d', | 
 |       web_links: [ | 
 |         { | 
 |           name: 'diffusion', | 
 |           url: `https://git.example.org/branch/test;refs/heads/test${counter}`, | 
 |         }, | 
 |       ], | 
 |     }; | 
 |   }; | 
 |   const tagGenerator = () => { | 
 |     return { | 
 |       ref: `refs/tags/test${++counter}`, | 
 |       revision: '9c9d08a438e55e52f33b608415e6dddd9b18550d', | 
 |       web_links: [ | 
 |         { | 
 |           name: 'diffusion', | 
 |           url: `https://git.example.org/tag/test;refs/tags/test${counter}`, | 
 |         }, | 
 |       ], | 
 |       message: 'Annotated tag', | 
 |       tagger: { | 
 |         name: 'Test User', | 
 |         email: 'test.user@gmail.com', | 
 |         date: '2017-09-19 14:54:00.000000000', | 
 |         tz: 540, | 
 |       }, | 
 |     }; | 
 |   }; | 
 |  | 
 |   suite('Branches', () => { | 
 |     let element; | 
 |     let branches; | 
 |     let sandbox; | 
 |  | 
 |     setup(() => { | 
 |       sandbox = sinon.sandbox.create(); | 
 |       element = fixture('basic'); | 
 |       element.detailType = 'branches'; | 
 |       counter = 0; | 
 |       sandbox.stub(page, 'show'); | 
 |     }); | 
 |  | 
 |     teardown(() => { | 
 |       sandbox.restore(); | 
 |     }); | 
 |  | 
 |     suite('list of repo branches', () => { | 
 |       setup(done => { | 
 |         branches = [{ | 
 |           ref: 'HEAD', | 
 |           revision: 'master', | 
 |         }].concat(_.times(25, branchGenerator)); | 
 |  | 
 |         stub('gr-rest-api-interface', { | 
 |           getRepoBranches(num, project, offset) { | 
 |             return Promise.resolve(branches); | 
 |           }, | 
 |         }); | 
 |  | 
 |         const params = { | 
 |           repo: 'test', | 
 |           detail: 'branches', | 
 |         }; | 
 |  | 
 |         element._paramsChanged(params).then(() => { flush(done); }); | 
 |       }); | 
 |  | 
 |       test('test for branch in the list', done => { | 
 |         flush(() => { | 
 |           assert.equal(element._items[2].ref, 'refs/heads/test2'); | 
 |           done(); | 
 |         }); | 
 |       }); | 
 |  | 
 |       test('test for web links in the branches list', done => { | 
 |         flush(() => { | 
 |           assert.equal(element._items[2].web_links[0].url, | 
 |               'https://git.example.org/branch/test;refs/heads/test2'); | 
 |           done(); | 
 |         }); | 
 |       }); | 
 |  | 
 |       test('test for refs/heads/ being striped from ref', done => { | 
 |         flush(() => { | 
 |           assert.equal(element._stripRefs(element._items[2].ref, | 
 |               element.detailType), 'test2'); | 
 |           done(); | 
 |         }); | 
 |       }); | 
 |  | 
 |       test('_shownItems', () => { | 
 |         assert.equal(element._shownItems.length, 25); | 
 |       }); | 
 |  | 
 |       test('Edit HEAD button not admin', done => { | 
 |         sandbox.stub(element, '_getLoggedIn').returns(Promise.resolve(true)); | 
 |         sandbox.stub(element.$.restAPI, 'getRepoAccess').returns( | 
 |             Promise.resolve({ | 
 |               test: {is_owner: false}, | 
 |             })); | 
 |         element._determineIfOwner('test').then(() => { | 
 |           assert.equal(element._isOwner, false); | 
 |           assert.equal(getComputedStyle(Polymer.dom(element.root) | 
 |               .querySelector('.revisionNoEditing')).display, 'inline'); | 
 |           assert.equal(getComputedStyle(Polymer.dom(element.root) | 
 |               .querySelector('.revisionEdit')).display, 'none'); | 
 |           done(); | 
 |         }); | 
 |       }); | 
 |  | 
 |       test('Edit HEAD button admin', done => { | 
 |         const saveBtn = Polymer.dom(element.root).querySelector('.saveBtn'); | 
 |         const cancelBtn = Polymer.dom(element.root).querySelector('.cancelBtn'); | 
 |         const editBtn = Polymer.dom(element.root).querySelector('.editBtn'); | 
 |         const revisionNoEditing = Polymer.dom(element.root) | 
 |               .querySelector('.revisionNoEditing'); | 
 |         const revisionWithEditing = Polymer.dom(element.root) | 
 |               .querySelector('.revisionWithEditing'); | 
 |  | 
 |         sandbox.stub(element, '_getLoggedIn').returns(Promise.resolve(true)); | 
 |         sandbox.stub(element.$.restAPI, 'getRepoAccess').returns( | 
 |             Promise.resolve({ | 
 |               test: {is_owner: true}, | 
 |             })); | 
 |         sandbox.stub(element, '_handleSaveRevision'); | 
 |         element._determineIfOwner('test').then(() => { | 
 |           assert.equal(element._isOwner, true); | 
 |           // The revision container for non-editing enabled row is not visible. | 
 |           assert.equal(getComputedStyle(revisionNoEditing).display, 'none'); | 
 |  | 
 |           // The revision container for editing enabled row is visible. | 
 |           assert.notEqual(getComputedStyle(Polymer.dom(element.root) | 
 |               .querySelector('.revisionEdit')).display, 'none'); | 
 |  | 
 |           // The revision and edit button are visible. | 
 |           assert.notEqual(getComputedStyle(revisionWithEditing).display, | 
 |               'none'); | 
 |           assert.notEqual(getComputedStyle(editBtn).display, 'none'); | 
 |  | 
 |           // The input, cancel, and save buttons are not visible. | 
 |           const hiddenElements = Polymer.dom(element.root) | 
 |               .querySelectorAll('.canEdit .editItem'); | 
 |  | 
 |           for (const item of hiddenElements) { | 
 |             assert.equal(getComputedStyle(item).display, 'none'); | 
 |           } | 
 |  | 
 |           MockInteractions.tap(editBtn); | 
 |           flushAsynchronousOperations(); | 
 |           // The revision and edit button are not visible. | 
 |           assert.equal(getComputedStyle(revisionWithEditing).display, 'none'); | 
 |           assert.equal(getComputedStyle(editBtn).display, 'none'); | 
 |  | 
 |           // The input, cancel, and save buttons are not visible. | 
 |           for (item of hiddenElements) { | 
 |             assert.notEqual(getComputedStyle(item).display, 'none'); | 
 |           } | 
 |  | 
 |           // The revised ref was set correctly | 
 |           assert.equal(element._revisedRef, 'master'); | 
 |  | 
 |           assert.isFalse(saveBtn.disabled); | 
 |  | 
 |           // Delete the ref. | 
 |           element._revisedRef = ''; | 
 |           assert.isTrue(saveBtn.disabled); | 
 |  | 
 |           // Change the ref to something else | 
 |           element._revisedRef = 'newRef'; | 
 |           element._repo = 'test'; | 
 |           assert.isFalse(saveBtn.disabled); | 
 |  | 
 |           // Save button calls handleSave. since this is stubbed, the edit | 
 |           // section remains open. | 
 |           MockInteractions.tap(saveBtn); | 
 |           assert.isTrue(element._handleSaveRevision.called); | 
 |  | 
 |           // When cancel is tapped, the edit secion closes. | 
 |           MockInteractions.tap(cancelBtn); | 
 |           flushAsynchronousOperations(); | 
 |  | 
 |           // The revision and edit button are visible. | 
 |           assert.notEqual(getComputedStyle(revisionWithEditing).display, | 
 |               'none'); | 
 |           assert.notEqual(getComputedStyle(editBtn).display, 'none'); | 
 |  | 
 |           // The input, cancel, and save buttons are not visible. | 
 |           for (const item of hiddenElements) { | 
 |             assert.equal(getComputedStyle(item).display, 'none'); | 
 |           } | 
 |           done(); | 
 |         }); | 
 |       }); | 
 |  | 
 |       test('_handleSaveRevision with invalid rev', done => { | 
 |         const event = {model: {set: sandbox.stub()}}; | 
 |         element._isEditing = true; | 
 |         sandbox.stub(element.$.restAPI, 'setRepoHead').returns( | 
 |             Promise.resolve({ | 
 |               status: 400, | 
 |             }) | 
 |         ); | 
 |  | 
 |         element._setRepoHead('test', 'newRef', event).then(() => { | 
 |           assert.isTrue(element._isEditing); | 
 |           assert.isFalse(event.model.set.called); | 
 |           done(); | 
 |         }); | 
 |       }); | 
 |  | 
 |       test('_handleSaveRevision with valid rev', done => { | 
 |         const event = {model: {set: sandbox.stub()}}; | 
 |         element._isEditing = true; | 
 |         sandbox.stub(element.$.restAPI, 'setRepoHead').returns( | 
 |             Promise.resolve({ | 
 |               status: 200, | 
 |             }) | 
 |         ); | 
 |  | 
 |         element._setRepoHead('test', 'newRef', event).then(() => { | 
 |           assert.isFalse(element._isEditing); | 
 |           assert.isTrue(event.model.set.called); | 
 |           done(); | 
 |         }); | 
 |       }); | 
 |  | 
 |       test('test _computeItemName', () => { | 
 |         assert.deepEqual(element._computeItemName('branches'), 'Branch'); | 
 |         assert.deepEqual(element._computeItemName('tags'), 'Tag'); | 
 |       }); | 
 |     }); | 
 |  | 
 |     suite('list with less then 25 branches', () => { | 
 |       setup(done => { | 
 |         branches = _.times(25, branchGenerator); | 
 |  | 
 |         stub('gr-rest-api-interface', { | 
 |           getRepoBranches(num, repo, offset) { | 
 |             return Promise.resolve(branches); | 
 |           }, | 
 |         }); | 
 |  | 
 |         const params = { | 
 |           repo: 'test', | 
 |           detail: 'branches', | 
 |         }; | 
 |  | 
 |         element._paramsChanged(params).then(() => { flush(done); }); | 
 |       }); | 
 |  | 
 |       test('_shownItems', () => { | 
 |         assert.equal(element._shownItems.length, 25); | 
 |       }); | 
 |     }); | 
 |  | 
 |     suite('filter', () => { | 
 |       test('_paramsChanged', done => { | 
 |         sandbox.stub(element.$.restAPI, 'getRepoBranches', () => { | 
 |           return Promise.resolve(branches); | 
 |         }); | 
 |         const params = { | 
 |           detail: 'branches', | 
 |           repo: 'test', | 
 |           filter: 'test', | 
 |           offset: 25, | 
 |         }; | 
 |         element._paramsChanged(params).then(() => { | 
 |           assert.equal(element.$.restAPI.getRepoBranches.lastCall.args[0], | 
 |               'test'); | 
 |           assert.equal(element.$.restAPI.getRepoBranches.lastCall.args[1], | 
 |               'test'); | 
 |           assert.equal(element.$.restAPI.getRepoBranches.lastCall.args[2], | 
 |               25); | 
 |           assert.equal(element.$.restAPI.getRepoBranches.lastCall.args[3], | 
 |               25); | 
 |           done(); | 
 |         }); | 
 |       }); | 
 |     }); | 
 |  | 
 |     suite('404', () => { | 
 |       test('fires page-error', done => { | 
 |         const response = {status: 404}; | 
 |         sandbox.stub(element.$.restAPI, 'getRepoBranches', | 
 |             (filter, repo, reposBranchesPerPage, opt_offset, errFn) => { | 
 |               errFn(response); | 
 |             }); | 
 |  | 
 |         element.addEventListener('page-error', e => { | 
 |           assert.deepEqual(e.detail.response, response); | 
 |           done(); | 
 |         }); | 
 |  | 
 |         const params = { | 
 |           detail: 'branches', | 
 |           repo: 'test', | 
 |           filter: 'test', | 
 |           offset: 25, | 
 |         }; | 
 |         element._paramsChanged(params); | 
 |       }); | 
 |     }); | 
 |   }); | 
 |  | 
 |   suite('Tags', () => { | 
 |     let element; | 
 |     let tags; | 
 |     let sandbox; | 
 |  | 
 |     setup(() => { | 
 |       sandbox = sinon.sandbox.create(); | 
 |       element = fixture('basic'); | 
 |       element.detailType = 'tags'; | 
 |       counter = 0; | 
 |       sandbox.stub(page, 'show'); | 
 |     }); | 
 |  | 
 |     teardown(() => { | 
 |       sandbox.restore(); | 
 |     }); | 
 |  | 
 |     test('_computeMessage', () => { | 
 |       let message = 'v2.15-rc1↵-----BEGIN PGP SIGNATURE-----↵Version: GnuPG v' + | 
 |       '1↵↵iQIcBAABAgAGBQJZ27O7AAoJEF/XxZqaEoiMy6kQAMoQCpGr3J6JITI4BVWsr7QM↵xy' + | 
 |       'EcWH5YPUko5EPTbkABHmaVyFmKGkuIQdn6c+NIbqJOk+5XT4oUyRSo1T569HPJ↵3kyxEJi' + | 
 |       'T1ryvp5BIHwdvHx58fjw1+YkiWLZuZq1FFkUYqnWTYCrkv7Fok98pdOmV↵CL1Hgugi5uK8' + | 
 |       '/kxf1M7+Nv6piaZ140pwSb1h6QdAjaZVfaBCnoxlG4LRUqHvEYay↵f4QYgFT67auHIGkZ4' + | 
 |       'moUcsp2Du/1jSsCWL/CPwjPFGbbckVAjLCMT9yD3NKwpEZF↵pfsiZyHI9dL0M+QjVrM+RD' + | 
 |       'HwIIJwra8R0IMkDlQ6MDrFlKNqNBbo588S6UPrm71L↵YuiwWlcrK9ZIybxT6LzbR65Rvez' + | 
 |       'DSitQ+xeIfpZE19/X6BCnvlARLE8k/tC2JksI↵lEZi7Lf3FQdIcwwyt98tJkS9HX9v9jbC' + | 
 |       '5QXifnoj3Li8tHSLuQ1dJCxHQiis6ojI↵OWUFkm0IHBXVNHA2dqYBdM+pL12mlI3wp6Ica' + | 
 |       '4cdEVDwzu+j1xnVSFUa+d+Y2xJF↵7mytuyhHiKG4hm+zbhMv6WD8Q3FoDsJZeLY99l0hYQ' + | 
 |       'SnnkMduFVroIs45pAs8gUA↵RvYla8mm9w/543IJAPzzFarPVLSsSyQ7tJl3UBzjKRNH/rX' + | 
 |       'W+F22qyWD1zyHPUIR↵C00ItmwlAvveImYKpQAH↵=L+K9↵-----END PGP SIGNATURE---' + | 
 |       '--'; | 
 |       assert.equal(element._computeMessage(message), 'v2.15-rc1↵'); | 
 |       message = 'v2.15-rc1'; | 
 |       assert.equal(element._computeMessage(message), 'v2.15-rc1'); | 
 |     }); | 
 |  | 
 |     suite('list of repo tags', () => { | 
 |       setup(done => { | 
 |         tags = _.times(26, tagGenerator); | 
 |  | 
 |         stub('gr-rest-api-interface', { | 
 |           getRepoTags(num, repo, offset) { | 
 |             return Promise.resolve(tags); | 
 |           }, | 
 |         }); | 
 |  | 
 |         const params = { | 
 |           repo: 'test', | 
 |           detail: 'tags', | 
 |         }; | 
 |  | 
 |         element._paramsChanged(params).then(() => { flush(done); }); | 
 |       }); | 
 |  | 
 |       test('test for tag in the list', done => { | 
 |         flush(() => { | 
 |           assert.equal(element._items[1].ref, 'refs/tags/test2'); | 
 |           done(); | 
 |         }); | 
 |       }); | 
 |  | 
 |       test('test for tag message in the list', done => { | 
 |         flush(() => { | 
 |           assert.equal(element._items[1].message, 'Annotated tag'); | 
 |           done(); | 
 |         }); | 
 |       }); | 
 |  | 
 |       test('test for tagger in the tag list', done => { | 
 |         const tagger = { | 
 |           name: 'Test User', | 
 |           email: 'test.user@gmail.com', | 
 |           date: '2017-09-19 14:54:00.000000000', | 
 |           tz: 540, | 
 |         }; | 
 |         flush(() => { | 
 |           assert.deepEqual(element._items[1].tagger, tagger); | 
 |           done(); | 
 |         }); | 
 |       }); | 
 |  | 
 |       test('test for web links in the tags list', done => { | 
 |         flush(() => { | 
 |           assert.equal(element._items[1].web_links[0].url, | 
 |               'https://git.example.org/tag/test;refs/tags/test2'); | 
 |           done(); | 
 |         }); | 
 |       }); | 
 |  | 
 |       test('test for refs/tags/ being striped from ref', done => { | 
 |         flush(() => { | 
 |           assert.equal(element._stripRefs(element._items[1].ref, | 
 |               element.detailType), 'test2'); | 
 |           done(); | 
 |         }); | 
 |       }); | 
 |  | 
 |       test('_shownItems', () => { | 
 |         assert.equal(element._shownItems.length, 25); | 
 |       }); | 
 |  | 
 |       test('_computeHideTagger', () => { | 
 |         const testObject1 = { | 
 |           tagger: 'test', | 
 |         }; | 
 |         assert.equal(element._computeHideTagger(testObject1), ''); | 
 |  | 
 |         assert.equal(element._computeHideTagger(undefined), 'hide'); | 
 |       }); | 
 |     }); | 
 |  | 
 |     suite('list with less then 25 tags', () => { | 
 |       setup(done => { | 
 |         tags = _.times(25, tagGenerator); | 
 |  | 
 |         stub('gr-rest-api-interface', { | 
 |           getRepoTags(num, project, offset) { | 
 |             return Promise.resolve(tags); | 
 |           }, | 
 |         }); | 
 |  | 
 |         const params = { | 
 |           repo: 'test', | 
 |           detail: 'tags', | 
 |         }; | 
 |  | 
 |         element._paramsChanged(params).then(() => { flush(done); }); | 
 |       }); | 
 |  | 
 |       test('_shownItems', () => { | 
 |         assert.equal(element._shownItems.length, 25); | 
 |       }); | 
 |     }); | 
 |  | 
 |     suite('filter', () => { | 
 |       test('_paramsChanged', done => { | 
 |         sandbox.stub(element.$.restAPI, 'getRepoTags', () => { | 
 |           return Promise.resolve(tags); | 
 |         }); | 
 |         const params = { | 
 |           repo: 'test', | 
 |           detail: 'tags', | 
 |           filter: 'test', | 
 |           offset: 25, | 
 |         }; | 
 |         element._paramsChanged(params).then(() => { | 
 |           assert.equal(element.$.restAPI.getRepoTags.lastCall.args[0], | 
 |               'test'); | 
 |           assert.equal(element.$.restAPI.getRepoTags.lastCall.args[1], | 
 |               'test'); | 
 |           assert.equal(element.$.restAPI.getRepoTags.lastCall.args[2], | 
 |               25); | 
 |           assert.equal(element.$.restAPI.getRepoTags.lastCall.args[3], | 
 |               25); | 
 |           done(); | 
 |         }); | 
 |       }); | 
 |     }); | 
 |  | 
 |     suite('create new', () => { | 
 |       test('_handleCreateClicked called when create-click fired', () => { | 
 |         sandbox.stub(element, '_handleCreateClicked'); | 
 |         element.$$('gr-list-view').fire('create-clicked'); | 
 |         assert.isTrue(element._handleCreateClicked.called); | 
 |       }); | 
 |  | 
 |       test('_handleCreateClicked opens modal', () => { | 
 |         const openStub = sandbox.stub(element.$.createOverlay, 'open'); | 
 |         element._handleCreateClicked(); | 
 |         assert.isTrue(openStub.called); | 
 |       }); | 
 |  | 
 |       test('_handleCreateItem called when confirm fired', () => { | 
 |         sandbox.stub(element, '_handleCreateItem'); | 
 |         element.$.createDialog.fire('confirm'); | 
 |         assert.isTrue(element._handleCreateItem.called); | 
 |       }); | 
 |  | 
 |       test('_handleCloseCreate called when cancel fired', () => { | 
 |         sandbox.stub(element, '_handleCloseCreate'); | 
 |         element.$.createDialog.fire('cancel'); | 
 |         assert.isTrue(element._handleCloseCreate.called); | 
 |       }); | 
 |     }); | 
 |  | 
 |     suite('404', () => { | 
 |       test('fires page-error', done => { | 
 |         const response = {status: 404}; | 
 |         sandbox.stub(element.$.restAPI, 'getRepoTags', | 
 |             (filter, repo, reposTagsPerPage, opt_offset, errFn) => { | 
 |               errFn(response); | 
 |             }); | 
 |  | 
 |         element.addEventListener('page-error', e => { | 
 |           assert.deepEqual(e.detail.response, response); | 
 |           done(); | 
 |         }); | 
 |  | 
 |         const params = { | 
 |           repo: 'test', | 
 |           detail: 'tags', | 
 |           filter: 'test', | 
 |           offset: 25, | 
 |         }; | 
 |         element._paramsChanged(params); | 
 |       }); | 
 |     }); | 
 |  | 
 |     test('test _computeHideDeleteClass', () => { | 
 |       assert.deepEqual(element._computeHideDeleteClass(true, false), 'show'); | 
 |       assert.deepEqual(element._computeHideDeleteClass(false, true), 'show'); | 
 |       assert.deepEqual(element._computeHideDeleteClass(false, false), ''); | 
 |     }); | 
 |   }); | 
 | </script> |