Skip to content

Commit d567e40

Browse files
committed
fix(tests): add missing ApprovalState fields in event_loop tests
1 parent c2d5ae0 commit d567e40

3 files changed

Lines changed: 154 additions & 64 deletions

File tree

src/cortex-tui/src/runner/event_loop/input.rs

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -516,11 +516,13 @@ impl EventLoop {
516516
key_event: crossterm::event::KeyEvent,
517517
terminal: &mut CortexTerminal,
518518
) -> Result<bool> {
519-
use crossterm::event::KeyCode;
520519
use crate::app::{InlineApprovalSelection, RiskLevelSelection};
520+
use crossterm::event::KeyCode;
521521

522522
// Check if risk level submenu is visible
523-
let show_submenu = self.app_state.pending_approval
523+
let show_submenu = self
524+
.app_state
525+
.pending_approval
524526
.as_ref()
525527
.map(|a| a.show_risk_submenu)
526528
.unwrap_or(false);
@@ -530,19 +532,22 @@ impl EventLoop {
530532
match key_event.code {
531533
KeyCode::Char('1') => {
532534
// Select Low risk level and approve
533-
self.handle_approve_with_risk_level(RiskLevelSelection::Low).await?;
535+
self.handle_approve_with_risk_level(RiskLevelSelection::Low)
536+
.await?;
534537
self.render(terminal)?;
535538
return Ok(true);
536539
}
537540
KeyCode::Char('2') => {
538541
// Select Medium risk level and approve
539-
self.handle_approve_with_risk_level(RiskLevelSelection::Medium).await?;
542+
self.handle_approve_with_risk_level(RiskLevelSelection::Medium)
543+
.await?;
540544
self.render(terminal)?;
541545
return Ok(true);
542546
}
543547
KeyCode::Char('3') => {
544548
// Select High risk level and approve
545-
self.handle_approve_with_risk_level(RiskLevelSelection::High).await?;
549+
self.handle_approve_with_risk_level(RiskLevelSelection::High)
550+
.await?;
546551
self.render(terminal)?;
547552
return Ok(true);
548553
}
@@ -572,7 +577,9 @@ impl EventLoop {
572577
}
573578
KeyCode::Enter => {
574579
// Confirm selected risk level
575-
let risk_level = self.app_state.pending_approval
580+
let risk_level = self
581+
.app_state
582+
.pending_approval
576583
.as_ref()
577584
.map(|a| a.selected_risk_level)
578585
.unwrap_or_default();
@@ -628,7 +635,9 @@ impl EventLoop {
628635
}
629636
KeyCode::Enter => {
630637
// Confirm selected action
631-
let action = self.app_state.pending_approval
638+
let action = self
639+
.app_state
640+
.pending_approval
632641
.as_ref()
633642
.map(|a| a.selected_action)
634643
.unwrap_or_default();
@@ -678,7 +687,9 @@ impl EventLoop {
678687

679688
// Show toast notification about the mode change
680689
let mode_name = self.app_state.permission_mode.display_name();
681-
self.app_state.toasts.info(&format!("Risk level set to: {}", mode_name));
690+
self.app_state
691+
.toasts
692+
.info(&format!("Risk level set to: {}", mode_name));
682693

683694
// Now approve the tool
684695
self.handle_approve().await?;

src/cortex-tui/src/runner/event_loop/tests.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
#[cfg(test)]
44
mod tests {
55
use crate::actions::ActionContext;
6-
use crate::app::{AppState, ApprovalMode, ApprovalState, FocusTarget};
6+
use crate::app::{
7+
AppState, ApprovalMode, ApprovalState, FocusTarget, InlineApprovalSelection,
8+
RiskLevelSelection,
9+
};
710
use crate::runner::event_loop::EventLoop;
811

912
#[test]
@@ -43,6 +46,9 @@ mod tests {
4346
tool_args_json: Some(serde_json::json!({})),
4447
diff_preview: None,
4548
approval_mode: ApprovalMode::Ask,
49+
selected_action: InlineApprovalSelection::default(),
50+
show_risk_submenu: false,
51+
selected_risk_level: RiskLevelSelection::default(),
4652
});
4753
let event_loop = EventLoop::new(app_state);
4854

src/cortex-tui/src/views/minimal_session/rendering.rs

Lines changed: 128 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ use cortex_core::widgets::{Brain, Message, MessageRole};
1515
use cortex_tui_components::welcome_card::{InfoCard, InfoCardPair, ToLines, WelcomeCard};
1616

1717
use crate::app::{
18-
AppState, ApprovalState, InlineApprovalSelection, RiskLevelSelection,
19-
SubagentDisplayStatus, SubagentTaskDisplay,
18+
AppState, ApprovalState, InlineApprovalSelection, RiskLevelSelection, SubagentDisplayStatus,
19+
SubagentTaskDisplay,
2020
};
2121
use crate::ui::colors::AdaptiveColors;
2222
use crate::ui::consts::border;
@@ -997,7 +997,12 @@ pub fn render_motd_compact(
997997
/// │ [1] Low [2] Medium [3] High [Esc] Cancel │
998998
/// ╰─────────────────────────────────────────────────────────╯
999999
/// ```
1000-
pub fn render_inline_approval(area: Rect, buf: &mut Buffer, approval: &ApprovalState, colors: &AdaptiveColors) {
1000+
pub fn render_inline_approval(
1001+
area: Rect,
1002+
buf: &mut Buffer,
1003+
approval: &ApprovalState,
1004+
colors: &AdaptiveColors,
1005+
) {
10011006
if area.is_empty() || area.height < 4 {
10021007
return;
10031008
}
@@ -1057,42 +1062,72 @@ pub fn render_inline_approval(area: Rect, buf: &mut Buffer, approval: &ApprovalS
10571062
if approval.show_risk_submenu {
10581063
// Risk level submenu content
10591064
let y = area.y + 1;
1060-
1065+
10611066
// Build risk level options
10621067
let mut spans: Vec<Span<'static>> = Vec::new();
1063-
1068+
10641069
let low_selected = approval.selected_risk_level == RiskLevelSelection::Low;
10651070
let med_selected = approval.selected_risk_level == RiskLevelSelection::Medium;
10661071
let high_selected = approval.selected_risk_level == RiskLevelSelection::High;
1067-
1072+
10681073
// [1] Low
1069-
spans.push(Span::styled("[1]", if low_selected { accent_style } else { dim_style }));
1070-
spans.push(Span::styled(" Low ", if low_selected {
1071-
Style::default().fg(colors.success)
1072-
} else {
1073-
dim_style
1074-
}));
1075-
1074+
spans.push(Span::styled(
1075+
"[1]",
1076+
if low_selected {
1077+
accent_style
1078+
} else {
1079+
dim_style
1080+
},
1081+
));
1082+
spans.push(Span::styled(
1083+
" Low ",
1084+
if low_selected {
1085+
Style::default().fg(colors.success)
1086+
} else {
1087+
dim_style
1088+
},
1089+
));
1090+
10761091
// [2] Medium
1077-
spans.push(Span::styled("[2]", if med_selected { accent_style } else { dim_style }));
1078-
spans.push(Span::styled(" Medium ", if med_selected {
1079-
Style::default().fg(colors.warning)
1080-
} else {
1081-
dim_style
1082-
}));
1083-
1092+
spans.push(Span::styled(
1093+
"[2]",
1094+
if med_selected {
1095+
accent_style
1096+
} else {
1097+
dim_style
1098+
},
1099+
));
1100+
spans.push(Span::styled(
1101+
" Medium ",
1102+
if med_selected {
1103+
Style::default().fg(colors.warning)
1104+
} else {
1105+
dim_style
1106+
},
1107+
));
1108+
10841109
// [3] High
1085-
spans.push(Span::styled("[3]", if high_selected { accent_style } else { dim_style }));
1086-
spans.push(Span::styled(" High ", if high_selected {
1087-
Style::default().fg(colors.error)
1088-
} else {
1089-
dim_style
1090-
}));
1091-
1110+
spans.push(Span::styled(
1111+
"[3]",
1112+
if high_selected {
1113+
accent_style
1114+
} else {
1115+
dim_style
1116+
},
1117+
));
1118+
spans.push(Span::styled(
1119+
" High ",
1120+
if high_selected {
1121+
Style::default().fg(colors.error)
1122+
} else {
1123+
dim_style
1124+
},
1125+
));
1126+
10921127
// [Esc] Cancel
10931128
spans.push(Span::styled("[Esc]", dim_style));
10941129
spans.push(Span::styled(" Cancel", dim_style));
1095-
1130+
10961131
let line = Line::from(spans);
10971132
Paragraph::new(line).render(
10981133
Rect::new(content_x, y, area.width.saturating_sub(4), 1),
@@ -1104,12 +1139,19 @@ pub fn render_inline_approval(area: Rect, buf: &mut Buffer, approval: &ApprovalS
11041139
let y1 = area.y + 1;
11051140
let warning_char = "⚠";
11061141
let tool_display = format!(" Execute: {}", approval.tool_name);
1107-
buf.set_string(content_x, y1, warning_char, Style::default().fg(colors.warning));
1142+
buf.set_string(
1143+
content_x,
1144+
y1,
1145+
warning_char,
1146+
Style::default().fg(colors.warning),
1147+
);
11081148
buf.set_string(
11091149
content_x + 2,
11101150
y1,
11111151
&tool_display,
1112-
Style::default().fg(colors.text).add_modifier(Modifier::BOLD),
1152+
Style::default()
1153+
.fg(colors.text)
1154+
.add_modifier(Modifier::BOLD),
11131155
);
11141156

11151157
// Line 2: args summary (truncated)
@@ -1124,37 +1166,67 @@ pub fn render_inline_approval(area: Rect, buf: &mut Buffer, approval: &ApprovalS
11241166

11251167
// Line 3: Action buttons
11261168
let y3 = area.y + 3;
1127-
1169+
11281170
let mut spans: Vec<Span<'static>> = Vec::new();
1129-
1171+
11301172
let reject_selected = approval.selected_action == InlineApprovalSelection::Reject;
11311173
let accept_selected = approval.selected_action == InlineApprovalSelection::AcceptOnce;
11321174
let set_selected = approval.selected_action == InlineApprovalSelection::AcceptAndSet;
1133-
1175+
11341176
// [n] Reject
1135-
spans.push(Span::styled("[n]", if reject_selected { accent_style } else { dim_style }));
1136-
spans.push(Span::styled(" Reject ", if reject_selected {
1137-
Style::default().fg(colors.error)
1138-
} else {
1139-
dim_style
1140-
}));
1141-
1177+
spans.push(Span::styled(
1178+
"[n]",
1179+
if reject_selected {
1180+
accent_style
1181+
} else {
1182+
dim_style
1183+
},
1184+
));
1185+
spans.push(Span::styled(
1186+
" Reject ",
1187+
if reject_selected {
1188+
Style::default().fg(colors.error)
1189+
} else {
1190+
dim_style
1191+
},
1192+
));
1193+
11421194
// [y] Accept Once
1143-
spans.push(Span::styled("[y]", if accept_selected { accent_style } else { dim_style }));
1144-
spans.push(Span::styled(" Accept Once ", if accept_selected {
1145-
Style::default().fg(colors.success)
1146-
} else {
1147-
dim_style
1148-
}));
1149-
1195+
spans.push(Span::styled(
1196+
"[y]",
1197+
if accept_selected {
1198+
accent_style
1199+
} else {
1200+
dim_style
1201+
},
1202+
));
1203+
spans.push(Span::styled(
1204+
" Accept Once ",
1205+
if accept_selected {
1206+
Style::default().fg(colors.success)
1207+
} else {
1208+
dim_style
1209+
},
1210+
));
1211+
11501212
// [a] Accept & Set Risk
1151-
spans.push(Span::styled("[a]", if set_selected { accent_style } else { dim_style }));
1152-
spans.push(Span::styled(" Accept & Set Risk", if set_selected {
1153-
Style::default().fg(colors.warning)
1154-
} else {
1155-
dim_style
1156-
}));
1157-
1213+
spans.push(Span::styled(
1214+
"[a]",
1215+
if set_selected {
1216+
accent_style
1217+
} else {
1218+
dim_style
1219+
},
1220+
));
1221+
spans.push(Span::styled(
1222+
" Accept & Set Risk",
1223+
if set_selected {
1224+
Style::default().fg(colors.warning)
1225+
} else {
1226+
dim_style
1227+
},
1228+
));
1229+
11581230
let line = Line::from(spans);
11591231
Paragraph::new(line).render(
11601232
Rect::new(content_x, y3, area.width.saturating_sub(4), 1),
@@ -1167,7 +1239,8 @@ pub fn render_inline_approval(area: Rect, buf: &mut Buffer, approval: &ApprovalS
11671239
fn format_args_summary(args: &serde_json::Value, max_width: usize) -> String {
11681240
match args {
11691241
serde_json::Value::Object(map) => {
1170-
let parts: Vec<String> = map.iter()
1242+
let parts: Vec<String> = map
1243+
.iter()
11711244
.take(3) // Only show first 3 args
11721245
.map(|(k, v)| {
11731246
let v_str = match v {

0 commit comments

Comments
 (0)