| /** |
| * @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. |
| */ |
| |
| import '../../../test/common-test-setup-karma.js'; |
| import './gr-repo.js'; |
| import {PolymerElement} from '@polymer/polymer/polymer-element.js'; |
| |
| const basicFixture = fixtureFromElement('gr-repo'); |
| |
| suite('gr-repo tests', () => { |
| let element; |
| |
| 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 = Array.from( |
| element.root.querySelectorAll('select')); |
| const textareas = Array.from( |
| element.root.querySelectorAll('iron-autogrow-textarea')); |
| const inputs = Array.from( |
| element.root.querySelectorAll('input')); |
| return inputs.concat(textareas).concat(selects); |
| } |
| |
| setup(() => { |
| stub('gr-rest-api-interface', { |
| getLoggedIn() { return Promise.resolve(false); }, |
| getConfig() { |
| return Promise.resolve({download: {}}); |
| }, |
| }); |
| element = basicFixture.instantiate(); |
| repoStub = sinon.stub( |
| element.$.restAPI, |
| 'getProjectConfig') |
| .callsFake(() => Promise.resolve(repoConf)); |
| }); |
| |
| test('_computePluginData', () => { |
| assert.deepEqual(element._computePluginData(), []); |
| assert.deepEqual(element._computePluginData({}), []); |
| assert.deepEqual(element._computePluginData({base: {}}), []); |
| assert.deepEqual(element._computePluginData({base: {plugin: 'data'}}), |
| [{name: 'plugin', config: 'data'}]); |
| }); |
| |
| test('_handlePluginConfigChanged', () => { |
| const notifyStub = sinon.stub(element, 'notifyPath'); |
| element._repoConfig = {plugin_config: {}}; |
| element._handlePluginConfigChanged({detail: { |
| name: 'test', |
| config: 'data', |
| notifyPath: 'path', |
| }}); |
| flushAsynchronousOperations(); |
| |
| assert.equal(element._repoConfig.plugin_config.test, 'data'); |
| assert.equal(notifyStub.lastCall.args[0], |
| '_repoConfig.plugin_config.path'); |
| }); |
| |
| 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('hide')); |
| assert.isTrue(getComputedStyle(element.$.downloadContent) |
| .display == 'none'); |
| element._schemesObj = SCHEMES; |
| flushAsynchronousOperations(); |
| assert.isFalse(element.$.downloadContent.classList.contains('hide')); |
| 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; |
| sinon.stub(element, '_getLoggedIn').callsFake(() => Promise.resolve(true)); |
| sinon.stub( |
| element.$.restAPI, |
| 'getRepoAccess') |
| .callsFake(() => 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}; |
| sinon.stub( |
| element.$.restAPI, 'getProjectConfig').callsFake((repo, errFn) => { |
| errFn(response); |
| }); |
| element.addEventListener('page-error', e => { |
| assert.deepEqual(e.detail.response, response); |
| done(); |
| }); |
| |
| element._loadRepo(); |
| }); |
| |
| suite('admin', () => { |
| setup(() => { |
| element.repo = REPO; |
| sinon.stub(element, '_getLoggedIn') |
| .callsFake(() => Promise.resolve(true)); |
| sinon.stub( |
| element.$.restAPI, |
| 'getRepoAccess') |
| .callsFake(() => 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', done => { |
| element |
| ._loadRepo().then(() => { |
| const sel = element.$.submitTypeSelect; |
| assert.equal(sel.bindValue, 'INHERIT'); |
| assert.equal( |
| sel.nativeSelect.options[0].text, |
| 'Inherit (Merge if necessary)' |
| ); |
| done(); |
| }); |
| }); |
| |
| test('fields update and save correctly', () => { |
| 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 = sinon.stub(element.$.restAPI, 'saveRepoConfig') |
| .callsFake(() => Promise.resolve({})); |
| |
| const button = 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; |
| const inputElement = PolymerElement ? |
| element.$.maxGitObjSizeIronInput : element.$.maxGitObjSizeInput; |
| inputElement.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)); |
| }); |
| }); |
| }); |
| }); |
| }); |
| |