Skip to content

Commit 89d4228

Browse files
committed
test: add comprehensive domain layer tests
- Add store tests (repository, session, challenge stores) - Add repository tests (challenge, trending repositories) - Add loading model tests (loading_steps, step_manager) - Expand analytics_service tests with mock implementations - Add stage_builder_service, session_manager, config_service tests - Expand parser tests (C++, C#, parser_registry) - Expand language, version_service tests
1 parent 8f6eb2d commit 89d4228

24 files changed

+3258
-250
lines changed

tests/unit/domain/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ pub mod events;
33
pub mod models;
44
pub mod repositories;
55
pub mod services;
6+
pub mod stores;

tests/unit/domain/models/language_tests.rs

Lines changed: 81 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,15 @@
11
use gittype::domain::models::Languages;
2-
use gittype::presentation::ui::Colors;
2+
use ratatui::style::Color;
3+
use std::hash::{Hash, Hasher};
34

45
#[test]
5-
fn language_registry_get_color_returns_specific_colors_for_known_languages() {
6-
assert_eq!(Languages::get_color(Some("rust")), Colors::lang_rust());
7-
assert_eq!(Languages::get_color(Some("python")), Colors::lang_python());
8-
assert_eq!(
9-
Languages::get_color(Some("javascript")),
10-
Colors::lang_javascript()
11-
);
12-
assert_eq!(
13-
Languages::get_color(Some("typescript")),
14-
Colors::lang_typescript()
15-
);
16-
}
17-
18-
#[test]
19-
fn language_registry_get_color_returns_default_for_unknown_languages() {
20-
assert_eq!(
21-
Languages::get_color(Some("unknown")),
22-
Colors::lang_default()
23-
);
24-
assert_eq!(Languages::get_color(Some("xyz")), Colors::lang_default());
25-
assert_eq!(Languages::get_color(Some("")), Colors::lang_default());
26-
}
27-
28-
#[test]
29-
fn language_registry_get_color_returns_default_for_none() {
30-
assert_eq!(Languages::get_color(None), Colors::lang_default());
6+
fn language_color_returns_specific_colors_for_known_languages() {
7+
let rust = Languages::get_by_name("rust").unwrap();
8+
assert_eq!(rust.color(), Color::Red);
9+
let python = Languages::get_by_name("python").unwrap();
10+
assert_eq!(python.color(), Color::Blue);
11+
let js = Languages::get_by_name("javascript").unwrap();
12+
assert_eq!(js.color(), Color::Yellow);
3113
}
3214

3315
#[test]
@@ -80,17 +62,16 @@ fn language_registry_get_by_name_finds_known_languages() {
8062

8163
#[test]
8264
fn language_trait_methods_work_correctly() {
83-
if let Some(rust_lang) = Languages::get_by_name("rust") {
84-
assert_eq!(rust_lang.name(), "rust");
85-
assert_eq!(rust_lang.display_name(), "Rust");
86-
assert_eq!(rust_lang.color(), Colors::lang_rust());
87-
}
65+
let rust_lang = Languages::get_by_name("rust").unwrap();
66+
assert_eq!(rust_lang.name(), "rust");
67+
assert_eq!(rust_lang.display_name(), "Rust");
68+
assert_eq!(rust_lang.color(), Color::Red);
8869
}
8970

9071
#[test]
9172
fn all_languages_returns_all_supported_languages() {
9273
let langs = Languages::all_languages();
93-
assert!(langs.len() >= 17); // At least 17 languages
74+
assert!(langs.len() >= 17);
9475
}
9576

9677
#[test]
@@ -111,20 +92,20 @@ fn get_supported_languages_includes_main_names_and_aliases() {
11192

11293
#[test]
11394
fn validate_languages_accepts_valid_languages() {
114-
let result = Languages::validate_languages(&vec!["rust".to_string(), "python".to_string()]);
95+
let result = Languages::validate_languages(&["rust".to_string(), "python".to_string()]);
11596
assert!(result.is_ok());
11697
}
11798

11899
#[test]
119100
fn validate_languages_rejects_invalid_languages() {
120-
let result = Languages::validate_languages(&vec!["rust".to_string(), "invalid".to_string()]);
101+
let result = Languages::validate_languages(&["rust".to_string(), "invalid".to_string()]);
121102
assert!(result.is_err());
122103
assert_eq!(result.unwrap_err(), vec!["invalid"]);
123104
}
124105

125106
#[test]
126107
fn validate_languages_accepts_empty_list() {
127-
let result = Languages::validate_languages(&vec![]);
108+
let result = Languages::validate_languages(&[]);
128109
assert!(result.is_ok());
129110
}
130111

@@ -169,22 +150,80 @@ fn get_by_name_is_case_insensitive() {
169150

170151
#[test]
171152
fn get_by_name_supports_aliases() {
172-
// If language has aliases, test them
173153
assert!(Languages::get_by_name("typescript").is_some());
174154
assert!(Languages::get_by_name("javascript").is_some());
175155
}
176156

177157
#[test]
178158
fn language_file_patterns_format() {
179-
if let Some(rust) = Languages::get_by_name("rust") {
180-
let patterns = rust.file_patterns();
181-
assert!(!patterns.is_empty());
182-
assert!(patterns.iter().any(|p| p.starts_with("**/")));
183-
}
159+
let rust = Languages::get_by_name("rust").unwrap();
160+
let patterns = rust.file_patterns();
161+
assert!(!patterns.is_empty());
162+
assert!(patterns.iter().any(|p| p.starts_with("**/")));
184163
}
185164

186165
#[test]
187166
fn get_language_by_name_wrapper_works() {
188167
assert!(Languages::get_language_by_name("rust").is_some());
189168
assert!(Languages::get_language_by_name("unknown").is_none());
190169
}
170+
171+
#[test]
172+
fn language_as_hash_key_returns_name() {
173+
let rust = Languages::get_by_name("rust").unwrap();
174+
assert_eq!(rust.as_hash_key(), "rust");
175+
}
176+
177+
#[test]
178+
fn dyn_language_hash_and_eq() {
179+
let rust = Languages::get_by_name("rust").unwrap();
180+
let python = Languages::get_by_name("python").unwrap();
181+
let rust2 = Languages::get_by_name("rust").unwrap();
182+
183+
// PartialEq
184+
assert_eq!(
185+
rust.as_ref() as &dyn gittype::domain::models::Language,
186+
rust2.as_ref() as &dyn gittype::domain::models::Language
187+
);
188+
assert_ne!(
189+
rust.as_ref() as &dyn gittype::domain::models::Language,
190+
python.as_ref() as &dyn gittype::domain::models::Language
191+
);
192+
193+
// Hash
194+
let mut h1 = std::collections::hash_map::DefaultHasher::new();
195+
(rust.as_ref() as &dyn gittype::domain::models::Language).hash(&mut h1);
196+
let hash1 = h1.finish();
197+
198+
let mut h2 = std::collections::hash_map::DefaultHasher::new();
199+
(rust2.as_ref() as &dyn gittype::domain::models::Language).hash(&mut h2);
200+
let hash2 = h2.finish();
201+
202+
assert_eq!(hash1, hash2);
203+
}
204+
205+
#[test]
206+
fn all_languages_have_display_name() {
207+
for lang in Languages::all_languages() {
208+
let dn = lang.display_name();
209+
assert!(!dn.is_empty(), "{} has empty display_name", lang.name());
210+
}
211+
}
212+
213+
#[test]
214+
fn all_languages_have_color() {
215+
for lang in Languages::all_languages() {
216+
let _ = lang.color(); // should not panic
217+
}
218+
}
219+
220+
#[test]
221+
fn all_languages_have_extensions() {
222+
for lang in Languages::all_languages() {
223+
assert!(
224+
!lang.extensions().is_empty(),
225+
"{} has no extensions",
226+
lang.name()
227+
);
228+
}
229+
}

0 commit comments

Comments
 (0)