@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.
Files changed (47) hide show
  1. package/dist/modules/edrm-storage/examples/usage.example.js +2 -2
  2. package/dist/modules/edrm-storage/models/file.model.js +1 -0
  3. package/dist/modules/edrm-storage/services/edrm-storage.service.d.ts +0 -1
  4. package/dist/modules/edrm-storage/services/edrm-storage.service.js +3 -14
  5. package/package.json +5 -6
  6. package/dist/modules/edrm-exams/lib/openai/correctQuestion.txt +0 -9
  7. package/dist/modules/edrm-exams/lib/openai/createQuestion.txt +0 -6
  8. package/dist/modules/edrm-exams/lib/openai.d.ts +0 -37
  9. package/dist/modules/edrm-exams/lib/openai.js +0 -135
  10. package/dist/modules/edrm-exams/listeners/correct.listener.d.ts +0 -2
  11. package/dist/modules/edrm-exams/listeners/correct.listener.js +0 -167
  12. package/dist/modules/edrm-exams/models/candidate.model.d.ts +0 -21
  13. package/dist/modules/edrm-exams/models/candidate.model.js +0 -75
  14. package/dist/modules/edrm-exams/models/candidate.models.d.ts +0 -21
  15. package/dist/modules/edrm-exams/models/candidate.models.js +0 -75
  16. package/dist/modules/edrm-exams/models/company.model.d.ts +0 -8
  17. package/dist/modules/edrm-exams/models/company.model.js +0 -34
  18. package/dist/modules/edrm-exams/models/contact.model.d.ts +0 -14
  19. package/dist/modules/edrm-exams/models/contact.model.js +0 -60
  20. package/dist/modules/edrm-exams/models/test-category.models.d.ts +0 -7
  21. package/dist/modules/edrm-exams/models/test-category.models.js +0 -29
  22. package/dist/modules/edrm-exams/models/test-job.model.d.ts +0 -7
  23. package/dist/modules/edrm-exams/models/test-job.model.js +0 -29
  24. package/dist/modules/edrm-exams/models/test-question.model.d.ts +0 -25
  25. package/dist/modules/edrm-exams/models/test-question.model.js +0 -70
  26. package/dist/modules/edrm-exams/models/test-result.model.d.ts +0 -26
  27. package/dist/modules/edrm-exams/models/test-result.model.js +0 -70
  28. package/dist/modules/edrm-exams/models/test.model.d.ts +0 -47
  29. package/dist/modules/edrm-exams/models/test.model.js +0 -133
  30. package/dist/modules/edrm-exams/models/user.model.d.ts +0 -18
  31. package/dist/modules/edrm-exams/models/user.model.js +0 -73
  32. package/dist/modules/edrm-exams/routes/company.router.d.ts +0 -7
  33. package/dist/modules/edrm-exams/routes/company.router.js +0 -108
  34. package/dist/modules/edrm-exams/routes/exams-candidate.router.d.ts +0 -7
  35. package/dist/modules/edrm-exams/routes/exams-candidate.router.js +0 -448
  36. package/dist/modules/edrm-exams/routes/exams.router.d.ts +0 -8
  37. package/dist/modules/edrm-exams/routes/exams.router.js +0 -1343
  38. package/dist/modules/edrm-exams/routes/result.router.d.ts +0 -7
  39. package/dist/modules/edrm-exams/routes/result.router.js +0 -370
  40. package/dist/modules/edrm-exams/routes/user.router.d.ts +0 -7
  41. package/dist/modules/edrm-exams/routes/user.router.js +0 -96
  42. package/dist/modules/edrm-storage/integration/edrm-storage-integration.d.ts +0 -53
  43. package/dist/modules/edrm-storage/integration/edrm-storage-integration.js +0 -132
  44. package/dist/modules/edrm-storage/tests/edrm-storage.service.test.d.ts +0 -1
  45. package/dist/modules/edrm-storage/tests/edrm-storage.service.test.js +0 -143
  46. package/dist/modules/edrm-storage/tests/integration.test.d.ts +0 -1
  47. 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
- });