@@ -0,0 +1,96 @@
6+ "github.com/charmbracelet/crush/internal/permission"
7+ "github.com/charmbracelet/crush/internal/ui/dialog"
8+ "github.com/stretchr/testify/require"
11+// newTestUIForPermissions builds a UI with a chat, dialog overlay, and
12+// common context sufficient to exercise handlePermissionNotification.
13+func newTestUIForPermissions() *UI {
15+ u.dialog = dialog.NewOverlay()
19+func TestHandlePermissionNotification_RemoteGrantClosesDialog(t *testing.T) {
22+ u := newTestUIForPermissions()
23+ perm := permission.PermissionRequest{
25+ ToolCallID: "tool-call-X",
28+ u.dialog.OpenDialog(dialog.NewPermissions(u.com, perm))
29+ require.True(t, u.dialog.ContainsDialog(dialog.PermissionsID))
31+ u.handlePermissionNotification(permission.PermissionNotification{
32+ ToolCallID: "tool-call-X",
36+ require.False(t, u.dialog.ContainsDialog(dialog.PermissionsID),
37+ "granted notification should close matching permissions dialog")
40+func TestHandlePermissionNotification_RemoteDenyClosesDialog(t *testing.T) {
43+ u := newTestUIForPermissions()
44+ perm := permission.PermissionRequest{
46+ ToolCallID: "tool-call-Y",
48+ u.dialog.OpenDialog(dialog.NewPermissions(u.com, perm))
50+ u.handlePermissionNotification(permission.PermissionNotification{
51+ ToolCallID: "tool-call-Y",
55+ require.False(t, u.dialog.ContainsDialog(dialog.PermissionsID),
56+ "denied notification should close matching permissions dialog")
59+func TestHandlePermissionNotification_InitialPendingDoesNotClose(t *testing.T) {
62+ u := newTestUIForPermissions()
63+ perm := permission.PermissionRequest{
65+ ToolCallID: "tool-call-Z",
67+ u.dialog.OpenDialog(dialog.NewPermissions(u.com, perm))
69+ // The initial notification published by permission.Request is
70+ // neither granted nor denied; it must not dismiss the dialog.
71+ u.handlePermissionNotification(permission.PermissionNotification{
72+ ToolCallID: "tool-call-Z",
75+ require.True(t, u.dialog.ContainsDialog(dialog.PermissionsID),
76+ "initial pending notification must not close the dialog")
79+func TestHandlePermissionNotification_DifferentToolCallIDDoesNotClose(t *testing.T) {
82+ u := newTestUIForPermissions()
83+ perm := permission.PermissionRequest{
85+ ToolCallID: "tool-call-A",
87+ u.dialog.OpenDialog(dialog.NewPermissions(u.com, perm))
89+ u.handlePermissionNotification(permission.PermissionNotification{
90+ ToolCallID: "tool-call-B",
94+ require.True(t, u.dialog.ContainsDialog(dialog.PermissionsID),
95+ "notification for unrelated tool call must not close the dialog")