Skip to content
Merged
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
3 changes: 0 additions & 3 deletions .eslintignore

This file was deleted.

9 changes: 0 additions & 9 deletions .eslintrc.json

This file was deleted.

5 changes: 2 additions & 3 deletions bin/dev.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
#!/usr/bin/env -S node --loader ts-node/esm --disable-warning=ExperimentalWarning

// eslint-disable-next-line n/shebang
import {execute} from '@oclif/core'
import {execute} from '@oclif/core';

await execute({development: true, dir: import.meta.url})
await execute({development: true, dir: import.meta.url});
5 changes: 2 additions & 3 deletions bin/run.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
#!/usr/bin/env node

// eslint-disable-next-line n/shebang
import {execute} from '@oclif/core'
import {execute} from '@oclif/core';

await execute({dir: import.meta.url})
await execute({dir: import.meta.url});
34 changes: 34 additions & 0 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import eslint from '@eslint/js';
import tseslint from 'typescript-eslint';
import stylistic from '@stylistic/eslint-plugin';
import iTwinEslintPlugin from '@itwin/eslint-plugin';
import { defineConfig, globalIgnores } from "eslint/config";

export default tseslint.config(
defineConfig([globalIgnores(["dist/*", "tmp/*"])]),
eslint.configs.recommended,
tseslint.configs.recommended,
tseslint.configs.stylistic,
iTwinEslintPlugin.configs.iTwinjsRecommendedConfig,
{
plugins: {
"@stylistic": stylistic,
},
rules: {
'@stylistic/semi': 'error',
'@stylistic/indent': ['error', 2],
},
languageOptions: {
parser: tseslint.parser,
parserOptions: {
project: "./tsconfig.eslint.json",
},
},
},
{
files: ["integration-tests/**/*"],
rules: {
'@typescript-eslint/no-non-null-assertion': 'off'
},
}
);
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@
*--------------------------------------------------------------------------------------------*/

import runSuiteIfMainModule from '../utils/run-suite-if-main-module';
import groupTests from './group.test'
import memberTests from './member/member.test'
import groupTests from './group.test';
import memberTests from './member/member.test';

const tests = () => describe('Access Control Tests (Native Client)', () => {
groupTests();
memberTests();
groupTests();
memberTests();
});

export default tests;
Expand Down
54 changes: 27 additions & 27 deletions integration-tests/access-control-native/group.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,36 +12,36 @@ import { nativeLoginToCli } from "../utils/helpers";
import runSuiteIfMainModule from "../utils/run-suite-if-main-module";

