8cdc76ba4c
These tags are preserved by the Closure compiler and vulcanize in order to serve the license notices embedded in the outputs. In a standalone Gerrit server, these license are also covered in the LICENSES.txt served with the documentation. When serving PG assets from a CDN, it's less obvious what the corresponding LICENSES.txt file is, since the CDN is not directly linked to a running Gerrit server. Safer to embed the licenses in the assets themselves. Change-Id: Id1add1451fad1baa7916882a6bda02c326ccc988
384 lines
12 KiB
HTML
384 lines
12 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</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-repo.html">
|
|
|
|
<script>void(0);</script>
|
|
|
|
<test-fixture id="basic">
|
|
<template>
|
|
<gr-repo></gr-repo>
|
|
</template>
|
|
</test-fixture>
|
|
|
|
<script>
|
|
suite('gr-repo tests', () => {
|
|
let element;
|
|
let sandbox;
|
|
let repoStub;
|
|
const repoConf = {
|
|
description: 'Access inherited by all other projects.',
|
|
use_contributor_agreements: {
|
|
value: false,
|
|
configured_value: 'FALSE',
|
|
},
|
|
use_content_merge: {
|
|
value: false,
|
|
configured_value: 'FALSE',
|
|
},
|
|
use_signed_off_by: {
|
|
value: false,
|
|
configured_value: 'FALSE',
|
|
},
|
|
create_new_change_for_all_not_in_target: {
|
|
value: false,
|
|
configured_value: 'FALSE',
|
|
},
|
|
require_change_id: {
|
|
value: false,
|
|
configured_value: 'FALSE',
|
|
},
|
|
enable_signed_push: {
|
|
value: false,
|
|
configured_value: 'FALSE',
|
|
},
|
|
require_signed_push: {
|
|
value: false,
|
|
configured_value: 'FALSE',
|
|
},
|
|
reject_implicit_merges: {
|
|
value: false,
|
|
configured_value: 'FALSE',
|
|
},
|
|
private_by_default: {
|
|
value: false,
|
|
configured_value: 'FALSE',
|
|
},
|
|
match_author_to_committer_date: {
|
|
value: false,
|
|
configured_value: 'FALSE',
|
|
},
|
|
reject_empty_commit: {
|
|
value: false,
|
|
configured_value: 'FALSE',
|
|
},
|
|
enable_reviewer_by_email: {
|
|
value: false,
|
|
configured_value: 'FALSE',
|
|
},
|
|
max_object_size_limit: {},
|
|
submit_type: 'MERGE_IF_NECESSARY',
|
|
default_submit_type: {
|
|
value: 'MERGE_IF_NECESSARY',
|
|
configured_value: 'INHERIT',
|
|
inherited_value: 'MERGE_IF_NECESSARY',
|
|
},
|
|
};
|
|
|
|
const REPO = 'test-repo';
|
|
const SCHEMES = {http: {}, repo: {}, ssh: {}};
|
|
|
|
function getFormFields() {
|
|
const selects = Polymer.dom(element.root).querySelectorAll('select');
|
|
const textareas =
|
|
Polymer.dom(element.root).querySelectorAll('iron-autogrow-textarea');
|
|
const inputs = Polymer.dom(element.root).querySelectorAll('input');
|
|
return inputs.concat(textareas).concat(selects);
|
|
}
|
|
|
|
setup(() => {
|
|
sandbox = sinon.sandbox.create();
|
|
stub('gr-rest-api-interface', {
|
|
getLoggedIn() { return Promise.resolve(false); },
|
|
getConfig() {
|
|
return Promise.resolve({download: {}});
|
|
},
|
|
});
|
|
element = fixture('basic');
|
|
repoStub = sandbox.stub(element.$.restAPI, 'getProjectConfig', () => {
|
|
return Promise.resolve(repoConf);
|
|
});
|
|
});
|
|
|
|
teardown(() => {
|
|
sandbox.restore();
|
|
});
|
|
|
|
test('loading displays before repo config is loaded', () => {
|
|
assert.isTrue(element.$.loading.classList.contains('loading'));
|
|
assert.isFalse(getComputedStyle(element.$.loading).display === 'none');
|
|
assert.isTrue(element.$.loadedContent.classList.contains('loading'));
|
|
assert.isTrue(getComputedStyle(element.$.loadedContent)
|
|
.display === 'none');
|
|
});
|
|
|
|
test('download commands visibility', () => {
|
|
element._loading = false;
|
|
flushAsynchronousOperations();
|
|
assert.isTrue(element.$.downloadContent.classList
|
|
.contains('hideDownload'));
|
|
assert.isTrue(getComputedStyle(element.$.downloadContent)
|
|
.display == 'none');
|
|
element._schemesObj = SCHEMES;
|
|
flushAsynchronousOperations();
|
|
assert.isFalse(element.$.downloadContent.classList
|
|
.contains('hideDownload'));
|
|
assert.isFalse(getComputedStyle(element.$.downloadContent)
|
|
.display == 'none');
|
|
});
|
|
|
|
test('form defaults to read only', () => {
|
|
assert.isTrue(element._readOnly);
|
|
});
|
|
|
|
test('form defaults to read only when not logged in', done => {
|
|
element.repo = REPO;
|
|
element._loadRepo().then(() => {
|
|
assert.isTrue(element._readOnly);
|
|
done();
|
|
});
|
|
});
|
|
|
|
test('form defaults to read only when logged in and not admin', done => {
|
|
element.repo = REPO;
|
|
sandbox.stub(element, '_getLoggedIn', () => {
|
|
return Promise.resolve(true);
|
|
});
|
|
sandbox.stub(element.$.restAPI, 'getRepoAccess', () => {
|
|
return Promise.resolve({'test-repo': {}});
|
|
});
|
|
element._loadRepo().then(() => {
|
|
assert.isTrue(element._readOnly);
|
|
done();
|
|
});
|
|
});
|
|
|
|
test('all form elements are disabled when not admin', done => {
|
|
element.repo = REPO;
|
|
element._loadRepo().then(() => {
|
|
flushAsynchronousOperations();
|
|
const formFields = getFormFields();
|
|
for (const field of formFields) {
|
|
assert.isTrue(field.hasAttribute('disabled'));
|
|
}
|
|
done();
|
|
});
|
|
});
|
|
|
|
test('_formatBooleanSelect', () => {
|
|
let item = {inherited_value: true};
|
|
assert.deepEqual(element._formatBooleanSelect(item), [
|
|
{
|
|
label: 'Inherit (true)',
|
|
value: 'INHERIT',
|
|
},
|
|
{
|
|
label: 'True',
|
|
value: 'TRUE',
|
|
}, {
|
|
label: 'False',
|
|
value: 'FALSE',
|
|
},
|
|
]);
|
|
|
|
item = {inherited_value: false};
|
|
assert.deepEqual(element._formatBooleanSelect(item), [
|
|
{
|
|
label: 'Inherit (false)',
|
|
value: 'INHERIT',
|
|
},
|
|
{
|
|
label: 'True',
|
|
value: 'TRUE',
|
|
}, {
|
|
label: 'False',
|
|
value: 'FALSE',
|
|
},
|
|
]);
|
|
|
|
// For items without inherited values
|
|
item = {};
|
|
assert.deepEqual(element._formatBooleanSelect(item), [
|
|
{
|
|
label: 'Inherit',
|
|
value: 'INHERIT',
|
|
},
|
|
{
|
|
label: 'True',
|
|
value: 'TRUE',
|
|
}, {
|
|
label: 'False',
|
|
value: 'FALSE',
|
|
},
|
|
]);
|
|
});
|
|
|
|
test('fires page-error', done => {
|
|
repoStub.restore();
|
|
|
|
element.repo = 'test';
|
|
|
|
const response = {status: 404};
|
|
sandbox.stub(
|
|
element.$.restAPI, 'getProjectConfig', (repo, errFn) => {
|
|
errFn(response);
|
|
});
|
|
element.addEventListener('page-error', e => {
|
|
assert.deepEqual(e.detail.response, response);
|
|
done();
|
|
});
|
|
|
|
element._loadRepo();
|
|
});
|
|
|
|
suite('admin', () => {
|
|
setup(() => {
|
|
element.repo = REPO;
|
|
sandbox.stub(element, '_getLoggedIn', () => {
|
|
return Promise.resolve(true);
|
|
});
|
|
sandbox.stub(element.$.restAPI, 'getRepoAccess', () => {
|
|
return Promise.resolve({'test-repo': {is_owner: true}});
|
|
});
|
|
});
|
|
|
|
test('all form elements are enabled', done => {
|
|
element._loadRepo().then(() => {
|
|
flushAsynchronousOperations();
|
|
const formFields = getFormFields();
|
|
for (const field of formFields) {
|
|
assert.isFalse(field.hasAttribute('disabled'));
|
|
}
|
|
assert.isFalse(element._loading);
|
|
done();
|
|
});
|
|
});
|
|
|
|
test('state gets set correctly', done => {
|
|
element._loadRepo().then(() => {
|
|
assert.equal(element._repoConfig.state, 'ACTIVE');
|
|
assert.equal(element.$.stateSelect.bindValue, 'ACTIVE');
|
|
done();
|
|
});
|
|
});
|
|
|
|
test('inherited submit type value is calculated correctly', () => {
|
|
return element._loadRepo().then(() => {
|
|
const sel = element.$.submitTypeSelect;
|
|
assert.equal(sel.bindValue, 'INHERIT');
|
|
assert.equal(
|
|
sel.nativeSelect.options[0].text, 'Inherit (Merge if necessary)');
|
|
});
|
|
});
|
|
|
|
test('fields update and save correctly', () => {
|
|
// test notedb
|
|
element._noteDbEnabled = false;
|
|
|
|
assert.equal(
|
|
element._computeRepositoriesClass(element._noteDbEnabled), '');
|
|
|
|
element._noteDbEnabled = true;
|
|
|
|
assert.equal(element._computeRepositoriesClass(
|
|
element._noteDbEnabled), 'showConfig');
|
|
|
|
const configInputObj = {
|
|
description: 'new description',
|
|
use_contributor_agreements: 'TRUE',
|
|
use_content_merge: 'TRUE',
|
|
use_signed_off_by: 'TRUE',
|
|
create_new_change_for_all_not_in_target: 'TRUE',
|
|
require_change_id: 'TRUE',
|
|
enable_signed_push: 'TRUE',
|
|
require_signed_push: 'TRUE',
|
|
reject_implicit_merges: 'TRUE',
|
|
private_by_default: 'TRUE',
|
|
match_author_to_committer_date: 'TRUE',
|
|
reject_empty_commit: 'TRUE',
|
|
max_object_size_limit: 10,
|
|
submit_type: 'FAST_FORWARD_ONLY',
|
|
state: 'READ_ONLY',
|
|
enable_reviewer_by_email: 'TRUE',
|
|
};
|
|
|
|
const saveStub = sandbox.stub(element.$.restAPI, 'saveRepoConfig'
|
|
, () => {
|
|
return Promise.resolve({});
|
|
});
|
|
|
|
const button = Polymer.dom(element.root).querySelector('gr-button');
|
|
|
|
return element._loadRepo().then(() => {
|
|
assert.isTrue(button.hasAttribute('disabled'));
|
|
assert.isFalse(element.$.Title.classList.contains('edited'));
|
|
element.$.descriptionInput.bindValue = configInputObj.description;
|
|
element.$.stateSelect.bindValue = configInputObj.state;
|
|
element.$.submitTypeSelect.bindValue = configInputObj.submit_type;
|
|
element.$.contentMergeSelect.bindValue =
|
|
configInputObj.use_content_merge;
|
|
element.$.newChangeSelect.bindValue =
|
|
configInputObj.create_new_change_for_all_not_in_target;
|
|
element.$.requireChangeIdSelect.bindValue =
|
|
configInputObj.require_change_id;
|
|
element.$.enableSignedPush.bindValue =
|
|
configInputObj.enable_signed_push;
|
|
element.$.requireSignedPush.bindValue =
|
|
configInputObj.require_signed_push;
|
|
element.$.rejectImplicitMergesSelect.bindValue =
|
|
configInputObj.reject_implicit_merges;
|
|
element.$.setAllnewChangesPrivateByDefaultSelect.bindValue =
|
|
configInputObj.private_by_default;
|
|
element.$.matchAuthoredDateWithCommitterDateSelect.bindValue =
|
|
configInputObj.match_author_to_committer_date;
|
|
element.$.maxGitObjSizeInput.bindValue =
|
|
configInputObj.max_object_size_limit;
|
|
element.$.contributorAgreementSelect.bindValue =
|
|
configInputObj.use_contributor_agreements;
|
|
element.$.useSignedOffBySelect.bindValue =
|
|
configInputObj.use_signed_off_by;
|
|
element.$.rejectEmptyCommitSelect.bindValue =
|
|
configInputObj.reject_empty_commit;
|
|
element.$.unRegisteredCcSelect.bindValue =
|
|
configInputObj.enable_reviewer_by_email;
|
|
|
|
assert.isFalse(button.hasAttribute('disabled'));
|
|
assert.isTrue(element.$.configurations.classList.contains('edited'));
|
|
|
|
const formattedObj =
|
|
element._formatRepoConfigForSave(element._repoConfig);
|
|
assert.deepEqual(formattedObj, configInputObj);
|
|
|
|
return element._handleSaveRepoConfig().then(() => {
|
|
assert.isTrue(button.hasAttribute('disabled'));
|
|
assert.isFalse(element.$.Title.classList.contains('edited'));
|
|
assert.isTrue(saveStub.lastCall.calledWithExactly(REPO,
|
|
configInputObj));
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
</script>
|