@nexical/cli 0.1.7 → 0.10.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/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 +88 -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/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 +33 -31
- package/src/commands/init.ts +85 -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/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 +152 -0
- package/test/integration/commands/init.integration.test.ts +82 -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/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.d.ts +0 -8
- 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,49 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
3
|
-
import BranchesGetCommand from '../../../../src/commands/branch/get.js';
|
|
4
|
-
import { getClient } from '../../../../src/utils/nexical-client.js';
|
|
5
|
-
|
|
6
|
-
vi.mock('../../../../src/utils/nexical-client.js');
|
|
7
|
-
|
|
8
|
-
describe('BranchesGetCommand Integration', () => {
|
|
9
|
-
let command: BranchesGetCommand;
|
|
10
|
-
let mockClient: any;
|
|
11
|
-
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
vi.resetAllMocks();
|
|
14
|
-
|
|
15
|
-
mockClient = {
|
|
16
|
-
branches: {
|
|
17
|
-
get: vi.fn(),
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
vi.mocked(getClient).mockReturnValue(mockClient);
|
|
21
|
-
|
|
22
|
-
command = new BranchesGetCommand([], {} as any);
|
|
23
|
-
vi.spyOn(command, 'info').mockImplementation(() => { });
|
|
24
|
-
vi.spyOn(command, 'error').mockImplementation(() => { });
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('should get branch details successfully', async () => {
|
|
28
|
-
mockClient.branches.get.mockResolvedValue({
|
|
29
|
-
id: '100',
|
|
30
|
-
name: 'integration-main',
|
|
31
|
-
previewUrl: 'http://int.com'
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
await command.run({ teamId: '1', projectId: '2', branchId: '100' });
|
|
35
|
-
|
|
36
|
-
expect(mockClient.branches.get).toHaveBeenCalledWith(1, 2, 100);
|
|
37
|
-
expect(command.info).toHaveBeenCalledWith('Branch Details:');
|
|
38
|
-
expect(command.info).toHaveBeenCalledWith(' ID: 100');
|
|
39
|
-
expect(command.info).toHaveBeenCalledWith(' Name: integration-main');
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
it('should handle get failure', async () => {
|
|
43
|
-
mockClient.branches.get.mockRejectedValue(new Error('Not found'));
|
|
44
|
-
|
|
45
|
-
await command.run({ teamId: '1', projectId: '2', branchId: '100' });
|
|
46
|
-
|
|
47
|
-
expect(command.error).toHaveBeenCalledWith('Failed to get branch: Not found');
|
|
48
|
-
});
|
|
49
|
-
});
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
3
|
-
import BranchesListCommand from '../../../../src/commands/branch/list.js';
|
|
4
|
-
import { getClient } from '../../../../src/utils/nexical-client.js';
|
|
5
|
-
|
|
6
|
-
vi.mock('../../../../src/utils/nexical-client.js');
|
|
7
|
-
|
|
8
|
-
describe('BranchesListCommand Integration', () => {
|
|
9
|
-
let command: BranchesListCommand;
|
|
10
|
-
let mockClient: any;
|
|
11
|
-
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
vi.resetAllMocks();
|
|
14
|
-
|
|
15
|
-
mockClient = {
|
|
16
|
-
branches: {
|
|
17
|
-
list: vi.fn(),
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
vi.mocked(getClient).mockReturnValue(mockClient);
|
|
21
|
-
|
|
22
|
-
command = new BranchesListCommand([], {} as any);
|
|
23
|
-
vi.spyOn(command, 'info').mockImplementation(() => { });
|
|
24
|
-
vi.spyOn(command, 'error').mockImplementation(() => { });
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('should list branches successfully', async () => {
|
|
28
|
-
mockClient.branches.list.mockResolvedValue([
|
|
29
|
-
{ id: '100', name: 'integration-main' },
|
|
30
|
-
{ id: '101', name: 'integration-dev' }
|
|
31
|
-
]);
|
|
32
|
-
|
|
33
|
-
await command.run({ teamId: '1', projectId: '2' });
|
|
34
|
-
|
|
35
|
-
expect(mockClient.branches.list).toHaveBeenCalledWith(1, 2);
|
|
36
|
-
expect(command.info).toHaveBeenCalledWith('Branches for Project 2:');
|
|
37
|
-
expect(command.info).toHaveBeenCalledWith('- integration-main (ID: 100)');
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it('should handle list failure', async () => {
|
|
41
|
-
mockClient.branches.list.mockRejectedValue(new Error('Network error'));
|
|
42
|
-
|
|
43
|
-
await command.run({ teamId: '1', projectId: '2' });
|
|
44
|
-
|
|
45
|
-
expect(command.error).toHaveBeenCalledWith('Failed to list branches: Network error');
|
|
46
|
-
});
|
|
47
|
-
});
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
3
|
-
import JobsGetCommand from '../../../../src/commands/job/get.js';
|
|
4
|
-
import { getClient } from '../../../../src/utils/nexical-client.js';
|
|
5
|
-
|
|
6
|
-
vi.mock('../../../../src/utils/nexical-client.js');
|
|
7
|
-
|
|
8
|
-
describe('JobsGetCommand Integration', () => {
|
|
9
|
-
let command: JobsGetCommand;
|
|
10
|
-
let mockClient: any;
|
|
11
|
-
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
vi.resetAllMocks();
|
|
14
|
-
|
|
15
|
-
mockClient = {
|
|
16
|
-
jobs: {
|
|
17
|
-
get: vi.fn(),
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
vi.mocked(getClient).mockReturnValue(mockClient);
|
|
21
|
-
|
|
22
|
-
command = new JobsGetCommand([], {} as any);
|
|
23
|
-
vi.spyOn(command, 'info').mockImplementation(() => { });
|
|
24
|
-
vi.spyOn(command, 'error').mockImplementation(() => { });
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('should get job details successfully', async () => {
|
|
28
|
-
mockClient.jobs.get.mockResolvedValue({
|
|
29
|
-
id: '123',
|
|
30
|
-
type: 'build',
|
|
31
|
-
status: 'success',
|
|
32
|
-
createdAt: '2023-01-01T00:00:00Z',
|
|
33
|
-
finishedAt: '2023-01-01T00:05:00Z',
|
|
34
|
-
startedAt: '2023-01-01T00:01:00Z',
|
|
35
|
-
completedAt: '2023-01-01T00:05:00Z',
|
|
36
|
-
queue: 'default'
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
await command.run({ teamId: '1', projectId: '2', branchId: '3', jobId: '123' });
|
|
40
|
-
|
|
41
|
-
expect(mockClient.jobs.get).toHaveBeenCalledWith(1, 2, 3, 123);
|
|
42
|
-
expect(command.info).toHaveBeenCalledWith('Job Details:');
|
|
43
|
-
expect(command.info).toHaveBeenCalledWith(' ID: 123');
|
|
44
|
-
expect(command.info).toHaveBeenCalledWith(' Status: success');
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
it('should handle get failure', async () => {
|
|
48
|
-
mockClient.jobs.get.mockRejectedValue(new Error('Job not found'));
|
|
49
|
-
|
|
50
|
-
await command.run({ teamId: '1', projectId: '2', branchId: '3', jobId: '123' });
|
|
51
|
-
|
|
52
|
-
expect(command.error).toHaveBeenCalledWith('Failed to get job: Job not found');
|
|
53
|
-
});
|
|
54
|
-
});
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
3
|
-
import JobsListCommand from '../../../../src/commands/job/list.js';
|
|
4
|
-
import { getClient } from '../../../../src/utils/nexical-client.js';
|
|
5
|
-
|
|
6
|
-
vi.mock('../../../../src/utils/nexical-client.js');
|
|
7
|
-
|
|
8
|
-
describe('JobsListCommand Integration', () => {
|
|
9
|
-
let command: JobsListCommand;
|
|
10
|
-
let mockClient: any;
|
|
11
|
-
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
vi.resetAllMocks();
|
|
14
|
-
|
|
15
|
-
mockClient = {
|
|
16
|
-
jobs: {
|
|
17
|
-
list: vi.fn(),
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
vi.mocked(getClient).mockReturnValue(mockClient);
|
|
21
|
-
|
|
22
|
-
command = new JobsListCommand([], {} as any);
|
|
23
|
-
vi.spyOn(command, 'info').mockImplementation(() => { });
|
|
24
|
-
vi.spyOn(command, 'error').mockImplementation(() => { });
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('should list jobs successfully', async () => {
|
|
28
|
-
mockClient.jobs.list.mockResolvedValue([
|
|
29
|
-
{ id: '101', status: 'running', type: 'build' },
|
|
30
|
-
{ id: '102', status: 'pending', type: 'deploy' }
|
|
31
|
-
]);
|
|
32
|
-
|
|
33
|
-
await command.run({ teamId: '1', projectId: '2', branchId: '3' });
|
|
34
|
-
|
|
35
|
-
expect(mockClient.jobs.list).toHaveBeenCalledWith(1, 2, 3);
|
|
36
|
-
expect(command.info).toHaveBeenCalledWith('Jobs for Branch 3:');
|
|
37
|
-
expect(command.info).toHaveBeenCalledWith('101 - build [running] (Started: Waiting)');
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it('should handle list failure', async () => {
|
|
41
|
-
mockClient.jobs.list.mockRejectedValue(new Error('Network error'));
|
|
42
|
-
|
|
43
|
-
await command.run({ teamId: '1', projectId: '2', branchId: '3' });
|
|
44
|
-
|
|
45
|
-
expect(command.error).toHaveBeenCalledWith('Failed to list jobs: Network error');
|
|
46
|
-
});
|
|
47
|
-
});
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
3
|
-
import JobsLogsCommand from '../../../../src/commands/job/logs.js';
|
|
4
|
-
import { getClient } from '../../../../src/utils/nexical-client.js';
|
|
5
|
-
|
|
6
|
-
vi.mock('../../../../src/utils/nexical-client.js');
|
|
7
|
-
|
|
8
|
-
describe('JobsLogsCommand Integration', () => {
|
|
9
|
-
let command: JobsLogsCommand;
|
|
10
|
-
let mockClient: any;
|
|
11
|
-
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
vi.resetAllMocks();
|
|
14
|
-
|
|
15
|
-
mockClient = {
|
|
16
|
-
jobs: {
|
|
17
|
-
getLogs: vi.fn(),
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
vi.mocked(getClient).mockReturnValue(mockClient);
|
|
21
|
-
|
|
22
|
-
command = new JobsLogsCommand([], {} as any);
|
|
23
|
-
vi.spyOn(command, 'info').mockImplementation(() => { });
|
|
24
|
-
vi.spyOn(command, 'error').mockImplementation(() => { });
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('should get job logs successfully', async () => {
|
|
28
|
-
mockClient.jobs.getLogs.mockResolvedValue([
|
|
29
|
-
{ timestamp: '2023T12:00:00', level: 'info', message: 'Build started' },
|
|
30
|
-
{ timestamp: '2023T12:01:00', level: 'error', message: 'Build failed' }
|
|
31
|
-
]);
|
|
32
|
-
|
|
33
|
-
await command.run({ teamId: '1', projectId: '2', branchId: '3', jobId: '123' });
|
|
34
|
-
|
|
35
|
-
expect(mockClient.jobs.getLogs).toHaveBeenCalledWith(1, 2, 3, 123);
|
|
36
|
-
expect(command.info).toHaveBeenCalledWith(expect.stringContaining('Build started'));
|
|
37
|
-
expect(command.error).toHaveBeenCalledWith(expect.stringContaining('Build failed'));
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it('should handle log failure', async () => {
|
|
41
|
-
mockClient.jobs.getLogs.mockRejectedValue(new Error('Logs unavailable'));
|
|
42
|
-
|
|
43
|
-
await command.run({ teamId: '1', projectId: '2', branchId: '3', jobId: '123' });
|
|
44
|
-
|
|
45
|
-
expect(command.error).toHaveBeenCalledWith('Failed to get logs: Logs unavailable');
|
|
46
|
-
});
|
|
47
|
-
});
|
|
@@ -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
|
-
});
|