In the event there are plugin generated links, ones with out beginning '/' are presumed to be external and open in a new tab. Others are treated as internal links. Change-Id: Ie8ee347b839f39d25af78dc30174f2a95c8cfd19
		
			
				
	
	
		
			312 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			312 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!DOCTYPE html>
 | 
						|
<!--
 | 
						|
@license
 | 
						|
Copyright (C) 2018 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>keyboard-shortcut-behavior</title>
 | 
						|
 | 
						|
<script src="../../bower_components/webcomponentsjs/webcomponents.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-admin-nav-behavior.html">
 | 
						|
 | 
						|
<test-fixture id="basic">
 | 
						|
  <template>
 | 
						|
    <test-element></test-element>
 | 
						|
  </template>
 | 
						|
</test-fixture>
 | 
						|
 | 
						|
<script>
 | 
						|
  suite('gr-admin-nav-behavior tests', () => {
 | 
						|
    let element;
 | 
						|
    let sandbox;
 | 
						|
    let capabilityStub;
 | 
						|
    let menuLinkStub;
 | 
						|
 | 
						|
    suiteSetup(() => {
 | 
						|
      // Define a Polymer element that uses this behavior.
 | 
						|
      Polymer({
 | 
						|
        is: 'test-element',
 | 
						|
        behaviors: [
 | 
						|
          Gerrit.AdminNavBehavior,
 | 
						|
        ],
 | 
						|
      });
 | 
						|
    });
 | 
						|
 | 
						|
    setup(() => {
 | 
						|
      element = fixture('basic');
 | 
						|
      sandbox = sinon.sandbox.create();
 | 
						|
      capabilityStub = sinon.stub();
 | 
						|
      menuLinkStub = sinon.stub().returns([]);
 | 
						|
    });
 | 
						|
 | 
						|
    teardown(() => {
 | 
						|
      sandbox.restore();
 | 
						|
    });
 | 
						|
 | 
						|
    const testAdminLinks = (account, options, expected, done) => {
 | 
						|
      element.getAdminLinks(account,
 | 
						|
          capabilityStub,
 | 
						|
          menuLinkStub,
 | 
						|
          options)
 | 
						|
          .then(res => {
 | 
						|
            assert.equal(expected.totalLength, res.links.length);
 | 
						|
            assert.equal(res.links[0].name, 'Repositories');
 | 
						|
            // Repos
 | 
						|
            if (expected.groupListShown) {
 | 
						|
              assert.equal(res.links[1].name, 'Groups');
 | 
						|
            }
 | 
						|
 | 
						|
            if (expected.pluginListShown) {
 | 
						|
              assert.equal(res.links[2].name, 'Plugins');
 | 
						|
              assert.isNotOk(res.links[2].subsection);
 | 
						|
            }
 | 
						|
 | 
						|
            if (expected.projectPageShown) {
 | 
						|
              assert.isOk(res.links[0].subsection);
 | 
						|
              assert.equal(res.links[0].subsection.children.length, 5);
 | 
						|
            } else {
 | 
						|
              assert.isNotOk(res.links[0].subsection);
 | 
						|
            }
 | 
						|
            // Groups
 | 
						|
            if (expected.groupPageShown) {
 | 
						|
              assert.isOk(res.links[1].subsection);
 | 
						|
              assert.equal(res.links[1].subsection.children.length,
 | 
						|
                  expected.groupSubpageLength);
 | 
						|
            } else if ( expected.totalLength > 1) {
 | 
						|
              assert.isNotOk(res.links[1].subsection);
 | 
						|
            }
 | 
						|
 | 
						|
            if (expected.pluginGeneratedLinks) {
 | 
						|
              for (const link of expected.pluginGeneratedLinks) {
 | 
						|
                const linkMatch = res.links.find(l => {
 | 
						|
                  return (l.url === link.url && l.name === link.text);
 | 
						|
                });
 | 
						|
                assert.isTrue(!!linkMatch);
 | 
						|
 | 
						|
                // External links should open in new tab.
 | 
						|
                if (link.url[0] !== '/') {
 | 
						|
                  assert.equal(linkMatch.target, '_blank');
 | 
						|
                } else {
 | 
						|
                  assert.isNotOk(linkMatch.target);
 | 
						|
                }
 | 
						|
              }
 | 
						|
            }
 | 
						|
 | 
						|
            // Current section
 | 
						|
            if (expected.projectPageShown || expected.groupPageShown) {
 | 
						|
              assert.isOk(res.expandedSection);
 | 
						|
              assert.isOk(res.expandedSection.children);
 | 
						|
            } else {
 | 
						|
              assert.isNotOk(res.expandedSection);
 | 
						|
            }
 | 
						|
            if (expected.projectPageShown) {
 | 
						|
              assert.equal(res.expandedSection.name, 'my-repo');
 | 
						|
              assert.equal(res.expandedSection.children.length, 5);
 | 
						|
            } else if (expected.groupPageShown) {
 | 
						|
              assert.equal(res.expandedSection.name, 'my-group');
 | 
						|
              assert.equal(res.expandedSection.children.length,
 | 
						|
                  expected.groupSubpageLength);
 | 
						|
            }
 | 
						|
            done();
 | 
						|
          });
 | 
						|
    };
 | 
						|
 | 
						|
    suite('logged out', () => {
 | 
						|
      let account;
 | 
						|
      let expected;
 | 
						|
 | 
						|
      setup(() => {
 | 
						|
        expected = {
 | 
						|
          groupListShown: false,
 | 
						|
          groupPageShown: false,
 | 
						|
          pluginListShown: false,
 | 
						|
        };
 | 
						|
      });
 | 
						|
 | 
						|
      test('without a specific repo or group', done => {
 | 
						|
        let options;
 | 
						|
        expected = Object.assign(expected, {
 | 
						|
          totalLength: 1,
 | 
						|
          projectPageShown: false,
 | 
						|
        });
 | 
						|
        testAdminLinks(account, options, expected, done);
 | 
						|
      });
 | 
						|
 | 
						|
      test('with a repo', done => {
 | 
						|
        const options = {repoName: 'my-repo'};
 | 
						|
        expected = Object.assign(expected, {
 | 
						|
          totalLength: 1,
 | 
						|
          projectPageShown: true,
 | 
						|
        });
 | 
						|
        testAdminLinks(account, options, expected, done);
 | 
						|
      });
 | 
						|
 | 
						|
      test('with plugin generated links', done => {
 | 
						|
        let options;
 | 
						|
        const generatedLinks = [
 | 
						|
          {text: 'internal link text', url: '/internal/link/url'},
 | 
						|
          {text: 'external link text', url: 'http://external/link/url'},
 | 
						|
        ];
 | 
						|
        menuLinkStub.returns(generatedLinks);
 | 
						|
        expected = Object.assign(expected, {
 | 
						|
          totalLength: 3,
 | 
						|
          projectPageShown: false,
 | 
						|
          pluginGeneratedLinks: generatedLinks,
 | 
						|
        });
 | 
						|
        testAdminLinks(account, options, expected, done);
 | 
						|
      });
 | 
						|
    });
 | 
						|
 | 
						|
    suite('no plugin capability logged in', () => {
 | 
						|
      const account = {
 | 
						|
        name: 'test-user',
 | 
						|
      };
 | 
						|
      let expected;
 | 
						|
 | 
						|
      setup(() => {
 | 
						|
        expected = {
 | 
						|
          totalLength: 2,
 | 
						|
          pluginListShown: false,
 | 
						|
        };
 | 
						|
        capabilityStub.returns(Promise.resolve({}));
 | 
						|
      });
 | 
						|
 | 
						|
      test('without a specific project or group', done => {
 | 
						|
        let options;
 | 
						|
        expected = Object.assign(expected, {
 | 
						|
          projectPageShown: false,
 | 
						|
          groupListShown: true,
 | 
						|
          groupPageShown: false,
 | 
						|
        });
 | 
						|
        testAdminLinks(account, options, expected, done);
 | 
						|
      });
 | 
						|
 | 
						|
      test('with a repo', done => {
 | 
						|
        const account = {
 | 
						|
          name: 'test-user',
 | 
						|
        };
 | 
						|
        const options = {repoName: 'my-repo'};
 | 
						|
        expected = Object.assign(expected, {
 | 
						|
          projectPageShown: true,
 | 
						|
          groupListShown: true,
 | 
						|
          groupPageShown: false,
 | 
						|
        });
 | 
						|
        testAdminLinks(account, options, expected, done);
 | 
						|
      });
 | 
						|
    });
 | 
						|
 | 
						|
    suite('view plugin capability logged in', () => {
 | 
						|
      const account = {
 | 
						|
        name: 'test-user',
 | 
						|
      };
 | 
						|
      let expected;
 | 
						|
 | 
						|
      setup(() => {
 | 
						|
        capabilityStub.returns(Promise.resolve({viewPlugins: true}));
 | 
						|
        expected = {
 | 
						|
          totalLength: 3,
 | 
						|
          groupListShown: true,
 | 
						|
          pluginListShown: true,
 | 
						|
        };
 | 
						|
      });
 | 
						|
 | 
						|
      test('without a specific repo or group', done => {
 | 
						|
        let options;
 | 
						|
        expected = Object.assign(expected, {
 | 
						|
          projectPageShown: false,
 | 
						|
          groupPageShown: false,
 | 
						|
        });
 | 
						|
        testAdminLinks(account, options, expected, done);
 | 
						|
      });
 | 
						|
 | 
						|
      test('with a repo', done => {
 | 
						|
        const options = {repoName: 'my-repo'};
 | 
						|
        expected = Object.assign(expected, {
 | 
						|
          projectPageShown: true,
 | 
						|
          groupPageShown: false,
 | 
						|
        });
 | 
						|
        testAdminLinks(account, options, expected, done);
 | 
						|
      });
 | 
						|
 | 
						|
      test('admin with internal group', done => {
 | 
						|
        const options = {
 | 
						|
          groupId: 'a15262',
 | 
						|
          groupName: 'my-group',
 | 
						|
          groupIsInternal: true,
 | 
						|
          isAdmin: true,
 | 
						|
          groupOwner: false,
 | 
						|
        };
 | 
						|
        expected = Object.assign(expected, {
 | 
						|
          projectPageShown: false,
 | 
						|
          groupPageShown: true,
 | 
						|
          groupSubpageLength: 2,
 | 
						|
        });
 | 
						|
        testAdminLinks(account, options, expected, done);
 | 
						|
      });
 | 
						|
 | 
						|
      test('group owner with internal group', done => {
 | 
						|
        const options = {
 | 
						|
          groupId: 'a15262',
 | 
						|
          groupName: 'my-group',
 | 
						|
          groupIsInternal: true,
 | 
						|
          isAdmin: false,
 | 
						|
          groupOwner: true,
 | 
						|
        };
 | 
						|
        expected = Object.assign(expected, {
 | 
						|
          projectPageShown: false,
 | 
						|
          groupPageShown: true,
 | 
						|
          groupSubpageLength: 2,
 | 
						|
        });
 | 
						|
        testAdminLinks(account, options, expected, done);
 | 
						|
      });
 | 
						|
 | 
						|
      test('non owner or admin with internal group', done => {
 | 
						|
        const options = {
 | 
						|
          groupId: 'a15262',
 | 
						|
          groupName: 'my-group',
 | 
						|
          groupIsInternal: true,
 | 
						|
          isAdmin: false,
 | 
						|
          groupOwner: false,
 | 
						|
        };
 | 
						|
        expected = Object.assign(expected, {
 | 
						|
          projectPageShown: false,
 | 
						|
          groupPageShown: true,
 | 
						|
          groupSubpageLength: 1,
 | 
						|
        });
 | 
						|
        testAdminLinks(account, options, expected, done);
 | 
						|
      });
 | 
						|
 | 
						|
      test('admin with external group', done => {
 | 
						|
        const options = {
 | 
						|
          groupId: 'a15262',
 | 
						|
          groupName: 'my-group',
 | 
						|
          groupIsInternal: false,
 | 
						|
          isAdmin: true,
 | 
						|
          groupOwner: true,
 | 
						|
        };
 | 
						|
        expected = Object.assign(expected, {
 | 
						|
          projectPageShown: false,
 | 
						|
          groupPageShown: true,
 | 
						|
          groupSubpageLength: 0,
 | 
						|
        });
 | 
						|
        testAdminLinks(account, options, expected, done);
 | 
						|
      });
 | 
						|
    });
 | 
						|
  });
 | 
						|
</script>
 |