1+ use ai:: generation:: fallback:: { generate_with_fallback, get_api_key, validate_api_key} ;
2+ use ai:: config:: AppConfig ;
3+
4+ #[ tokio:: test]
5+ async fn test_fallback_strategy_no_api_key ( ) {
6+ // Clear environment to ensure clean test
7+ std:: env:: remove_var ( "OPENAI_API_KEY" ) ;
8+
9+ let test_diff = r#"diff --git a/src/auth.rs b/src/auth.rs
10+ new file mode 100644
11+ index 0000000..1234567
12+ --- /dev/null
13+ +++ b/src/auth.rs
14+ @@ -0,0 +1,5 @@
15+ +pub fn authenticate(user: &str, pass: &str) -> bool {
16+ + user == "admin" && pass == "secret"
17+ +}
18+ "# ;
19+
20+ let mut config = AppConfig :: default ( ) ;
21+ config. openai_api_key = None ;
22+
23+ let result = generate_with_fallback ( test_diff, & config) . await ;
24+
25+ // Should succeed with local generation
26+ assert ! ( result. is_ok( ) , "Expected fallback to succeed, got: {:?}" , result. err( ) ) ;
27+
28+ let message = result. unwrap ( ) ;
29+ assert ! ( !message. is_empty( ) , "Generated message should not be empty" ) ;
30+ assert ! ( message. len( ) <= 72 , "Message should respect default length limit" ) ; // Default max_commit_length
31+ }
32+
33+ #[ tokio:: test]
34+ async fn test_fallback_strategy_invalid_api_key ( ) {
35+ let test_diff = r#"diff --git a/src/test.py b/src/test.py
36+ new file mode 100644
37+ index 0000000..abc123
38+ --- /dev/null
39+ +++ b/src/test.py
40+ @@ -0,0 +1,3 @@
41+ +def hello():
42+ + return "Hello, World!"
43+ "# ;
44+
45+ let mut config = AppConfig :: default ( ) ;
46+ config. openai_api_key = Some ( "<PLACE HOLDER FOR YOUR API KEY>" . to_string ( ) ) ;
47+
48+ let result = generate_with_fallback ( test_diff, & config) . await ;
49+
50+ // Should succeed with local fallback
51+ assert ! ( result. is_ok( ) , "Expected fallback to succeed, got: {:?}" , result. err( ) ) ;
52+
53+ let message = result. unwrap ( ) ;
54+ assert ! ( !message. is_empty( ) , "Generated message should not be empty" ) ;
55+ }
56+
57+ #[ test]
58+ fn test_api_key_validation ( ) {
59+ // Test various invalid keys
60+ assert ! ( validate_api_key( None ) . is_err( ) ) ;
61+ assert ! ( validate_api_key( Some ( "" ) ) . is_err( ) ) ;
62+ assert ! ( validate_api_key( Some ( "<PLACE HOLDER FOR YOUR API KEY>" ) ) . is_err( ) ) ;
63+
64+ // Test valid key
65+ assert ! ( validate_api_key( Some ( "sk-valid-key-123" ) ) . is_ok( ) ) ;
66+ }
67+
68+ #[ test]
69+ fn test_get_api_key_from_config ( ) {
70+ // Test with valid config
71+ let mut config = AppConfig :: default ( ) ;
72+ config. openai_api_key = Some ( "test-key-123" . to_string ( ) ) ;
73+ assert ! ( get_api_key( & config) . is_ok( ) ) ;
74+
75+ // Test with invalid config
76+ config. openai_api_key = Some ( "<PLACE HOLDER FOR YOUR API KEY>" . to_string ( ) ) ;
77+ assert ! ( get_api_key( & config) . is_err( ) ) ;
78+
79+ // Test with no config
80+ config. openai_api_key = None ;
81+ std:: env:: remove_var ( "OPENAI_API_KEY" ) ;
82+ assert ! ( get_api_key( & config) . is_err( ) ) ;
83+ }
84+
85+ #[ test]
86+ fn test_get_api_key_from_env ( ) {
87+ // Set environment variable
88+ std:: env:: set_var ( "OPENAI_API_KEY" , "env-test-key" ) ;
89+
90+ let mut config = AppConfig :: default ( ) ;
91+ config. openai_api_key = None ;
92+
93+ let result = get_api_key ( & config) ;
94+ assert ! ( result. is_ok( ) ) ;
95+ assert_eq ! ( result. unwrap( ) , "env-test-key" ) ;
96+
97+ // Clean up
98+ std:: env:: remove_var ( "OPENAI_API_KEY" ) ;
99+ }
0 commit comments