"""Tests for the enrich business API endpoint.""" import json import os import sqlite3 import threading import unittest from http.client import HTTPConnection from tempfile import TemporaryDirectory from unittest.mock import patch from app.main import create_server, hash_password class EnrichmentApiTests(unittest.TestCase): def setUp(self): self.tmp = TemporaryDirectory() os.environ["BOOTSTRAP_ADMIN_EMAIL"] = "enrich-owner@example.test" os.environ["BOOTSTRAP_ADMIN_PASSWORD"] = "password" self.server = create_server("127.0.0.1", 0, self.tmp.name + "/enrich.db") self.thread = threading.Thread(target=self.server.serve_forever, daemon=True); self.thread.start() self.conn = HTTPConnection("127.0.0.1", self.server.server_port, timeout=3); self.cookie = None self.request("POST", "/api/v1/auth/login", {"email": "enrich-owner@example.test", "password": "password"}) def tearDown(self): self.server.shutdown(); self.server.server_close(); self.thread.join(2); self.tmp.cleanup() for key in ("BOOTSTRAP_ADMIN_EMAIL", "BOOTSTRAP_ADMIN_PASSWORD"): os.environ.pop(key, None) def request(self, method, path, payload=None): headers = {"Content-Type": "application/json"} if self.cookie: headers["Cookie"] = self.cookie self.conn.request(method, path, json.dumps(payload).encode() if payload is not None else None, headers) response = self.conn.getresponse(); cookie = response.getheader("Set-Cookie") if cookie: self.cookie = cookie.split(";", 1)[0] return response.status, json.loads(response.read() or b"{}") def test_enrich_business_returns_website_domain_contacts(self): status, business = self.request("POST", "/api/v1/businesses", {"name": "Enrich Co", "website": "https://enrich.example.test"}) self.assertEqual(status, 201) scan = {"status": 200, "final_url": "https://enrich.example.test/", "redirect_chain": [], "body": b"Enrich

Enrich Co

hello@enrich.example.test", "html": "Enrich

Enrich Co

hello@enrich.example.test", "content_type": "text/html", "elapsed_ms": 15, "tls": True, "certificate_status": "valid"} with patch("app.main.scan_website", return_value=scan), \ patch("app.enrichment.validate_url", side_effect=lambda url: url), \ patch("app.enrichment.normalize_registrable_domain", return_value="enrich.example.test"), \ patch("app.main.enrich_domain", return_value={"domain": "enrich.example.test", "status": "registered", "resolves": True}): status, result = self.request("POST", f"/api/v1/businesses/{business['id']}/enrichment", {}) self.assertEqual(status, 200) self.assertEqual(result["business_id"], business["id"]) self.assertEqual(result["website"]["status"], "working") self.assertEqual(result["domain"]["status"], "registered") self.assertTrue(any(c["value"] == "hello@enrich.example.test" for c in result["contacts"])) def test_enrich_business_tenant_isolated(self): status, business = self.request("POST", "/api/v1/businesses", {"name": "Tenant Co"}) self.assertEqual(status, 201) other_hash, other_salt = hash_password("other-password") db = sqlite3.connect(self.tmp.name + "/enrich.db") db.execute("INSERT INTO organizations(id,name) VALUES(?,?)", ("other-tenant", "Other")) db.execute("INSERT INTO users(organization_id,email,password_hash,password_salt,role) VALUES(?,?,?,?,?)", ("other-tenant", "other@example.test", other_hash, other_salt, "owner")) db.commit(); db.close() self.cookie = None self.assertEqual(self.request("POST", "/api/v1/auth/login", {"email": "other@example.test", "password": "other-password"})[0], 200) self.assertEqual(self.request("POST", f"/api/v1/businesses/{business['id']}/enrichment", {})[0], 404) if __name__ == "__main__": unittest.main()