development-hub/tests/test_data_store.py

136 lines
4.2 KiB
Python

"""Tests for DashboardDataStore."""
import pytest
from pathlib import Path
from unittest.mock import MagicMock, patch
from development_hub.views.dashboard.data_store import DashboardDataStore
from development_hub.project_discovery import Project
class TestFileWatching:
"""Tests for file watching functionality."""
def test_watches_all_parent_directories(self, qtbot, tmp_path):
"""File watcher should watch all unique parent directories."""
# Create directory structure like global dashboard
docs_dir = tmp_path / "docs"
goals_dir = docs_dir / "goals"
goals_dir.mkdir(parents=True)
# Create test files
todos_file = docs_dir / "todos.md"
ideas_file = docs_dir / "ideas-and-exploration.md"
goals_file = goals_dir / "goals.md"
milestones_file = goals_dir / "milestones.md"
todos_file.write_text("# TODOs\n")
ideas_file.write_text("# Ideas\n")
goals_file.write_text("# Goals\n")
milestones_file.write_text("# Milestones\n")
# Create data store with mocked paths
project = MagicMock(spec=Project)
project.key = "test-project"
store = DashboardDataStore(project)
# Manually set paths to our test files
store._todos_path = todos_file
store._goals_path = goals_file
store._milestones_path = milestones_file
store._ideas_path = ideas_file
# Set up file watching
store._setup_file_watching()
# Check that both directories are being watched
watched_dirs = store._file_watcher.directories()
assert str(docs_dir) in watched_dirs
assert str(goals_dir) in watched_dirs
def test_watches_files_that_exist(self, qtbot, tmp_path):
"""File watcher should watch existing files."""
docs_dir = tmp_path / "docs"
docs_dir.mkdir()
todos_file = docs_dir / "todos.md"
todos_file.write_text("# TODOs\n")
project = MagicMock(spec=Project)
project.key = "test-project"
store = DashboardDataStore(project)
store._todos_path = todos_file
store._goals_path = docs_dir / "goals.md" # Doesn't exist
store._milestones_path = None
store._ideas_path = None
store._setup_file_watching()
watched_files = store._file_watcher.files()
assert str(todos_file) in watched_files
# Non-existent file should not be watched
assert str(docs_dir / "goals.md") not in watched_files
def test_ensure_file_watched_adds_missing(self, qtbot, tmp_path):
"""_ensure_file_watched adds files that aren't being watched."""
docs_dir = tmp_path / "docs"
docs_dir.mkdir()
todos_file = docs_dir / "todos.md"
todos_file.write_text("# TODOs\n")
project = MagicMock(spec=Project)
project.key = "test-project"
store = DashboardDataStore(project)
store._todos_path = todos_file
store._goals_path = None
store._milestones_path = None
store._ideas_path = None
# Initially no watches
assert str(todos_file) not in store._file_watcher.files()
# Ensure should add it
store._ensure_file_watched()
assert str(todos_file) in store._file_watcher.files()
assert str(docs_dir) in store._file_watcher.directories()
class TestDateHandling:
"""Tests for dynamic date in save_ideas."""
def test_save_ideas_uses_current_date(self, qtbot, tmp_path):
"""save_ideas should use today's date, not a hardcoded one."""
from datetime import date
docs_dir = tmp_path / "docs"
docs_dir.mkdir()
ideas_file = docs_dir / "ideas-and-exploration.md"
project = MagicMock(spec=Project)
project.key = "test-project"
store = DashboardDataStore(project)
store._ideas_path = ideas_file
store._ideas_list = []
store.save_ideas()
content = ideas_file.read_text()
today = date.today().isoformat()
assert f"updated: {today}" in content
# Should NOT have the old hardcoded date
assert "updated: 2026-01-08" not in content
if __name__ == "__main__":
pytest.main([__file__, "-v"])