|
@@ -6,17 +6,21 @@ import path from 'path';
|
|
|
import { dataDir, TEST_SETUP_TIMEOUT_MS, testConfig } from './config/test-config';
|
|
import { dataDir, TEST_SETUP_TIMEOUT_MS, testConfig } from './config/test-config';
|
|
|
import { initialData } from './fixtures/e2e-initial-data';
|
|
import { initialData } from './fixtures/e2e-initial-data';
|
|
|
import {
|
|
import {
|
|
|
|
|
+ CreateAdministrator,
|
|
|
CreateChannel,
|
|
CreateChannel,
|
|
|
|
|
+ CreateRole,
|
|
|
CurrencyCode,
|
|
CurrencyCode,
|
|
|
LanguageCode,
|
|
LanguageCode,
|
|
|
Me,
|
|
Me,
|
|
|
Permission,
|
|
Permission,
|
|
|
} from './graphql/generated-e2e-admin-types';
|
|
} from './graphql/generated-e2e-admin-types';
|
|
|
-import { ME } from './graphql/shared-definitions';
|
|
|
|
|
|
|
+import { CREATE_ADMINISTRATOR, CREATE_ROLE, ME } from './graphql/shared-definitions';
|
|
|
|
|
+import { assertThrowsWithMessage } from './utils/assert-throws-with-message';
|
|
|
|
|
|
|
|
describe('Channels', () => {
|
|
describe('Channels', () => {
|
|
|
const { server, adminClient, shopClient } = createTestEnvironment(testConfig);
|
|
const { server, adminClient, shopClient } = createTestEnvironment(testConfig);
|
|
|
const SECOND_CHANNEL_TOKEN = 'second_channel_token';
|
|
const SECOND_CHANNEL_TOKEN = 'second_channel_token';
|
|
|
|
|
+ let secondChannelAdminRole: CreateRole.CreateRole;
|
|
|
|
|
|
|
|
beforeAll(async () => {
|
|
beforeAll(async () => {
|
|
|
await server.init({
|
|
await server.init({
|
|
@@ -67,10 +71,117 @@ describe('Channels', () => {
|
|
|
it('superadmin has all permissions on new channel', async () => {
|
|
it('superadmin has all permissions on new channel', async () => {
|
|
|
const { me } = await adminClient.query<Me.Query>(ME);
|
|
const { me } = await adminClient.query<Me.Query>(ME);
|
|
|
|
|
|
|
|
|
|
+ expect(me!.channels.length).toBe(2);
|
|
|
|
|
+
|
|
|
const secondChannelData = me!.channels.find(c => c.token === SECOND_CHANNEL_TOKEN);
|
|
const secondChannelData = me!.channels.find(c => c.token === SECOND_CHANNEL_TOKEN);
|
|
|
const nonOwnerPermissions = Object.values(Permission).filter(p => p !== Permission.Owner);
|
|
const nonOwnerPermissions = Object.values(Permission).filter(p => p !== Permission.Owner);
|
|
|
expect(secondChannelData!.permissions).toEqual(nonOwnerPermissions);
|
|
expect(secondChannelData!.permissions).toEqual(nonOwnerPermissions);
|
|
|
});
|
|
});
|
|
|
|
|
+
|
|
|
|
|
+ it('createRole on second Channel', async () => {
|
|
|
|
|
+ const { createRole } = await adminClient.query<CreateRole.Mutation, CreateRole.Variables>(
|
|
|
|
|
+ CREATE_ROLE,
|
|
|
|
|
+ {
|
|
|
|
|
+ input: {
|
|
|
|
|
+ description: 'second channel admin',
|
|
|
|
|
+ code: 'second-channel-admin',
|
|
|
|
|
+ channelId: 'T_2',
|
|
|
|
|
+ permissions: [
|
|
|
|
|
+ Permission.ReadCatalog,
|
|
|
|
|
+ Permission.ReadSettings,
|
|
|
|
|
+ Permission.ReadAdministrator,
|
|
|
|
|
+ Permission.CreateAdministrator,
|
|
|
|
|
+ Permission.UpdateAdministrator,
|
|
|
|
|
+ ],
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ expect(createRole.channels).toEqual([
|
|
|
|
|
+ {
|
|
|
|
|
+ id: 'T_2',
|
|
|
|
|
+ code: 'second-channel',
|
|
|
|
|
+ token: SECOND_CHANNEL_TOKEN,
|
|
|
|
|
+ },
|
|
|
|
|
+ ]);
|
|
|
|
|
+
|
|
|
|
|
+ secondChannelAdminRole = createRole;
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it('createAdministrator with second-channel-admin role', async () => {
|
|
|
|
|
+ const { createAdministrator } = await adminClient.query<
|
|
|
|
|
+ CreateAdministrator.Mutation,
|
|
|
|
|
+ CreateAdministrator.Variables
|
|
|
|
|
+ >(CREATE_ADMINISTRATOR, {
|
|
|
|
|
+ input: {
|
|
|
|
|
+ firstName: 'Admin',
|
|
|
|
|
+ lastName: 'Two',
|
|
|
|
|
+ emailAddress: 'admin2@test.com',
|
|
|
|
|
+ password: 'test',
|
|
|
|
|
+ roleIds: [secondChannelAdminRole.id],
|
|
|
|
|
+ },
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ expect(createAdministrator.user.roles.map(r => r.description)).toEqual(['second channel admin']);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it(
|
|
|
|
|
+ 'cannot create role on channel for which admin does not have CreateAdministrator permission',
|
|
|
|
|
+ assertThrowsWithMessage(async () => {
|
|
|
|
|
+ await adminClient.asUserWithCredentials('admin2@test.com', 'test');
|
|
|
|
|
+ await adminClient.query<CreateRole.Mutation, CreateRole.Variables>(CREATE_ROLE, {
|
|
|
|
|
+ input: {
|
|
|
|
|
+ description: 'read default channel catalog',
|
|
|
|
|
+ code: 'read default channel catalog',
|
|
|
|
|
+ channelId: 'T_1',
|
|
|
|
|
+ permissions: [Permission.ReadCatalog],
|
|
|
|
|
+ },
|
|
|
|
|
+ });
|
|
|
|
|
+ }, 'You are not currently authorized to perform this action'),
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ it('can create role on channel for which admin has CreateAdministrator permission', async () => {
|
|
|
|
|
+ const { createRole } = await adminClient.query<CreateRole.Mutation, CreateRole.Variables>(
|
|
|
|
|
+ CREATE_ROLE,
|
|
|
|
|
+ {
|
|
|
|
|
+ input: {
|
|
|
|
|
+ description: 'read second channel catalog',
|
|
|
|
|
+ code: 'read-second-channel-catalog',
|
|
|
|
|
+ channelId: 'T_2',
|
|
|
|
|
+ permissions: [Permission.ReadCatalog],
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ expect(createRole.channels).toEqual([
|
|
|
|
|
+ {
|
|
|
|
|
+ id: 'T_2',
|
|
|
|
|
+ code: 'second-channel',
|
|
|
|
|
+ token: SECOND_CHANNEL_TOKEN,
|
|
|
|
|
+ },
|
|
|
|
|
+ ]);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it('createRole with no channelId implicitly uses active channel', async () => {
|
|
|
|
|
+ const { createRole } = await adminClient.query<CreateRole.Mutation, CreateRole.Variables>(
|
|
|
|
|
+ CREATE_ROLE,
|
|
|
|
|
+ {
|
|
|
|
|
+ input: {
|
|
|
|
|
+ description: 'update second channel catalog',
|
|
|
|
|
+ code: 'update-second-channel-catalog',
|
|
|
|
|
+ permissions: [Permission.UpdateCatalog],
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ expect(createRole.channels).toEqual([
|
|
|
|
|
+ {
|
|
|
|
|
+ id: 'T_2',
|
|
|
|
|
+ code: 'second-channel',
|
|
|
|
|
+ token: SECOND_CHANNEL_TOKEN,
|
|
|
|
|
+ },
|
|
|
|
|
+ ]);
|
|
|
|
|
+ });
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
const CREATE_CHANNEL = gql`
|
|
const CREATE_CHANNEL = gql`
|