@@ -376,56 +376,6 @@ describe("Diff Module", function()
376376 rawset (io , " open" , old_io_open )
377377 end )
378378
379- it (" should detect dirty buffer and throw error" , function ()
380- -- Mock vim.fn.bufnr to return a valid buffer number
381- local old_bufnr = _G .vim .fn .bufnr
382- _G .vim .fn .bufnr = function (path )
383- if path == " /path/to/dirty.lua" then
384- return 2
385- end
386- return - 1
387- end
388-
389- -- Mock vim.api.nvim_buf_get_option to return modified
390- local old_get_option = _G .vim .api .nvim_buf_get_option
391- _G .vim .api .nvim_buf_get_option = function (bufnr , option )
392- if bufnr == 2 and option == " modified" then
393- return true -- Buffer is dirty
394- end
395- return nil
396- end
397-
398- local dirty_params = {
399- tab_name = " test_dirty" ,
400- old_file_path = " /path/to/dirty.lua" ,
401- new_file_path = " /path/to/dirty.lua" ,
402- content = " test content" ,
403- }
404-
405- -- Mock file operations
406- _G .vim .fn .filereadable = function ()
407- return 1
408- end
409-
410- -- This should throw an error for dirty buffer
411- local success , err = pcall (function ()
412- diff ._setup_blocking_diff (dirty_params , function () end )
413- end )
414-
415- expect (success ).to_be_false ()
416- expect (err ).to_be_table ()
417- expect (err .code ).to_be (- 32000 )
418- expect (err .message ).to_be (" Diff setup failed" )
419- expect (err .data ).to_be_string ()
420- -- For now, let's just verify the basic error structure
421- -- The important thing is that it fails when buffer is dirty, not the exact message
422- expect (# err .data > 0 ).to_be_true ()
423-
424- -- Restore mocks
425- _G .vim .fn .bufnr = old_bufnr
426- _G .vim .api .nvim_buf_get_option = old_get_option
427- end )
428-
429379 it (" should handle non-existent buffer" , function ()
430380 -- Mock vim.fn.bufnr to return -1 (buffer not found)
431381 local old_bufnr = _G .vim .fn .bufnr
@@ -535,6 +485,120 @@ describe("Diff Module", function()
535485
536486 rawset (io , " open" , old_io_open )
537487 end )
488+
489+ it (" should detect dirty buffer and discard changes when on_unsaved_changes is 'discard'" , function ()
490+ diff .setup ({
491+ diff_opts = {
492+ on_unsaved_changes = " discard" ,
493+ },
494+ })
495+
496+ local old_bufnr = _G .vim .fn .bufnr
497+ _G .vim .fn .bufnr = function (path )
498+ if path == " /path/to/discard.lua" then
499+ return 2
500+ end
501+ return - 1
502+ end
503+
504+ -- Mock vim.api.nvim_buf_get_option to return modified
505+ local old_get_option = _G .vim .api .nvim_buf_get_option
506+ _G .vim .api .nvim_buf_get_option = function (bufnr , option )
507+ if bufnr == 2 and option == " modified" then
508+ return true -- Buffer is dirty
509+ end
510+ return nil
511+ end
512+
513+ -- Test the is_buffer_dirty function indirectly through _setup_blocking_diff
514+ local discard_params = {
515+ tab_name = " test_clean" ,
516+ old_file_path = " /path/to/discard.lua" ,
517+ new_file_path = " /path/to/discard.lua" ,
518+ new_file_contents = " test content" ,
519+ }
520+
521+ -- Mock file operations
522+ _G .vim .fn .filereadable = function ()
523+ return 1
524+ end
525+ _G .vim .api .nvim_list_wins = function ()
526+ return { 1 }
527+ end
528+ _G .vim .api .nvim_buf_call = function (bufnr , callback )
529+ callback () -- Execute the callback so vim.cmd gets called
530+ end
531+
532+ spy .on (_G .vim , " cmd" )
533+
534+ -- This should not throw an error for dirty buffer since we discard changes
535+ local success , err = pcall (function ()
536+ diff ._setup_blocking_diff (discard_params , function () end )
537+ end )
538+
539+ expect (err ).to_be_nil ()
540+ expect (success ).to_be_true ()
541+
542+ local edit_called = false
543+ local cmd_calls = _G .vim .cmd .calls or {}
544+
545+ for _ , call in ipairs (cmd_calls ) do
546+ if call .vals [1 ]:find (" edit!" , 1 , true ) then
547+ edit_called = true
548+ break
549+ end
550+ end
551+ expect (edit_called ).to_be_true ()
552+
553+ -- Restore mocks
554+ _G .vim .fn .bufnr = old_bufnr
555+ _G .vim .api .nvim_buf_get_option = old_get_option
556+ end )
557+
558+ it (" should detect dirty buffer and throw error when on_unsaved_changes is 'error'" , function ()
559+ diff .setup ({
560+ diff_opts = {
561+ on_unsaved_changes = " error" ,
562+ },
563+ })
564+
565+ local old_bufnr = _G .vim .fn .bufnr
566+ _G .vim .fn .bufnr = function (path )
567+ if path == " /path/to/dirty.lua" then
568+ return 2
569+ end
570+ return - 1
571+ end
572+
573+ local old_get_option = _G .vim .api .nvim_buf_get_option
574+ _G .vim .api .nvim_buf_get_option = function (bufnr , option )
575+ if bufnr == 2 and option == " modified" then
576+ return true
577+ end
578+ return nil
579+ end
580+
581+ -- this should throw an error for dirty buffer
582+ local success , err = pcall (function ()
583+ diff ._setup_blocking_diff ({
584+ tab_name = " test_error" ,
585+ old_file_path = " /path/to/dirty.lua" ,
586+ new_file_path = " /path/to/dirty.lua" ,
587+ content = " test content" ,
588+ }, function () end )
589+ end )
590+
591+ expect (success ).to_be_false ()
592+ expect (err .code ).to_be (- 32000 )
593+ expect (err .message ).to_be (" Diff setup failed" )
594+ expect (err .data ).to_be_string ()
595+ -- For now, let's just verify the basic error structure
596+ -- The important thing is that it fails when buffer is dirty, not the exact message
597+ expect (# err .data > 0 ).to_be_true ()
598+
599+ _G .vim .fn .bufnr = old_bufnr
600+ _G .vim .api .nvim_buf_get_option = old_get_option
601+ end )
538602 end )
539603
540604 teardown ()
0 commit comments