Files
gerrit/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list_test.html
Paladox none cbb792c2ce Fix support for deleting branches (if you have can_delete)
* This fixes _determineIfOwner so that the check inside it "access && !!access[repo].is_owner"
  forces a boolean value.

* This fixes a issue where you change the head to point to a different branch,
  but it did not correctly update the delete branch button, without needing
  to refresh the page.

Bug: Issue 10151
Bug: Issue 10019
Change-Id: I8a500a02865d88986b710e552b0c6d81576e301f
2019-01-18 15:18:45 +00:00

560 lines
18 KiB
HTML

<!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>