const tests = () => describe('group', () => {
let iTwinId: string;
let groupId: string;
const groupName = "Test Group";
const groupDescription = "Test Group Description";
before(async function() {
this.timeout(5 * 60 * 1000);
await nativeLoginToCli();
let iTwinId: string;
let groupId: string;
const groupName = "Test Group";
const groupDescription = "Test Group Description";
before(async function() {
this.timeout(5 * 60 * 1000);
await nativeLoginToCli();

const iTwinName = `cli-itwin-integration-test-${new Date().toISOString()}`;
const { result: iTwin } = await runCommand<ITwin>(`itwin create --class Thing --sub-class Asset --name ${iTwinName}`);
expect(iTwin?.id).to.not.be.undefined;
iTwinId = iTwin!.id!;
const { result: group } = await runCommand<Group>(`access-control group create --itwin-id ${iTwinId} --name "${groupName}" --description "${groupDescription}"`);
expect(group).to.not.be.undefined;
groupId = group!.id!;
});
const iTwinName = `cli-itwin-integration-test-${new Date().toISOString()}`;
const { result: iTwin } = await runCommand<ITwin>(`itwin create --class Thing --sub-class Asset --name ${iTwinName}`);
expect(iTwin?.id).to.not.be.undefined;
iTwinId = iTwin!.id!;
const { result: group } = await runCommand<Group>(`access-control group create --itwin-id ${iTwinId} --name "${groupName}" --description "${groupDescription}"`);
expect(group).to.not.be.undefined;
groupId = group!.id!;
});

after(async () => {
const { result: deleteResult } = await runCommand<{result: string}>(`itwin delete --itwin-id ${iTwinId}`);
expect(deleteResult).to.have.property('result', 'deleted');
});
after(async () => {
const { result: deleteResult } = await runCommand<{result: string}>(`itwin delete --itwin-id ${iTwinId}`);
expect(deleteResult).to.have.property('result', 'deleted');
});

it('Should update group ims-group', async () => {
const imsGroupName = "iTwin CLI Test Group";
const { result: groupUpdate } = await runCommand<Group>(`access-control group update --itwin-id ${iTwinId} --group-id ${groupId} --ims-group "${imsGroupName}"`);
expect(groupUpdate).to.not.be.undefined;
expect(groupUpdate!.id).to.not.be.undefined;
expect(groupUpdate!.imsGroups).to.have.lengthOf(1);
expect(groupUpdate!.imsGroups![0]).to.be.equal(imsGroupName);
});
it('Should update group ims-group', async () => {
const imsGroupName = "iTwin CLI Test Group";
const { result: groupUpdate } = await runCommand<Group>(`access-control group update --itwin-id ${iTwinId} --group-id ${groupId} --ims-group "${imsGroupName}"`);
expect(groupUpdate).to.not.be.undefined;
expect(groupUpdate!.id).to.not.be.undefined;
expect(groupUpdate!.imsGroups).to.have.lengthOf(1);
expect(groupUpdate!.imsGroups![0]).to.be.equal(imsGroupName);
});
});

export default tests;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@

import runSuiteIfMainModule from '../../utils/run-suite-if-main-module';
import ownerTests from './owner.test';
import userTests from './user.test'
import userTests from './user.test';

const tests = () => describe('member', () => {
userTests();
ownerTests();
userTests();
ownerTests();
});

export default tests;
Expand Down
68 changes: 34 additions & 34 deletions integration-tests/access-control-native/member/owner.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,41 +14,41 @@ import { nativeLoginToCli } from "../../utils/helpers.js";
import runSuiteIfMainModule from "../../utils/run-suite-if-main-module.js";

