This repository has been archived on 2026-03-24. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Timmy-time-dashboard/tests/functional/test_cli.py
Alexander Whitestone 9d78eb31d1 ruff (#169)
* polish: streamline nav, extract inline styles, improve tablet UX

- Restructure desktop nav from 8+ flat links + overflow dropdown into
  5 grouped dropdowns (Core, Agents, Intel, System, More) matching
  the mobile menu structure to reduce decision fatigue
- Extract all inline styles from mission_control.html and base.html
  notification elements into mission-control.css with semantic classes
- Replace JS-built innerHTML with secure DOM construction in
  notification loader and chat history
- Add CONNECTING state to connection indicator (amber) instead of
  showing OFFLINE before WebSocket connects
- Add tablet breakpoint (1024px) with larger touch targets for
  Apple Pencil / stylus use and safe-area padding for iPad toolbar
- Add active-link highlighting in desktop dropdown menus
- Rename "Mission Control" page title to "System Overview" to
  disambiguate from the chat home page
- Add "Home — Timmy Time" page title to index.html

https://claude.ai/code/session_015uPUoKyYa8M2UAcyk5Gt6h

* fix(security): move auth-gate credentials to environment variables

Hardcoded username, password, and HMAC secret in auth-gate.py replaced
with os.environ lookups. Startup now refuses to run if any variable is
unset. Added AUTH_GATE_SECRET/USER/PASS to .env.example.

https://claude.ai/code/session_015uPUoKyYa8M2UAcyk5Gt6h

* refactor(tooling): migrate from black+isort+bandit to ruff

Replace three separate linting/formatting tools with a single ruff
invocation. Updates tox.ini (lint, format, pre-push, pre-commit envs),
.pre-commit-config.yaml, and CI workflow. Fixes all ruff errors
including unused imports, missing raise-from, and undefined names.
Ruff config maps existing bandit skips to equivalent S-rules.

https://claude.ai/code/session_015uPUoKyYa8M2UAcyk5Gt6h

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-03-11 12:23:35 -04:00

73 lines
2.8 KiB
Python

"""Functional tests for CLI entry points via Typer's CliRunner.
Each test invokes the real CLI command. Ollama is not running, so
commands that need inference will fail gracefully — and that's a valid
user scenario we want to verify.
"""
# ── timmy CLI ─────────────────────────────────────────────────────────────────
class TestTimmyCLI:
"""Tests the `timmy` command (chat, think, status)."""
def test_status_runs(self, timmy_runner):
runner, app = timmy_runner
result = runner.invoke(app, ["status"])
assert result.exit_code is not None
def test_chat_requires_message(self, timmy_runner):
runner, app = timmy_runner
result = runner.invoke(app, ["chat"])
assert result.exit_code != 0
assert "Missing argument" in result.output or "Usage" in result.output
def test_think_requires_topic(self, timmy_runner):
runner, app = timmy_runner
result = runner.invoke(app, ["think"])
assert result.exit_code != 0
assert "Missing argument" in result.output or "Usage" in result.output
def test_chat_with_message_runs(self, timmy_runner):
runner, app = timmy_runner
result = runner.invoke(app, ["chat", "hello"])
assert result.exit_code is not None
def test_help_text(self, timmy_runner):
runner, app = timmy_runner
result = runner.invoke(app, ["--help"])
assert result.exit_code == 0
assert "Timmy" in result.output or "sovereign" in result.output.lower()
# ── timmy-serve CLI ───────────────────────────────────────────────────────────
class TestTimmyServeCLI:
"""Tests the `timmy-serve` command (start, status)."""
def test_start_dry_run(self, serve_runner):
runner, app = serve_runner
result = runner.invoke(app, ["start", "--dry-run"])
assert result.exit_code == 0
assert "Starting Timmy Serve" in result.output
def test_start_dry_run_custom_port(self, serve_runner):
runner, app = serve_runner
result = runner.invoke(app, ["start", "--dry-run", "--port", "9999"])
assert result.exit_code == 0
assert "9999" in result.output
def test_status(self, serve_runner):
runner, app = serve_runner
result = runner.invoke(app, ["status"])
assert result.exit_code == 0
assert "Timmy Serve" in result.output
def test_help_text(self, serve_runner):
runner, app = serve_runner
result = runner.invoke(app, ["--help"])
assert result.exit_code == 0
assert "Serve" in result.output