free-claude-code/smoke/test_feature_manifest.py
Ali Khokhar 462a9430bb
Add local live smoke test suite (#148)
## Summary
- add an opt-in local `smoke/` pytest suite for API, auth, providers,
CLI, IDE-shaped requests, messaging, voice, tools, and thinking stream
contracts
- keep smoke tests out of normal CI collection with `testpaths =
["tests"]`
- write sanitized smoke artifacts under `.smoke-results/`

## Verification
- `uv run ruff format`
- `uv run ruff check`
- `uv run ty check`
- `uv run ty check smoke`
- `FCC_LIVE_SMOKE=1 FCC_SMOKE_TARGETS=all FCC_SMOKE_RUN_VOICE=1 uv run
pytest smoke -n 0 -m live -s --tb=short` -> 17 passed, 9 skipped
- `uv run pytest` -> 904 passed

## Notes
- Skipped live checks require local credentials/tools/services, such as
provider models, Telegram/Discord targets, voice backend, or Claude CLI.
- `claude-pick` smoke was intentionally removed.
2026-04-23 19:06:09 -07:00

48 lines
1.7 KiB
Python

from __future__ import annotations
import pytest
from messaging.platforms.factory import create_messaging_platform
from providers.base import BaseProvider
from providers.deepseek import DeepSeekProvider
from providers.llamacpp import LlamaCppProvider
from providers.lmstudio import LMStudioProvider
from providers.nvidia_nim import NvidiaNimProvider
from providers.open_router import OpenRouterProvider
from smoke.features import FEATURE_SMOKES, README_FEATURES, smoke_ids
pytestmark = [pytest.mark.live, pytest.mark.smoke_target("contract")]
def test_every_advertised_feature_has_a_smoke_entry() -> None:
missing = sorted(set(README_FEATURES) - smoke_ids())
extra = sorted(smoke_ids() - set(README_FEATURES))
assert not missing, f"README features missing smoke entries: {missing}"
assert not extra, f"smoke entries not tied to README features: {extra}"
def test_smoke_manifest_has_unique_ids_and_checks() -> None:
ids = [feature.feature_id for feature in FEATURE_SMOKES]
assert len(ids) == len(set(ids))
for feature in FEATURE_SMOKES:
assert feature.checks, feature
assert feature.mode in {
"live",
"contract",
"live_or_interactive",
"live_or_skip",
}
def test_provider_and_platform_registries_include_advertised_builtins() -> None:
provider_classes = {
"nvidia_nim": NvidiaNimProvider,
"open_router": OpenRouterProvider,
"deepseek": DeepSeekProvider,
"lmstudio": LMStudioProvider,
"llamacpp": LlamaCppProvider,
}
for provider_class in provider_classes.values():
assert issubclass(provider_class, BaseProvider)
assert create_messaging_platform("not-a-platform") is None