const tests = () => describe('owner', () => {
let iTwinId: string;
const iTwinName: string = `cli-itwin-integration-test-${new Date().toISOString()}`;
let iTwinId: string;
const iTwinName: string = `cli-itwin-integration-test-${new Date().toISOString()}`;

before(async () => {
await nativeLoginToCli();

const { result: iTwin } = await runCommand<ITwin>(`itwin create --class Thing --sub-class Asset --name ${iTwinName}`);
expect(iTwin).to.have.property('id');
iTwinId = iTwin!.id!;
});

after(async () => {
const { result: deleteResult } = await runCommand<{result: string}>(`itwin delete --itwin-id ${iTwinId}`);
expect(deleteResult).to.have.property('result', 'deleted');
});

it('Should add an internal member to an iTwin and remove owner member', async () => {
const emailToAdd = ITP_TEST_USER_SAMEORG;

const { result: invitedUser } = await runCommand<OwnerResponse>(`access-control member owner add --itwin-id ${iTwinId} --email ${emailToAdd}`);

expect(invitedUser).to.not.be.undefined;
expect(invitedUser!.member).to.not.be.undefined;
expect(invitedUser!.member.email.toLowerCase()).to.be.equal(emailToAdd!.toLowerCase());

const { result: usersInfo } = await runCommand<GroupMember[]>(`access-control member owner list --itwin-id ${iTwinId}`);
expect(usersInfo).to.not.be.undefined;
expect(usersInfo).to.have.lengthOf(2);
const joinedUser = usersInfo?.filter(user => user.email.toLowerCase() === emailToAdd!.toLowerCase())[0];
expect(joinedUser).to.not.be.undefined;

const { result: deleteResult } = await runCommand<{result: string}>(`access-control member owner delete --itwin-id ${iTwinId} --member-id ${joinedUser?.id}`);
expect(deleteResult).to.not.be.undefined;
expect(deleteResult).to.have.property('result', "deleted");
});
before(async () => {
await nativeLoginToCli();

const { result: iTwin } = await runCommand<ITwin>(`itwin create --class Thing --sub-class Asset --name ${iTwinName}`);
expect(iTwin).to.have.property('id');
iTwinId = iTwin!.id!;
});

after(async () => {
const { result: deleteResult } = await runCommand<{result: string}>(`itwin delete --itwin-id ${iTwinId}`);
expect(deleteResult).to.have.property('result', 'deleted');
});

it('Should add an internal member to an iTwin and remove owner member', async () => {
const emailToAdd = ITP_TEST_USER_SAMEORG;

const { result: invitedUser } = await runCommand<OwnerResponse>(`access-control member owner add --itwin-id ${iTwinId} --email ${emailToAdd}`);

expect(invitedUser).to.not.be.undefined;
expect(invitedUser!.member).to.not.be.undefined;
expect(invitedUser!.member.email.toLowerCase()).to.be.equal(emailToAdd!.toLowerCase());

const { result: usersInfo } = await runCommand<GroupMember[]>(`access-control member owner list --itwin-id ${iTwinId}`);
expect(usersInfo).to.not.be.undefined;
expect(usersInfo).to.have.lengthOf(2);
const joinedUser = usersInfo?.filter(user => user.email.toLowerCase() === emailToAdd!.toLowerCase())[0];
expect(joinedUser).to.not.be.undefined;

const { result: deleteResult } = await runCommand<{result: string}>(`access-control member owner delete --itwin-id ${iTwinId} --member-id ${joinedUser?.id}`);
expect(deleteResult).to.not.be.undefined;
expect(deleteResult).to.have.property('result', "deleted");
});
});

export default tests;
Expand Down
68 changes: 34 additions & 34 deletions integration-tests/access-control-native/member/user.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,49 +14,49 @@ import { nativeLoginToCli } from "../../utils/helpers";
import runSuiteIfMainModule from "../../utils/run-suite-if-main-module";

