@programisto/edrm-storage 0.3.1 → 1.0.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/dist/modules/edrm-storage/examples/usage.example.js +2 -2
- package/dist/modules/edrm-storage/models/file.model.js +1 -0
- package/dist/modules/edrm-storage/services/edrm-storage.service.d.ts +0 -1
- package/dist/modules/edrm-storage/services/edrm-storage.service.js +3 -14
- package/package.json +5 -6
- package/dist/modules/edrm-exams/lib/openai/correctQuestion.txt +0 -9
- package/dist/modules/edrm-exams/lib/openai/createQuestion.txt +0 -6
- package/dist/modules/edrm-exams/lib/openai.d.ts +0 -37
- package/dist/modules/edrm-exams/lib/openai.js +0 -135
- package/dist/modules/edrm-exams/listeners/correct.listener.d.ts +0 -2
- package/dist/modules/edrm-exams/listeners/correct.listener.js +0 -167
- package/dist/modules/edrm-exams/models/candidate.model.d.ts +0 -21
- package/dist/modules/edrm-exams/models/candidate.model.js +0 -75
- package/dist/modules/edrm-exams/models/candidate.models.d.ts +0 -21
- package/dist/modules/edrm-exams/models/candidate.models.js +0 -75
- package/dist/modules/edrm-exams/models/company.model.d.ts +0 -8
- package/dist/modules/edrm-exams/models/company.model.js +0 -34
- package/dist/modules/edrm-exams/models/contact.model.d.ts +0 -14
- package/dist/modules/edrm-exams/models/contact.model.js +0 -60
- package/dist/modules/edrm-exams/models/test-category.models.d.ts +0 -7
- package/dist/modules/edrm-exams/models/test-category.models.js +0 -29
- package/dist/modules/edrm-exams/models/test-job.model.d.ts +0 -7
- package/dist/modules/edrm-exams/models/test-job.model.js +0 -29
- package/dist/modules/edrm-exams/models/test-question.model.d.ts +0 -25
- package/dist/modules/edrm-exams/models/test-question.model.js +0 -70
- package/dist/modules/edrm-exams/models/test-result.model.d.ts +0 -26
- package/dist/modules/edrm-exams/models/test-result.model.js +0 -70
- package/dist/modules/edrm-exams/models/test.model.d.ts +0 -47
- package/dist/modules/edrm-exams/models/test.model.js +0 -133
- package/dist/modules/edrm-exams/models/user.model.d.ts +0 -18
- package/dist/modules/edrm-exams/models/user.model.js +0 -73
- package/dist/modules/edrm-exams/routes/company.router.d.ts +0 -7
- package/dist/modules/edrm-exams/routes/company.router.js +0 -108
- package/dist/modules/edrm-exams/routes/exams-candidate.router.d.ts +0 -7
- package/dist/modules/edrm-exams/routes/exams-candidate.router.js +0 -448
- package/dist/modules/edrm-exams/routes/exams.router.d.ts +0 -8
- package/dist/modules/edrm-exams/routes/exams.router.js +0 -1343
- package/dist/modules/edrm-exams/routes/result.router.d.ts +0 -7
- package/dist/modules/edrm-exams/routes/result.router.js +0 -370
- package/dist/modules/edrm-exams/routes/user.router.d.ts +0 -7
- package/dist/modules/edrm-exams/routes/user.router.js +0 -96
- package/dist/modules/edrm-storage/integration/edrm-storage-integration.d.ts +0 -53
- package/dist/modules/edrm-storage/integration/edrm-storage-integration.js +0 -132
- package/dist/modules/edrm-storage/tests/edrm-storage.service.test.d.ts +0 -1
- package/dist/modules/edrm-storage/tests/edrm-storage.service.test.js +0 -143
- package/dist/modules/edrm-storage/tests/integration.test.d.ts +0 -1
- package/dist/modules/edrm-storage/tests/integration.test.js +0 -141
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
import { EdrmStorageService } from '../services/edrm-storage.service.js';
|
|
2
|
-
import { FileProvider, FileStatus } from '../models/file.model.js';
|
|
3
|
-
describe('EdrmStorageService', () => {
|
|
4
|
-
let storageService;
|
|
5
|
-
beforeEach(() => {
|
|
6
|
-
storageService = new EdrmStorageService();
|
|
7
|
-
});
|
|
8
|
-
describe('initUpload', () => {
|
|
9
|
-
it('devrait initialiser un upload avec succès', async () => {
|
|
10
|
-
const mockData = {
|
|
11
|
-
originalName: 'test.pdf',
|
|
12
|
-
mimeType: 'application/pdf',
|
|
13
|
-
size: 1024000,
|
|
14
|
-
tenantId: 'test-tenant',
|
|
15
|
-
entityName: 'test-entity',
|
|
16
|
-
entityId: 'test-id'
|
|
17
|
-
};
|
|
18
|
-
// Mock du provider S3
|
|
19
|
-
const mockProvider = {
|
|
20
|
-
initUpload: jest.fn().mockResolvedValue({
|
|
21
|
-
uploadId: 'test-upload-id',
|
|
22
|
-
presignedUrl: 'https://test-url.com',
|
|
23
|
-
expiresAt: new Date(),
|
|
24
|
-
bucket: 'test-bucket',
|
|
25
|
-
key: 'test-key'
|
|
26
|
-
})
|
|
27
|
-
};
|
|
28
|
-
// Mock du modèle File
|
|
29
|
-
const mockFileModel = {
|
|
30
|
-
save: jest.fn().mockResolvedValue({
|
|
31
|
-
_id: 'test-file-id',
|
|
32
|
-
...mockData
|
|
33
|
-
})
|
|
34
|
-
};
|
|
35
|
-
// Injecter les mocks
|
|
36
|
-
storageService.providers.set(FileProvider.S3, mockProvider);
|
|
37
|
-
jest.spyOn(require('../models/file.model.js'), 'default').mockImplementation(() => mockFileModel);
|
|
38
|
-
const result = await storageService.initUpload(mockData.originalName, mockData.mimeType, mockData.size, mockData.tenantId, mockData.entityName, mockData.entityId);
|
|
39
|
-
expect(result).toBeDefined();
|
|
40
|
-
expect(result.fileId).toBe('test-file-id');
|
|
41
|
-
expect(mockProvider.initUpload).toHaveBeenCalled();
|
|
42
|
-
});
|
|
43
|
-
it('devrait rejeter avec une erreur si les paramètres sont manquants', async () => {
|
|
44
|
-
await expect(storageService.initUpload('', 'application/pdf', 1024000, 'test-tenant', 'test-entity', 'test-id')).rejects.toThrow();
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
describe('completeUpload', () => {
|
|
48
|
-
it('devrait finaliser un upload avec succès', async () => {
|
|
49
|
-
const mockFileRecord = {
|
|
50
|
-
_id: 'test-file-id',
|
|
51
|
-
status: FileStatus.PENDING,
|
|
52
|
-
bucket: 'test-bucket',
|
|
53
|
-
key: 'test-key',
|
|
54
|
-
provider: FileProvider.S3,
|
|
55
|
-
save: jest.fn().mockResolvedValue(true)
|
|
56
|
-
};
|
|
57
|
-
const mockProvider = {
|
|
58
|
-
getFileMetadata: jest.fn().mockResolvedValue({
|
|
59
|
-
size: 1024000,
|
|
60
|
-
etag: 'test-etag',
|
|
61
|
-
lastModified: new Date(),
|
|
62
|
-
contentType: 'application/pdf'
|
|
63
|
-
})
|
|
64
|
-
};
|
|
65
|
-
// Mock du modèle File
|
|
66
|
-
jest.spyOn(require('../models/file.model.js'), 'default').mockImplementation(() => ({
|
|
67
|
-
findById: jest.fn().mockResolvedValue(mockFileRecord)
|
|
68
|
-
}));
|
|
69
|
-
storageService.providers.set(FileProvider.S3, mockProvider);
|
|
70
|
-
const result = await storageService.completeUpload('test-file-id');
|
|
71
|
-
expect(result.status).toBe(FileStatus.COMPLETED);
|
|
72
|
-
expect(mockProvider.getFileMetadata).toHaveBeenCalled();
|
|
73
|
-
});
|
|
74
|
-
it('devrait rejeter si le fichier n\'existe pas', async () => {
|
|
75
|
-
jest.spyOn(require('../models/file.model.js'), 'default').mockImplementation(() => ({
|
|
76
|
-
findById: jest.fn().mockResolvedValue(null)
|
|
77
|
-
}));
|
|
78
|
-
await expect(storageService.completeUpload('non-existent-id')).rejects.toThrow('Fichier non trouvé');
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
describe('getDownloadUrl', () => {
|
|
82
|
-
it('devrait générer une URL de téléchargement', async () => {
|
|
83
|
-
const mockFileRecord = {
|
|
84
|
-
_id: 'test-file-id',
|
|
85
|
-
status: FileStatus.COMPLETED,
|
|
86
|
-
bucket: 'test-bucket',
|
|
87
|
-
key: 'test-key',
|
|
88
|
-
provider: FileProvider.S3,
|
|
89
|
-
originalName: 'test.pdf',
|
|
90
|
-
accessCount: 0,
|
|
91
|
-
save: jest.fn().mockResolvedValue(true)
|
|
92
|
-
};
|
|
93
|
-
const mockProvider = {
|
|
94
|
-
getDownloadUrl: jest.fn().mockResolvedValue({
|
|
95
|
-
url: 'https://download-url.com',
|
|
96
|
-
expiresAt: new Date(),
|
|
97
|
-
filename: 'test.pdf',
|
|
98
|
-
contentType: 'application/pdf'
|
|
99
|
-
})
|
|
100
|
-
};
|
|
101
|
-
jest.spyOn(require('../models/file.model.js'), 'default').mockImplementation(() => ({
|
|
102
|
-
findById: jest.fn().mockResolvedValue(mockFileRecord)
|
|
103
|
-
}));
|
|
104
|
-
storageService.providers.set(FileProvider.S3, mockProvider);
|
|
105
|
-
const result = await storageService.getDownloadUrl('test-file-id');
|
|
106
|
-
expect(result.url).toBeDefined();
|
|
107
|
-
expect(mockProvider.getDownloadUrl).toHaveBeenCalled();
|
|
108
|
-
});
|
|
109
|
-
it('devrait rejeter si le fichier n\'est pas finalisé', async () => {
|
|
110
|
-
const mockFileRecord = {
|
|
111
|
-
_id: 'test-file-id',
|
|
112
|
-
status: FileStatus.PENDING
|
|
113
|
-
};
|
|
114
|
-
jest.spyOn(require('../models/file.model.js'), 'default').mockImplementation(() => ({
|
|
115
|
-
findById: jest.fn().mockResolvedValue(mockFileRecord)
|
|
116
|
-
}));
|
|
117
|
-
await expect(storageService.getDownloadUrl('test-file-id')).rejects.toThrow('Fichier non encore finalisé');
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
describe('listFiles', () => {
|
|
121
|
-
it('devrait lister les fichiers avec pagination', async () => {
|
|
122
|
-
const mockFiles = [
|
|
123
|
-
{ _id: 'file-1', filename: 'test1.pdf' },
|
|
124
|
-
{ _id: 'file-2', filename: 'test2.pdf' }
|
|
125
|
-
];
|
|
126
|
-
jest.spyOn(require('../models/file.model.js'), 'default').mockImplementation(() => ({
|
|
127
|
-
find: jest.fn().mockReturnValue({
|
|
128
|
-
sort: jest.fn().mockReturnValue({
|
|
129
|
-
skip: jest.fn().mockReturnValue({
|
|
130
|
-
limit: jest.fn().mockReturnValue({
|
|
131
|
-
exec: jest.fn().mockResolvedValue(mockFiles)
|
|
132
|
-
})
|
|
133
|
-
})
|
|
134
|
-
})
|
|
135
|
-
}),
|
|
136
|
-
countDocuments: jest.fn().mockResolvedValue(2)
|
|
137
|
-
}));
|
|
138
|
-
const result = await storageService.listFiles('test-tenant', 'test-entity', 'test-id');
|
|
139
|
-
expect(result.files).toHaveLength(2);
|
|
140
|
-
expect(result.total).toBe(2);
|
|
141
|
-
});
|
|
142
|
-
});
|
|
143
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
import { EdrmStorageService } from '../services/edrm-storage.service.js';
|
|
2
|
-
import { FileProvider } from '../models/file.model.js';
|
|
3
|
-
import { validateEdrmStorageConfig } from '../config/environment.example.js';
|
|
4
|
-
describe('EDRM Storage Integration Tests', () => {
|
|
5
|
-
let storageService;
|
|
6
|
-
beforeAll(async () => {
|
|
7
|
-
// Vérifier la configuration
|
|
8
|
-
const configValidation = validateEdrmStorageConfig();
|
|
9
|
-
if (!configValidation.valid) {
|
|
10
|
-
console.warn('Configuration invalide:', configValidation.errors);
|
|
11
|
-
}
|
|
12
|
-
storageService = new EdrmStorageService();
|
|
13
|
-
});
|
|
14
|
-
describe('Configuration', () => {
|
|
15
|
-
it('devrait valider la configuration d\'environnement', () => {
|
|
16
|
-
const validation = validateEdrmStorageConfig();
|
|
17
|
-
expect(validation.valid).toBeDefined();
|
|
18
|
-
expect(Array.isArray(validation.errors)).toBe(true);
|
|
19
|
-
});
|
|
20
|
-
});
|
|
21
|
-
describe('Service Initialization', () => {
|
|
22
|
-
it('devrait initialiser le service sans erreur', () => {
|
|
23
|
-
expect(storageService).toBeDefined();
|
|
24
|
-
expect(storageService).toBeInstanceOf(EdrmStorageService);
|
|
25
|
-
});
|
|
26
|
-
});
|
|
27
|
-
describe('Upload Flow', () => {
|
|
28
|
-
it('devrait initialiser un upload avec succès', async () => {
|
|
29
|
-
const testData = {
|
|
30
|
-
originalName: 'test-integration.pdf',
|
|
31
|
-
mimeType: 'application/pdf',
|
|
32
|
-
size: 1024,
|
|
33
|
-
tenantId: 'test-tenant',
|
|
34
|
-
entityName: 'test-entity',
|
|
35
|
-
entityId: 'test-id-123'
|
|
36
|
-
};
|
|
37
|
-
try {
|
|
38
|
-
const result = await storageService.initUpload(testData.originalName, testData.mimeType, testData.size, testData.tenantId, testData.entityName, testData.entityId, FileProvider.S3);
|
|
39
|
-
expect(result).toBeDefined();
|
|
40
|
-
expect(result.fileId).toBeDefined();
|
|
41
|
-
expect(result.presignedUrl).toBeDefined();
|
|
42
|
-
expect(result.bucket).toBeDefined();
|
|
43
|
-
expect(result.key).toBeDefined();
|
|
44
|
-
console.log('Upload initialisé avec succès:', {
|
|
45
|
-
fileId: result.fileId,
|
|
46
|
-
bucket: result.bucket,
|
|
47
|
-
key: result.key
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
catch (error) {
|
|
51
|
-
// Si les credentials AWS ne sont pas configurés, c'est normal
|
|
52
|
-
console.log('Test d\'upload ignoré - credentials AWS non configurés');
|
|
53
|
-
}
|
|
54
|
-
}, 10000);
|
|
55
|
-
it('devrait gérer les erreurs de paramètres invalides', async () => {
|
|
56
|
-
await expect(storageService.initUpload('', // nom vide
|
|
57
|
-
'application/pdf', 1024, 'tenant', 'entity', 'id')).rejects.toThrow();
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
describe('File Management', () => {
|
|
61
|
-
it('devrait lister les fichiers', async () => {
|
|
62
|
-
try {
|
|
63
|
-
const result = await storageService.listFiles('test-tenant', 'test-entity', 'test-id', undefined, 1, 10);
|
|
64
|
-
expect(result).toBeDefined();
|
|
65
|
-
expect(result.files).toBeDefined();
|
|
66
|
-
expect(Array.isArray(result.files)).toBe(true);
|
|
67
|
-
expect(result.total).toBeDefined();
|
|
68
|
-
expect(result.page).toBe(1);
|
|
69
|
-
expect(result.totalPages).toBeDefined();
|
|
70
|
-
}
|
|
71
|
-
catch (error) {
|
|
72
|
-
console.log('Test de listing ignoré - base de données non connectée');
|
|
73
|
-
}
|
|
74
|
-
});
|
|
75
|
-
it('devrait gérer les erreurs de fichier inexistant', async () => {
|
|
76
|
-
await expect(storageService.getFileById('non-existent-id')).rejects.toThrow('Fichier non trouvé');
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
describe('Provider Management', () => {
|
|
80
|
-
it('devrait supporter le provider S3', () => {
|
|
81
|
-
// Le provider S3 devrait être disponible par défaut
|
|
82
|
-
expect(FileProvider.S3).toBe('S3');
|
|
83
|
-
});
|
|
84
|
-
it('devrait gérer les providers non supportés', async () => {
|
|
85
|
-
// Test avec un provider inexistant
|
|
86
|
-
await expect(storageService.initUpload('test.pdf', 'application/pdf', 1024, 'tenant', 'entity', 'id', 'INVALID_PROVIDER')).rejects.toThrow('Provider INVALID_PROVIDER non supporté');
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
describe('Error Handling', () => {
|
|
90
|
-
it('devrait gérer les erreurs de connexion S3', async () => {
|
|
91
|
-
// Test avec des credentials invalides
|
|
92
|
-
const originalAccessKey = process.env.AWS_ACCESS_KEY_ID;
|
|
93
|
-
const originalSecretKey = process.env.AWS_SECRET_ACCESS_KEY;
|
|
94
|
-
// Simuler des credentials invalides
|
|
95
|
-
process.env.AWS_ACCESS_KEY_ID = 'invalid';
|
|
96
|
-
process.env.AWS_SECRET_ACCESS_KEY = 'invalid';
|
|
97
|
-
try {
|
|
98
|
-
await storageService.initUpload('test.pdf', 'application/pdf', 1024, 'tenant', 'entity', 'id');
|
|
99
|
-
}
|
|
100
|
-
catch (error) {
|
|
101
|
-
expect(error).toBeDefined();
|
|
102
|
-
console.log('Erreur S3 attendue avec credentials invalides');
|
|
103
|
-
}
|
|
104
|
-
finally {
|
|
105
|
-
// Restaurer les credentials originaux
|
|
106
|
-
if (originalAccessKey)
|
|
107
|
-
process.env.AWS_ACCESS_KEY_ID = originalAccessKey;
|
|
108
|
-
if (originalSecretKey)
|
|
109
|
-
process.env.AWS_SECRET_ACCESS_KEY = originalSecretKey;
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
describe('Performance', () => {
|
|
114
|
-
it('devrait gérer les uploads multiples', async () => {
|
|
115
|
-
const uploads = [];
|
|
116
|
-
const testData = {
|
|
117
|
-
originalName: 'test-multiple.pdf',
|
|
118
|
-
mimeType: 'application/pdf',
|
|
119
|
-
size: 1024,
|
|
120
|
-
tenantId: 'test-tenant',
|
|
121
|
-
entityName: 'test-entity',
|
|
122
|
-
entityId: 'test-id'
|
|
123
|
-
};
|
|
124
|
-
try {
|
|
125
|
-
// Créer plusieurs uploads simultanés
|
|
126
|
-
for (let i = 0; i < 3; i++) {
|
|
127
|
-
uploads.push(storageService.initUpload(`${testData.originalName}-${i}`, testData.mimeType, testData.size, testData.tenantId, testData.entityName, `${testData.entityId}-${i}`));
|
|
128
|
-
}
|
|
129
|
-
const results = await Promise.all(uploads);
|
|
130
|
-
expect(results).toHaveLength(3);
|
|
131
|
-
results.forEach((result, index) => {
|
|
132
|
-
expect(result.fileId).toBeDefined();
|
|
133
|
-
expect(result.presignedUrl).toBeDefined();
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
catch (error) {
|
|
137
|
-
console.log('Test de performance ignoré - credentials AWS non configurés');
|
|
138
|
-
}
|
|
139
|
-
}, 15000);
|
|
140
|
-
});
|
|
141
|
-
});
|