import os import sys import tempfile import requests import elog import pytest from getpass import getuser, getpass from pathlib import Path from slic.utils.elog import Elog, get_default_elog_instance from unittest.mock import patch from bs4 import BeautifulSoup # Helper pour extraire uniquement le mot de passe comme dans la vraie fonction def get_default_elog_password(url, **kwargs): kwargs.setdefault("user", getuser()) user = kwargs["user"] if "password" not in kwargs: try: home = Path.home() fn = home / ".elog_psi" with fn.open() as f: pw = f.read().strip() except Exception: print(f"Enter elog password for user: {user}") pw = getpass() kwargs["password"] = pw return kwargs["password"] def get_test_elog(): return Elog("http://localhost:8080/demo", user="robot", password="testpassword") def test_get_default_elog_instance_with_direct_password_and_real_check(): url = "http://localhost:8080/demo" user = "robot" password = "testpassword" elog_instance, returned_user = get_default_elog_instance(url, user=user, password=password) assert returned_user == user assert hasattr(elog_instance, "post") r = requests.get(url, auth=(user, password)) assert r.status_code == 200 @patch("slic.utils.elog.getpass") @patch("slic.utils.elog.Path.home") def test_get_default_elog_instance_asks_password_and_opens(mock_home, mock_getpass): mock_home.return_value = Path("/does/not/exist") # Fausse home → lecture échoue mock_getpass.return_value = "testpassword" url = "http://localhost:8080/demo" user = "robot" elog_instance, returned_user = get_default_elog_instance(url, user=user) assert returned_user == user assert hasattr(elog_instance, "post") r = requests.get(url, auth=(user, mock_getpass.return_value)) assert r.status_code == 200 @patch("slic.utils.elog.getpass") @patch("slic.utils.elog.getuser") @patch("slic.utils.elog.Path.home") def test_get_default_elog_with_path_home(mock_home, mock_getuser, mock_getpass): fake_user = "robot" fake_pw = "testpassword" mock_getuser.return_value = fake_user mock_getpass.return_value = fake_pw # fallback safety tmp_home = Path("/tmp/fake_home_for_robot") tmp_home.mkdir(parents=True, exist_ok=True) pw_file = tmp_home / ".elog_psi" pw_file.write_text(fake_pw) mock_home.return_value = tmp_home url = "http://localhost:8080/demo" try: elog_instance, returned_user = get_default_elog_instance(url) assert returned_user == fake_user assert hasattr(elog_instance, "post") r = requests.get(url, auth=(fake_user, fake_pw)) assert r.status_code == 200 finally: pw_file.unlink(missing_ok=True) tmp_home.rmdir() def test_post(): elog = get_test_elog() title = "AUTHOR_OVERRIDE_TEST" text = "This is a message" author = "robot" elog.post(text, attributes = {"Author": author}) url = "http://localhost:8080/demo" response = requests.get(url) soup = BeautifulSoup(response.content, 'html.parser') content = soup.get_text() print("Texte brut :", content) assert 'This\xa0is\xa0a\xa0message' in content, "Message not found" assert author in content, f"Author not found" @patch("slic.utils.elog.Screenshot") def test_screenshot(mock_screenshot_class): with tempfile.NamedTemporaryFile(delete=False, suffix=".png") as tmp: fake_path = tmp.name tmp.write(b"fake image data") mock_instance = mock_screenshot_class.return_value mock_instance.shoot.return_value = [fake_path] elog = get_test_elog() test_msg = "SCREENSHOT_INTEGRATION_TEST_MSG_456" elog.screenshot(message=test_msg) url = "http://localhost:8080/demo/2" response = requests.get(url) # print("Texte bruuuuuut :", response.text) soup = BeautifulSoup(response.content, 'html.parser') content = soup.get_text() print("Texte brut :", content) filename = os.path.basename(fake_path) assert test_msg in content, "Message not found" assert filename in content, f"Attachment '{filename}' not found in post HTML" os.remove(fake_path)