Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor spo list roleassignment add to use util instead of calling other command, Closes #5157 #5208

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
128 changes: 73 additions & 55 deletions src/m365/spo/commands/list/list-roleassignment-add.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,73 @@ import { pid } from '../../../../utils/pid';
import { session } from '../../../../utils/session';
import { sinonUtil } from '../../../../utils/sinonUtil';
import commands from '../../commands';
import * as SpoUserGetCommand from '../user/user-get';
import * as SpoGroupGetCommand from '../group/group-get';
import * as SpoRoleDefinitionListCommand from '../roledefinition/roledefinition-list';
import { spo } from '../../../../utils/spo';
import { RoleDefinition } from '../roledefinition/RoleDefinition';
const command: Command = require('./list-roleassignment-add');

describe(commands.LIST_ROLEASSIGNMENT_ADD, () => {
let log: any[];
let logger: Logger;
let commandInfo: CommandInfo;
const userResponse = {
Id: 11,
IsHiddenInUI: false,
LoginName: 'i:0#.f|membership|[email protected]',
Title: 'John Doe',
PrincipalType: 1,
Email: '[email protected]',
Expiration: '',
IsEmailAuthenticationGuestUser: false,
IsShareByEmailGuestUser: false,
IsSiteAdmin: false,
UserId: {
NameId: '10032002473c5ae3',
NameIdIssuer: 'urn:federation:microsoftonline'
},
UserPrincipalName: '[email protected]'
};

const groupResponse = {
Id: 11,
IsHiddenInUI: false,
LoginName: "groupname",
Title: "groupname",
PrincipalType: 8,
AllowMembersEditMembership: false,
AllowRequestToJoinLeave: false,
AutoAcceptRequestToJoinLeave: false,
Description: "",
OnlyAllowMembersViewMembership: true,
OwnerTitle: "John Doe",
RequestToJoinLeaveEmailSetting: null
};

const roledefinitionResponse: RoleDefinition = {
BasePermissions: {
High: 176,
Low: 138612833
},
Description: "Can view pages and list items and download documents.",
Hidden: false,
Id: 1073741827,
Name: "Read",
Order: 128,
RoleTypeKind: 2,
BasePermissionsValue: [
"ViewListItems",
"OpenItems",
"ViewVersions",
"ViewFormPages",
"Open",
"ViewPages",
"CreateSSCSite",
"BrowseUserInfo",
"UseClientIntegration",
"UseRemoteAPIs",
"CreateAlerts"
],
RoleTypeKindValue: "Reader"
};

before(() => {
sinon.stub(auth, 'restoreAuth').resolves();
Expand Down Expand Up @@ -48,7 +106,9 @@ describe(commands.LIST_ROLEASSIGNMENT_ADD, () => {
afterEach(() => {
sinonUtil.restore([
request.post,
Cli.executeCommandWithOutput
spo.getGroupByName,
spo.getUserByEmail,
spo.getRoleDefinitionByName
]);
});

Expand Down Expand Up @@ -174,15 +234,7 @@ describe(commands.LIST_ROLEASSIGNMENT_ADD, () => {
throw 'Invalid request';
});

sinon.stub(Cli, 'executeCommandWithOutput').callsFake(async (command): Promise<any> => {
if (command === SpoUserGetCommand) {
return {
stdout: '{"Id": 11,"IsHiddenInUI": false,"LoginName": "i:0#.f|membership|[email protected]","Title": "Some Account","PrincipalType": 1,"Email": "[email protected]","Expiration": "","IsEmailAuthenticationGuestUser": false,"IsShareByEmailGuestUser": false,"IsSiteAdmin": true,"UserId": {"NameId": "1003200097d06dd6","NameIdIssuer": "urn:federation:microsoftonline"},"UserPrincipalName": "[email protected]"}'
};
}

throw 'Unknown case';
});
sinon.stub(spo, 'getUserByEmail').resolves(userResponse);

await command.action(logger, {
options: {
Expand All @@ -204,14 +256,8 @@ describe(commands.LIST_ROLEASSIGNMENT_ADD, () => {
throw 'Invalid request';
});

const error = 'no user found';
sinon.stub(Cli, 'executeCommandWithOutput').callsFake(async (command): Promise<any> => {
if (command === SpoUserGetCommand) {
throw error;
}

throw 'Unknown case';
});
const error = 'User cannot be found.';
sinon.stub(spo, 'getUserByEmail').rejects(new Error(error));

await assert.rejects(command.action(logger, {
options: {
Expand All @@ -233,15 +279,7 @@ describe(commands.LIST_ROLEASSIGNMENT_ADD, () => {
throw 'Invalid request';
});

sinon.stub(Cli, 'executeCommandWithOutput').callsFake(async (command): Promise<any> => {
if (command === SpoGroupGetCommand) {
return {
stdout: '{"Id": 11,"IsHiddenInUI": false,"LoginName": "otherGroup","Title": "otherGroup","PrincipalType": 8,"AllowMembersEditMembership": false,"AllowRequestToJoinLeave": false,"AutoAcceptRequestToJoinLeave": false,"Description": "","OnlyAllowMembersViewMembership": true,"OwnerTitle": "Some Account","RequestToJoinLeaveEmailSetting": null}'
};
}

throw new CommandError('Unknown case');
});
sinon.stub(spo, 'getGroupByName').resolves(groupResponse);

await command.action(logger, {
options: {
Expand All @@ -263,14 +301,8 @@ describe(commands.LIST_ROLEASSIGNMENT_ADD, () => {
throw 'Invalid request';
});

const error = 'no group found';
sinon.stub(Cli, 'executeCommandWithOutput').callsFake(async (command): Promise<any> => {
if (command === SpoGroupGetCommand) {
throw error;
}

throw 'Unknown case';
});
const error = 'Group cannot be found';
sinon.stub(spo, 'getGroupByName').rejects(new Error(error));

await assert.rejects(command.action(logger, {
options: {
Expand All @@ -292,15 +324,7 @@ describe(commands.LIST_ROLEASSIGNMENT_ADD, () => {
throw 'Invalid request';
});

sinon.stub(Cli, 'executeCommandWithOutput').callsFake(async (command): Promise<any> => {
if (command === SpoRoleDefinitionListCommand) {
return {
stdout: '[{"BasePermissions": {"High": "2147483647","Low": "4294967295"},"Description": "Has full control.","Hidden": false,"Id": 1073741827,"Name": "Full Control","Order": 1,"RoleTypeKind": 5}]'
};
}

throw 'Unknown case';
});
sinon.stub(spo, 'getRoleDefinitionByName').resolves(roledefinitionResponse);

await command.action(logger, {
options: {
Expand All @@ -322,14 +346,8 @@ describe(commands.LIST_ROLEASSIGNMENT_ADD, () => {
throw 'Invalid request';
});

const error = 'no role definition found';
sinon.stub(Cli, 'executeCommandWithOutput').callsFake(async (command): Promise<any> => {
if (command === SpoRoleDefinitionListCommand) {
throw error;
}

throw 'Unknown case';
});
const error = 'No roledefinition is found for Read';
sinon.stub(spo, 'getRoleDefinitionByName').rejects(new Error(error));

await assert.rejects(command.action(logger, {
options: {
Expand Down
62 changes: 9 additions & 53 deletions src/m365/spo/commands/list/list-roleassignment-add.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,12 @@
import { Cli } from '../../../../cli/Cli';
import { Logger } from '../../../../cli/Logger';
import Command from '../../../../Command';
import GlobalOptions from '../../../../GlobalOptions';
import request, { CliRequestOptions } from '../../../../request';
import { formatting } from '../../../../utils/formatting';
import { urlUtil } from '../../../../utils/urlUtil';
import { validation } from '../../../../utils/validation';
import SpoCommand from '../../../base/SpoCommand';
import commands from '../../commands';
import * as SpoUserGetCommand from '../user/user-get';
import { Options as SpoUserGetCommandOptions } from '../user/user-get';
import * as SpoGroupGetCommand from '../group/group-get';
import { Options as SpoGroupGetCommandOptions } from '../group/group-get';
import * as SpoRoleDefinitionListCommand from '../roledefinition/roledefinition-list';
import { Options as SpoRoleDefinitionListCommandOptions } from '../roledefinition/roledefinition-list';
import { RoleDefinition } from '../roledefinition/RoleDefinition';
import { spo } from '../../../../utils/spo';

interface CommandArgs {
options: Options;
Expand Down Expand Up @@ -148,13 +140,15 @@ class SpoListRoleAssignmentAddCommand extends SpoCommand {
requestUrl += `GetList('${formatting.encodeQueryParameter(listServerRelativeUrl)}')/`;
}

args.options.roleDefinitionId = await this.getRoleDefinitionId(args.options);
args.options.roleDefinitionId = await this.getRoleDefinitionId(args.options, logger);
if (args.options.upn) {
args.options.principalId = await this.getUserPrincipalId(args.options);
const user = await spo.getUserByEmail(args.options.webUrl, args.options.upn, logger, this.verbose);
args.options.principalId = user.Id;
await this.addRoleAssignment(requestUrl, logger, args.options);
}
else if (args.options.groupName) {
args.options.principalId = await this.getGroupPrincipalId(args.options);
const group = await spo.getGroupByName(args.options.webUrl, args.options.groupName, logger, this.verbose);
args.options.principalId = group.Id;
await this.addRoleAssignment(requestUrl, logger, args.options);
}
else {
Expand All @@ -180,51 +174,13 @@ class SpoListRoleAssignmentAddCommand extends SpoCommand {
return request.post(requestOptions);
}

private async getRoleDefinitionId(options: Options): Promise<number> {
private async getRoleDefinitionId(options: Options, logger: Logger): Promise<number> {
if (!options.roleDefinitionName) {
return options.roleDefinitionId as number;
}

const roleDefinitionListCommandOptions: SpoRoleDefinitionListCommandOptions = {
webUrl: options.webUrl,
output: 'json',
debug: this.debug,
verbose: this.verbose
};

const output = await Cli.executeCommandWithOutput(SpoRoleDefinitionListCommand as Command, { options: { ...roleDefinitionListCommandOptions, _: [] } });
const getRoleDefinitionListOutput = JSON.parse(output.stdout);
const roleDefinitionId: number = getRoleDefinitionListOutput.find((role: RoleDefinition) => role.Name === options.roleDefinitionName).Id;
return roleDefinitionId;
}

private async getGroupPrincipalId(options: Options): Promise<number> {
const groupGetCommandOptions: SpoGroupGetCommandOptions = {
webUrl: options.webUrl,
name: options.groupName,
output: 'json',
debug: this.debug,
verbose: this.verbose
};

const output = await Cli.executeCommandWithOutput(SpoGroupGetCommand as Command, { options: { ...groupGetCommandOptions, _: [] } });
const getGroupOutput = JSON.parse(output.stdout);
return getGroupOutput.Id;
}

private async getUserPrincipalId(options: Options): Promise<number> {
const userGetCommandOptions: SpoUserGetCommandOptions = {
webUrl: options.webUrl,
email: options.upn,
id: undefined,
output: 'json',
debug: this.debug,
verbose: this.verbose
};

const output = await Cli.executeCommandWithOutput(SpoUserGetCommand as Command, { options: { ...userGetCommandOptions, _: [] } });
const getUserOutput = JSON.parse(output.stdout);
return getUserOutput.Id;
const roleDefinition = await spo.getRoleDefinitionByName(options.webUrl, options.roleDefinitionName, logger, this.verbose);
return roleDefinition.Id;
}
}

Expand Down
Loading