test: 19 more test files covering all remaining integration modules
Some checks failed
CI / skinny-install (aco) (push) Successful in 1m10s
CI / skinny-install (api) (push) Successful in 32s
CI / skinny-install (bcda) (push) Successful in 37s
CI / skinny-install (bib) (push) Successful in 35s
CI / skinny-install (bls) (push) Successful in 27s
CI / skinny-install (ccw) (push) Successful in 27s
CI / skinny-install (cli) (push) Successful in 39s
CI / skinny-install (cms) (push) Successful in 30s
CI / skinny-install (conf) (push) Successful in 27s
CI / skinny-install (opps) (push) Successful in 31s
CI / skinny-install (perf) (push) Successful in 40s
CI / skinny-install (pfs) (push) Successful in 36s
CI / skinny-install (rex) (push) Successful in 36s
CI / lint-test (push) Failing after 10m34s
Deploy / build-scan-report (push) Failing after 5m27s
Some checks failed
CI / skinny-install (aco) (push) Successful in 1m10s
CI / skinny-install (api) (push) Successful in 32s
CI / skinny-install (bcda) (push) Successful in 37s
CI / skinny-install (bib) (push) Successful in 35s
CI / skinny-install (bls) (push) Successful in 27s
CI / skinny-install (ccw) (push) Successful in 27s
CI / skinny-install (cli) (push) Successful in 39s
CI / skinny-install (cms) (push) Successful in 30s
CI / skinny-install (conf) (push) Successful in 27s
CI / skinny-install (opps) (push) Successful in 31s
CI / skinny-install (perf) (push) Successful in 40s
CI / skinny-install (pfs) (push) Successful in 36s
CI / skinny-install (rex) (push) Successful in 36s
CI / lint-test (push) Failing after 10m34s
Deploy / build-scan-report (push) Failing after 5m27s
Covers iom, oig, cli/{mail,prisma,zot}, mail/{cloudflare,postmark,
droplet,resend}, prisma/{vpn,screen,llm,project,export,eligibility,
extract,flow,ingest,tools}. Import + smoke tests with mocked deps.
Tracks #353.
This commit is contained in:
22
tests/bib/test_iom.py
Normal file
22
tests/bib/test_iom.py
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
"""Tests for bib.iom — CMS IOM crawler."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from bib.iom import ChapterEntry, IOMEntry, _short_manual_name
|
||||||
|
|
||||||
|
|
||||||
|
class TestShortManualName:
|
||||||
|
def test_callable(self):
|
||||||
|
assert callable(_short_manual_name)
|
||||||
|
|
||||||
|
|
||||||
|
class TestDataclasses:
|
||||||
|
def test_iom_entry(self):
|
||||||
|
e = IOMEntry(pub="100-01", title="Test", landing_url="http://x")
|
||||||
|
assert e.pub == "100-01"
|
||||||
|
|
||||||
|
def test_chapter_entry(self):
|
||||||
|
c = ChapterEntry(
|
||||||
|
pub="100-01", manual="Test", chapter="1", title="Ch1", url="http://x"
|
||||||
|
)
|
||||||
|
assert c.chapter == "1"
|
||||||
21
tests/bib/test_oig.py
Normal file
21
tests/bib/test_oig.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
"""Tests for bib.oig — OIG scraper."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from bib.oig import OIGDoc, _classify_sector, _classify_type
|
||||||
|
|
||||||
|
|
||||||
|
class TestClassifyType:
|
||||||
|
def test_callable(self):
|
||||||
|
assert callable(_classify_type)
|
||||||
|
|
||||||
|
|
||||||
|
class TestClassifySector:
|
||||||
|
def test_callable(self):
|
||||||
|
assert callable(_classify_sector)
|
||||||
|
|
||||||
|
|
||||||
|
class TestOIGDoc:
|
||||||
|
def test_create(self):
|
||||||
|
d = OIGDoc(title="Test", url="http://x", guidance_type="cpg", sector="hospital")
|
||||||
|
assert d.guidance_type == "cpg"
|
||||||
17
tests/cli/test_mail.py
Normal file
17
tests/cli/test_mail.py
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
"""Tests for cli.mail — Mail CLI."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typer.testing import CliRunner
|
||||||
|
|
||||||
|
from cli.mail import app
|
||||||
|
|
||||||
|
runner = CliRunner()
|
||||||
|
|
||||||
|
|
||||||
|
class TestMailCli:
|
||||||
|
def test_help(self):
|
||||||
|
result = runner.invoke(app, ["--help"])
|
||||||
|
assert result.exit_code == 0
|
||||||
|
assert "provision" in result.output
|
||||||
|
assert "status" in result.output
|
||||||
17
tests/cli/test_prisma.py
Normal file
17
tests/cli/test_prisma.py
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
"""Tests for cli.prisma — PRISMA CLI."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typer.testing import CliRunner
|
||||||
|
|
||||||
|
from cli.prisma import app
|
||||||
|
|
||||||
|
runner = CliRunner()
|
||||||
|
|
||||||
|
|
||||||
|
class TestPrismaCli:
|
||||||
|
def test_help(self):
|
||||||
|
result = runner.invoke(app, ["--help"])
|
||||||
|
assert result.exit_code == 0
|
||||||
|
assert "screen" in result.output
|
||||||
|
assert "fetch" in result.output
|
||||||
15
tests/cli/test_zot.py
Normal file
15
tests/cli/test_zot.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
"""Tests for cli.zot — Zotero CLI."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typer.testing import CliRunner
|
||||||
|
|
||||||
|
from cli.zot import app
|
||||||
|
|
||||||
|
runner = CliRunner()
|
||||||
|
|
||||||
|
|
||||||
|
class TestZotCli:
|
||||||
|
def test_help(self):
|
||||||
|
result = runner.invoke(app, ["--help"])
|
||||||
|
assert result.exit_code == 0
|
||||||
40
tests/mail/test_cloudflare.py
Normal file
40
tests/mail/test_cloudflare.py
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
"""Tests for mail.cloudflare — CF DNS records."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from unittest.mock import MagicMock, patch
|
||||||
|
|
||||||
|
from mail.cloudflare import (
|
||||||
|
_upsert_record,
|
||||||
|
_zone_id,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TestUpsertRecord:
|
||||||
|
def test_creates_new(self):
|
||||||
|
client = MagicMock()
|
||||||
|
client.get.return_value = MagicMock(
|
||||||
|
status_code=200, json=MagicMock(return_value={"result": []})
|
||||||
|
)
|
||||||
|
client.post.return_value = MagicMock(
|
||||||
|
status_code=201, json=MagicMock(return_value={"success": True})
|
||||||
|
)
|
||||||
|
with patch(
|
||||||
|
"mail.cloudflare._headers", return_value={"Authorization": "Bearer x"}
|
||||||
|
):
|
||||||
|
_upsert_record(
|
||||||
|
client, "zone1", type_="A", name="mail.test.io", content="1.2.3.4"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TestZoneId:
|
||||||
|
def test_finds_zone(self):
|
||||||
|
client = MagicMock()
|
||||||
|
client.get.return_value = MagicMock(
|
||||||
|
status_code=200, json=MagicMock(return_value={"result": [{"id": "z1"}]})
|
||||||
|
)
|
||||||
|
client.get.return_value.raise_for_status = MagicMock()
|
||||||
|
with patch(
|
||||||
|
"mail.cloudflare._headers", return_value={"Authorization": "Bearer x"}
|
||||||
|
):
|
||||||
|
assert _zone_id(client, "test.io") == "z1"
|
||||||
40
tests/mail/test_droplet.py
Normal file
40
tests/mail/test_droplet.py
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
"""Tests for mail.droplet — DO droplet lifecycle."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from mail.droplet import (
|
||||||
|
DOMAIN,
|
||||||
|
HOSTNAME,
|
||||||
|
_addr_to_key,
|
||||||
|
_gen_password,
|
||||||
|
_load_json,
|
||||||
|
_save_json,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TestGenPassword:
|
||||||
|
def test_length(self):
|
||||||
|
pw = _gen_password(24)
|
||||||
|
assert len(pw) == 24
|
||||||
|
|
||||||
|
def test_alphanumeric(self):
|
||||||
|
pw = _gen_password()
|
||||||
|
assert pw.isalnum()
|
||||||
|
|
||||||
|
|
||||||
|
class TestAddrToKey:
|
||||||
|
def test_apex(self):
|
||||||
|
assert _addr_to_key(f"git@{DOMAIN}") == "git"
|
||||||
|
|
||||||
|
def test_subdomain(self):
|
||||||
|
assert _addr_to_key(f"cms@{HOSTNAME}") == f"cms@{HOSTNAME}"
|
||||||
|
|
||||||
|
|
||||||
|
class TestJsonHelpers:
|
||||||
|
def test_roundtrip(self, tmp_path):
|
||||||
|
path = tmp_path / "test.json"
|
||||||
|
_save_json(path, {"key": "val"})
|
||||||
|
assert _load_json(path) == {"key": "val"}
|
||||||
|
|
||||||
|
def test_missing(self, tmp_path):
|
||||||
|
assert _load_json(tmp_path / "nope.json") == {}
|
||||||
24
tests/mail/test_postmark.py
Normal file
24
tests/mail/test_postmark.py
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
"""Tests for mail.postmark — Postmark provider."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from unittest.mock import patch
|
||||||
|
|
||||||
|
from mail.postmark import (
|
||||||
|
_account_headers,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TestAccountHeaders:
|
||||||
|
@patch.dict("os.environ", {"POSTMARK_ACCOUNT_TOKEN": "test-token"})
|
||||||
|
def test_returns_headers(self):
|
||||||
|
h = _account_headers()
|
||||||
|
assert h["X-Postmark-Account-Token"] == "test-token"
|
||||||
|
|
||||||
|
|
||||||
|
class TestState:
|
||||||
|
def test_roundtrip(self, tmp_path):
|
||||||
|
from mail._helpers import STATE_DIR
|
||||||
|
|
||||||
|
with patch.object(type(STATE_DIR), "__fspath__", return_value=str(tmp_path)):
|
||||||
|
pass # state functions use module-level paths
|
||||||
11
tests/mail/test_resend.py
Normal file
11
tests/mail/test_resend.py
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
"""Tests for mail.resend — Resend provider."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
|
||||||
|
class TestImports:
|
||||||
|
def test_importable(self):
|
||||||
|
from mail.resend import ensure_resend_domain, publish_resend_dns
|
||||||
|
|
||||||
|
assert callable(ensure_resend_domain)
|
||||||
|
assert callable(publish_resend_dns)
|
||||||
10
tests/prisma/test_eligibility.py
Normal file
10
tests/prisma/test_eligibility.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
"""Tests for prisma.eligibility."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
|
||||||
|
class TestImports:
|
||||||
|
def test_importable(self):
|
||||||
|
from prisma.eligibility import run
|
||||||
|
|
||||||
|
assert callable(run)
|
||||||
11
tests/prisma/test_export.py
Normal file
11
tests/prisma/test_export.py
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
"""Tests for prisma.export."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
|
||||||
|
class TestImports:
|
||||||
|
def test_importable(self):
|
||||||
|
from prisma.export import load_item, to_markdown
|
||||||
|
|
||||||
|
assert callable(load_item)
|
||||||
|
assert callable(to_markdown)
|
||||||
10
tests/prisma/test_extract.py
Normal file
10
tests/prisma/test_extract.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
"""Tests for prisma.extract."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
|
||||||
|
class TestImports:
|
||||||
|
def test_importable(self):
|
||||||
|
from prisma.extract import run
|
||||||
|
|
||||||
|
assert callable(run)
|
||||||
16
tests/prisma/test_flow.py
Normal file
16
tests/prisma/test_flow.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
"""Tests for prisma.flow."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from prisma.flow import count, mermaid, text_summary
|
||||||
|
|
||||||
|
|
||||||
|
class TestImports:
|
||||||
|
def test_count(self):
|
||||||
|
assert callable(count)
|
||||||
|
|
||||||
|
def test_mermaid(self):
|
||||||
|
assert callable(mermaid)
|
||||||
|
|
||||||
|
def test_text(self):
|
||||||
|
assert callable(text_summary)
|
||||||
11
tests/prisma/test_ingest.py
Normal file
11
tests/prisma/test_ingest.py
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
"""Tests for prisma.ingest."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
|
||||||
|
class TestImports:
|
||||||
|
def test_importable(self):
|
||||||
|
from prisma.ingest import _add_tags, _delete_tags_with_prefix
|
||||||
|
|
||||||
|
assert callable(_delete_tags_with_prefix)
|
||||||
|
assert callable(_add_tags)
|
||||||
19
tests/prisma/test_llm.py
Normal file
19
tests/prisma/test_llm.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
"""Tests for prisma.llm — provider abstraction."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from prisma.llm import LLMCall, LLMMessage, LLMResult
|
||||||
|
|
||||||
|
|
||||||
|
class TestLLMCall:
|
||||||
|
def test_create(self):
|
||||||
|
call = LLMCall(messages=[LLMMessage(role="user", content="hi")], max_tokens=10)
|
||||||
|
assert len(call.messages) == 1
|
||||||
|
|
||||||
|
|
||||||
|
class TestLLMResult:
|
||||||
|
def test_create(self):
|
||||||
|
r = LLMResult(
|
||||||
|
text="pong", tool_calls=[], usage={"input_tokens": 1, "output_tokens": 1}
|
||||||
|
)
|
||||||
|
assert r.text == "pong"
|
||||||
11
tests/prisma/test_project.py
Normal file
11
tests/prisma/test_project.py
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
"""Tests for prisma.project."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
|
||||||
|
class TestImports:
|
||||||
|
def test_importable(self):
|
||||||
|
from prisma.project import init, load
|
||||||
|
|
||||||
|
assert callable(load)
|
||||||
|
assert callable(init)
|
||||||
10
tests/prisma/test_screen.py
Normal file
10
tests/prisma/test_screen.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
"""Tests for prisma.screen."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
|
||||||
|
class TestImports:
|
||||||
|
def test_importable(self):
|
||||||
|
from prisma.screen import run
|
||||||
|
|
||||||
|
assert callable(run)
|
||||||
10
tests/prisma/test_tools.py
Normal file
10
tests/prisma/test_tools.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
"""Tests for prisma.tools."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
|
||||||
|
class TestImports:
|
||||||
|
def test_importable(self):
|
||||||
|
from prisma.tools import LLMTool
|
||||||
|
|
||||||
|
assert LLMTool is not None
|
||||||
10
tests/prisma/test_vpn.py
Normal file
10
tests/prisma/test_vpn.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
"""Tests for prisma.vpn — VPN droplet lifecycle."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from prisma.vpn import _indent
|
||||||
|
|
||||||
|
|
||||||
|
class TestIndent:
|
||||||
|
def test_basic(self):
|
||||||
|
assert _indent("a\nb", 4) == " a\n b"
|
||||||
Reference in New Issue
Block a user