1+ import os
2+ import shutil
3+ import tempfile
4+ import time
5+ import pytest
6+
7+ from src .uckn .core .organisms .knowledge_manager import KnowledgeManager
8+
9+ # --- Pytest fixtures for temp directory and KnowledgeManager ---
10+
11+ @pytest .fixture (scope = "module" )
12+ def temp_knowledge_dir ():
13+ temp_dir = tempfile .mkdtemp (prefix = "uckn_test_knowledge_" )
14+ yield temp_dir
15+ shutil .rmtree (temp_dir )
16+
17+ @pytest .fixture (scope = "module" )
18+ def km (temp_knowledge_dir ):
19+ # Wait a bit to avoid ChromaDB file lock issues in CI
20+ time .sleep (0.5 )
21+ km = KnowledgeManager (knowledge_dir = temp_knowledge_dir )
22+ yield km
23+ # No explicit teardown needed; temp dir fixture handles cleanup
24+
25+ # --- Helper functions for test data ---
26+
27+ def valid_pattern_data (pattern_id = "pattern1" ):
28+ # All metadata fields as strings (not lists), matching ChromaDB schema
29+ return {
30+ "document" : "Use a singleton to ensure a class has only one instance." ,
31+ "metadata" : {
32+ "pattern_id" : pattern_id ,
33+ "pattern_type" : "singleton" ,
34+ "technology_stack" : "python,pytest" , # String, not list
35+ "success_rate" : 0.95 ,
36+ "created_at" : "2024-06-28T12:00:00Z" ,
37+ "updated_at" : "2024-06-28T12:00:00Z"
38+ }
39+ }
40+
41+ def valid_error_solution_data (solution_id = "solution1" ):
42+ return {
43+ "document" : "To fix ImportError, ensure the module is installed and the path is correct." ,
44+ "metadata" : {
45+ "solution_id" : solution_id ,
46+ "error_category" : "ImportError" ,
47+ "resolution_steps" : "Check module path; reinstall package" , # String, not list
48+ "avg_resolution_time" : 2.5 ,
49+ "created_at" : "2024-06-28T12:00:00Z" ,
50+ "updated_at" : "2024-06-28T12:00:00Z"
51+ }
52+ }
53+
54+ # --- Integration Tests ---
55+
56+ def test_add_and_search_pattern (km ):
57+ pattern = valid_pattern_data ()
58+ pattern_id = km .add_pattern (pattern )
59+ assert pattern_id is not None
60+
61+ # Search for the pattern
62+ results = km .search_patterns ("singleton" , limit = 5 )
63+ assert isinstance (results , list )
64+ assert any (r .get ("id" ) == pattern_id for r in results )
65+
66+ def test_pattern_classification_workflow (km ):
67+ pattern = valid_pattern_data ("pattern2" )
68+ pattern_id = km .add_pattern (pattern )
69+ assert pattern_id is not None
70+
71+ # Create a category
72+ cat_id = km .create_category ("Design Patterns" , "Classic design patterns" )
73+ assert cat_id is not None
74+
75+ # Assign pattern to category
76+ assigned = km .assign_pattern_to_category (pattern_id , cat_id )
77+ assert assigned
78+
79+ # Get patterns by category
80+ patterns = km .get_patterns_by_category (cat_id )
81+ assert pattern_id in patterns
82+
83+ # Get categories for pattern
84+ cats = km .get_pattern_categories (pattern_id )
85+ assert any (c .get ("category_id" ) == cat_id for c in cats )
86+
87+ # Remove pattern from category
88+ removed = km .remove_pattern_from_category (pattern_id , cat_id )
89+ assert removed
90+
91+ # Delete category
92+ deleted = km .delete_category (cat_id )
93+ assert deleted
94+
95+ def test_add_and_search_error_solution (km ):
96+ solution = valid_error_solution_data ()
97+ solution_id = km .add_error_solution (solution )
98+ assert solution_id is not None
99+
100+ # Search for the error solution
101+ results = km .search_error_solutions ("ImportError" , limit = 5 )
102+ assert isinstance (results , list )
103+ assert any (r .get ("id" ) == solution_id for r in results )
104+
105+ def test_health_status_and_error_handling (km ):
106+ health = km .get_health_status ()
107+ assert isinstance (health , dict )
108+ assert health ["chromadb_available" ] is True
109+ assert health ["semantic_search_available" ] is True
110+ assert "pattern_manager" in health ["components" ]
111+
112+ # Try to get a non-existent pattern
113+ result = km .get_pattern ("nonexistent" )
114+ assert result is None
115+
116+ # Try to get a non-existent error solution
117+ result = km .get_error_solution ("nonexistent" )
118+ assert result is None
119+
120+ def test_update_and_delete_pattern (km ):
121+ pattern = valid_pattern_data ("pattern3" )
122+ pattern_id = km .add_pattern (pattern )
123+ assert pattern_id is not None
124+
125+ # Update the pattern
126+ updated = km .update_pattern (pattern_id , {"metadata" : {"success_rate" : 0.99 }})
127+ assert updated
128+
129+ # Delete the pattern
130+ deleted = km .delete_pattern (pattern_id )
131+ assert deleted
132+
133+ def test_tech_stack_analysis (km ):
134+ # Test tech stack detector integration
135+ project_path = "/tmp" # Use a simple path that exists
136+ tech_stack = km .analyze_project_stack (project_path )
137+ assert isinstance (tech_stack , dict )
138+ # The result should have some structure even if minimal
0 commit comments