@closedloop-ai/cli 0.2.3 → 0.2.4
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/README.md +61 -47
- package/docs/CLI_COMMANDS.md +78 -64
- package/package.json +1 -1
- package/packages/cli/dist/__tests__/api.test.js +151 -0
- package/packages/cli/dist/__tests__/api.test.js.map +1 -0
- package/packages/cli/dist/__tests__/errors.test.js +1 -1
- package/packages/cli/dist/__tests__/errors.test.js.map +1 -1
- package/packages/cli/dist/__tests__/performance.test.js +221 -0
- package/packages/cli/dist/__tests__/performance.test.js.map +1 -0
- package/packages/cli/dist/__tests__/setup.js +37 -7
- package/packages/cli/dist/__tests__/setup.js.map +1 -1
- package/packages/cli/dist/__tests__/team-simple.test.js +38 -0
- package/packages/cli/dist/__tests__/team-simple.test.js.map +1 -0
- package/packages/cli/dist/__tests__/test-factories.js +148 -0
- package/packages/cli/dist/__tests__/test-factories.js.map +1 -0
- package/packages/cli/dist/__tests__/validation.test.js +1 -1
- package/packages/cli/dist/api/feedback.js +2 -2
- package/packages/cli/dist/api/feedback.js.map +1 -1
- package/packages/cli/dist/api/ingest.js +60 -0
- package/packages/cli/dist/api/ingest.js.map +1 -0
- package/packages/cli/dist/api/team.js +14 -0
- package/packages/cli/dist/api/team.js.map +1 -1
- package/packages/cli/dist/cli.js +64 -26
- package/packages/cli/dist/cli.js.map +1 -1
- package/packages/cli/dist/commands/config.js +1 -1
- package/packages/cli/dist/commands/config.js.map +1 -1
- package/packages/cli/dist/commands/feedback.js +23 -23
- package/packages/cli/dist/commands/feedback.js.map +1 -1
- package/packages/cli/dist/commands/ingest.js +391 -0
- package/packages/cli/dist/commands/ingest.js.map +1 -0
- package/packages/cli/dist/commands/insight.js +234 -0
- package/packages/cli/dist/commands/insight.js.map +1 -0
- package/packages/cli/dist/commands/team.js +58 -20
- package/packages/cli/dist/commands/team.js.map +1 -1
- package/packages/cli/dist/config/constants.js +4 -3
- package/packages/cli/dist/config/constants.js.map +1 -1
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const axios_1 = __importDefault(require("axios"));
|
|
7
|
+
const team_1 = require("../api/team");
|
|
8
|
+
// Mock axios
|
|
9
|
+
jest.mock('axios');
|
|
10
|
+
const mockedAxios = axios_1.default;
|
|
11
|
+
// Mock config
|
|
12
|
+
jest.mock('../config', () => ({
|
|
13
|
+
config: {
|
|
14
|
+
get: jest.fn().mockReturnValue('test-api-key')
|
|
15
|
+
}
|
|
16
|
+
}));
|
|
17
|
+
// Mock constants
|
|
18
|
+
jest.mock('../config/constants', () => ({
|
|
19
|
+
CONFIG: {
|
|
20
|
+
API_BASE_URL: 'https://mcp.closedloop.sh'
|
|
21
|
+
}
|
|
22
|
+
}));
|
|
23
|
+
describe('API Client Integration Tests', () => {
|
|
24
|
+
beforeEach(() => {
|
|
25
|
+
jest.clearAllMocks();
|
|
26
|
+
mockedAxios.create.mockReturnValue(mockedAxios);
|
|
27
|
+
});
|
|
28
|
+
describe('getTeamWebsite', () => {
|
|
29
|
+
it('should make GET request to correct endpoint', async () => {
|
|
30
|
+
const mockResponse = {
|
|
31
|
+
data: {
|
|
32
|
+
success: true,
|
|
33
|
+
data: {
|
|
34
|
+
website: 'https://example.com',
|
|
35
|
+
updated_at: '2024-01-15T10:30:00Z'
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
mockedAxios.get.mockResolvedValue(mockResponse);
|
|
40
|
+
const result = await (0, team_1.getTeamWebsite)();
|
|
41
|
+
expect(mockedAxios.create).toHaveBeenCalledWith({
|
|
42
|
+
baseURL: 'https://mcp.closedloop.sh',
|
|
43
|
+
headers: {
|
|
44
|
+
'Authorization': 'Bearer test-api-key',
|
|
45
|
+
'Content-Type': 'application/json',
|
|
46
|
+
},
|
|
47
|
+
timeout: 30000,
|
|
48
|
+
});
|
|
49
|
+
expect(mockedAxios.get).toHaveBeenCalledWith('/team/website');
|
|
50
|
+
expect(result).toEqual({
|
|
51
|
+
website: 'https://example.com',
|
|
52
|
+
updated_at: '2024-01-15T10:30:00Z'
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
it('should handle API error responses', async () => {
|
|
56
|
+
const mockError = {
|
|
57
|
+
response: {
|
|
58
|
+
status: 404,
|
|
59
|
+
data: { message: 'Team not found' }
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
mockedAxios.get.mockRejectedValue(mockError);
|
|
63
|
+
await expect((0, team_1.getTeamWebsite)()).rejects.toThrow('Resource not found');
|
|
64
|
+
});
|
|
65
|
+
it('should handle network errors', async () => {
|
|
66
|
+
const mockError = {
|
|
67
|
+
code: 'ENOTFOUND',
|
|
68
|
+
message: 'Network error'
|
|
69
|
+
};
|
|
70
|
+
mockedAxios.get.mockRejectedValue(mockError);
|
|
71
|
+
await expect((0, team_1.getTeamWebsite)()).rejects.toThrow('Cannot connect to ClosedLoop AI servers');
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
describe('updateTeamWebsite', () => {
|
|
75
|
+
it('should make POST request with correct data', async () => {
|
|
76
|
+
const mockResponse = {
|
|
77
|
+
data: {
|
|
78
|
+
success: true,
|
|
79
|
+
data: {
|
|
80
|
+
website: 'https://example.com',
|
|
81
|
+
updated_at: '2024-01-15T10:30:00Z'
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
mockedAxios.post.mockResolvedValue(mockResponse);
|
|
86
|
+
const result = await (0, team_1.updateTeamWebsite)('https://example.com');
|
|
87
|
+
expect(mockedAxios.post).toHaveBeenCalledWith('/team/website', {
|
|
88
|
+
website: 'https://example.com'
|
|
89
|
+
});
|
|
90
|
+
expect(result).toEqual({
|
|
91
|
+
website: 'https://example.com',
|
|
92
|
+
updated_at: '2024-01-15T10:30:00Z'
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
it('should validate URL format before making request', async () => {
|
|
96
|
+
await expect((0, team_1.updateTeamWebsite)('invalid-url')).rejects.toThrow('Invalid website URL format');
|
|
97
|
+
expect(mockedAxios.post).not.toHaveBeenCalled();
|
|
98
|
+
});
|
|
99
|
+
it('should handle API error responses', async () => {
|
|
100
|
+
const mockError = {
|
|
101
|
+
response: {
|
|
102
|
+
status: 500,
|
|
103
|
+
data: { message: 'Internal server error' }
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
mockedAxios.post.mockRejectedValue(mockError);
|
|
107
|
+
await expect((0, team_1.updateTeamWebsite)('https://example.com')).rejects.toThrow('Server error');
|
|
108
|
+
});
|
|
109
|
+
it('should handle unsuccessful API responses', async () => {
|
|
110
|
+
const mockResponse = {
|
|
111
|
+
data: {
|
|
112
|
+
success: false,
|
|
113
|
+
message: 'Update failed'
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
mockedAxios.post.mockResolvedValue(mockResponse);
|
|
117
|
+
await expect((0, team_1.updateTeamWebsite)('https://example.com')).rejects.toThrow('Failed to update team website');
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe('Error Handling', () => {
|
|
121
|
+
it('should handle 401 unauthorized errors', async () => {
|
|
122
|
+
const mockError = {
|
|
123
|
+
response: {
|
|
124
|
+
status: 401,
|
|
125
|
+
data: { message: 'Unauthorized' }
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
mockedAxios.get.mockRejectedValue(mockError);
|
|
129
|
+
await expect((0, team_1.getTeamWebsite)()).rejects.toThrow('Invalid API key');
|
|
130
|
+
});
|
|
131
|
+
it('should handle 429 rate limit errors', async () => {
|
|
132
|
+
const mockError = {
|
|
133
|
+
response: {
|
|
134
|
+
status: 429,
|
|
135
|
+
data: { message: 'Rate limited' }
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
mockedAxios.get.mockRejectedValue(mockError);
|
|
139
|
+
await expect((0, team_1.getTeamWebsite)()).rejects.toThrow('Rate limit exceeded');
|
|
140
|
+
});
|
|
141
|
+
it('should handle timeout errors', async () => {
|
|
142
|
+
const mockError = {
|
|
143
|
+
code: 'ETIMEDOUT',
|
|
144
|
+
message: 'Request timeout'
|
|
145
|
+
};
|
|
146
|
+
mockedAxios.get.mockRejectedValue(mockError);
|
|
147
|
+
await expect((0, team_1.getTeamWebsite)()).rejects.toThrow('Request timed out');
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
//# sourceMappingURL=api.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.test.js","sourceRoot":"","sources":["../../src/__tests__/api.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -64,7 +64,7 @@ describe('Error Utils', () => {
|
|
|
64
64
|
code: 'ENOTFOUND'
|
|
65
65
|
};
|
|
66
66
|
const result = (0, errors_1.handleApiError)(mockError);
|
|
67
|
-
expect(result.message).toContain('Cannot connect to ClosedLoop servers');
|
|
67
|
+
expect(result.message).toContain('Cannot connect to ClosedLoop AI servers');
|
|
68
68
|
expect(result.code).toBe(errors_1.ERROR_CODES.CONNECTION_ERROR);
|
|
69
69
|
});
|
|
70
70
|
it('should handle timeout errors', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/__tests__/errors.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/__tests__/errors.test.ts"],"names":[],"mappings":";;AAAA,4CAOyB;AAEzB,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,KAAK,GAAG,IAAI,iBAAQ,CAAC,YAAY,EAAE,oBAAW,CAAC,gBAAgB,CAAC,CAAC;YACvE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAW,CAAC,gBAAgB,CAAC,CAAC;YACtD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,KAAK,GAAG,IAAI,iBAAQ,CAAC,YAAY,EAAE,oBAAW,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;YAC1E,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,SAAS,GAAG;gBAChB,QAAQ,EAAE;oBACR,MAAM,EAAE,GAAG;oBACX,IAAI,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE;iBAClC;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,uBAAc,EAAC,SAAS,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAW,CAAC,YAAY,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,SAAS,GAAG;gBAChB,QAAQ,EAAE;oBACR,MAAM,EAAE,GAAG;oBACX,IAAI,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE;iBAC/B;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,uBAAc,EAAC,SAAS,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAW,CAAC,SAAS,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,SAAS,GAAG;gBAChB,QAAQ,EAAE;oBACR,MAAM,EAAE,GAAG;oBACX,IAAI,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE;iBAClC;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,uBAAc,EAAC,SAAS,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAW,CAAC,YAAY,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,SAAS,GAAG;gBAChB,QAAQ,EAAE;oBACR,MAAM,EAAE,GAAG;oBACX,IAAI,EAAE,EAAE,OAAO,EAAE,uBAAuB,EAAE;iBAC3C;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,uBAAc,EAAC,SAAS,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAW,CAAC,YAAY,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,SAAS,GAAG;gBAChB,IAAI,EAAE,WAAW;aAClB,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,uBAAc,EAAC,SAAS,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,yCAAyC,CAAC,CAAC;YAC5E,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAW,CAAC,gBAAgB,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,SAAS,GAAG;gBAChB,IAAI,EAAE,WAAW;aAClB,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,uBAAc,EAAC,SAAS,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAW,CAAC,gBAAgB,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,SAAS,GAAG;gBAChB,OAAO,EAAE,eAAe;aACzB,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,uBAAc,EAAC,SAAS,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAW,CAAC,aAAa,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,MAAM,GAAG,IAAA,8BAAqB,EAAC,mBAAmB,CAAC,CAAC;YAC1D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAW,CAAC,gBAAgB,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,MAAM,GAAG,IAAA,yBAAgB,EAAC,eAAe,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAW,CAAC,aAAa,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,MAAM,GAAG,IAAA,8BAAqB,EAAC,mBAAmB,CAAC,CAAC;YAC1D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAW,CAAC,gBAAgB,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const validation_1 = require("../utils/validation");
|
|
4
|
+
const test_factories_1 = require("./test-factories");
|
|
5
|
+
describe('Performance Tests', () => {
|
|
6
|
+
describe('Input Validation Performance', () => {
|
|
7
|
+
it('should handle large input efficiently', () => {
|
|
8
|
+
const largeInput = test_factories_1.performanceTestData.largeInput;
|
|
9
|
+
const startTime = performance.now();
|
|
10
|
+
(0, validation_1.validateInputContent)(largeInput);
|
|
11
|
+
const endTime = performance.now();
|
|
12
|
+
const executionTime = endTime - startTime;
|
|
13
|
+
// Should complete within 100ms
|
|
14
|
+
expect(executionTime).toBeLessThan(100);
|
|
15
|
+
});
|
|
16
|
+
it('should handle many validations efficiently', () => {
|
|
17
|
+
const inputs = Array.from({ length: 1000 }, (_, i) => `Test input ${i}`);
|
|
18
|
+
const startTime = performance.now();
|
|
19
|
+
inputs.forEach(input => {
|
|
20
|
+
try {
|
|
21
|
+
(0, validation_1.validateInputContent)(input);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
// Some might fail, that's okay for performance test
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
const endTime = performance.now();
|
|
28
|
+
const executionTime = endTime - startTime;
|
|
29
|
+
// Should complete 1000 validations within 500ms
|
|
30
|
+
expect(executionTime).toBeLessThan(500);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
describe('Sanitization Performance', () => {
|
|
34
|
+
it('should sanitize large XSS payload efficiently', () => {
|
|
35
|
+
const xssPayload = test_factories_1.securityTestData.xssPayload.repeat(1000);
|
|
36
|
+
const startTime = performance.now();
|
|
37
|
+
(0, validation_1.sanitizeInput)(xssPayload);
|
|
38
|
+
const endTime = performance.now();
|
|
39
|
+
const executionTime = endTime - startTime;
|
|
40
|
+
// Should complete within 50ms
|
|
41
|
+
expect(executionTime).toBeLessThan(50);
|
|
42
|
+
});
|
|
43
|
+
it('should handle many sanitizations efficiently', () => {
|
|
44
|
+
const payloads = Array.from({ length: 500 }, () => test_factories_1.securityTestData.xssPayload);
|
|
45
|
+
const startTime = performance.now();
|
|
46
|
+
payloads.forEach(payload => {
|
|
47
|
+
(0, validation_1.sanitizeInput)(payload);
|
|
48
|
+
});
|
|
49
|
+
const endTime = performance.now();
|
|
50
|
+
const executionTime = endTime - startTime;
|
|
51
|
+
// Should complete 500 sanitizations within 200ms
|
|
52
|
+
expect(executionTime).toBeLessThan(200);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe('Memory Usage', () => {
|
|
56
|
+
it('should not leak memory with repeated validations', () => {
|
|
57
|
+
const initialMemory = process.memoryUsage().heapUsed;
|
|
58
|
+
// Perform many validations
|
|
59
|
+
for (let i = 0; i < 10000; i++) {
|
|
60
|
+
try {
|
|
61
|
+
(0, validation_1.validateInputContent)(`Test input ${i}`);
|
|
62
|
+
(0, validation_1.validateApiKey)(`test-key-${i}`);
|
|
63
|
+
(0, validation_1.validateEmail)(`test${i}@example.com`);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
// Some might fail, that's okay
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Force garbage collection if available
|
|
70
|
+
if (global.gc) {
|
|
71
|
+
global.gc();
|
|
72
|
+
}
|
|
73
|
+
const finalMemory = process.memoryUsage().heapUsed;
|
|
74
|
+
const memoryIncrease = finalMemory - initialMemory;
|
|
75
|
+
// Memory increase should be reasonable (less than 50MB)
|
|
76
|
+
expect(memoryIncrease).toBeLessThan(50 * 1024 * 1024);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
describe('Edge Case Tests', () => {
|
|
81
|
+
describe('Boundary Conditions', () => {
|
|
82
|
+
it('should handle exactly maximum length input', () => {
|
|
83
|
+
const maxLengthInput = 'a'.repeat(50000);
|
|
84
|
+
expect(() => (0, validation_1.validateInputContent)(maxLengthInput)).not.toThrow();
|
|
85
|
+
});
|
|
86
|
+
it('should reject input one character over maximum', () => {
|
|
87
|
+
const tooLongInput = 'a'.repeat(50001);
|
|
88
|
+
expect(() => (0, validation_1.validateInputContent)(tooLongInput)).toThrow();
|
|
89
|
+
});
|
|
90
|
+
it('should handle minimum valid API key length', () => {
|
|
91
|
+
const minApiKey = 'a'.repeat(10);
|
|
92
|
+
expect(() => (0, validation_1.validateApiKey)(minApiKey)).not.toThrow();
|
|
93
|
+
});
|
|
94
|
+
it('should reject API key one character under minimum', () => {
|
|
95
|
+
const tooShortApiKey = 'a'.repeat(9);
|
|
96
|
+
expect(() => (0, validation_1.validateApiKey)(tooShortApiKey)).toThrow();
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
describe('Unicode and Special Characters', () => {
|
|
100
|
+
it('should handle unicode characters', () => {
|
|
101
|
+
const unicodeInput = 'Test with émojis 🚀 and ñ characters';
|
|
102
|
+
expect(() => (0, validation_1.validateInputContent)(unicodeInput)).not.toThrow();
|
|
103
|
+
});
|
|
104
|
+
it('should handle various unicode ranges', () => {
|
|
105
|
+
const unicodeInputs = [
|
|
106
|
+
'English text',
|
|
107
|
+
'中文文本',
|
|
108
|
+
'العربية',
|
|
109
|
+
'Русский текст',
|
|
110
|
+
'日本語のテキスト',
|
|
111
|
+
'한국어 텍스트'
|
|
112
|
+
];
|
|
113
|
+
unicodeInputs.forEach(input => {
|
|
114
|
+
expect(() => (0, validation_1.validateInputContent)(input)).not.toThrow();
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
it('should handle special characters in URLs', () => {
|
|
118
|
+
const specialUrls = [
|
|
119
|
+
'https://example.com/path?query=value&other=test',
|
|
120
|
+
'https://example.com/path#fragment',
|
|
121
|
+
'https://example.com/path/with-dashes_and_underscores',
|
|
122
|
+
'https://example.com/path%20with%20spaces'
|
|
123
|
+
];
|
|
124
|
+
specialUrls.forEach(url => {
|
|
125
|
+
expect(() => (0, validation_1.validateUrl)(url)).not.toThrow();
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
describe('Security Edge Cases', () => {
|
|
130
|
+
it('should sanitize various XSS payloads', () => {
|
|
131
|
+
const xssPayloads = [
|
|
132
|
+
test_factories_1.securityTestData.xssPayload,
|
|
133
|
+
test_factories_1.securityTestData.htmlInjection,
|
|
134
|
+
test_factories_1.securityTestData.javascriptUrl,
|
|
135
|
+
'<iframe src="javascript:alert(1)"></iframe>',
|
|
136
|
+
'<img src="x" onerror="alert(1)">',
|
|
137
|
+
'<svg onload="alert(1)"></svg>',
|
|
138
|
+
'<body onload="alert(1)">',
|
|
139
|
+
'<input onfocus="alert(1)" autofocus>'
|
|
140
|
+
];
|
|
141
|
+
xssPayloads.forEach(payload => {
|
|
142
|
+
const sanitized = (0, validation_1.sanitizeInput)(payload);
|
|
143
|
+
expect(sanitized).not.toContain('<script');
|
|
144
|
+
expect(sanitized).not.toContain('javascript:');
|
|
145
|
+
expect(sanitized).not.toContain('onerror');
|
|
146
|
+
expect(sanitized).not.toContain('onload');
|
|
147
|
+
expect(sanitized).not.toContain('onfocus');
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
it('should handle SQL injection attempts', () => {
|
|
151
|
+
const sqlPayloads = [
|
|
152
|
+
test_factories_1.securityTestData.sqlInjection,
|
|
153
|
+
"'; DROP TABLE users; --",
|
|
154
|
+
"' OR '1'='1",
|
|
155
|
+
"'; INSERT INTO users VALUES ('hacker', 'password'); --"
|
|
156
|
+
];
|
|
157
|
+
sqlPayloads.forEach(payload => {
|
|
158
|
+
const sanitized = (0, validation_1.sanitizeInput)(payload);
|
|
159
|
+
// The current sanitization is basic, so we just check it doesn't contain script tags
|
|
160
|
+
expect(sanitized).not.toContain('<script');
|
|
161
|
+
expect(sanitized).not.toContain('javascript:');
|
|
162
|
+
// Basic check that it's been processed
|
|
163
|
+
expect(sanitized).toBeDefined();
|
|
164
|
+
expect(typeof sanitized).toBe('string');
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
it('should handle path traversal attempts', () => {
|
|
168
|
+
const pathPayloads = [
|
|
169
|
+
test_factories_1.securityTestData.pathTraversal,
|
|
170
|
+
'../../../etc/passwd',
|
|
171
|
+
'..\\..\\..\\windows\\system32\\config\\sam',
|
|
172
|
+
'....//....//....//etc/passwd'
|
|
173
|
+
];
|
|
174
|
+
pathPayloads.forEach(payload => {
|
|
175
|
+
const sanitized = (0, validation_1.sanitizeInput)(payload);
|
|
176
|
+
// The current sanitization is basic, so we just check it doesn't contain script tags
|
|
177
|
+
expect(sanitized).not.toContain('<script');
|
|
178
|
+
expect(sanitized).not.toContain('javascript:');
|
|
179
|
+
// Basic check that it's been processed
|
|
180
|
+
expect(sanitized).toBeDefined();
|
|
181
|
+
expect(typeof sanitized).toBe('string');
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
describe('Concurrent Operations', () => {
|
|
186
|
+
it('should handle concurrent validations', async () => {
|
|
187
|
+
const promises = Array.from({ length: 100 }, (_, i) => Promise.resolve((0, validation_1.validateInputContent)(`Concurrent test ${i}`)));
|
|
188
|
+
const results = await Promise.all(promises);
|
|
189
|
+
expect(results).toHaveLength(100);
|
|
190
|
+
});
|
|
191
|
+
it('should handle concurrent sanitizations', async () => {
|
|
192
|
+
const payloads = Array.from({ length: 100 }, () => test_factories_1.securityTestData.xssPayload);
|
|
193
|
+
const promises = payloads.map(payload => Promise.resolve((0, validation_1.sanitizeInput)(payload)));
|
|
194
|
+
const results = await Promise.all(promises);
|
|
195
|
+
expect(results).toHaveLength(100);
|
|
196
|
+
results.forEach(result => {
|
|
197
|
+
expect(result).not.toContain('<script');
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
describe('Error Recovery', () => {
|
|
202
|
+
it('should recover from validation errors gracefully', () => {
|
|
203
|
+
const invalidInputs = ['', ' ', 'a'.repeat(50001)];
|
|
204
|
+
const validInputs = ['Valid input 1', 'Valid input 2', 'Valid input 3'];
|
|
205
|
+
let errorCount = 0;
|
|
206
|
+
let successCount = 0;
|
|
207
|
+
[...invalidInputs, ...validInputs].forEach(input => {
|
|
208
|
+
try {
|
|
209
|
+
(0, validation_1.validateInputContent)(input);
|
|
210
|
+
successCount++;
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
errorCount++;
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
expect(errorCount).toBe(3); // 3 invalid inputs
|
|
217
|
+
expect(successCount).toBe(3); // 3 valid inputs
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
//# sourceMappingURL=performance.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance.test.js","sourceRoot":"","sources":["../../src/__tests__/performance.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,50 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
2
3
|
// Test setup file
|
|
3
|
-
|
|
4
|
-
// Mock console methods to avoid
|
|
4
|
+
const globals_1 = require("@jest/globals");
|
|
5
|
+
// Mock console methods to avoid noise in tests
|
|
5
6
|
global.console = {
|
|
6
7
|
...console,
|
|
7
|
-
log: jest.fn(),
|
|
8
|
-
error: jest.fn(),
|
|
9
|
-
warn: jest.fn(),
|
|
10
|
-
info: jest.fn()
|
|
8
|
+
log: globals_1.jest.fn(),
|
|
9
|
+
error: globals_1.jest.fn(),
|
|
10
|
+
warn: globals_1.jest.fn(),
|
|
11
|
+
info: globals_1.jest.fn(),
|
|
12
|
+
debug: globals_1.jest.fn(),
|
|
11
13
|
};
|
|
12
14
|
// Mock process.exit to prevent tests from actually exiting
|
|
13
15
|
const originalExit = process.exit;
|
|
14
16
|
beforeAll(() => {
|
|
15
|
-
process.exit = jest.fn();
|
|
17
|
+
process.exit = globals_1.jest.fn();
|
|
16
18
|
});
|
|
17
19
|
afterAll(() => {
|
|
18
20
|
process.exit = originalExit;
|
|
19
21
|
});
|
|
22
|
+
// Mock process.stdin for interactive tests
|
|
23
|
+
Object.defineProperty(process, 'stdin', {
|
|
24
|
+
value: {
|
|
25
|
+
isTTY: false,
|
|
26
|
+
setRawMode: globals_1.jest.fn(),
|
|
27
|
+
resume: globals_1.jest.fn(),
|
|
28
|
+
pause: globals_1.jest.fn(),
|
|
29
|
+
},
|
|
30
|
+
writable: true,
|
|
31
|
+
});
|
|
32
|
+
// Mock process.stdout for output tests
|
|
33
|
+
Object.defineProperty(process, 'stdout', {
|
|
34
|
+
value: {
|
|
35
|
+
write: globals_1.jest.fn(),
|
|
36
|
+
end: globals_1.jest.fn(),
|
|
37
|
+
},
|
|
38
|
+
writable: true,
|
|
39
|
+
});
|
|
40
|
+
// Mock process.stderr for error output tests
|
|
41
|
+
Object.defineProperty(process, 'stderr', {
|
|
42
|
+
value: {
|
|
43
|
+
write: globals_1.jest.fn(),
|
|
44
|
+
end: globals_1.jest.fn(),
|
|
45
|
+
},
|
|
46
|
+
writable: true,
|
|
47
|
+
});
|
|
48
|
+
// Global test timeout
|
|
49
|
+
globals_1.jest.setTimeout(10000);
|
|
20
50
|
//# sourceMappingURL=setup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":";;AAAA,kBAAkB;AAClB,2CAAqC;AAErC,+CAA+C;AAC/C,MAAM,CAAC,OAAO,GAAG;IACf,GAAG,OAAO;IACV,GAAG,EAAE,cAAI,CAAC,EAAE,EAAE;IACd,KAAK,EAAE,cAAI,CAAC,EAAE,EAAE;IAChB,IAAI,EAAE,cAAI,CAAC,EAAE,EAAE;IACf,IAAI,EAAE,cAAI,CAAC,EAAE,EAAE;IACf,KAAK,EAAE,cAAI,CAAC,EAAE,EAAE;CACjB,CAAC;AAEF,2DAA2D;AAC3D,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;AAClC,SAAS,CAAC,GAAG,EAAE;IACb,OAAO,CAAC,IAAI,GAAG,cAAI,CAAC,EAAE,EAAS,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,GAAG,EAAE;IACZ,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEH,2CAA2C;AAC3C,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE;IACtC,KAAK,EAAE;QACL,KAAK,EAAE,KAAK;QACZ,UAAU,EAAE,cAAI,CAAC,EAAE,EAAE;QACrB,MAAM,EAAE,cAAI,CAAC,EAAE,EAAE;QACjB,KAAK,EAAE,cAAI,CAAC,EAAE,EAAE;KACjB;IACD,QAAQ,EAAE,IAAI;CACf,CAAC,CAAC;AAEH,uCAAuC;AACvC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE;IACvC,KAAK,EAAE;QACL,KAAK,EAAE,cAAI,CAAC,EAAE,EAAE;QAChB,GAAG,EAAE,cAAI,CAAC,EAAE,EAAE;KACf;IACD,QAAQ,EAAE,IAAI;CACf,CAAC,CAAC;AAEH,6CAA6C;AAC7C,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE;IACvC,KAAK,EAAE;QACL,KAAK,EAAE,cAAI,CAAC,EAAE,EAAE;QAChB,GAAG,EAAE,cAAI,CAAC,EAAE,EAAE;KACf;IACD,QAAQ,EAAE,IAAI;CACf,CAAC,CAAC;AAEH,sBAAsB;AACtB,cAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const team_1 = require("../commands/team");
|
|
4
|
+
// Mock chalk and ora
|
|
5
|
+
jest.mock('chalk', () => ({
|
|
6
|
+
green: (text) => text,
|
|
7
|
+
yellow: (text) => text,
|
|
8
|
+
gray: (text) => text,
|
|
9
|
+
red: (text) => text,
|
|
10
|
+
black: (text) => text
|
|
11
|
+
}));
|
|
12
|
+
jest.mock('ora', () => {
|
|
13
|
+
const mockSpinner = {
|
|
14
|
+
start: jest.fn().mockReturnThis(),
|
|
15
|
+
succeed: jest.fn().mockReturnThis(),
|
|
16
|
+
fail: jest.fn().mockReturnThis()
|
|
17
|
+
};
|
|
18
|
+
return jest.fn(() => mockSpinner);
|
|
19
|
+
});
|
|
20
|
+
describe('Team Commands - Simple Tests', () => {
|
|
21
|
+
it('should be a valid Command instance', () => {
|
|
22
|
+
expect(team_1.teamCommand).toBeDefined();
|
|
23
|
+
expect(team_1.teamCommand.name()).toBe('team');
|
|
24
|
+
});
|
|
25
|
+
it('should have website subcommand', () => {
|
|
26
|
+
const websiteCommand = team_1.teamCommand.commands.find(cmd => cmd.name() === 'website');
|
|
27
|
+
expect(websiteCommand).toBeDefined();
|
|
28
|
+
expect(websiteCommand?.name()).toBe('website');
|
|
29
|
+
});
|
|
30
|
+
it('should show help when no subcommand provided', async () => {
|
|
31
|
+
const consoleSpy = jest.spyOn(console, 'log').mockImplementation();
|
|
32
|
+
await team_1.teamCommand.parseAsync(['team']);
|
|
33
|
+
expect(consoleSpy).toHaveBeenCalledWith('Use team subcommands to manage team settings');
|
|
34
|
+
expect(consoleSpy).toHaveBeenCalledWith('Available commands: website');
|
|
35
|
+
consoleSpy.mockRestore();
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=team-simple.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-simple.test.js","sourceRoot":"","sources":["../../src/__tests__/team-simple.test.ts"],"names":[],"mappings":";;AAAA,2CAA+C;AAE/C,qBAAqB;AACrB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IACxB,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;IAC7B,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;IAC9B,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;IAC5B,GAAG,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;IAC3B,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI;CAC9B,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE;IACpB,MAAM,WAAW,GAAG;QAClB,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE;QACjC,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE;QACnC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE;KACjC,CAAC;IACF,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,kBAAW,CAAC,CAAC,WAAW,EAAE,CAAC;QAClC,MAAM,CAAC,kBAAW,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,cAAc,GAAG,kBAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,SAAS,CAAC,CAAC;QAClF,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,EAAE,CAAC;QAEnE,MAAM,kBAAW,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAEvC,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,8CAA8C,CAAC,CAAC;QACxF,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,6BAA6B,CAAC,CAAC;QAEvE,UAAU,CAAC,WAAW,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|