File size: 3,715 Bytes
2695555
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
"""Utilitário compartilhado pelos testes: carrega tars.py isolado, sem
precisar dos pacotes de sistema (pyautogui, psutil) instalados — eles
são só usados pra controlar mouse/teclado e ler CPU/RAM, nada disso é
necessário pra testar a lógica (seleção de modelo, detecção de tarefa,
resolução de app/site, etc).

Uso, em qualquer test_*.py desta pasta:

    from _util import carregar_tars
    tars = carregar_tars()
"""

import importlib.util
import os
import sys
import tempfile
import types

RAIZ = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
CAMINHO_TARS = os.path.join(RAIZ, "tars.py")

# Os módulos irmãos (tars_i18n, tars_acessibilidade...) são importados pelo
# tars.py; os testes rodam de dentro de tests/.
if RAIZ not in sys.path:
    sys.path.insert(0, RAIZ)

# Testes previsíveis: textos em português (a menos que o teste peça outro
# idioma) e nada gravado na configuração real do usuário.
os.environ.setdefault("TARS_IDIOMA", "pt_BR")
os.environ.setdefault("TARS_SEM_AVISO_VERSAO", "1")
os.environ.setdefault("TARS_ARQUIVO_AUTOTESTE", os.path.join(tempfile.mkdtemp(prefix="opentars-auto-"), "autoteste.txt"))  # testes não vão à internet ver se há versão nova
os.environ.setdefault("TARS_ARQUIVO_CONFIG", os.path.join(tempfile.mkdtemp(prefix="opentars-teste-"), "config.json"))
os.environ.setdefault("TARS_SEM_ATALHO", "1")
# 26/10: a pesquisa vem ligada por padrão; os testes não falam com o SearXNG real do PC (ele pode estar rodando)
if not os.path.exists(os.environ["TARS_ARQUIVO_CONFIG"]):
    open(os.environ["TARS_ARQUIVO_CONFIG"], "w").write('{"web": {"ligada": false}}')
os.environ.setdefault("TARS_SEM_MODELINHOS", "1")      # os modelinhos de foto (~300 MB) não se baixam nos testes
# 5.1: a escolha do Gargantua Lite depende da máquina; os testes fixam o completo (o do Lite pede o dele)
os.environ.setdefault("TARS_GARGANTUA", "completo")
# 18/10: o registro das ferramentas também: sem isto, os testes escreviam "open_application app82..." no ~/.tars_log de verdade
os.environ.setdefault("TARS_DIR_LOG", tempfile.mkdtemp(prefix="opentars-log-"))
# Histórico de modelos, embeddings em cache...: nada no ~/.cache de verdade.
os.environ.setdefault("XDG_CACHE_HOME", tempfile.mkdtemp(prefix="opentars-cache-"))
# 16/10: nenhum teste fala com o Ollama de verdade (dois já carregavam e descarregavam modelos do Enzo). Por padrão o
# endereço é uma porta sem ninguém; quem precisa sobe o fake_ollama e põe o próprio OLLAMA_HOST antes de carregar o tars.
# TARS_TESTE_OLLAMA_REAL=1 libera (para medir com modelo de verdade, de propósito).
if os.environ.get("TARS_TESTE_OLLAMA_REAL") != "1" and (not os.environ.get("OLLAMA_HOST")
                                                     or os.environ["OLLAMA_HOST"].rstrip("/").endswith(":11434")):
    os.environ["OLLAMA_HOST"] = "http://127.0.0.1:9"


def carregar_tars():
    if "pyautogui" not in sys.modules:
        sys.modules["pyautogui"] = types.ModuleType("pyautogui")

    if "psutil" not in sys.modules:
        stub = types.ModuleType("psutil")
        stub.process_iter = lambda *a, **k: []
        sys.modules["psutil"] = stub

    spec = importlib.util.spec_from_file_location("tars", CAMINHO_TARS)
    modulo = importlib.util.module_from_spec(spec)
    sys.modules["tars"] = modulo  # como num "import tars" de verdade (sys.modules[__name__] funciona)
    spec.loader.exec_module(modulo)
    # 4.5: os testes simulam uma área de trabalho (um teste do modo sem interface liga SEM_INTERFACE de volta)
    if not os.environ.get("TARS_TESTE_SEM_INTERFACE"):
        modulo.SEM_INTERFACE = False
        modulo.AMBIENTE.update(sem_interface=False, tela=True)
    return modulo