#!/usr/bin/env python3 """ Test-Skript zum Überprüfen der Many-to-Many-Beziehung mit additionalColumns zwischen CDokumente und CAICollections """ import requests import json import sys from datetime import datetime # API-Konfiguration (aus e2e_tests.py übernommen) BASE_URL = "https://crm.bitbylaw.com" API_KEY = "2b0747ca34d15032aa233ae043cc61bc" HEADERS = { "X-Api-Key": API_KEY, "Content-Type": "application/json" } def api_request(method, endpoint, data=None): """Führt einen API-Request aus""" url = f"{BASE_URL}/api/v1/{endpoint}" try: if method == "GET": response = requests.get(url, headers=HEADERS) elif method == "POST": response = requests.post(url, headers=HEADERS, json=data) elif method == "PUT": response = requests.put(url, headers=HEADERS, json=data) elif method == "DELETE": response = requests.delete(url, headers=HEADERS) else: raise ValueError(f"Unknown method: {method}") response.raise_for_status() return response.json() if response.text else {} except requests.exceptions.RequestException as e: print(f"❌ API Error: {e}") if hasattr(e.response, 'text'): print(f" Response: {e.response.text}") return None def main(): print("="*80) print(" "*20 + "Many-to-Many Junction Test") print("="*80) print() # Test-Daten test_sync_id = f"TEST-SYNC-{datetime.now().strftime('%Y%m%d-%H%M%S')}" doc_id = None collection_id = None try: # 1. CDokumente-Eintrag erstellen print("1️⃣ Erstelle Test-Dokument...") doc_data = { "name": f"Test-Dokument für Junction-Test {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}", "description": "Test-Dokument für Many-to-Many mit syncId" } doc_result = api_request("POST", "CDokumente", doc_data) if not doc_result or 'id' not in doc_result: print("❌ Fehler beim Erstellen des Dokuments") return False doc_id = doc_result['id'] print(f"✓ Dokument erstellt: {doc_id}") print() # 2. CAICollections-Eintrag erstellen print("2️⃣ Erstelle Test-Collection...") collection_data = { "name": f"Test-Collection für Junction-Test {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}", "description": "Test-Collection für Many-to-Many mit syncId" } collection_result = api_request("POST", "CAICollections", collection_data) if not collection_result or 'id' not in collection_result: print("❌ Fehler beim Erstellen der Collection") return False collection_id = collection_result['id'] print(f"✓ Collection erstellt: {collection_id}") print() # 3. Verknüpfung erstellen mit syncId print("3️⃣ Verknüpfe Dokument mit Collection (mit syncId)...") print(f" syncId: {test_sync_id}") link_data = { "id": collection_id, "columns": { "syncId": test_sync_id } } link_result = api_request("POST", f"CDokumente/{doc_id}/cAICollections", link_data) if link_result is None: print("❌ Fehler beim Verknüpfen") return False print(f"✓ Verknüpfung erstellt") print() # 4. Beziehung über API abrufen print("4️⃣ Rufe Beziehung über API ab...") relations = api_request("GET", f"CDokumente/{doc_id}/cAICollections") if not relations: print("❌ Fehler beim Abrufen der Beziehung") return False print(f"✓ Beziehung abgerufen") print("\nAPI-Response:") print("-" * 80) print(json.dumps(relations, indent=2, ensure_ascii=False)) print("-" * 80) print() # 5. Prüfe ob syncId vorhanden ist print("5️⃣ Prüfe ob syncId in der Response vorhanden ist...") if 'list' in relations and len(relations['list']) > 0: first_relation = relations['list'][0] if 'syncId' in first_relation: returned_sync_id = first_relation['syncId'] if returned_sync_id == test_sync_id: print(f"✅ syncId korrekt zurückgegeben: {returned_sync_id}") success = True else: print(f"⚠️ syncId zurückgegeben, aber Wert stimmt nicht überein:") print(f" Erwartet: {test_sync_id}") print(f" Erhalten: {returned_sync_id}") success = False else: print("❌ syncId ist NICHT in der API-Response vorhanden") print(f" Vorhandene Felder: {list(first_relation.keys())}") success = False else: print("❌ Keine Beziehungen in der Response gefunden") success = False print() # 6. Direkter Datenbankcheck (optional) print("6️⃣ Prüfe Datenbank direkt...") import subprocess db_check = subprocess.run([ "docker", "exec", "espocrm-db", "mariadb", "-u", "espocrm", "-pdatabase_password", "espocrm", "-e", f"SELECT * FROM c_a_i_collection_c_dokumente WHERE c_dokumente_id='{doc_id}' AND deleted=0;" ], capture_output=True, text=True) if db_check.returncode == 0: print("Datenbank-Inhalt:") print("-" * 80) print(db_check.stdout) print("-" * 80) else: print(f"⚠️ Konnte Datenbank nicht direkt abfragen: {db_check.stderr}") print() return success finally: # Cleanup print("7️⃣ Räume Test-Daten auf...") if doc_id: result = api_request("DELETE", f"CDokumente/{doc_id}") if result is not None: print(f"✓ Dokument gelöscht: {doc_id}") if collection_id: result = api_request("DELETE", f"CAICollections/{collection_id}") if result is not None: print(f"✓ Collection gelöscht: {collection_id}") print() if __name__ == "__main__": print() result = main() print("="*80) if result: print("✅ TEST ERFOLGREICH - Many-to-Many mit additionalColumns funktioniert!") else: print("❌ TEST FEHLGESCHLAGEN - syncId nicht in API-Response") print("="*80) sys.exit(0 if result else 1)