emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Assistance Writing Test for Org Agenda Custom Bulk Function


From: Kevin Foley
Subject: Assistance Writing Test for Org Agenda Custom Bulk Function
Date: Mon, 15 Feb 2021 18:21:50 -0500

I'm trying write a test for a recently merged patch[1].

The patch adds the ability for users to specify a function to collect
args to be passed to a custom bulk function.

I'm trying to mock the argument collecting function and the custom bulk
function and then test that the arguments returned from the former are
passed to the latter.  I'd also like to test the argument function is
only called once while the bulk function is called multiple times.

Here is an example of what I'm trying to do:

(org-test-with-temp-text-in-file
    "* TODO a\n*TODO b"
  (let ((org-agenda-files `(,(buffer-file-name))))
    (org-todo-list)
    (org-agenda-bulk-mark-all)

    ;; Fails without these
    ;; (defvar f-called-cnt)
    ;; (defvar arg-f-call-cnt)
    ;; (defvar f-called-args)

    (let ((f-called-cnt 0)
          (arg-f-call-cnt 0)
          (f-called-args nil))
      (cl-letf (((symbol-function 'read-char-exclusive)
                 (lambda () ?P))
                (org-agenda-bulk-custom-functions
                 '((?P (lambda (&rest args)
                         (message "test" args)
                         (setq f-called-cnt (1+ f-called-cnt)
                               f-called-args args))
                       (lambda ()
                         (setq arg-f-call-cnt (1+ arg-f-call-cnt))
                         '(1 2 3))))))
        (org-agenda-bulk-action)
        (org-test-agenda--kill-all-agendas)

        (should (= f-called-cnt 2))
        (should (= arg-f-call-cnt 1))
        (should (equal f-called-args '(1 2 3)))))))

However, this fails with the error void-variable unless I first define
the variables for storing the call counts/arguments.  I understand that
defvar makes the variables dynamically bound, however I'm struggling to
understand why that's needed here.  I've read the manual entries on
variable binding but I seem to be missing something.

Can someone help me understand what's going on here?  Also, is there a
better way to approach this?

[1] 
https://code.orgmode.org/bzg/org-mode/commit/885ee086dde4ec2a9e303ff101e55d55c4b2363f



reply via email to

[Prev in Thread] Current Thread [Next in Thread]