/** * LibreBooking API Test-Skript * * Testet die Authentifizierung und grundlegende API-Operationen * mit den bereitgestellten Test-Credentials. * * Ausführen mit: npx ts-node test/test-api.ts */ const https = require('https'); const http = require('http'); // Test-Credentials const TEST_CONFIG = { url: 'https://librebooking.zell-cloud.de', username: 'sebastian.zell@zell-aufmass.de', password: 'wanUQ4uVqU6lfP', }; interface LibreBookingSession { sessionToken: string; userId: number; sessionExpires: string; } /** * HTTP/HTTPS Request Helper */ async function makeRequest( url: string, method: string, headers: Record, body?: any ): Promise { return new Promise((resolve, reject) => { const urlObj = new URL(url); const isHttps = urlObj.protocol === 'https:'; const lib = isHttps ? https : http; const options = { hostname: urlObj.hostname, port: urlObj.port || (isHttps ? 443 : 80), path: urlObj.pathname + urlObj.search, method, headers: { 'Content-Type': 'application/json', ...headers, }, }; const req = lib.request(options, (res: any) => { let data = ''; res.on('data', (chunk: string) => (data += chunk)); res.on('end', () => { try { const jsonData = JSON.parse(data); resolve({ statusCode: res.statusCode, data: jsonData }); } catch (e) { resolve({ statusCode: res.statusCode, data }); } }); }); req.on('error', reject); if (body) { req.write(JSON.stringify(body)); } req.end(); }); } /** * Authentifizierung testen */ async function testAuthentication(): Promise { console.log('\n========================================'); console.log('TEST 1: Authentifizierung'); console.log('========================================'); try { const response = await makeRequest( `${TEST_CONFIG.url}/Web/Services/index.php/Authentication/Authenticate`, 'POST', {}, { username: TEST_CONFIG.username, password: TEST_CONFIG.password, } ); if (response.statusCode === 200 && response.data.isAuthenticated) { console.log('✅ Authentifizierung erfolgreich!'); console.log(` Session Token: ${response.data.sessionToken.substring(0, 20)}...`); console.log(` User ID: ${response.data.userId}`); console.log(` Session läuft ab: ${response.data.sessionExpires}`); return { sessionToken: response.data.sessionToken, userId: response.data.userId, sessionExpires: response.data.sessionExpires, }; } else { console.log('❌ Authentifizierung fehlgeschlagen!'); console.log(' Response:', JSON.stringify(response.data, null, 2)); return null; } } catch (error: any) { console.log('❌ Fehler bei der Authentifizierung:', error.message); return null; } } /** * Alle Reservierungen abrufen */ async function testGetReservations(session: LibreBookingSession): Promise { console.log('\n========================================'); console.log('TEST 2: Reservierungen abrufen'); console.log('========================================'); try { const response = await makeRequest( `${TEST_CONFIG.url}/Web/Services/index.php/Reservations/`, 'GET', { 'X-Booked-SessionToken': session.sessionToken, 'X-Booked-UserId': session.userId.toString(), } ); if (response.statusCode === 200) { const reservations = response.data.reservations || []; console.log(`✅ ${reservations.length} Reservierung(en) gefunden`); if (reservations.length > 0) { console.log('\n Erste 3 Reservierungen:'); reservations.slice(0, 3).forEach((res: any, idx: number) => { console.log(` ${idx + 1}. ${res.title || 'Ohne Titel'}`); console.log(` Referenz: ${res.referenceNumber}`); console.log(` Ressource: ${res.resourceName}`); console.log(` Zeit: ${res.startDate} - ${res.endDate}`); console.log(''); }); } } else { console.log(`❌ Fehler beim Abrufen: Status ${response.statusCode}`); console.log(' Response:', JSON.stringify(response.data, null, 2)); } } catch (error: any) { console.log('❌ Fehler:', error.message); } } /** * Alle Ressourcen abrufen */ async function testGetResources(session: LibreBookingSession): Promise { console.log('\n========================================'); console.log('TEST 3: Ressourcen abrufen'); console.log('========================================'); try { const response = await makeRequest( `${TEST_CONFIG.url}/Web/Services/index.php/Resources/`, 'GET', { 'X-Booked-SessionToken': session.sessionToken, 'X-Booked-UserId': session.userId.toString(), } ); if (response.statusCode === 200) { const resources = response.data.resources || []; console.log(`✅ ${resources.length} Ressource(n) gefunden`); resources.forEach((res: any, idx: number) => { console.log(` ${idx + 1}. ${res.name} (ID: ${res.resourceId})`); if (res.location) console.log(` Standort: ${res.location}`); console.log(` Status: ${res.statusId === 1 ? 'Verfügbar' : res.statusId === 0 ? 'Versteckt' : 'Nicht verfügbar'}`); }); } else { console.log(`❌ Fehler beim Abrufen: Status ${response.statusCode}`); } } catch (error: any) { console.log('❌ Fehler:', error.message); } } /** * Alle Zeitpläne abrufen */ async function testGetSchedules(session: LibreBookingSession): Promise { console.log('\n========================================'); console.log('TEST 4: Zeitpläne abrufen'); console.log('========================================'); try { const response = await makeRequest( `${TEST_CONFIG.url}/Web/Services/index.php/Schedules/`, 'GET', { 'X-Booked-SessionToken': session.sessionToken, 'X-Booked-UserId': session.userId.toString(), } ); if (response.statusCode === 200) { const schedules = response.data.schedules || []; console.log(`✅ ${schedules.length} Zeitplan/Zeitpläne gefunden`); schedules.forEach((schedule: any, idx: number) => { console.log(` ${idx + 1}. ${schedule.name} (ID: ${schedule.id})`); console.log(` Zeitzone: ${schedule.timezone}`); console.log(` Standard: ${schedule.isDefault ? 'Ja' : 'Nein'}`); }); } else { console.log(`❌ Fehler beim Abrufen: Status ${response.statusCode}`); } } catch (error: any) { console.log('❌ Fehler:', error.message); } } /** * Alle Benutzer abrufen */ async function testGetUsers(session: LibreBookingSession): Promise { console.log('\n========================================'); console.log('TEST 5: Benutzer abrufen'); console.log('========================================'); try { const response = await makeRequest( `${TEST_CONFIG.url}/Web/Services/index.php/Users/`, 'GET', { 'X-Booked-SessionToken': session.sessionToken, 'X-Booked-UserId': session.userId.toString(), } ); if (response.statusCode === 200) { const users = response.data.users || []; console.log(`✅ ${users.length} Benutzer gefunden`); users.slice(0, 5).forEach((user: any, idx: number) => { console.log(` ${idx + 1}. ${user.firstName} ${user.lastName}`); console.log(` E-Mail: ${user.emailAddress}`); console.log(` ID: ${user.id}`); }); if (users.length > 5) { console.log(` ... und ${users.length - 5} weitere`); } } else { console.log(`❌ Fehler beim Abrufen: Status ${response.statusCode}`); } } catch (error: any) { console.log('❌ Fehler:', error.message); } } /** * Abmelden */ async function testSignOut(session: LibreBookingSession): Promise { console.log('\n========================================'); console.log('TEST 6: Abmelden'); console.log('========================================'); try { const response = await makeRequest( `${TEST_CONFIG.url}/Web/Services/index.php/Authentication/SignOut`, 'POST', {}, { userId: session.userId, sessionToken: session.sessionToken, } ); if (response.statusCode === 200 || response.statusCode === 204) { console.log('✅ Erfolgreich abgemeldet'); } else { console.log(`⚠️ Abmeldung mit Status ${response.statusCode} abgeschlossen`); } } catch (error: any) { console.log('⚠️ Abmeldung fehlgeschlagen (kann ignoriert werden):', error.message); } } /** * Hauptfunktion */ async function runTests(): Promise { console.log('\n📝 LibreBooking API Test'); console.log('======================================'); console.log(`URL: ${TEST_CONFIG.url}`); console.log(`User: ${TEST_CONFIG.username}`); console.log('======================================'); // Test 1: Authentifizierung const session = await testAuthentication(); if (!session) { console.log('\n❌ Tests abgebrochen - Authentifizierung fehlgeschlagen'); process.exit(1); } // Test 2-5: API-Endpunkte await testGetReservations(session); await testGetResources(session); await testGetSchedules(session); await testGetUsers(session); // Test 6: Abmelden await testSignOut(session); console.log('\n========================================'); console.log('✅ Alle Tests abgeschlossen!'); console.log('========================================\n'); } // Tests ausführen runTests().catch(console.error);