336 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			336 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 * @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.
 | 
						|
 */
 | 
						|
 | 
						|
import '../test/common-test-setup-karma.js';
 | 
						|
import {getAdminLinks} from './admin-nav-util.js';
 | 
						|
 | 
						|
suite('gr-admin-nav-behavior tests', () => {
 | 
						|
  let capabilityStub;
 | 
						|
  let menuLinkStub;
 | 
						|
 | 
						|
  setup(() => {
 | 
						|
    capabilityStub = sinon.stub();
 | 
						|
    menuLinkStub = sinon.stub().returns([]);
 | 
						|
  });
 | 
						|
 | 
						|
  const testAdminLinks = (account, options, expected, done) => {
 | 
						|
    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 => (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);
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  suite('view plugin screen with plugin capability', () => {
 | 
						|
    const account = {
 | 
						|
      name: 'test-user',
 | 
						|
    };
 | 
						|
    let expected;
 | 
						|
 | 
						|
    setup(() => {
 | 
						|
      capabilityStub.returns(Promise.resolve({pluginCapability: true}));
 | 
						|
      expected = {};
 | 
						|
    });
 | 
						|
 | 
						|
    test('with plugin with capabilities', done => {
 | 
						|
      let options;
 | 
						|
      const generatedLinks = [
 | 
						|
        {text: 'without capability', url: '/without'},
 | 
						|
        {text: 'with capability',
 | 
						|
          url: '/with',
 | 
						|
          capability: 'pluginCapability'},
 | 
						|
      ];
 | 
						|
      menuLinkStub.returns(generatedLinks);
 | 
						|
      expected = Object.assign(expected, {
 | 
						|
        totalLength: 4,
 | 
						|
        pluginGeneratedLinks: generatedLinks,
 | 
						|
      });
 | 
						|
      testAdminLinks(account, options, expected, done);
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  suite('view plugin screen without plugin capability', () => {
 | 
						|
    const account = {
 | 
						|
      name: 'test-user',
 | 
						|
    };
 | 
						|
    let expected;
 | 
						|
 | 
						|
    setup(() => {
 | 
						|
      capabilityStub.returns(Promise.resolve({}));
 | 
						|
      expected = {};
 | 
						|
    });
 | 
						|
 | 
						|
    test('with plugin with capabilities', done => {
 | 
						|
      let options;
 | 
						|
      const generatedLinks = [
 | 
						|
        {text: 'without capability', url: '/without'},
 | 
						|
        {text: 'with capability',
 | 
						|
          url: '/with',
 | 
						|
          capability: 'pluginCapability'},
 | 
						|
      ];
 | 
						|
      menuLinkStub.returns(generatedLinks);
 | 
						|
      expected = Object.assign(expected, {
 | 
						|
        totalLength: 3,
 | 
						|
        pluginGeneratedLinks: [generatedLinks[0]],
 | 
						|
      });
 | 
						|
      testAdminLinks(account, options, expected, done);
 | 
						|
    });
 | 
						|
  });
 | 
						|
});
 | 
						|
 |