blob: e06664e524e76b16c33b3473aed88412271d27c5 [file] [log] [blame]
/**
* @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 {AccountDetailInfo, GroupId, RepoName, Timestamp} from '../api/rest-api';
import '../test/common-test-setup-karma';
import {AdminNavLinksOption, getAdminLinks} from './admin-nav-util';
suite('gr-admin-nav-behavior tests', () => {
let capabilityStub: sinon.SinonStub;
let menuLinkStub: sinon.SinonStub;
setup(() => {
capabilityStub = sinon.stub();
menuLinkStub = sinon.stub().returns([]);
});
const testAdminLinks = async (
account: AccountDetailInfo | undefined,
options: AdminNavLinksOption | undefined,
expected: any
) => {
const res = await getAdminLinks(
account,
capabilityStub,
menuLinkStub,
options
);
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, 6);
} 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, 6);
} else if (expected.groupPageShown) {
assert.equal(res.expandedSection!.name, 'my-group');
assert.equal(
res.expandedSection!.children!.length,
expected.groupSubpageLength
);
}
};
suite('logged out', () => {
let account: AccountDetailInfo;
let expected: any;
setup(() => {
expected = {
groupListShown: false,
groupPageShown: false,
pluginListShown: false,
};
});
test('without a specific repo or group', async () => {
let options;
expected = Object.assign(expected, {
totalLength: 1,
projectPageShown: false,
});
await testAdminLinks(account, options, expected);
});
test('with a repo', async () => {
const options = {repoName: 'my-repo' as RepoName};
expected = Object.assign(expected, {
totalLength: 1,
projectPageShown: true,
});
await testAdminLinks(account, options, expected);
});
test('with plugin generated links', async () => {
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,
});
await testAdminLinks(account, options, expected);
});
});
suite('no plugin capability logged in', () => {
const account = {
name: 'test-user',
registered_on: '' as Timestamp,
};
let expected: any;
setup(() => {
expected = {
totalLength: 2,
pluginListShown: false,
};
capabilityStub.returns(Promise.resolve({}));
});
test('without a specific project or group', async () => {
let options;
expected = Object.assign(expected, {
projectPageShown: false,
groupListShown: true,
groupPageShown: false,
});
await testAdminLinks(account, options, expected);
});
test('with a repo', async () => {
const account = {
name: 'test-user',
registered_on: '' as Timestamp,
};
const options = {repoName: 'my-repo' as RepoName};
expected = Object.assign(expected, {
projectPageShown: true,
groupListShown: true,
groupPageShown: false,
});
await testAdminLinks(account, options, expected);
});
});
suite('view plugin capability logged in', () => {
const account = {
name: 'test-user',
registered_on: '' as Timestamp,
};
let expected: any;
setup(() => {
capabilityStub.returns(Promise.resolve({viewPlugins: true}));
expected = {
totalLength: 3,
groupListShown: true,
pluginListShown: true,
};
});
test('without a specific repo or group', async () => {
let options;
expected = Object.assign(expected, {
projectPageShown: false,
groupPageShown: false,
});
await testAdminLinks(account, options, expected);
});
test('with a repo', async () => {
const options = {repoName: 'my-repo' as RepoName};
expected = Object.assign(expected, {
projectPageShown: true,
groupPageShown: false,
});
await testAdminLinks(account, options, expected);
});
test('admin with internal group', async () => {
const options = {
groupId: 'a15262' as GroupId,
groupName: 'my-group',
groupIsInternal: true,
isAdmin: true,
groupOwner: false,
};
expected = Object.assign(expected, {
projectPageShown: false,
groupPageShown: true,
groupSubpageLength: 2,
});
await testAdminLinks(account, options, expected);
});
test('group owner with internal group', async () => {
const options = {
groupId: 'a15262' as GroupId,
groupName: 'my-group',
groupIsInternal: true,
isAdmin: false,
groupOwner: true,
};
expected = Object.assign(expected, {
projectPageShown: false,
groupPageShown: true,
groupSubpageLength: 2,
});
await testAdminLinks(account, options, expected);
});
test('non owner or admin with internal group', async () => {
const options = {
groupId: 'a15262' as GroupId,
groupName: 'my-group',
groupIsInternal: true,
isAdmin: false,
groupOwner: false,
};
expected = Object.assign(expected, {
projectPageShown: false,
groupPageShown: true,
groupSubpageLength: 1,
});
await testAdminLinks(account, options, expected);
});
test('admin with external group', async () => {
const options = {
groupId: 'a15262' as GroupId,
groupName: 'my-group',
groupIsInternal: false,
isAdmin: true,
groupOwner: true,
};
expected = Object.assign(expected, {
projectPageShown: false,
groupPageShown: true,
groupSubpageLength: 0,
});
await testAdminLinks(account, options, expected);
});
});
suite('view plugin screen with plugin capability', () => {
const account = {
name: 'test-user',
registered_on: '' as Timestamp,
};
let expected: any;
setup(() => {
capabilityStub.returns(Promise.resolve({pluginCapability: true}));
expected = {};
});
test('with plugin with capabilities', async () => {
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,
});
await testAdminLinks(account, options, expected);
});
});
suite('view plugin screen without plugin capability', () => {
const account = {
name: 'test-user',
registered_on: '' as Timestamp,
};
let expected: any;
setup(() => {
capabilityStub.returns(Promise.resolve({}));
expected = {};
});
test('with plugin with capabilities', async () => {
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]],
});
await testAdminLinks(account, options, expected);
});
});
});