emacs/test/lisp/erc/erc-scenarios-base-kill-on-part.el
F. Jason Park cf7cc4c630 Don't kill server buffer with erc-kill-buffer-on-part
* etc/ERC-NEWS: Mention new flag `erc-killing-buffer-on-part-p' and
the renaming of `erc-kill-channel'.
* lisp/erc/erc-backend.el (erc-server-PART): Only kill a buffer on
behalf of `erc-kill-buffer-on-part' when the buffer hasn't already
been killed, and bind `erc-killing-buffer-on-part-p' to t when doing
so.
* lisp/erc/erc-log.el (erc-conditional-save-buffer): Don't save logs
when the buffer parameter is nil because that causes the server buffer
to be saved out.  It's possible that user code relying on this
longstanding bug will be affected, however, by default, the server
buffer will also be saved out independently at designated junctures.
* lisp/erc/erc.el (erc-part-hook): Redo doc string.
(erc-killing-buffer-on-part-p): New variable, a flag to prevent
redundant execution of `erc-kill-channel-hook' members concerned with
parted channels.
(erc-kill-buffer-on-part): Tweak doc string.
(erc-kill-channel-hook): Use new name for `erc-kill-channel',
`erc-part-channel-on-kill'.
(erc-kill-channel, erc-part-channel-on-kill): Rename former to latter,
and inhibit execution when `erc-killing-buffer-on-part-p' is non-nil.
* test/lisp/erc/erc-scenarios-base-kill-on-part.el: New file.
(Bug#70840)
2024-05-18 15:48:05 -07:00

95 lines
3.8 KiB
EmacsLisp

;;; erc-scenarios-base-kill-on-part.el --- killing buffers on part -*- lexical-binding: t -*-
;; Copyright (C) 2024 Free Software Foundation, Inc.
;; This file is part of GNU Emacs.
;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Code:
(require 'ert-x)
(eval-and-compile
(let ((load-path (cons (ert-resource-directory) load-path)))
(require 'erc-scenarios-common)))
;; Assert channel buffer is killed when `erc-kill-buffer-on-part' is
;; enabled and a user issues a /part. Also assert that code in
;; `erc-kill-channel-hook' can detect when `erc-response-PART' is
;; killing a buffer on behalf of that option.
(ert-deftest erc-scenarios-base-kill-on-part--enabled ()
:tags '(:expensive-test)
(should-not erc-kill-buffer-on-part)
(erc-scenarios-common-with-cleanup
((erc-scenarios-common-dialog "base/reuse-buffers/channel")
(erc-server-flood-penalty 0.1)
(dumb-server (erc-d-run "localhost" t 'foonet))
(port (process-contact dumb-server :service))
(erc-kill-buffer-on-part t)
(calls nil)
(erc-part-hook (lambda (b) (push (buffer-name b) calls)))
(erc-kill-channel-hook
(cons (lambda () (push erc-killing-buffer-on-part-p calls))
erc-kill-channel-hook))
(expect (erc-d-t-make-expecter)))
(ert-info ("Connect to foonet")
(with-current-buffer (erc :server "127.0.0.1"
:port port
:nick "tester"
:password "foonet:changeme"
:full-name "tester")
(funcall expect 10 "This server is in debug mode")))
(with-current-buffer (erc-d-t-wait-for 20 (get-buffer "#chan"))
(funcall expect 10 "<alice> bob: Whilst I can shake")
(erc-scenarios-common-say "/part"))
(erc-d-t-wait-for 20 (null (get-buffer "#chan")))
(should (equal calls '(t "#chan")))))
;; When `erc-kill-buffer-on-part' is non-nil, and the parted buffer has
;; already been killed, don't kill the server buffer. Bug#70840
(ert-deftest erc-scenarios-base-kill-on-part--enabled/killed ()
:tags '(:expensive-test)
(should-not erc-kill-buffer-on-part)
(erc-scenarios-common-with-cleanup
((erc-scenarios-common-dialog "base/reuse-buffers/channel")
(erc-server-flood-penalty 0.1)
(dumb-server (erc-d-run "localhost" t 'foonet))
(port (process-contact dumb-server :service))
(erc-kill-buffer-on-part t)
(calls nil)
(erc-part-hook (lambda (b) (push b calls)))
(expect (erc-d-t-make-expecter)))
(ert-info ("Connect to foonet")
(with-current-buffer (erc :server "127.0.0.1"
:port port
:nick "tester"
:password "foonet:changeme"
:full-name "tester")
(funcall expect 10 "This server is in debug mode")))
(with-current-buffer (erc-d-t-wait-for 20 (get-buffer "#chan"))
(funcall expect 10 "<alice> bob: Whilst I can shake")
(kill-buffer))
(erc-d-t-wait-for 20 (null (get-buffer "#chan")))
(erc-d-t-wait-for 10 (equal calls '(nil)))
(erc-d-t-ensure-for 0.1 (get-buffer "foonet"))))
;;; erc-scenarios-base-kill-on-part.el ends here