85 lines
2.5 KiB
Python
85 lines
2.5 KiB
Python
|
|
"""Tests for setup wizard functionality."""
|
||
|
|
import sys
|
||
|
|
from pathlib import Path
|
||
|
|
|
||
|
|
sys.path.insert(0, str(Path(__file__).parent.parent / "scripts"))
|
||
|
|
|
||
|
|
import pytest
|
||
|
|
import json
|
||
|
|
from unittest.mock import patch
|
||
|
|
from setup import load_sources, save_sources, get_default_sources, setup_language, setup_markets
|
||
|
|
|
||
|
|
|
||
|
|
def test_load_sources_missing_file(tmp_path, monkeypatch):
|
||
|
|
"""Test loading non-existent sources returns defaults."""
|
||
|
|
sources_file = tmp_path / "sources.json"
|
||
|
|
|
||
|
|
# Patch both path constants to use temp file
|
||
|
|
monkeypatch.setattr("setup.SOURCES_FILE", sources_file)
|
||
|
|
|
||
|
|
# File doesn't exist, so load_sources should call get_default_sources
|
||
|
|
sources = load_sources()
|
||
|
|
|
||
|
|
assert isinstance(sources, dict)
|
||
|
|
assert "rss_feeds" in sources # Default structure has rss_feeds
|
||
|
|
|
||
|
|
|
||
|
|
def test_save_sources(tmp_path, monkeypatch):
|
||
|
|
"""Test saving sources to JSON."""
|
||
|
|
sources_file = tmp_path / "sources.json"
|
||
|
|
monkeypatch.setattr("setup.SOURCES_FILE", sources_file)
|
||
|
|
|
||
|
|
sources = {
|
||
|
|
"rss_feeds": {
|
||
|
|
"test_source": {
|
||
|
|
"name": "Test",
|
||
|
|
"enabled": True,
|
||
|
|
"top": "https://example.com/rss"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
save_sources(sources)
|
||
|
|
|
||
|
|
assert sources_file.exists()
|
||
|
|
with open(sources_file) as f:
|
||
|
|
saved = json.load(f)
|
||
|
|
|
||
|
|
assert saved["rss_feeds"]["test_source"]["enabled"] is True
|
||
|
|
|
||
|
|
|
||
|
|
def test_get_default_sources():
|
||
|
|
"""Test default sources structure."""
|
||
|
|
sources = get_default_sources()
|
||
|
|
|
||
|
|
assert isinstance(sources, dict)
|
||
|
|
assert "rss_feeds" in sources
|
||
|
|
# Should have common sources like wsj, barrons, cnbc
|
||
|
|
feeds = sources["rss_feeds"]
|
||
|
|
assert any("wsj" in k.lower() or "barrons" in k.lower() or "cnbc" in k.lower()
|
||
|
|
for k in feeds.keys())
|
||
|
|
|
||
|
|
|
||
|
|
@patch("setup.prompt", side_effect=["en"])
|
||
|
|
@patch("setup.save_sources")
|
||
|
|
def test_setup_language(mock_save, mock_prompt):
|
||
|
|
"""Test language setup function."""
|
||
|
|
sources = {"language": {"supported": ["en", "de"], "default": "de"}}
|
||
|
|
setup_language(sources)
|
||
|
|
|
||
|
|
# Should have called prompt
|
||
|
|
mock_prompt.assert_called()
|
||
|
|
# Language should be updated
|
||
|
|
assert sources["language"]["default"] == "en"
|
||
|
|
|
||
|
|
|
||
|
|
@patch("setup.prompt_bool", side_effect=[True, False])
|
||
|
|
@patch("setup.save_sources")
|
||
|
|
def test_setup_markets(mock_save, mock_prompt):
|
||
|
|
"""Test markets setup function."""
|
||
|
|
sources = {"markets": {"us": {"enabled": False}, "eu": {"enabled": False}}}
|
||
|
|
setup_markets(sources)
|
||
|
|
|
||
|
|
# Should have prompted (at least once for US)
|
||
|
|
assert mock_prompt.called
|