@nexical/cli 0.1.7 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/deploy.yml +3 -3
- package/GEMINI.md +193 -0
- package/README.md +317 -104
- package/dist/chunk-JYASTIIW.js +42 -0
- package/dist/chunk-JYASTIIW.js.map +1 -0
- package/dist/chunk-LZ3YQWAR.js +2204 -0
- package/dist/chunk-LZ3YQWAR.js.map +1 -0
- package/dist/chunk-OKXOCNXP.js +105 -0
- package/dist/chunk-OKXOCNXP.js.map +1 -0
- package/dist/chunk-OYFWMYPG.js +52 -0
- package/dist/chunk-OYFWMYPG.js.map +1 -0
- package/dist/chunk-WKERTCM6.js +74 -0
- package/dist/chunk-WKERTCM6.js.map +1 -0
- package/dist/index.js +32 -5
- package/dist/index.js.map +1 -1
- package/dist/src/commands/init.d.ts +11 -0
- package/dist/src/commands/init.js +89 -0
- package/dist/src/commands/init.js.map +1 -0
- package/dist/src/commands/module/add.d.ts +14 -0
- package/dist/src/commands/module/add.js +136 -0
- package/dist/src/commands/module/add.js.map +1 -0
- package/dist/src/commands/module/list.d.ts +10 -0
- package/dist/src/commands/module/list.js +73 -0
- package/dist/src/commands/module/list.js.map +1 -0
- package/dist/src/commands/module/remove.d.ts +12 -0
- package/dist/src/commands/module/remove.js +71 -0
- package/dist/src/commands/module/remove.js.map +1 -0
- package/dist/src/commands/module/update.d.ts +11 -0
- package/dist/src/commands/module/update.js +52 -0
- package/dist/src/commands/module/update.js.map +1 -0
- package/dist/src/commands/run.d.ts +11 -0
- package/dist/src/commands/run.js +93 -0
- package/dist/src/commands/run.js.map +1 -0
- package/dist/src/commands/{login.d.ts → setup.d.ts} +2 -2
- package/dist/src/commands/setup.js +62 -0
- package/dist/src/commands/setup.js.map +1 -0
- package/dist/src/utils/discovery.d.ts +13 -0
- package/dist/src/utils/discovery.js +9 -0
- package/dist/src/utils/git.d.ts +16 -0
- package/dist/src/utils/git.js +29 -0
- package/dist/src/utils/git.js.map +1 -0
- package/dist/src/utils/url-resolver.d.ts +15 -0
- package/dist/src/utils/url-resolver.js +9 -0
- package/dist/src/utils/url-resolver.js.map +1 -0
- package/index.ts +29 -5
- package/package.json +32 -30
- package/src/commands/init.ts +86 -0
- package/src/commands/module/add.ts +169 -0
- package/src/commands/module/list.ts +69 -0
- package/src/commands/module/remove.ts +74 -0
- package/src/commands/module/update.ts +50 -0
- package/src/commands/run.ts +98 -0
- package/src/commands/setup.ts +74 -0
- package/src/utils/discovery.ts +134 -0
- package/src/utils/git.ts +65 -0
- package/src/utils/url-resolver.ts +57 -0
- package/test/e2e/lifecycle.e2e.test.ts +153 -0
- package/test/integration/commands/init.integration.test.ts +85 -0
- package/test/integration/commands/module.integration.test.ts +144 -0
- package/test/integration/commands/run.integration.test.ts +90 -0
- package/test/integration/utils/command-loading.integration.test.ts +80 -0
- package/test/unit/commands/init.test.ts +153 -0
- package/test/unit/commands/module/add.test.ts +262 -0
- package/test/unit/commands/module/list.test.ts +115 -0
- package/test/unit/commands/module/remove.test.ts +89 -0
- package/test/unit/commands/module/update.test.ts +91 -0
- package/test/unit/commands/run.test.ts +252 -0
- package/test/unit/commands/setup.test.ts +169 -0
- package/test/unit/utils/command-discovery.test.ts +176 -0
- package/test/unit/utils/git.test.ts +152 -0
- package/test/unit/utils/integration-helpers.test.ts +72 -0
- package/test/unit/utils/url-resolver.test.ts +39 -0
- package/test/utils/integration-helpers.ts +66 -0
- package/vitest.e2e.config.ts +0 -1
- package/dist/chunk-JDRAVUKK.js +0 -48
- package/dist/chunk-JDRAVUKK.js.map +0 -1
- package/dist/src/commands/admin/create-user.d.ts +0 -15
- package/dist/src/commands/admin/create-user.js +0 -49
- package/dist/src/commands/admin/create-user.js.map +0 -1
- package/dist/src/commands/branch/create.d.ts +0 -19
- package/dist/src/commands/branch/create.js +0 -59
- package/dist/src/commands/branch/create.js.map +0 -1
- package/dist/src/commands/branch/delete.d.ts +0 -15
- package/dist/src/commands/branch/delete.js +0 -50
- package/dist/src/commands/branch/delete.js.map +0 -1
- package/dist/src/commands/branch/get.d.ts +0 -15
- package/dist/src/commands/branch/get.js +0 -53
- package/dist/src/commands/branch/get.js.map +0 -1
- package/dist/src/commands/branch/list.d.ts +0 -15
- package/dist/src/commands/branch/list.js +0 -51
- package/dist/src/commands/branch/list.js.map +0 -1
- package/dist/src/commands/job/get.d.ts +0 -15
- package/dist/src/commands/job/get.js +0 -62
- package/dist/src/commands/job/get.js.map +0 -1
- package/dist/src/commands/job/list.d.ts +0 -15
- package/dist/src/commands/job/list.js +0 -57
- package/dist/src/commands/job/list.js.map +0 -1
- package/dist/src/commands/job/logs.d.ts +0 -15
- package/dist/src/commands/job/logs.js +0 -67
- package/dist/src/commands/job/logs.js.map +0 -1
- package/dist/src/commands/job/trigger.d.ts +0 -19
- package/dist/src/commands/job/trigger.js +0 -74
- package/dist/src/commands/job/trigger.js.map +0 -1
- package/dist/src/commands/login.js +0 -31
- package/dist/src/commands/login.js.map +0 -1
- package/dist/src/commands/project/create.d.ts +0 -24
- package/dist/src/commands/project/create.js +0 -63
- package/dist/src/commands/project/create.js.map +0 -1
- package/dist/src/commands/project/delete.d.ts +0 -20
- package/dist/src/commands/project/delete.js +0 -58
- package/dist/src/commands/project/delete.js.map +0 -1
- package/dist/src/commands/project/get.d.ts +0 -15
- package/dist/src/commands/project/get.js +0 -49
- package/dist/src/commands/project/get.js.map +0 -1
- package/dist/src/commands/project/list.d.ts +0 -15
- package/dist/src/commands/project/list.js +0 -45
- package/dist/src/commands/project/list.js.map +0 -1
- package/dist/src/commands/project/update.d.ts +0 -19
- package/dist/src/commands/project/update.js +0 -66
- package/dist/src/commands/project/update.js.map +0 -1
- package/dist/src/commands/team/create.d.ts +0 -19
- package/dist/src/commands/team/create.js +0 -45
- package/dist/src/commands/team/create.js.map +0 -1
- package/dist/src/commands/team/delete.d.ts +0 -20
- package/dist/src/commands/team/delete.js +0 -52
- package/dist/src/commands/team/delete.js.map +0 -1
- package/dist/src/commands/team/get.d.ts +0 -15
- package/dist/src/commands/team/get.js +0 -42
- package/dist/src/commands/team/get.js.map +0 -1
- package/dist/src/commands/team/list.d.ts +0 -8
- package/dist/src/commands/team/list.js +0 -30
- package/dist/src/commands/team/list.js.map +0 -1
- package/dist/src/commands/team/member/invite.d.ts +0 -20
- package/dist/src/commands/team/member/invite.js +0 -54
- package/dist/src/commands/team/member/invite.js.map +0 -1
- package/dist/src/commands/team/member/remove.d.ts +0 -15
- package/dist/src/commands/team/member/remove.js +0 -43
- package/dist/src/commands/team/member/remove.js.map +0 -1
- package/dist/src/commands/team/update.d.ts +0 -19
- package/dist/src/commands/team/update.js +0 -55
- package/dist/src/commands/team/update.js.map +0 -1
- package/dist/src/commands/token/generate.d.ts +0 -19
- package/dist/src/commands/token/generate.js +0 -48
- package/dist/src/commands/token/generate.js.map +0 -1
- package/dist/src/commands/token/list.d.ts +0 -8
- package/dist/src/commands/token/list.js +0 -31
- package/dist/src/commands/token/list.js.map +0 -1
- package/dist/src/commands/token/revoke.d.ts +0 -15
- package/dist/src/commands/token/revoke.js +0 -38
- package/dist/src/commands/token/revoke.js.map +0 -1
- package/dist/src/commands/whoami.d.ts +0 -8
- package/dist/src/commands/whoami.js +0 -26
- package/dist/src/commands/whoami.js.map +0 -1
- package/dist/src/utils/nexical-client.d.ts +0 -10
- package/dist/src/utils/nexical-client.js +0 -12
- package/src/commands/admin/create-user.ts +0 -46
- package/src/commands/branch/create.ts +0 -57
- package/src/commands/branch/delete.ts +0 -47
- package/src/commands/branch/get.ts +0 -50
- package/src/commands/branch/list.ts +0 -50
- package/src/commands/job/get.ts +0 -59
- package/src/commands/job/list.ts +0 -56
- package/src/commands/job/logs.ts +0 -67
- package/src/commands/job/trigger.ts +0 -73
- package/src/commands/login.ts +0 -31
- package/src/commands/project/create.ts +0 -61
- package/src/commands/project/delete.ts +0 -56
- package/src/commands/project/get.ts +0 -46
- package/src/commands/project/list.ts +0 -44
- package/src/commands/project/update.ts +0 -63
- package/src/commands/team/create.ts +0 -43
- package/src/commands/team/delete.ts +0 -50
- package/src/commands/team/get.ts +0 -39
- package/src/commands/team/list.ts +0 -26
- package/src/commands/team/member/invite.ts +0 -56
- package/src/commands/team/member/remove.ts +0 -40
- package/src/commands/team/update.ts +0 -53
- package/src/commands/token/generate.ts +0 -45
- package/src/commands/token/list.ts +0 -27
- package/src/commands/token/revoke.ts +0 -35
- package/src/commands/whoami.ts +0 -21
- package/src/utils/nexical-client.ts +0 -47
- package/test/e2e/auth.e2e.test.ts +0 -46
- package/test/e2e/job-workflow.e2e.test.ts +0 -33
- package/test/e2e/project-lifecycle.e2e.test.ts +0 -48
- package/test/e2e/setup.ts +0 -237
- package/test/e2e/utils.ts +0 -33
- package/test/integration/commands/admin/create-user.test.ts +0 -51
- package/test/integration/commands/branch/create.test.ts +0 -51
- package/test/integration/commands/branch/delete.test.ts +0 -43
- package/test/integration/commands/branch/get.test.ts +0 -49
- package/test/integration/commands/branch/list.test.ts +0 -47
- package/test/integration/commands/job/get.test.ts +0 -54
- package/test/integration/commands/job/list.test.ts +0 -47
- package/test/integration/commands/job/logs.test.ts +0 -47
- package/test/integration/commands/job/trigger.test.ts +0 -57
- package/test/integration/commands/login.test.ts +0 -62
- package/test/integration/commands/project/create.test.ts +0 -53
- package/test/integration/commands/project/delete.test.ts +0 -43
- package/test/integration/commands/project/get.test.ts +0 -51
- package/test/integration/commands/project/list.test.ts +0 -47
- package/test/integration/commands/project/update.test.ts +0 -53
- package/test/integration/commands/team/create.test.ts +0 -53
- package/test/integration/commands/team/delete.test.ts +0 -43
- package/test/integration/commands/team/get.test.ts +0 -50
- package/test/integration/commands/team/list.test.ts +0 -47
- package/test/integration/commands/team/member/invite.test.ts +0 -46
- package/test/integration/commands/team/member/remove.test.ts +0 -43
- package/test/integration/commands/team/update.test.ts +0 -50
- package/test/integration/commands/token/generate.test.ts +0 -51
- package/test/integration/commands/token/list.test.ts +0 -47
- package/test/integration/commands/token/revoke.test.ts +0 -43
- package/test/integration/commands/whoami.test.ts +0 -49
- package/test/unit/commands/admin/create-user.test.ts +0 -51
- package/test/unit/commands/branch/create.test.ts +0 -57
- package/test/unit/commands/branch/delete.test.ts +0 -49
- package/test/unit/commands/branch/get.test.ts +0 -67
- package/test/unit/commands/branch/list.test.ts +0 -62
- package/test/unit/commands/job/get.test.ts +0 -76
- package/test/unit/commands/job/list.test.ts +0 -62
- package/test/unit/commands/job/logs.test.ts +0 -60
- package/test/unit/commands/job/trigger.test.ts +0 -75
- package/test/unit/commands/login.test.ts +0 -64
- package/test/unit/commands/project/create.test.ts +0 -64
- package/test/unit/commands/project/delete.test.ts +0 -72
- package/test/unit/commands/project/get.test.ts +0 -73
- package/test/unit/commands/project/list.test.ts +0 -62
- package/test/unit/commands/project/update.test.ts +0 -58
- package/test/unit/commands/team/create.test.ts +0 -68
- package/test/unit/commands/team/delete.test.ts +0 -71
- package/test/unit/commands/team/get.test.ts +0 -70
- package/test/unit/commands/team/list.test.ts +0 -56
- package/test/unit/commands/team/member/invite.test.ts +0 -52
- package/test/unit/commands/team/member/remove.test.ts +0 -49
- package/test/unit/commands/team/update.test.ts +0 -63
- package/test/unit/commands/token/generate.test.ts +0 -65
- package/test/unit/commands/token/list.test.ts +0 -58
- package/test/unit/commands/token/revoke.test.ts +0 -49
- package/test/unit/commands/whoami.test.ts +0 -49
- package/test/unit/utils/nexical-client.test.ts +0 -113
- /package/dist/src/utils/{nexical-client.js.map → discovery.js.map} +0 -0
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
3
|
-
import JobsTriggerCommand from '../../../../src/commands/job/trigger.js';
|
|
4
|
-
import { getClient } from '../../../../src/utils/nexical-client.js';
|
|
5
|
-
|
|
6
|
-
vi.mock('../../../../src/utils/nexical-client.js');
|
|
7
|
-
|
|
8
|
-
describe('JobsTriggerCommand Integration', () => {
|
|
9
|
-
let command: JobsTriggerCommand;
|
|
10
|
-
let mockClient: any;
|
|
11
|
-
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
vi.resetAllMocks();
|
|
14
|
-
|
|
15
|
-
mockClient = {
|
|
16
|
-
jobs: {
|
|
17
|
-
create: vi.fn(),
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
vi.mocked(getClient).mockReturnValue(mockClient);
|
|
21
|
-
|
|
22
|
-
command = new JobsTriggerCommand([], {} as any);
|
|
23
|
-
vi.spyOn(command, 'success').mockImplementation(() => { });
|
|
24
|
-
vi.spyOn(command, 'error').mockImplementation(() => { });
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('should trigger job successfully', async () => {
|
|
28
|
-
mockClient.jobs.create.mockResolvedValue({ id: 'job-new' });
|
|
29
|
-
|
|
30
|
-
await command.run({ teamId: '1', projectId: '2', branchId: '3', type: 'build' });
|
|
31
|
-
|
|
32
|
-
expect(mockClient.jobs.create).toHaveBeenCalledWith(1, 2, 3, {
|
|
33
|
-
type: 'build',
|
|
34
|
-
inputs: {},
|
|
35
|
-
});
|
|
36
|
-
expect(command.success).toHaveBeenCalledWith('Job job-new triggered successfully!');
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it('should trigger job with input', async () => {
|
|
40
|
-
mockClient.jobs.create.mockResolvedValue({ id: 'job-new' });
|
|
41
|
-
|
|
42
|
-
await command.run({ teamId: '1', projectId: '2', branchId: '3', type: 'deploy', input: '{"env":"prod"}' });
|
|
43
|
-
|
|
44
|
-
expect(mockClient.jobs.create).toHaveBeenCalledWith(1, 2, 3, {
|
|
45
|
-
type: 'deploy',
|
|
46
|
-
inputs: { env: 'prod' },
|
|
47
|
-
});
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it('should handle trigger failure', async () => {
|
|
51
|
-
mockClient.jobs.create.mockRejectedValue(new Error('Quota exceeded'));
|
|
52
|
-
|
|
53
|
-
await command.run({ teamId: '1', projectId: '2', branchId: '3', type: 'build' });
|
|
54
|
-
|
|
55
|
-
expect(command.error).toHaveBeenCalledWith('Failed to trigger job: Quota exceeded');
|
|
56
|
-
});
|
|
57
|
-
});
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
3
|
-
import LoginCommand from '../../../src/commands/login.js';
|
|
4
|
-
import { getClient, saveToken } from '../../../src/utils/nexical-client.js';
|
|
5
|
-
|
|
6
|
-
vi.mock('../../../src/utils/nexical-client.js');
|
|
7
|
-
|
|
8
|
-
describe('LoginCommand Integration', () => {
|
|
9
|
-
let command: LoginCommand;
|
|
10
|
-
let mockClient: any;
|
|
11
|
-
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
vi.resetAllMocks();
|
|
14
|
-
|
|
15
|
-
mockClient = {
|
|
16
|
-
auth: {
|
|
17
|
-
authenticateDevice: vi.fn(),
|
|
18
|
-
},
|
|
19
|
-
users: {
|
|
20
|
-
me: vi.fn(),
|
|
21
|
-
},
|
|
22
|
-
setToken: vi.fn(),
|
|
23
|
-
};
|
|
24
|
-
vi.mocked(getClient).mockReturnValue(mockClient);
|
|
25
|
-
|
|
26
|
-
command = new LoginCommand([], {} as any);
|
|
27
|
-
vi.spyOn(command, 'info').mockImplementation(() => { });
|
|
28
|
-
vi.spyOn(command, 'notice').mockImplementation(() => { });
|
|
29
|
-
vi.spyOn(command, 'success').mockImplementation(() => { });
|
|
30
|
-
vi.spyOn(command, 'error').mockImplementation(() => { });
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
it('should authenticate successfully', async () => {
|
|
34
|
-
mockClient.auth.authenticateDevice.mockImplementation(async (_clientId: string, callback: any) => {
|
|
35
|
-
callback('USER-CODE', 'https://verify.url');
|
|
36
|
-
return 'new-token';
|
|
37
|
-
});
|
|
38
|
-
mockClient.users.me.mockResolvedValue({ fullName: 'Integration User', email: 'int@example.com' });
|
|
39
|
-
|
|
40
|
-
await command.run();
|
|
41
|
-
|
|
42
|
-
expect(command.info).toHaveBeenCalledWith('Starting device authentication...');
|
|
43
|
-
expect(mockClient.auth.authenticateDevice).toHaveBeenCalledWith('nexical-cli', expect.any(Function));
|
|
44
|
-
|
|
45
|
-
expect(command.notice).toHaveBeenCalledWith('Please visit: https://verify.url');
|
|
46
|
-
expect(command.notice).toHaveBeenCalledWith('And enter code: USER-CODE');
|
|
47
|
-
|
|
48
|
-
expect(saveToken).toHaveBeenCalledWith('new-token');
|
|
49
|
-
expect(mockClient.setToken).toHaveBeenCalledWith('new-token');
|
|
50
|
-
expect(mockClient.users.me).toHaveBeenCalled();
|
|
51
|
-
expect(command.success).toHaveBeenCalledWith('Successfully logged in as Integration User (int@example.com)');
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it('should handle authentication failure', async () => {
|
|
55
|
-
mockClient.auth.authenticateDevice.mockRejectedValue(new Error('Auth failed'));
|
|
56
|
-
|
|
57
|
-
await command.run();
|
|
58
|
-
|
|
59
|
-
expect(command.error).toHaveBeenCalledWith('Login failed: Auth failed');
|
|
60
|
-
expect(saveToken).not.toHaveBeenCalled();
|
|
61
|
-
});
|
|
62
|
-
});
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
3
|
-
import ProjectsCreateCommand from '../../../../src/commands/project/create.js';
|
|
4
|
-
import { getClient } from '../../../../src/utils/nexical-client.js';
|
|
5
|
-
|
|
6
|
-
vi.mock('../../../../src/utils/nexical-client.js');
|
|
7
|
-
|
|
8
|
-
describe('ProjectsCreateCommand Integration', () => {
|
|
9
|
-
let command: ProjectsCreateCommand;
|
|
10
|
-
let mockClient: any;
|
|
11
|
-
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
vi.resetAllMocks();
|
|
14
|
-
|
|
15
|
-
mockClient = {
|
|
16
|
-
projects: {
|
|
17
|
-
create: vi.fn(),
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
vi.mocked(getClient).mockReturnValue(mockClient);
|
|
21
|
-
|
|
22
|
-
command = new ProjectsCreateCommand([], {} as any);
|
|
23
|
-
vi.spyOn(command, 'info').mockImplementation(() => { });
|
|
24
|
-
vi.spyOn(command, 'success').mockImplementation(() => { });
|
|
25
|
-
vi.spyOn(command, 'error').mockImplementation(() => { });
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it('should create project successfully', async () => {
|
|
29
|
-
mockClient.projects.create.mockResolvedValue({
|
|
30
|
-
name: 'New Project',
|
|
31
|
-
id: 'proj-1'
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
await command.run({ teamId: '1', name: 'New Project', repo: 'git@repo', prod: 'http://prod.com' });
|
|
35
|
-
|
|
36
|
-
expect(mockClient.projects.create).toHaveBeenCalledWith(1, {
|
|
37
|
-
name: 'New Project',
|
|
38
|
-
repoUrl: 'git@repo',
|
|
39
|
-
productionUrl: 'http://prod.com',
|
|
40
|
-
mode: undefined
|
|
41
|
-
});
|
|
42
|
-
expect(command.success).toHaveBeenCalledWith('Project "New Project" set up successfully!');
|
|
43
|
-
expect(command.info).toHaveBeenCalledWith('ID: proj-1');
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it('should handle creation failure', async () => {
|
|
47
|
-
mockClient.projects.create.mockRejectedValue(new Error('Project exists'));
|
|
48
|
-
|
|
49
|
-
await command.run({ teamId: '1', name: 'New Project' });
|
|
50
|
-
|
|
51
|
-
expect(command.error).toHaveBeenCalledWith('Failed to create project: Project exists');
|
|
52
|
-
});
|
|
53
|
-
});
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
3
|
-
import ProjectsDeleteCommand from '../../../../src/commands/project/delete.js';
|
|
4
|
-
import { getClient } from '../../../../src/utils/nexical-client.js';
|
|
5
|
-
|
|
6
|
-
vi.mock('../../../../src/utils/nexical-client.js');
|
|
7
|
-
|
|
8
|
-
describe('ProjectsDeleteCommand Integration', () => {
|
|
9
|
-
let command: ProjectsDeleteCommand;
|
|
10
|
-
let mockClient: any;
|
|
11
|
-
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
vi.resetAllMocks();
|
|
14
|
-
|
|
15
|
-
mockClient = {
|
|
16
|
-
projects: {
|
|
17
|
-
delete: vi.fn(),
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
vi.mocked(getClient).mockReturnValue(mockClient);
|
|
21
|
-
|
|
22
|
-
command = new ProjectsDeleteCommand([], {} as any);
|
|
23
|
-
vi.spyOn(command, 'success').mockImplementation(() => { });
|
|
24
|
-
vi.spyOn(command, 'error').mockImplementation(() => { });
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('should delete project successfully', async () => {
|
|
28
|
-
mockClient.projects.delete.mockResolvedValue({});
|
|
29
|
-
|
|
30
|
-
await command.run({ teamId: '1', projectId: '2', confirm: true });
|
|
31
|
-
|
|
32
|
-
expect(mockClient.projects.delete).toHaveBeenCalledWith(1, 2);
|
|
33
|
-
expect(command.success).toHaveBeenCalledWith('Project 2 deleted.');
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
it('should handle deletion failure', async () => {
|
|
37
|
-
mockClient.projects.delete.mockRejectedValue(new Error('Project not found'));
|
|
38
|
-
|
|
39
|
-
await command.run({ teamId: '1', projectId: '2', confirm: true });
|
|
40
|
-
|
|
41
|
-
expect(command.error).toHaveBeenCalledWith('Failed to delete project: Project not found');
|
|
42
|
-
});
|
|
43
|
-
});
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
3
|
-
import ProjectsGetCommand from '../../../../src/commands/project/get.js';
|
|
4
|
-
import { getClient } from '../../../../src/utils/nexical-client.js';
|
|
5
|
-
|
|
6
|
-
vi.mock('../../../../src/utils/nexical-client.js');
|
|
7
|
-
|
|
8
|
-
describe('ProjectsGetCommand Integration', () => {
|
|
9
|
-
let command: ProjectsGetCommand;
|
|
10
|
-
let mockClient: any;
|
|
11
|
-
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
vi.resetAllMocks();
|
|
14
|
-
|
|
15
|
-
mockClient = {
|
|
16
|
-
projects: {
|
|
17
|
-
get: vi.fn(),
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
vi.mocked(getClient).mockReturnValue(mockClient);
|
|
21
|
-
|
|
22
|
-
command = new ProjectsGetCommand([], {} as any);
|
|
23
|
-
vi.spyOn(command, 'info').mockImplementation(() => { });
|
|
24
|
-
vi.spyOn(command, 'error').mockImplementation(() => { });
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('should get project details successfully', async () => {
|
|
28
|
-
mockClient.projects.get.mockResolvedValue({
|
|
29
|
-
id: '101',
|
|
30
|
-
name: 'My Project',
|
|
31
|
-
repoUrl: 'git@repo',
|
|
32
|
-
productionUrl: 'http://prod.com',
|
|
33
|
-
mode: 'full'
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
await command.run({ teamId: '1', projectId: '101' });
|
|
37
|
-
|
|
38
|
-
expect(mockClient.projects.get).toHaveBeenCalledWith(1, 101);
|
|
39
|
-
expect(command.info).toHaveBeenCalledWith('Project Details:');
|
|
40
|
-
expect(command.info).toHaveBeenCalledWith(' ID: 101');
|
|
41
|
-
expect(command.info).toHaveBeenCalledWith(' Name: My Project');
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
it('should handle get failure', async () => {
|
|
45
|
-
mockClient.projects.get.mockRejectedValue(new Error('Project not found'));
|
|
46
|
-
|
|
47
|
-
await command.run({ teamId: '1', projectId: '101' });
|
|
48
|
-
|
|
49
|
-
expect(command.error).toHaveBeenCalledWith('Failed to get project: Project not found');
|
|
50
|
-
});
|
|
51
|
-
});
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
3
|
-
import ProjectsListCommand from '../../../../src/commands/project/list.js';
|
|
4
|
-
import { getClient } from '../../../../src/utils/nexical-client.js';
|
|
5
|
-
|
|
6
|
-
vi.mock('../../../../src/utils/nexical-client.js');
|
|
7
|
-
|
|
8
|
-
describe('ProjectsListCommand Integration', () => {
|
|
9
|
-
let command: ProjectsListCommand;
|
|
10
|
-
let mockClient: any;
|
|
11
|
-
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
vi.resetAllMocks();
|
|
14
|
-
|
|
15
|
-
mockClient = {
|
|
16
|
-
projects: {
|
|
17
|
-
list: vi.fn(),
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
vi.mocked(getClient).mockReturnValue(mockClient);
|
|
21
|
-
|
|
22
|
-
command = new ProjectsListCommand([], {} as any);
|
|
23
|
-
vi.spyOn(command, 'info').mockImplementation(() => { });
|
|
24
|
-
vi.spyOn(command, 'error').mockImplementation(() => { });
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('should list projects successfully', async () => {
|
|
28
|
-
mockClient.projects.list.mockResolvedValue([
|
|
29
|
-
{ id: '101', name: 'Project A' },
|
|
30
|
-
{ id: '102', name: 'Project B' }
|
|
31
|
-
]);
|
|
32
|
-
|
|
33
|
-
await command.run({ teamId: '1' });
|
|
34
|
-
|
|
35
|
-
expect(mockClient.projects.list).toHaveBeenCalledWith(1);
|
|
36
|
-
expect(command.info).toHaveBeenCalledWith('Projects in Team 1:');
|
|
37
|
-
expect(command.info).toHaveBeenCalledWith('- Project A (ID: 101) [No Repo]');
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it('should handle list failure', async () => {
|
|
41
|
-
mockClient.projects.list.mockRejectedValue(new Error('Network error'));
|
|
42
|
-
|
|
43
|
-
await command.run({ teamId: '1' });
|
|
44
|
-
|
|
45
|
-
expect(command.error).toHaveBeenCalledWith('Failed to list projects: Network error');
|
|
46
|
-
});
|
|
47
|
-
});
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
3
|
-
import ProjectsUpdateCommand from '../../../../src/commands/project/update.js';
|
|
4
|
-
import { getClient } from '../../../../src/utils/nexical-client.js';
|
|
5
|
-
|
|
6
|
-
vi.mock('../../../../src/utils/nexical-client.js');
|
|
7
|
-
|
|
8
|
-
describe('ProjectsUpdateCommand Integration', () => {
|
|
9
|
-
let command: ProjectsUpdateCommand;
|
|
10
|
-
let mockClient: any;
|
|
11
|
-
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
vi.resetAllMocks();
|
|
14
|
-
|
|
15
|
-
mockClient = {
|
|
16
|
-
projects: {
|
|
17
|
-
update: vi.fn(),
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
vi.mocked(getClient).mockReturnValue(mockClient);
|
|
21
|
-
|
|
22
|
-
command = new ProjectsUpdateCommand([], {} as any);
|
|
23
|
-
vi.spyOn(command, 'success').mockImplementation(() => { });
|
|
24
|
-
vi.spyOn(command, 'info').mockImplementation(() => { });
|
|
25
|
-
vi.spyOn(command, 'error').mockImplementation(() => { });
|
|
26
|
-
vi.spyOn(command, 'warn').mockImplementation(() => { });
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it('should update project successfully', async () => {
|
|
30
|
-
mockClient.projects.update.mockResolvedValue({
|
|
31
|
-
id: '101',
|
|
32
|
-
name: 'Updated Name',
|
|
33
|
-
repoUrl: 'git@newrepo'
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
await command.run({ teamId: '1', projectId: '101', name: 'Updated Name', repo: 'git@newrepo' });
|
|
37
|
-
|
|
38
|
-
expect(mockClient.projects.update).toHaveBeenCalledWith(1, 101, {
|
|
39
|
-
name: 'Updated Name',
|
|
40
|
-
repoUrl: 'git@newrepo',
|
|
41
|
-
});
|
|
42
|
-
expect(command.success).toHaveBeenCalledWith('Project 101 updated!');
|
|
43
|
-
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it('should handle update failure', async () => {
|
|
47
|
-
mockClient.projects.update.mockRejectedValue(new Error('Update failed'));
|
|
48
|
-
|
|
49
|
-
await command.run({ teamId: '1', projectId: '101', name: 'New Name' });
|
|
50
|
-
|
|
51
|
-
expect(command.error).toHaveBeenCalledWith('Failed to update project: Update failed');
|
|
52
|
-
});
|
|
53
|
-
});
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
3
|
-
import TeamsCreateCommand from '../../../../src/commands/team/create.js';
|
|
4
|
-
import { getClient } from '../../../../src/utils/nexical-client.js';
|
|
5
|
-
|
|
6
|
-
vi.mock('../../../../src/utils/nexical-client.js');
|
|
7
|
-
|
|
8
|
-
describe('TeamsCreateCommand Integration', () => {
|
|
9
|
-
let command: TeamsCreateCommand;
|
|
10
|
-
let mockClient: any;
|
|
11
|
-
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
vi.resetAllMocks();
|
|
14
|
-
|
|
15
|
-
mockClient = {
|
|
16
|
-
teams: {
|
|
17
|
-
create: vi.fn(),
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
vi.mocked(getClient).mockReturnValue(mockClient);
|
|
21
|
-
|
|
22
|
-
command = new TeamsCreateCommand([], {} as any);
|
|
23
|
-
vi.spyOn(command, 'info').mockImplementation(() => { });
|
|
24
|
-
vi.spyOn(command, 'success').mockImplementation(() => { });
|
|
25
|
-
vi.spyOn(command, 'error').mockImplementation(() => { });
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it('should create team successfully', async () => {
|
|
29
|
-
mockClient.teams.create.mockResolvedValue({
|
|
30
|
-
name: 'New Team',
|
|
31
|
-
id: 'team-1',
|
|
32
|
-
slug: 'new-team'
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
await command.run({ name: 'New Team', slug: 'new-team' });
|
|
36
|
-
|
|
37
|
-
expect(mockClient.teams.create).toHaveBeenCalledWith({
|
|
38
|
-
name: 'New Team',
|
|
39
|
-
slug: 'new-team'
|
|
40
|
-
});
|
|
41
|
-
expect(command.success).toHaveBeenCalledWith('Team "New Team" created successfully!');
|
|
42
|
-
expect(command.info).toHaveBeenCalledWith('ID: team-1');
|
|
43
|
-
expect(command.info).toHaveBeenCalledWith('Slug: new-team');
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it('should handle creation failure', async () => {
|
|
47
|
-
mockClient.teams.create.mockRejectedValue(new Error('Slug taken'));
|
|
48
|
-
|
|
49
|
-
await command.run({ name: 'New Team', slug: 'team' });
|
|
50
|
-
|
|
51
|
-
expect(command.error).toHaveBeenCalledWith('Failed to create team: Slug taken');
|
|
52
|
-
});
|
|
53
|
-
});
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
3
|
-
import TeamsDeleteCommand from '../../../../src/commands/team/delete.js';
|
|
4
|
-
import { getClient } from '../../../../src/utils/nexical-client.js';
|
|
5
|
-
|
|
6
|
-
vi.mock('../../../../src/utils/nexical-client.js');
|
|
7
|
-
|
|
8
|
-
describe('TeamsDeleteCommand Integration', () => {
|
|
9
|
-
let command: TeamsDeleteCommand;
|
|
10
|
-
let mockClient: any;
|
|
11
|
-
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
vi.resetAllMocks();
|
|
14
|
-
|
|
15
|
-
mockClient = {
|
|
16
|
-
teams: {
|
|
17
|
-
delete: vi.fn(),
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
vi.mocked(getClient).mockReturnValue(mockClient);
|
|
21
|
-
|
|
22
|
-
command = new TeamsDeleteCommand([], {} as any);
|
|
23
|
-
vi.spyOn(command, 'success').mockImplementation(() => { });
|
|
24
|
-
vi.spyOn(command, 'error').mockImplementation(() => { });
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('should delete team successfully', async () => {
|
|
28
|
-
mockClient.teams.delete.mockResolvedValue({});
|
|
29
|
-
|
|
30
|
-
await command.run({ teamId: '1', confirm: true });
|
|
31
|
-
|
|
32
|
-
expect(mockClient.teams.delete).toHaveBeenCalledWith(1);
|
|
33
|
-
expect(command.success).toHaveBeenCalledWith('Team 1 deleted.');
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
it('should handle deletion failure', async () => {
|
|
37
|
-
mockClient.teams.delete.mockRejectedValue(new Error('Permission denied'));
|
|
38
|
-
|
|
39
|
-
await command.run({ teamId: '1', confirm: true });
|
|
40
|
-
|
|
41
|
-
expect(command.error).toHaveBeenCalledWith('Failed to delete team: Permission denied');
|
|
42
|
-
});
|
|
43
|
-
});
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
3
|
-
import TeamsGetCommand from '../../../../src/commands/team/get.js';
|
|
4
|
-
import { getClient } from '../../../../src/utils/nexical-client.js';
|
|
5
|
-
|
|
6
|
-
vi.mock('../../../../src/utils/nexical-client.js');
|
|
7
|
-
|
|
8
|
-
describe('TeamsGetCommand Integration', () => {
|
|
9
|
-
let command: TeamsGetCommand;
|
|
10
|
-
let mockClient: any;
|
|
11
|
-
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
vi.resetAllMocks();
|
|
14
|
-
|
|
15
|
-
mockClient = {
|
|
16
|
-
teams: {
|
|
17
|
-
get: vi.fn(),
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
vi.mocked(getClient).mockReturnValue(mockClient);
|
|
21
|
-
|
|
22
|
-
command = new TeamsGetCommand([], {} as any);
|
|
23
|
-
vi.spyOn(command, 'info').mockImplementation(() => { });
|
|
24
|
-
vi.spyOn(command, 'error').mockImplementation(() => { });
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('should get team details successfully', async () => {
|
|
28
|
-
mockClient.teams.get.mockResolvedValue({
|
|
29
|
-
id: '1',
|
|
30
|
-
name: 'My Team',
|
|
31
|
-
slug: 'my-team',
|
|
32
|
-
role: 'owner'
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
await command.run({ teamId: '1' });
|
|
36
|
-
|
|
37
|
-
expect(mockClient.teams.get).toHaveBeenCalledWith(1);
|
|
38
|
-
expect(command.info).toHaveBeenCalledWith('Team Details:');
|
|
39
|
-
expect(command.info).toHaveBeenCalledWith(' Name: My Team');
|
|
40
|
-
expect(command.info).toHaveBeenCalledWith(' Role: owner');
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it('should handle get failure', async () => {
|
|
44
|
-
mockClient.teams.get.mockRejectedValue(new Error('Not found'));
|
|
45
|
-
|
|
46
|
-
await command.run({ teamId: '1' });
|
|
47
|
-
|
|
48
|
-
expect(command.error).toHaveBeenCalledWith('Failed to get team: Not found');
|
|
49
|
-
});
|
|
50
|
-
});
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
3
|
-
import TeamsListCommand from '../../../../src/commands/team/list.js';
|
|
4
|
-
import { getClient } from '../../../../src/utils/nexical-client.js';
|
|
5
|
-
|
|
6
|
-
vi.mock('../../../../src/utils/nexical-client.js');
|
|
7
|
-
|
|
8
|
-
describe('TeamsListCommand Integration', () => {
|
|
9
|
-
let command: TeamsListCommand;
|
|
10
|
-
let mockClient: any;
|
|
11
|
-
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
vi.resetAllMocks();
|
|
14
|
-
|
|
15
|
-
mockClient = {
|
|
16
|
-
teams: {
|
|
17
|
-
list: vi.fn(),
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
vi.mocked(getClient).mockReturnValue(mockClient);
|
|
21
|
-
|
|
22
|
-
command = new TeamsListCommand([], {} as any);
|
|
23
|
-
vi.spyOn(command, 'info').mockImplementation(() => { });
|
|
24
|
-
vi.spyOn(command, 'error').mockImplementation(() => { });
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('should list teams successfully', async () => {
|
|
28
|
-
mockClient.teams.list.mockResolvedValue([
|
|
29
|
-
{ name: 'Team A', slug: 'team-a', role: 'admin' },
|
|
30
|
-
{ name: 'Team B', slug: 'team-b' }
|
|
31
|
-
]);
|
|
32
|
-
|
|
33
|
-
await command.run();
|
|
34
|
-
|
|
35
|
-
expect(mockClient.teams.list).toHaveBeenCalled();
|
|
36
|
-
expect(command.info).toHaveBeenCalledWith('Your Teams:');
|
|
37
|
-
expect(command.info).toHaveBeenCalledWith('- Team A (team-a) [admin]');
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it('should handle list failure', async () => {
|
|
41
|
-
mockClient.teams.list.mockRejectedValue(new Error('Network error'));
|
|
42
|
-
|
|
43
|
-
await command.run();
|
|
44
|
-
|
|
45
|
-
expect(command.error).toHaveBeenCalledWith('Failed to list teams: Network error');
|
|
46
|
-
});
|
|
47
|
-
});
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
3
|
-
import TeamsInviteCommand from '../../../../../src/commands/team/member/invite.js';
|
|
4
|
-
import { getClient } from '../../../../../src/utils/nexical-client.js';
|
|
5
|
-
|
|
6
|
-
vi.mock('../../../../../src/utils/nexical-client.js');
|
|
7
|
-
|
|
8
|
-
describe('TeamsInviteCommand Integration', () => {
|
|
9
|
-
let command: TeamsInviteCommand;
|
|
10
|
-
let mockClient: any;
|
|
11
|
-
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
vi.resetAllMocks();
|
|
14
|
-
|
|
15
|
-
mockClient = {
|
|
16
|
-
teams: {
|
|
17
|
-
inviteMember: vi.fn(),
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
vi.mocked(getClient).mockReturnValue(mockClient);
|
|
21
|
-
|
|
22
|
-
command = new TeamsInviteCommand([], {} as any);
|
|
23
|
-
vi.spyOn(command, 'success').mockImplementation(() => { });
|
|
24
|
-
vi.spyOn(command, 'error').mockImplementation(() => { });
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('should invite member successfully', async () => {
|
|
28
|
-
mockClient.teams.inviteMember.mockResolvedValue({});
|
|
29
|
-
|
|
30
|
-
await command.run({ teamId: '1', email: 'test@example.com', role: 'member' });
|
|
31
|
-
|
|
32
|
-
expect(mockClient.teams.inviteMember).toHaveBeenCalledWith(1, {
|
|
33
|
-
email: 'test@example.com',
|
|
34
|
-
role: 'member'
|
|
35
|
-
});
|
|
36
|
-
expect(command.success).toHaveBeenCalledWith('Invited test@example.com to team 1 as member.');
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it('should handle invite failure', async () => {
|
|
40
|
-
mockClient.teams.inviteMember.mockRejectedValue(new Error('Invalid email'));
|
|
41
|
-
|
|
42
|
-
await command.run({ teamId: '1', email: 'invalid' });
|
|
43
|
-
|
|
44
|
-
expect(command.error).toHaveBeenCalledWith('Failed to invite member: Invalid email');
|
|
45
|
-
});
|
|
46
|
-
});
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
3
|
-
import TeamsMembersRemoveCommand from '../../../../../src/commands/team/member/remove.js';
|
|
4
|
-
import { getClient } from '../../../../../src/utils/nexical-client.js';
|
|
5
|
-
|
|
6
|
-
vi.mock('../../../../../src/utils/nexical-client.js');
|
|
7
|
-
|
|
8
|
-
describe('TeamsMembersRemoveCommand Integration', () => {
|
|
9
|
-
let command: TeamsMembersRemoveCommand;
|
|
10
|
-
let mockClient: any;
|
|
11
|
-
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
vi.resetAllMocks();
|
|
14
|
-
|
|
15
|
-
mockClient = {
|
|
16
|
-
teams: {
|
|
17
|
-
removeMember: vi.fn(),
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
vi.mocked(getClient).mockReturnValue(mockClient);
|
|
21
|
-
|
|
22
|
-
command = new TeamsMembersRemoveCommand([], {} as any);
|
|
23
|
-
vi.spyOn(command, 'success').mockImplementation(() => { });
|
|
24
|
-
vi.spyOn(command, 'error').mockImplementation(() => { });
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('should remove member successfully', async () => {
|
|
28
|
-
mockClient.teams.removeMember.mockResolvedValue({});
|
|
29
|
-
|
|
30
|
-
await command.run({ teamId: '1', userId: 'user-1' });
|
|
31
|
-
|
|
32
|
-
expect(mockClient.teams.removeMember).toHaveBeenCalledWith(1, 'user-1');
|
|
33
|
-
expect(command.success).toHaveBeenCalledWith('User user-1 removed from team 1.');
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
it('should handle removal failure', async () => {
|
|
37
|
-
mockClient.teams.removeMember.mockRejectedValue(new Error('User not found'));
|
|
38
|
-
|
|
39
|
-
await command.run({ teamId: '1', userId: 'user-1' });
|
|
40
|
-
|
|
41
|
-
expect(command.error).toHaveBeenCalledWith('Failed to remove member: User not found');
|
|
42
|
-
});
|
|
43
|
-
});
|