diff --git a/server/__tests__/auth.test.js b/server/__tests__/auth.test.js new file mode 100644 index 0000000..f4c8ea4 --- /dev/null +++ b/server/__tests__/auth.test.js @@ -0,0 +1,103 @@ +const request = require('supertest'); +const AuthConfig = require('../config/auth.js'); + +const mockConfig = { + "auth": { + "passportjs": [ + { + "provider1": { + "type": "oauth", + "OAUTH_AUTHORIZATION_URL": "https://www.testurl.com/oauth2/authorize", + "OAUTH_TOKEN_URL": "https://www.testurl.com/oauth2/token", + "OAUTH_CLIENT_ID": "your_oauth_client_id", + "OAUTH_CLIENT_SECRET": "your_oauth_client_secret", + "OAUTH_CALLBACK_URL": "https://localhost:3000/auth/provider/callback", + "OAUTH_ADD_SCOPE": "scopes", + "OAUTH_ROLE_TEACHER_VALUE": "teacher-claim-value", + "OAUTH_ROLE_STUDENT_VALUE": "student-claim-value" + } + }, + { + "provider2": { + "type": "oidc", + "OIDC_CLIENT_ID": "your_oidc_client_id", + "OIDC_CLIENT_SECRET": "your_oidc_client_secret", + "OIDC_ISSUER_URL": "https://your-issuer.com", + "OIDC_CALLBACK_URL": "http://localhost:3000/auth/oidc/callback" + } + } + ], + "simple-login": { + "enabled": true, + "name": "provider3", + "SESSION_SECRET": "your_session_secret" + } + } +}; + +// Créez une instance de AuthConfig en utilisant la configuration mockée +describe('AuthConfig Class Tests', () => { + let authConfigInstance; + + // Initialisez l'instance avec la configuration mockée + beforeAll(() => { + authConfigInstance = new AuthConfig(); + authConfigInstance.loadConfigTest(mockConfig); // On injecte la configuration mockée + }); + + it('devrait retourner la configuration PassportJS', () => { + const config = authConfigInstance.getPassportJSConfig(); + expect(config).toHaveProperty('provider1'); + expect(config).toHaveProperty('provider2'); + }); + + it('devrait retourner la configuration Simple Login', () => { + const config = authConfigInstance.getSimpleLoginConfig(); + expect(config).toHaveProperty('name', 'provider3'); + expect(config).toHaveProperty('SESSION_SECRET', 'your_session_secret'); + }); + + it('devrait retourner les providers OAuth', () => { + const oauthProviders = authConfigInstance.getOAuthProviders(); + expect(Array.isArray(oauthProviders)).toBe(true); + expect(oauthProviders.length).toBe(1); // Il y a un seul provider OAuth + expect(oauthProviders[0]).toHaveProperty('provider1'); + }); + + it('devrait valider la configuration des providers', () => { + expect(() => authConfigInstance.validateProvidersConfig()).not.toThrow(); + }); + + it('devrait lever une erreur si une configuration manque', () => { + const invalidMockConfig = { + "auth": { + "passportjs": [ + { + "provider1": { + "type": "oauth", + "OAUTH_CLIENT_ID": "your_oauth_client_id" // Il manque des champs nécessaires + } + } + ] + } + }; + + const instanceWithInvalidConfig = new AuthConfig(); + instanceWithInvalidConfig.loadConfigTest(invalidMockConfig); + + // Vérifiez que l'erreur est lancée avec les champs manquants corrects + expect(() => instanceWithInvalidConfig.validateProvidersConfig()).toThrow( + new Error(`Configuration invalide pour les providers suivants : [ + { + "provider": "provider1", + "missingFields": [ + "OAUTH_AUTHORIZATION_URL", + "OAUTH_TOKEN_URL", + "OAUTH_CLIENT_SECRET", + "OAUTH_CALLBACK_URL" + ] + } +]`) + ); + }); +}); \ No newline at end of file diff --git a/server/config/auth.js b/server/config/auth.js index fc54497..b8b1f34 100644 --- a/server/config/auth.js +++ b/server/config/auth.js @@ -2,25 +2,29 @@ const fs = require('fs'); const path = require('path'); const pathAuthConfig = './auth_config.json'; +const configPath = path.join(__dirname, pathAuthConfig); + class AuthConfig { - constructor(configPath) { - this.configPath = configPath; - this.config = this.loadConfig(); - this.validateProvidersConfig(); - } + config = null; + // Méthode pour lire le fichier de configuration JSON loadConfig() { try { - const configData = fs.readFileSync(this.configPath, 'utf-8'); - return JSON.parse(configData); + const configData = fs.readFileSync(configPath, 'utf-8'); + this.config = JSON.parse(configData); } catch (error) { console.error("Erreur lors de la lecture du fichier de configuration :", error); return null; } } + // Méthode pour load le fichier de test + loadConfigTest(mockConfig) { + this.config = mockConfig; + } + // Méthode pour retourner la configuration des fournisseurs PassportJS getPassportJSConfig() { if (this.config && this.config.auth && this.config.auth.passportjs) { @@ -177,7 +181,4 @@ class AuthConfig { } -// Utilisation de la classe ConfigManager -const configPath = path.join(__dirname, pathAuthConfig); -const instance = new AuthConfig(configPath); -module.exports = instance; +module.exports = AuthConfig; diff --git a/server/controllers/auth.js b/server/controllers/auth.js index 845e062..21fa3b1 100644 --- a/server/controllers/auth.js +++ b/server/controllers/auth.js @@ -1,17 +1,18 @@ -const authConfig = require('../config/auth.js'); +const AuthConfig = require('../config/auth.js'); class authController { async getActive(req, res, next) { - try { - const authActive = authConfig.getActiveAuth(); + const authC = new AuthConfig(); + authC.loadConfig(); + + const authActive = authC.getActiveAuth(); const response = { authActive }; - return res.json(response); } catch (error) {