const tests = () => describe('user', () => {
let iTwinId: string;
const iTwinName: string = `cli-itwin-integration-test-${new Date().toISOString()}`;
let iTwinId: string;
const iTwinName: string = `cli-itwin-integration-test-${new Date().toISOString()}`;

before(async () => {
await nativeLoginToCli();
before(async () => {
await nativeLoginToCli();

const { result: iTwin } = await runCommand<ITwin>(`itwin create --class Thing --sub-class Asset --name ${iTwinName}`);
expect(iTwin, "itwin create result").to.have.property('id');
iTwinId = iTwin!.id!;
});
const { result: iTwin } = await runCommand<ITwin>(`itwin create --class Thing --sub-class Asset --name ${iTwinName}`);
expect(iTwin, "itwin create result").to.have.property('id');
iTwinId = iTwin!.id!;
});

after(async () => {
const { result: deleteResult } = await runCommand<{result: string}>(`itwin delete --itwin-id ${iTwinId}`);
expect(deleteResult).to.have.property('result', 'deleted');
});
after(async () => {
const { result: deleteResult } = await runCommand<{result: string}>(`itwin delete --itwin-id ${iTwinId}`);
expect(deleteResult).to.have.property('result', 'deleted');
});

it('Should add an internal member to an iTwin and remove user member', async () => {
const { result: newRole } = await runCommand<Role>(`access-control role create -i ${iTwinId} -n "Test Role 1" -d "Test Role Description"`);
expect(newRole).to.not.be.undefined;
expect(newRole!.id).to.not.be.undefined;
it('Should add an internal member to an iTwin and remove user member', async () => {
const { result: newRole } = await runCommand<Role>(`access-control role create -i ${iTwinId} -n "Test Role 1" -d "Test Role Description"`);
expect(newRole).to.not.be.undefined;
expect(newRole!.id).to.not.be.undefined;

const emailToAdd = ITP_TEST_USER_SAMEORG;
const emailToAdd = ITP_TEST_USER_SAMEORG;

const { result: invitedUser } = await runCommand<MembersResponse>(`access-control member user add --itwin-id ${iTwinId} --members "[{"email": "${emailToAdd}", "roleIds": ["${newRole!.id}"]}]"`);
const { result: invitedUser } = await runCommand<MembersResponse>(`access-control member user add --itwin-id ${iTwinId} --members "[{"email": "${emailToAdd}", "roleIds": ["${newRole!.id}"]}]"`);

expect(invitedUser).to.not.be.undefined;
expect(invitedUser!.members).to.have.lengthOf(1);
expect(invitedUser!.members[0].email.toLowerCase()).to.be.equal(emailToAdd!.toLowerCase());
expect(invitedUser!.members[0].roles).to.have.lengthOf(1);
expect(invitedUser!.members[0].roles[0].id).to.be.equal(newRole!.id);
expect(invitedUser).to.not.be.undefined;
expect(invitedUser!.members).to.have.lengthOf(1);
expect(invitedUser!.members[0].email.toLowerCase()).to.be.equal(emailToAdd!.toLowerCase());
expect(invitedUser!.members[0].roles).to.have.lengthOf(1);
expect(invitedUser!.members[0].roles[0].id).to.be.equal(newRole!.id);

const { result: usersInfo } = await runCommand<Member[]>(`access-control member user list --itwin-id ${iTwinId}`);
expect(usersInfo).to.not.be.undefined;
expect(usersInfo).to.have.lengthOf(2);
const joinedUser = usersInfo?.filter(user => user.email.toLowerCase() === emailToAdd!.toLowerCase())[0];
expect(joinedUser).to.not.be.undefined;
expect(joinedUser?.roles).to.have.lengthOf(1);
expect(joinedUser?.roles[0].id).to.be.equal(newRole!.id);
const { result: usersInfo } = await runCommand<Member[]>(`access-control member user list --itwin-id ${iTwinId}`);
expect(usersInfo).to.not.be.undefined;
expect(usersInfo).to.have.lengthOf(2);
const joinedUser = usersInfo?.filter(user => user.email.toLowerCase() === emailToAdd!.toLowerCase())[0];
expect(joinedUser).to.not.be.undefined;
expect(joinedUser?.roles).to.have.lengthOf(1);
expect(joinedUser?.roles[0].id).to.be.equal(newRole!.id);

const { result: deleteResult } = await runCommand<{result: string}>(`access-control member user delete --itwin-id ${iTwinId} --member-id ${joinedUser?.id}`);
expect(deleteResult).to.not.be.undefined;
expect(deleteResult).to.have.property('result', "deleted");
});
const { result: deleteResult } = await runCommand<{result: string}>(`access-control member user delete --itwin-id ${iTwinId} --member-id ${joinedUser?.id}`);
expect(deleteResult).to.not.be.undefined;
expect(deleteResult).to.have.property('result', "deleted");
});
});

export default tests;
Expand Down
24 changes: 12 additions & 12 deletions integration-tests/access-control/access-control.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,21 @@ import permissionTests from "./permissions.test";
import roleTests from "./role.test";

const tests = () => describe('Access Control Tests', () => {
describe('group', () => {
groupTests();
});
describe('group', () => {
groupTests();
});

describe('role', () => {
roleTests();
});
describe('role', () => {
roleTests();
});

describe('permissions', () => {
permissionTests();
});
describe('permissions', () => {
permissionTests();
});

describe('member', () => {
memberTests();
});
describe('member', () => {
memberTests();
});
});

export default tests;
Expand Down
Loading