Refactor directory structure of components There is no change in functionality. Only moving things around. + Separate html from the js. + Place the unit test for a component within the same folder. + Organize the components in subfolders. Change-Id: I51fdc510db75fc1b33f040ca63decbbdfd4d5513
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.html b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.html new file mode 100644 index 0000000..bfe4906 --- /dev/null +++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.html
@@ -0,0 +1,395 @@ +<!DOCTYPE html> +<!-- +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-view</title> + +<script src="../../../bower_components/webcomponentsjs/webcomponents.min.js"></script> +<script src="../../../bower_components/web-component-tester/browser.js"></script> +<script src="../../../bower_components/page/page.js"></script> +<script src="../../../scripts/fake-app.js"></script> +<script src="../../../scripts/util.js"></script> + +<link rel="import" href="../../../bower_components/iron-test-helpers/iron-test-helpers.html"> +<link rel="import" href="gr-diff-view.html"> + +<test-fixture id="basic"> + <template> + <gr-diff-view></gr-diff-view> + </template> +</test-fixture> + +<script> + suite('gr-diff-view tests', function() { + var element; + var server; + + setup(function() { + element = fixture('basic'); + element.$.changeDetailXHR.auto = false; + element.$.filesXHR.auto = false; + element.$.configXHR.auto = false; + element.$.diff.auto = false; + + server = sinon.fakeServer.create(); + server.respondWith( + 'PUT', + '/changes/42/revisions/2/files/%2FCOMMIT_MSG/reviewed', + [ + 201, + {'Content-Type': 'application/json'}, + ')]}\'\n' + + '""', + ] + ); + server.respondWith( + 'DELETE', + '/changes/42/revisions/2/files/%2FCOMMIT_MSG/reviewed', + [ + 204, + {'Content-Type': 'application/json'}, + '', + ] + ); + }); + + teardown(function() { + server.restore(); + }); + + test('keyboard shortcuts', function() { + element._changeNum = '42'; + element._patchRange = { + patchNum: '10', + }; + element._change = { + revisions: { + a: { _number: 10, }, + }, + }; + element._fileList = ['chell.go', 'glados.txt', 'wheatley.md']; + element._path = 'glados.txt'; + element.changeViewState.selectedFileIndex = 1; + + var showStub = sinon.stub(page, 'show'); + MockInteractions.pressAndReleaseKeyOn(element, 85); // 'u' + assert(showStub.lastCall.calledWithExactly('/c/42/'), + 'Should navigate to /c/42/'); + + MockInteractions.pressAndReleaseKeyOn(element, 221); // ']' + assert(showStub.lastCall.calledWithExactly('/c/42/10/wheatley.md'), + 'Should navigate to /c/42/10/wheatley.md'); + element._path = 'wheatley.md'; + assert.equal(element.changeViewState.selectedFileIndex, 2); + + MockInteractions.pressAndReleaseKeyOn(element, 219); // '[' + assert(showStub.lastCall.calledWithExactly('/c/42/10/glados.txt'), + 'Should navigate to /c/42/10/glados.txt'); + element._path = 'glados.txt'; + assert.equal(element.changeViewState.selectedFileIndex, 1); + + MockInteractions.pressAndReleaseKeyOn(element, 219); // '[' + assert(showStub.lastCall.calledWithExactly('/c/42/10/chell.go'), + 'Should navigate to /c/42/10/chell.go'); + element._path = 'chell.go'; + assert.equal(element.changeViewState.selectedFileIndex, 0); + + MockInteractions.pressAndReleaseKeyOn(element, 219); // '[' + assert(showStub.lastCall.calledWithExactly('/c/42/'), + 'Should navigate to /c/42/'); + assert.equal(element.changeViewState.selectedFileIndex, 0); + + var showPrefsStub = sinon.stub(element.$.diff, 'showDiffPreferences'); + MockInteractions.pressAndReleaseKeyOn(element, 188); // ',' + assert(showPrefsStub.calledOnce); + + var scrollStub = sinon.stub(element.$.diff, 'scrollToNextDiffChunk'); + MockInteractions.pressAndReleaseKeyOn(element, 78); // 'n' + assert(scrollStub.calledOnce); + scrollStub.restore(); + + scrollStub = sinon.stub(element.$.diff, 'scrollToPreviousDiffChunk'); + MockInteractions.pressAndReleaseKeyOn(element, 80); // 'p' + assert(scrollStub.calledOnce); + scrollStub.restore(); + + scrollStub = sinon.stub(element.$.diff, 'scrollToNextCommentThread'); + MockInteractions.pressAndReleaseKeyOn(element, 78, ['shift']); // 'N' + assert(scrollStub.calledOnce); + scrollStub.restore(); + + scrollStub = sinon.stub(element.$.diff, 'scrollToPreviousCommentThread'); + MockInteractions.pressAndReleaseKeyOn(element, 80, ['shift']); // 'P' + assert(scrollStub.calledOnce); + scrollStub.restore(); + + showPrefsStub.restore(); + showStub.restore(); + }); + + test('keyboard shortcuts with patch range', function() { + element._changeNum = '42'; + element._patchRange = { + basePatchNum: '5', + patchNum: '10', + }; + element._change = { + revisions: { + a: { _number: 10, }, + }, + }; + element._fileList = ['chell.go', 'glados.txt', 'wheatley.md']; + element._path = 'glados.txt'; + + var showStub = sinon.stub(page, 'show'); + + MockInteractions.pressAndReleaseKeyOn(element, 65); // 'a' + assert.isTrue(showStub.notCalled, 'The `a` keyboard shortcut should ' + + 'only work when the user is logged in.'); + assert.isNull(window.sessionStorage.getItem( + 'changeView.showReplyDialog')); + + element._loggedIn = true; + MockInteractions.pressAndReleaseKeyOn(element, 65); // 'a' + assert.isTrue(element.changeViewState.showReplyDialog); + + assert(showStub.lastCall.calledWithExactly('/c/42/'), + 'Should navigate to /c/42/'); + + MockInteractions.pressAndReleaseKeyOn(element, 85); // 'u' + assert(showStub.lastCall.calledWithExactly('/c/42/'), + 'Should navigate to /c/42/'); + + MockInteractions.pressAndReleaseKeyOn(element, 221); // ']' + assert(showStub.lastCall.calledWithExactly('/c/42/5..10/wheatley.md'), + 'Should navigate to /c/42/5..10/wheatley.md'); + element._path = 'wheatley.md'; + + MockInteractions.pressAndReleaseKeyOn(element, 219); // '[' + assert(showStub.lastCall.calledWithExactly('/c/42/5..10/glados.txt'), + 'Should navigate to /c/42/5..10/glados.txt'); + element._path = 'glados.txt'; + + MockInteractions.pressAndReleaseKeyOn(element, 219); // '[' + assert(showStub.lastCall.calledWithExactly('/c/42/5..10/chell.go'), + 'Should navigate to /c/42/5..10/chell.go'); + element._path = 'chell.go'; + + MockInteractions.pressAndReleaseKeyOn(element, 219); // '[' + assert(showStub.lastCall.calledWithExactly('/c/42/'), + 'Should navigate to /c/42/'); + + showStub.restore(); + }); + + test('keyboard shortcuts with old patch number', function() { + element._changeNum = '42'; + element._patchRange = { + patchNum: '1', + }; + element._change = { + revisions: { + a: { _number: 1, }, + b: { _number: 2, }, + }, + }; + element._fileList = ['chell.go', 'glados.txt', 'wheatley.md']; + element._path = 'glados.txt'; + + var showStub = sinon.stub(page, 'show'); + + MockInteractions.pressAndReleaseKeyOn(element, 65); // 'a' + assert.isTrue(showStub.notCalled, 'The `a` keyboard shortcut should ' + + 'only work when the user is logged in.'); + assert.isNull(window.sessionStorage.getItem( + 'changeView.showReplyDialog')); + + element._loggedIn = true; + MockInteractions.pressAndReleaseKeyOn(element, 65); // 'a' + assert.isTrue(element.changeViewState.showReplyDialog); + + assert(showStub.lastCall.calledWithExactly('/c/42/1'), + 'Should navigate to /c/42/1'); + + MockInteractions.pressAndReleaseKeyOn(element, 85); // 'u' + assert(showStub.lastCall.calledWithExactly('/c/42/1'), + 'Should navigate to /c/42/1'); + + MockInteractions.pressAndReleaseKeyOn(element, 221); // ']' + assert(showStub.lastCall.calledWithExactly('/c/42/1/wheatley.md'), + 'Should navigate to /c/42/1/wheatley.md'); + element._path = 'wheatley.md'; + + MockInteractions.pressAndReleaseKeyOn(element, 219); // '[' + assert(showStub.lastCall.calledWithExactly('/c/42/1/glados.txt'), + 'Should navigate to /c/42/1/glados.txt'); + element._path = 'glados.txt'; + + MockInteractions.pressAndReleaseKeyOn(element, 219); // '[' + assert(showStub.lastCall.calledWithExactly('/c/42/1/chell.go'), + 'Should navigate to /c/42/1/chell.go'); + element._path = 'chell.go'; + + MockInteractions.pressAndReleaseKeyOn(element, 219); // '[' + assert(showStub.lastCall.calledWithExactly('/c/42/1'), + 'Should navigate to /c/42/1'); + + showStub.restore(); + }); + + test('go up to change via kb without change loaded', function() { + element._changeNum = '42'; + element._patchRange = { + patchNum: '1', + }; + + element._fileList = ['chell.go', 'glados.txt', 'wheatley.md']; + element._path = 'glados.txt'; + + var showStub = sinon.stub(page, 'show'); + + MockInteractions.pressAndReleaseKeyOn(element, 65); // 'a' + assert.isTrue(showStub.notCalled, 'The `a` keyboard shortcut should ' + + 'only work when the user is logged in.'); + assert.isNull(window.sessionStorage.getItem( + 'changeView.showReplyDialog')); + + element._loggedIn = true; + MockInteractions.pressAndReleaseKeyOn(element, 65); // 'a' + assert.isTrue(element.changeViewState.showReplyDialog); + + assert(showStub.lastCall.calledWithExactly('/c/42/1'), + 'Should navigate to /c/42/1'); + + MockInteractions.pressAndReleaseKeyOn(element, 85); // 'u' + assert(showStub.lastCall.calledWithExactly('/c/42/1'), + 'Should navigate to /c/42/1'); + + MockInteractions.pressAndReleaseKeyOn(element, 221); // ']' + assert(showStub.lastCall.calledWithExactly('/c/42/1/wheatley.md'), + 'Should navigate to /c/42/1/wheatley.md'); + element._path = 'wheatley.md'; + + MockInteractions.pressAndReleaseKeyOn(element, 219); // '[' + assert(showStub.lastCall.calledWithExactly('/c/42/1/glados.txt'), + 'Should navigate to /c/42/1/glados.txt'); + element._path = 'glados.txt'; + + MockInteractions.pressAndReleaseKeyOn(element, 219); // '[' + assert(showStub.lastCall.calledWithExactly('/c/42/1/chell.go'), + 'Should navigate to /c/42/1/chell.go'); + element._path = 'chell.go'; + + MockInteractions.pressAndReleaseKeyOn(element, 219); // '[' + assert(showStub.lastCall.calledWithExactly('/c/42/1'), + 'Should navigate to /c/42/1'); + + showStub.restore(); + }); + + test('jump to file dropdown', function() { + element._changeNum = '42'; + element._patchRange = { + patchNum: '10', + }; + element._fileList = ['chell.go', 'glados.txt', 'wheatley.md']; + element._path = 'glados.txt'; + flushAsynchronousOperations(); + var linkEls = + Polymer.dom(element.root).querySelectorAll('.dropdown-content > a'); + assert.equal(linkEls.length, 3); + assert.isFalse(linkEls[0].hasAttribute('selected')); + assert.isTrue(linkEls[1].hasAttribute('selected')); + assert.isFalse(linkEls[2].hasAttribute('selected')); + assert.equal(linkEls[0].getAttribute('data-key-nav'), '['); + assert.equal(linkEls[1].getAttribute('data-key-nav'), ''); + assert.equal(linkEls[2].getAttribute('data-key-nav'), ']'); + assert.equal(linkEls[0].getAttribute('href'), '/c/42/10/chell.go'); + assert.equal(linkEls[1].getAttribute('href'), '/c/42/10/glados.txt'); + assert.equal(linkEls[2].getAttribute('href'), '/c/42/10/wheatley.md'); + + assert.equal(element._computeFileDisplayName('/foo/bar/baz'), + '/foo/bar/baz'); + assert.equal(element._computeFileDisplayName('/COMMIT_MSG'), + 'Commit message'); + }); + + test('jump to file dropdown with patch range', function() { + element._changeNum = '42'; + element._patchRange = { + basePatchNum: '5', + patchNum: '10', + }; + element._fileList = ['chell.go', 'glados.txt', 'wheatley.md']; + element._path = 'glados.txt'; + flushAsynchronousOperations(); + var linkEls = + Polymer.dom(element.root).querySelectorAll('.dropdown-content > a'); + assert.equal(linkEls.length, 3); + assert.isFalse(linkEls[0].hasAttribute('selected')); + assert.isTrue(linkEls[1].hasAttribute('selected')); + assert.isFalse(linkEls[2].hasAttribute('selected')); + assert.equal(linkEls[0].getAttribute('data-key-nav'), '['); + assert.equal(linkEls[1].getAttribute('data-key-nav'), ''); + assert.equal(linkEls[2].getAttribute('data-key-nav'), ']'); + assert.equal(linkEls[0].getAttribute('href'), '/c/42/5..10/chell.go'); + assert.equal(linkEls[1].getAttribute('href'), '/c/42/5..10/glados.txt'); + assert.equal(linkEls[2].getAttribute('href'), '/c/42/5..10/wheatley.md'); + }); + + test('file review status', function(done) { + element._loggedIn = true; + element._changeNum = '42'; + element._patchRange = { + basePatchNum: '1', + patchNum: '2', + }; + element._fileList = ['/COMMIT_MSG']; + element._path = '/COMMIT_MSG'; + + server.respond(); + + element.async(function() { + var commitMsg = Polymer.dom(element.root).querySelector( + 'input[type="checkbox"]'); + + assert.isTrue(commitMsg.checked); + + MockInteractions.tap(commitMsg); + server.respond(); + element._xhrPromise.then(function(req) { + assert.isFalse(commitMsg.checked); + assert.equal(req.status, 204); + assert.equal(req.url, + '/changes/42/revisions/2/files/%2FCOMMIT_MSG/reviewed'); + + MockInteractions.tap(commitMsg); + server.respond(); + }).then(function() { + element._xhrPromise.then(function(req) { + assert.isTrue(commitMsg.checked); + assert.equal(req.status, 201); + assert.equal(req.url, + '/changes/42/revisions/2/files/%2FCOMMIT_MSG/reviewed'); + + done(); + }); + }); + }, 1); + }); + }); +</script>