Skip to content

Commit 7a898ba

Browse files
unhappychoiceclaude
andcommitted
refactor: improve RecordsScreen testability
- Move session data loading from new() to RecordsScreenDataProvider - RecordsScreen::new() now returns empty data without database access - init_with_data() accepts pre-loaded data from provider - Enables proper unit testing with mock data providers 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 7edc9ea commit 7a898ba

File tree

1 file changed

+36
-16
lines changed

1 file changed

+36
-16
lines changed

src/presentation/game/screens/records_screen.rs

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,38 @@ impl ScreenDataProvider for RecordsScreenDataProvider {
110110
fn provide(&self) -> Result<Box<dyn std::any::Any>> {
111111
let repositories = self.repository.get_all_repositories()?;
112112

113+
// Get sessions with default filter (Last 30 days, sorted by date descending)
114+
let sessions = self.repository.get_sessions_filtered(
115+
None, // repository_filter
116+
Some(30), // date_filter: Last 30 days
117+
"date", // sort_by
118+
true, // sort_descending
119+
)?;
120+
121+
// Convert to SessionDisplayData with session results and repository info
122+
let mut session_display_data = Vec::new();
123+
let repository_map: std::collections::HashMap<i64, StoredRepository> = repositories
124+
.iter()
125+
.map(|repo| (repo.id, repo.clone()))
126+
.collect();
127+
128+
for session in sessions {
129+
let session_result = {
130+
let db = self.repository.db_with_lock()?;
131+
db.get_session_result(session.id).unwrap_or(None)
132+
};
133+
let repository = session
134+
.repository_id
135+
.and_then(|id| repository_map.get(&id).cloned());
136+
session_display_data.push(SessionDisplayData {
137+
session,
138+
repository,
139+
session_result,
140+
});
141+
}
142+
113143
Ok(Box::new(RecordsScreenData {
114-
sessions: Vec::new(),
144+
sessions: session_display_data,
115145
repositories,
116146
}))
117147
}
@@ -136,29 +166,19 @@ pub struct RecordsScreen {
136166

137167
impl RecordsScreen {
138168
pub fn new(event_bus: EventBus) -> Self {
139-
let (sessions, repositories) = SessionRepository::new()
140-
.and_then(|repo| {
141-
let repositories = repo.get_all_repositories()?;
142-
Ok((Vec::new(), repositories))
143-
})
144-
.unwrap_or_default();
145-
146169
let mut list_state = ListState::default();
147170
list_state.select(Some(0));
148171

149-
let mut screen = Self {
150-
sessions,
151-
repositories,
172+
Self {
173+
sessions: Vec::new(),
174+
repositories: Vec::new(),
152175
filter_state: FilterState::default(),
153176
list_state,
154177
scroll_state: ScrollbarState::default(),
155178
action_result: None,
156179
selected_session_for_detail: None,
157180
event_bus,
158-
};
159-
160-
let _ = screen.refresh_sessions();
161-
screen
181+
}
162182
}
163183

164184
pub fn get_selected_session_for_detail(&self) -> &Option<SessionDisplayData> {
@@ -492,8 +512,8 @@ impl Screen for RecordsScreen {
492512

493513
let screen_data = data.downcast::<RecordsScreenData>()?;
494514

515+
self.sessions = screen_data.sessions;
495516
self.repositories = screen_data.repositories;
496-
self.refresh_sessions()?;
497517

498518
Ok(())
499519
}

0 commit comments

Comments
 (0)