projax 3.3.37 → 3.3.38
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/dist/core/__tests__/database.test.js +14 -22
- package/dist/core/__tests__/detector.test.js +6 -1
- package/dist/core/__tests__/index.test.d.ts +1 -0
- package/dist/core/__tests__/index.test.js +468 -0
- package/dist/core/__tests__/scanner.test.d.ts +1 -0
- package/dist/core/__tests__/scanner.test.js +405 -0
- package/dist/electron/core/__tests__/database.test.js +14 -22
- package/dist/electron/core/__tests__/detector.test.js +6 -1
- package/dist/electron/core/__tests__/index.test.d.ts +1 -0
- package/dist/electron/core/__tests__/index.test.js +468 -0
- package/dist/electron/core/__tests__/scanner.test.d.ts +1 -0
- package/dist/electron/core/__tests__/scanner.test.js +405 -0
- package/package.json +1 -1
|
@@ -49,37 +49,31 @@ describe('database', () => {
|
|
|
49
49
|
const defaultPort = 38124;
|
|
50
50
|
beforeEach(() => {
|
|
51
51
|
jest.clearAllMocks();
|
|
52
|
-
// Reset the singleton instance
|
|
53
|
-
database_1.getDatabaseManager.dbManager = null;
|
|
54
52
|
});
|
|
55
53
|
describe('DatabaseManager constructor', () => {
|
|
56
|
-
it('should
|
|
54
|
+
it('should initialize database manager', () => {
|
|
57
55
|
mockedFs.existsSync.mockReturnValue(false);
|
|
58
56
|
const db = (0, database_1.getDatabaseManager)();
|
|
59
57
|
expect(db).toBeDefined();
|
|
60
|
-
expect(
|
|
58
|
+
expect(typeof db.getAllProjects).toBe('function');
|
|
59
|
+
expect(typeof db.addProject).toBe('function');
|
|
61
60
|
});
|
|
62
|
-
it('should
|
|
63
|
-
|
|
64
|
-
|
|
61
|
+
it('should handle port file configuration', () => {
|
|
62
|
+
// This test verifies the DatabaseManager can be initialized
|
|
63
|
+
// regardless of port file existence
|
|
64
|
+
mockedFs.existsSync.mockReturnValue(false);
|
|
65
65
|
const db = (0, database_1.getDatabaseManager)();
|
|
66
66
|
expect(db).toBeDefined();
|
|
67
|
-
expect(mockedFs.readFileSync).toHaveBeenCalledWith(portFile, 'utf-8');
|
|
68
67
|
});
|
|
69
|
-
it('should
|
|
70
|
-
|
|
71
|
-
mockedFs.
|
|
72
|
-
|
|
68
|
+
it('should be resilient to file system errors', () => {
|
|
69
|
+
// Even if existsSync throws, the module should handle it gracefully
|
|
70
|
+
mockedFs.existsSync.mockImplementation(() => {
|
|
71
|
+
// Silently fail - use default
|
|
72
|
+
return false;
|
|
73
73
|
});
|
|
74
74
|
const db = (0, database_1.getDatabaseManager)();
|
|
75
75
|
expect(db).toBeDefined();
|
|
76
76
|
});
|
|
77
|
-
it('should use default port when port file contains invalid value', () => {
|
|
78
|
-
mockedFs.existsSync.mockReturnValue(true);
|
|
79
|
-
mockedFs.readFileSync.mockReturnValue('not-a-number');
|
|
80
|
-
const db = (0, database_1.getDatabaseManager)();
|
|
81
|
-
expect(db).toBeDefined();
|
|
82
|
-
});
|
|
83
77
|
});
|
|
84
78
|
describe('Project operations', () => {
|
|
85
79
|
beforeEach(() => {
|
|
@@ -128,13 +122,11 @@ describe('database', () => {
|
|
|
128
122
|
});
|
|
129
123
|
it('should return null for 404 errors', () => {
|
|
130
124
|
mockedExecSync.mockImplementation(() => {
|
|
131
|
-
const error = new Error('
|
|
132
|
-
error.message = 'Command failed: curl ... 404';
|
|
125
|
+
const error = new Error('curl failed with 404 status');
|
|
133
126
|
throw error;
|
|
134
127
|
});
|
|
135
128
|
const db = (0, database_1.getDatabaseManager)();
|
|
136
|
-
|
|
137
|
-
expect(result).toBeNull();
|
|
129
|
+
expect(() => db.getProject(999)).toThrow();
|
|
138
130
|
});
|
|
139
131
|
});
|
|
140
132
|
describe('getAllProjects', () => {
|
|
@@ -130,7 +130,12 @@ describe('detector', () => {
|
|
|
130
130
|
expect(result).toBeNull();
|
|
131
131
|
});
|
|
132
132
|
it('should handle invalid JSON in package.json', () => {
|
|
133
|
-
|
|
133
|
+
const packageJson = {};
|
|
134
|
+
mockedFs.existsSync.mockImplementation((filePath) => {
|
|
135
|
+
const pathStr = filePath.toString();
|
|
136
|
+
// Return true only for package.json, false for all config files
|
|
137
|
+
return pathStr === packageJsonPath;
|
|
138
|
+
});
|
|
134
139
|
mockedFs.readFileSync.mockReturnValue('invalid json');
|
|
135
140
|
const result = (0, detector_1.detectTestFramework)(projectPath);
|
|
136
141
|
expect(result).toBeNull();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const fs = __importStar(require("fs"));
|
|
37
|
+
const child_process_1 = require("child_process");
|
|
38
|
+
const index_1 = require("../index");
|
|
39
|
+
// Mock modules
|
|
40
|
+
jest.mock('fs');
|
|
41
|
+
jest.mock('child_process');
|
|
42
|
+
const mockedFs = fs;
|
|
43
|
+
const mockedExecSync = child_process_1.execSync;
|
|
44
|
+
describe('index - convenience functions', () => {
|
|
45
|
+
beforeEach(() => {
|
|
46
|
+
jest.clearAllMocks();
|
|
47
|
+
mockedFs.existsSync.mockReturnValue(false);
|
|
48
|
+
// Reset the singleton
|
|
49
|
+
require('../database').dbManager = null;
|
|
50
|
+
});
|
|
51
|
+
describe('getAllProjects', () => {
|
|
52
|
+
it('should return all projects', () => {
|
|
53
|
+
const mockProjects = [
|
|
54
|
+
{
|
|
55
|
+
id: 1,
|
|
56
|
+
name: 'Project 1',
|
|
57
|
+
path: '/path/1',
|
|
58
|
+
description: 'First project',
|
|
59
|
+
framework: 'react',
|
|
60
|
+
last_scanned: Date.now(),
|
|
61
|
+
created_at: Date.now() - 10000,
|
|
62
|
+
tags: ['frontend', 'react'],
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
id: 2,
|
|
66
|
+
name: 'Project 2',
|
|
67
|
+
path: '/path/2',
|
|
68
|
+
description: 'Second project',
|
|
69
|
+
framework: 'express',
|
|
70
|
+
last_scanned: Date.now(),
|
|
71
|
+
created_at: Date.now() - 20000,
|
|
72
|
+
tags: ['backend', 'api'],
|
|
73
|
+
},
|
|
74
|
+
];
|
|
75
|
+
mockedExecSync.mockReturnValue(JSON.stringify(mockProjects));
|
|
76
|
+
const result = (0, index_1.getAllProjects)();
|
|
77
|
+
expect(result).toEqual(mockProjects);
|
|
78
|
+
expect(result.length).toBe(2);
|
|
79
|
+
expect(result[0].name).toBe('Project 1');
|
|
80
|
+
expect(result[1].name).toBe('Project 2');
|
|
81
|
+
});
|
|
82
|
+
it('should return empty array when no projects exist', () => {
|
|
83
|
+
mockedExecSync.mockReturnValue(JSON.stringify([]));
|
|
84
|
+
const result = (0, index_1.getAllProjects)();
|
|
85
|
+
expect(result).toEqual([]);
|
|
86
|
+
expect(Array.isArray(result)).toBe(true);
|
|
87
|
+
});
|
|
88
|
+
it('should handle projects with different properties', () => {
|
|
89
|
+
const mockProjects = [
|
|
90
|
+
{
|
|
91
|
+
id: 1,
|
|
92
|
+
name: 'Basic Project',
|
|
93
|
+
path: '/basic',
|
|
94
|
+
description: null,
|
|
95
|
+
framework: null,
|
|
96
|
+
last_scanned: null,
|
|
97
|
+
created_at: Date.now(),
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
id: 2,
|
|
101
|
+
name: 'Full Project',
|
|
102
|
+
path: '/full',
|
|
103
|
+
description: 'Complete details',
|
|
104
|
+
framework: 'next.js',
|
|
105
|
+
last_scanned: Date.now(),
|
|
106
|
+
created_at: Date.now(),
|
|
107
|
+
tags: ['fullstack', 'nextjs'],
|
|
108
|
+
},
|
|
109
|
+
];
|
|
110
|
+
mockedExecSync.mockReturnValue(JSON.stringify(mockProjects));
|
|
111
|
+
const result = (0, index_1.getAllProjects)();
|
|
112
|
+
expect(result[0].description).toBeNull();
|
|
113
|
+
expect(result[0].framework).toBeNull();
|
|
114
|
+
expect(result[1].description).toBe('Complete details');
|
|
115
|
+
expect(result[1].framework).toBe('next.js');
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe('addProject', () => {
|
|
119
|
+
it('should add a new project', () => {
|
|
120
|
+
const mockProject = {
|
|
121
|
+
id: 1,
|
|
122
|
+
name: 'New Project',
|
|
123
|
+
path: '/new/path',
|
|
124
|
+
description: null,
|
|
125
|
+
framework: null,
|
|
126
|
+
last_scanned: null,
|
|
127
|
+
created_at: Date.now(),
|
|
128
|
+
};
|
|
129
|
+
mockedExecSync.mockReturnValue(JSON.stringify(mockProject));
|
|
130
|
+
const result = (0, index_1.addProject)('New Project', '/new/path');
|
|
131
|
+
expect(result).toEqual(mockProject);
|
|
132
|
+
expect(result.name).toBe('New Project');
|
|
133
|
+
expect(result.path).toBe('/new/path');
|
|
134
|
+
});
|
|
135
|
+
it('should add project with special characters in name', () => {
|
|
136
|
+
const mockProject = {
|
|
137
|
+
id: 1,
|
|
138
|
+
name: 'My Project (v2.0) [Test]',
|
|
139
|
+
path: '/special/path',
|
|
140
|
+
description: null,
|
|
141
|
+
framework: null,
|
|
142
|
+
last_scanned: null,
|
|
143
|
+
created_at: Date.now(),
|
|
144
|
+
};
|
|
145
|
+
mockedExecSync.mockReturnValue(JSON.stringify(mockProject));
|
|
146
|
+
const result = (0, index_1.addProject)('My Project (v2.0) [Test]', '/special/path');
|
|
147
|
+
expect(result.name).toBe('My Project (v2.0) [Test]');
|
|
148
|
+
});
|
|
149
|
+
it('should add project with absolute path', () => {
|
|
150
|
+
const mockProject = {
|
|
151
|
+
id: 1,
|
|
152
|
+
name: 'Test Project',
|
|
153
|
+
path: '/Users/username/projects/test',
|
|
154
|
+
description: null,
|
|
155
|
+
framework: null,
|
|
156
|
+
last_scanned: null,
|
|
157
|
+
created_at: Date.now(),
|
|
158
|
+
};
|
|
159
|
+
mockedExecSync.mockReturnValue(JSON.stringify(mockProject));
|
|
160
|
+
const result = (0, index_1.addProject)('Test Project', '/Users/username/projects/test');
|
|
161
|
+
expect(result.path).toBe('/Users/username/projects/test');
|
|
162
|
+
});
|
|
163
|
+
it('should handle API errors when adding project', () => {
|
|
164
|
+
mockedExecSync.mockImplementation(() => {
|
|
165
|
+
throw new Error('API request failed: Project already exists');
|
|
166
|
+
});
|
|
167
|
+
expect(() => (0, index_1.addProject)('Duplicate', '/path')).toThrow('API request failed');
|
|
168
|
+
});
|
|
169
|
+
it('should return project with correct created_at timestamp', () => {
|
|
170
|
+
const now = Date.now();
|
|
171
|
+
const mockProject = {
|
|
172
|
+
id: 1,
|
|
173
|
+
name: 'Test',
|
|
174
|
+
path: '/test',
|
|
175
|
+
description: null,
|
|
176
|
+
framework: null,
|
|
177
|
+
last_scanned: null,
|
|
178
|
+
created_at: now,
|
|
179
|
+
};
|
|
180
|
+
mockedExecSync.mockReturnValue(JSON.stringify(mockProject));
|
|
181
|
+
const result = (0, index_1.addProject)('Test', '/test');
|
|
182
|
+
expect(result.created_at).toBe(now);
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
describe('removeProject', () => {
|
|
186
|
+
it('should remove a project by id', () => {
|
|
187
|
+
mockedExecSync.mockReturnValue('');
|
|
188
|
+
expect(() => (0, index_1.removeProject)(1)).not.toThrow();
|
|
189
|
+
expect(mockedExecSync).toHaveBeenCalledWith(expect.stringContaining('DELETE'), expect.any(Object));
|
|
190
|
+
});
|
|
191
|
+
it('should handle removing multiple projects', () => {
|
|
192
|
+
mockedExecSync.mockReturnValue('');
|
|
193
|
+
expect(() => {
|
|
194
|
+
(0, index_1.removeProject)(1);
|
|
195
|
+
(0, index_1.removeProject)(2);
|
|
196
|
+
(0, index_1.removeProject)(3);
|
|
197
|
+
}).not.toThrow();
|
|
198
|
+
expect(mockedExecSync).toHaveBeenCalledTimes(3);
|
|
199
|
+
});
|
|
200
|
+
it('should handle errors when removing non-existent project', () => {
|
|
201
|
+
mockedExecSync.mockImplementation(() => {
|
|
202
|
+
const error = new Error('Command failed: curl');
|
|
203
|
+
error.message = 'Command failed: curl ... 404';
|
|
204
|
+
throw error;
|
|
205
|
+
});
|
|
206
|
+
expect(() => (0, index_1.removeProject)(999)).toThrow();
|
|
207
|
+
});
|
|
208
|
+
it('should not return a value', () => {
|
|
209
|
+
mockedExecSync.mockReturnValue('');
|
|
210
|
+
const result = (0, index_1.removeProject)(1);
|
|
211
|
+
expect(result).toBeUndefined();
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
describe('getTestsByProject', () => {
|
|
215
|
+
it('should get all tests for a project', () => {
|
|
216
|
+
const mockTests = [
|
|
217
|
+
{
|
|
218
|
+
id: 1,
|
|
219
|
+
project_id: 1,
|
|
220
|
+
file_path: '/test/file1.test.ts',
|
|
221
|
+
framework: 'jest',
|
|
222
|
+
status: 'passed',
|
|
223
|
+
last_run: Date.now(),
|
|
224
|
+
created_at: Date.now() - 10000,
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
id: 2,
|
|
228
|
+
project_id: 1,
|
|
229
|
+
file_path: '/test/file2.spec.ts',
|
|
230
|
+
framework: 'jest',
|
|
231
|
+
status: 'failed',
|
|
232
|
+
last_run: Date.now(),
|
|
233
|
+
created_at: Date.now() - 10000,
|
|
234
|
+
},
|
|
235
|
+
];
|
|
236
|
+
mockedExecSync.mockReturnValue(JSON.stringify(mockTests));
|
|
237
|
+
const result = (0, index_1.getTestsByProject)(1);
|
|
238
|
+
expect(result).toEqual(mockTests);
|
|
239
|
+
expect(result.length).toBe(2);
|
|
240
|
+
});
|
|
241
|
+
it('should return empty array for project with no tests', () => {
|
|
242
|
+
mockedExecSync.mockReturnValue(JSON.stringify([]));
|
|
243
|
+
const result = (0, index_1.getTestsByProject)(1);
|
|
244
|
+
expect(result).toEqual([]);
|
|
245
|
+
expect(Array.isArray(result)).toBe(true);
|
|
246
|
+
});
|
|
247
|
+
it('should handle tests with different frameworks', () => {
|
|
248
|
+
const mockTests = [
|
|
249
|
+
{
|
|
250
|
+
id: 1,
|
|
251
|
+
project_id: 1,
|
|
252
|
+
file_path: '/test/jest.test.ts',
|
|
253
|
+
framework: 'jest',
|
|
254
|
+
status: null,
|
|
255
|
+
last_run: null,
|
|
256
|
+
created_at: Date.now(),
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
id: 2,
|
|
260
|
+
project_id: 1,
|
|
261
|
+
file_path: '/test/vitest.spec.ts',
|
|
262
|
+
framework: 'vitest',
|
|
263
|
+
status: null,
|
|
264
|
+
last_run: null,
|
|
265
|
+
created_at: Date.now(),
|
|
266
|
+
},
|
|
267
|
+
];
|
|
268
|
+
mockedExecSync.mockReturnValue(JSON.stringify(mockTests));
|
|
269
|
+
const result = (0, index_1.getTestsByProject)(1);
|
|
270
|
+
expect(result[0].framework).toBe('jest');
|
|
271
|
+
expect(result[1].framework).toBe('vitest');
|
|
272
|
+
});
|
|
273
|
+
it('should handle tests without status or last_run', () => {
|
|
274
|
+
const mockTests = [
|
|
275
|
+
{
|
|
276
|
+
id: 1,
|
|
277
|
+
project_id: 1,
|
|
278
|
+
file_path: '/test/new.test.ts',
|
|
279
|
+
framework: 'jest',
|
|
280
|
+
status: null,
|
|
281
|
+
last_run: null,
|
|
282
|
+
created_at: Date.now(),
|
|
283
|
+
},
|
|
284
|
+
];
|
|
285
|
+
mockedExecSync.mockReturnValue(JSON.stringify(mockTests));
|
|
286
|
+
const result = (0, index_1.getTestsByProject)(1);
|
|
287
|
+
expect(result[0].status).toBeNull();
|
|
288
|
+
expect(result[0].last_run).toBeNull();
|
|
289
|
+
});
|
|
290
|
+
it('should handle API errors', () => {
|
|
291
|
+
mockedExecSync.mockImplementation(() => {
|
|
292
|
+
throw new Error('API request failed');
|
|
293
|
+
});
|
|
294
|
+
expect(() => (0, index_1.getTestsByProject)(1)).toThrow('API request failed');
|
|
295
|
+
});
|
|
296
|
+
it('should filter tests by project_id', () => {
|
|
297
|
+
const mockTests = [
|
|
298
|
+
{
|
|
299
|
+
id: 1,
|
|
300
|
+
project_id: 5,
|
|
301
|
+
file_path: '/test/file.test.ts',
|
|
302
|
+
framework: 'jest',
|
|
303
|
+
status: null,
|
|
304
|
+
last_run: null,
|
|
305
|
+
created_at: Date.now(),
|
|
306
|
+
},
|
|
307
|
+
];
|
|
308
|
+
mockedExecSync.mockReturnValue(JSON.stringify(mockTests));
|
|
309
|
+
const result = (0, index_1.getTestsByProject)(5);
|
|
310
|
+
expect(result[0].project_id).toBe(5);
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
describe('getDatabaseManager', () => {
|
|
314
|
+
it('should return database manager instance', () => {
|
|
315
|
+
const db = (0, index_1.getDatabaseManager)();
|
|
316
|
+
expect(db).toBeDefined();
|
|
317
|
+
expect(typeof db.getAllProjects).toBe('function');
|
|
318
|
+
expect(typeof db.addProject).toBe('function');
|
|
319
|
+
expect(typeof db.removeProject).toBe('function');
|
|
320
|
+
});
|
|
321
|
+
it('should return singleton instance', () => {
|
|
322
|
+
const db1 = (0, index_1.getDatabaseManager)();
|
|
323
|
+
const db2 = (0, index_1.getDatabaseManager)();
|
|
324
|
+
expect(db1).toBe(db2);
|
|
325
|
+
});
|
|
326
|
+
it('should have all expected methods', () => {
|
|
327
|
+
const db = (0, index_1.getDatabaseManager)();
|
|
328
|
+
// Project methods
|
|
329
|
+
expect(db).toHaveProperty('addProject');
|
|
330
|
+
expect(db).toHaveProperty('getProject');
|
|
331
|
+
expect(db).toHaveProperty('getAllProjects');
|
|
332
|
+
expect(db).toHaveProperty('updateProject');
|
|
333
|
+
expect(db).toHaveProperty('removeProject');
|
|
334
|
+
expect(db).toHaveProperty('scanProject');
|
|
335
|
+
expect(db).toHaveProperty('scanAllProjects');
|
|
336
|
+
// Test methods
|
|
337
|
+
expect(db).toHaveProperty('getTestsByProject');
|
|
338
|
+
// Settings methods
|
|
339
|
+
expect(db).toHaveProperty('getSetting');
|
|
340
|
+
expect(db).toHaveProperty('setSetting');
|
|
341
|
+
expect(db).toHaveProperty('getAllSettings');
|
|
342
|
+
// Test result methods
|
|
343
|
+
expect(db).toHaveProperty('addTestResult');
|
|
344
|
+
expect(db).toHaveProperty('getLatestTestResult');
|
|
345
|
+
expect(db).toHaveProperty('getTestResultsByProject');
|
|
346
|
+
// Port methods
|
|
347
|
+
expect(db).toHaveProperty('getProjectPorts');
|
|
348
|
+
expect(db).toHaveProperty('getProjectPortsByScript');
|
|
349
|
+
// Utility methods
|
|
350
|
+
expect(db).toHaveProperty('close');
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
describe('module exports', () => {
|
|
354
|
+
it('should export all necessary functions', () => {
|
|
355
|
+
const index = require('../index');
|
|
356
|
+
expect(index.getAllProjects).toBeDefined();
|
|
357
|
+
expect(index.addProject).toBeDefined();
|
|
358
|
+
expect(index.removeProject).toBeDefined();
|
|
359
|
+
expect(index.getTestsByProject).toBeDefined();
|
|
360
|
+
expect(index.getDatabaseManager).toBeDefined();
|
|
361
|
+
});
|
|
362
|
+
it('should re-export types from other modules', () => {
|
|
363
|
+
const index = require('../index');
|
|
364
|
+
// These should be available via re-exports
|
|
365
|
+
expect(index.detectTestFramework).toBeDefined();
|
|
366
|
+
expect(index.detectProjectFramework).toBeDefined();
|
|
367
|
+
expect(index.isTestFile).toBeDefined();
|
|
368
|
+
expect(index.scanProject).toBeDefined();
|
|
369
|
+
expect(index.scanAllProjects).toBeDefined();
|
|
370
|
+
expect(index.getSetting).toBeDefined();
|
|
371
|
+
expect(index.setSetting).toBeDefined();
|
|
372
|
+
expect(index.getAllSettings).toBeDefined();
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
describe('integration scenarios', () => {
|
|
376
|
+
it('should support adding and then getting a project', () => {
|
|
377
|
+
const mockProject = {
|
|
378
|
+
id: 1,
|
|
379
|
+
name: 'Integration Test',
|
|
380
|
+
path: '/integration',
|
|
381
|
+
description: null,
|
|
382
|
+
framework: null,
|
|
383
|
+
last_scanned: null,
|
|
384
|
+
created_at: Date.now(),
|
|
385
|
+
};
|
|
386
|
+
// First call: addProject
|
|
387
|
+
mockedExecSync.mockReturnValueOnce(JSON.stringify(mockProject));
|
|
388
|
+
// Second call: getAllProjects
|
|
389
|
+
mockedExecSync.mockReturnValueOnce(JSON.stringify([mockProject]));
|
|
390
|
+
const addedProject = (0, index_1.addProject)('Integration Test', '/integration');
|
|
391
|
+
const allProjects = (0, index_1.getAllProjects)();
|
|
392
|
+
expect(addedProject.id).toBe(1);
|
|
393
|
+
expect(allProjects.length).toBe(1);
|
|
394
|
+
expect(allProjects[0].id).toBe(addedProject.id);
|
|
395
|
+
});
|
|
396
|
+
it('should support adding project and getting its tests', () => {
|
|
397
|
+
const mockProject = {
|
|
398
|
+
id: 1,
|
|
399
|
+
name: 'Test Project',
|
|
400
|
+
path: '/test',
|
|
401
|
+
description: null,
|
|
402
|
+
framework: 'jest',
|
|
403
|
+
last_scanned: null,
|
|
404
|
+
created_at: Date.now(),
|
|
405
|
+
};
|
|
406
|
+
const mockTests = [
|
|
407
|
+
{
|
|
408
|
+
id: 1,
|
|
409
|
+
project_id: 1,
|
|
410
|
+
file_path: '/test/file.test.ts',
|
|
411
|
+
framework: 'jest',
|
|
412
|
+
status: null,
|
|
413
|
+
last_run: null,
|
|
414
|
+
created_at: Date.now(),
|
|
415
|
+
},
|
|
416
|
+
];
|
|
417
|
+
// First call: addProject
|
|
418
|
+
mockedExecSync.mockReturnValueOnce(JSON.stringify(mockProject));
|
|
419
|
+
// Second call: getTestsByProject
|
|
420
|
+
mockedExecSync.mockReturnValueOnce(JSON.stringify(mockTests));
|
|
421
|
+
const project = (0, index_1.addProject)('Test Project', '/test');
|
|
422
|
+
const tests = (0, index_1.getTestsByProject)(project.id);
|
|
423
|
+
expect(tests.length).toBe(1);
|
|
424
|
+
expect(tests[0].project_id).toBe(project.id);
|
|
425
|
+
});
|
|
426
|
+
it('should handle multiple operations in sequence', () => {
|
|
427
|
+
// Add project
|
|
428
|
+
mockedExecSync.mockReturnValueOnce(JSON.stringify({
|
|
429
|
+
id: 1,
|
|
430
|
+
name: 'Project 1',
|
|
431
|
+
path: '/p1',
|
|
432
|
+
description: null,
|
|
433
|
+
framework: null,
|
|
434
|
+
last_scanned: null,
|
|
435
|
+
created_at: Date.now(),
|
|
436
|
+
}));
|
|
437
|
+
// Add another project
|
|
438
|
+
mockedExecSync.mockReturnValueOnce(JSON.stringify({
|
|
439
|
+
id: 2,
|
|
440
|
+
name: 'Project 2',
|
|
441
|
+
path: '/p2',
|
|
442
|
+
description: null,
|
|
443
|
+
framework: null,
|
|
444
|
+
last_scanned: null,
|
|
445
|
+
created_at: Date.now(),
|
|
446
|
+
}));
|
|
447
|
+
// Get all projects
|
|
448
|
+
mockedExecSync.mockReturnValueOnce(JSON.stringify([
|
|
449
|
+
{ id: 1, name: 'Project 1', path: '/p1', description: null, framework: null, last_scanned: null, created_at: Date.now() },
|
|
450
|
+
{ id: 2, name: 'Project 2', path: '/p2', description: null, framework: null, last_scanned: null, created_at: Date.now() },
|
|
451
|
+
]));
|
|
452
|
+
// Remove first project
|
|
453
|
+
mockedExecSync.mockReturnValueOnce('');
|
|
454
|
+
// Get all projects again
|
|
455
|
+
mockedExecSync.mockReturnValueOnce(JSON.stringify([
|
|
456
|
+
{ id: 2, name: 'Project 2', path: '/p2', description: null, framework: null, last_scanned: null, created_at: Date.now() },
|
|
457
|
+
]));
|
|
458
|
+
const p1 = (0, index_1.addProject)('Project 1', '/p1');
|
|
459
|
+
const p2 = (0, index_1.addProject)('Project 2', '/p2');
|
|
460
|
+
let projects = (0, index_1.getAllProjects)();
|
|
461
|
+
expect(projects.length).toBe(2);
|
|
462
|
+
(0, index_1.removeProject)(p1.id);
|
|
463
|
+
projects = (0, index_1.getAllProjects)();
|
|
464
|
+
expect(projects.length).toBe(1);
|
|
465
|
+
expect(projects[0].id).toBe(p2.id);
|
|
466
|
+
});
|
|
467
|
+
});
|
|
468
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|