emacs/test/lisp/erc/erc-services-tests.el
F. Jason Park 0590224343 Standardize auth-source queries in ERC
* lisp/erc/erc.el (erc-password): Deprecate variable only used by
`erc-select-read-args'.  Server passwords are primarily used as
surrogates for other forms of authentication.  Such use is common but
nonstandard and often discouraged in favor of the de facto standard,
SASL.  Folks in the habit of invoking `erc(-tls)' interactively should
be encouraged to use auth-source instead.
(erc-select-read-args): Before this change, `erc-select-read-args'
offered to use the value of a non-nil `erc-password' as the :password
argument for `erc' and `erc-tls', referring to it as the "default"
password.  And when `erc-prompt-for-password' was nil and
`erc-password' wasn't, the latter was passed along unconditionally.
This only further complicated an already confusing situation for new
users, who in most cases shouldn't be worried about sending a PASS
command at all.  Until SASL arrives, they should provide server
passwords manually or learn to use auth-source.
(erc-auth-source-server-function, erc-auth-source-join-function): New
user options for retrieving a password externally, ostensibly by
calling `auth-source-search'.
(erc--auth-source-determine-params-defaults): New helper for
`erc--auth-source-search' with potential for exporting publicly in the
future.  Favors :host and :port fields above others.  Prioritizes
network IDs over announced servers and dialed endpoints.
(erc--auth-source-determine-params-merge): Add new function for
merging contextual and default parameters.  This is another contender
for possible exporting.
(erc--auth-source-search): New function for consulting auth-source and
sorting the result as filtered and prioritized by the previously
mentioned helpers.
(erc-auth-source-search): New function to serve as default
value for auth-source query-function options.
(erc-server-join-channel): Use user option for consulting auth-source
facility.  Also accept nil for first argument (instead of server).
(erc-cmd-JOIN): Use above-mentioned facilities when joining new
channel.  Omit server when calling `erc-server-join-channel'.  Don't
filter target buffers twice.  Don't call `switch-to-buffer', which
would create phantom buffers with names like target/server that were
never used.  IOW, only switch to existing target buffers.
(erc--compute-server-password): Add new helper function for
determining password.
(erc-open, erc-determine-parameters): Move password figuring from the
first to the latter.

* lisp/erc/erc-services.el
(erc-auth-source-services-function): Add new option for consulting
auth-source in a NickServ context.
(erc-nickserv-get-password): Pass network-context ID, when looking up
password in `erc-nickserv-passwords' and when formatting prompt for
user input.
(erc-nickserv-passwords): Add comment to custom option definition type
tag.

* test/lisp/erc/erc-services-tests.el: Add new test file for above
changes.  For now, stash auth-source-related tests here until a
suitable home can be found.

* lisp/erc/erc-join.el (erc-autojoin--join): Don't pass session-like
entity from `erc-autojoin-channels-alist' match to
`erc-server-join-channel'.  Allow that function to decide for itself
which host to look up if necessary.

* test/lisp/erc/resources/base/auth-source/foonet.eld: New file.
* test/lisp/erc/resources/base/auth-source/nopass.eld: New file.
* test/lisp/erc/resources/erc-scenarios-common.el: New file.
* test/lisp/erc/resources/services/auth-source/libera.eld: New file.
* test/lisp/erc/erc-scenarios-auth-source.el: New file.
* test/lisp/erc/erc-scenarios-base-reuse-buffers.el: New file.
* test/lisp/erc/erc-scenarios-join-auth-source.el: New file.
* test/lisp/erc/resources/base/reuse-buffers/channel/barnet.eld: New file.
* test/lisp/erc/resources/base/reuse-buffers/channel/foonet.eld: New file.
* test/lisp/erc/resources/join/auth-source/foonet.eld: New file.
(Bug#48598)
2022-06-30 15:18:22 -07:00

574 lines
23 KiB
EmacsLisp

;;; erc-services-tests.el --- Tests for erc-services. -*- lexical-binding:t -*-
;; Copyright (C) 2020-2022 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/>.
;;; Commentary:
;; TODO: move the auth-source tests somewhere else. They've been
;; stashed here for pragmatic reasons.
;;; Code:
(require 'ert-x)
(require 'erc-services)
(require 'erc-compat)
(require 'secrets)
;;;; Core auth-source
(ert-deftest erc--auth-source-determine-params-merge ()
(let ((erc-session-server "irc.gnu.org")
(erc-server-announced-name "my.gnu.org")
(erc-session-port 6697)
(erc-network 'fake)
(erc-server-current-nick "tester")
(erc-networks--id (erc-networks--id-create 'GNU.chat)))
(should (equal (erc--auth-source-determine-params-merge)
'(:host ("GNU.chat" "my.gnu.org" "irc.gnu.org")
:port ("6697" "irc")
:require (:secret))))
(should (equal (erc--auth-source-determine-params-merge :host "fake")
'(:host ("fake" "GNU.chat" "my.gnu.org" "irc.gnu.org")
:port ("6697" "irc")
:require (:secret))))
(should (equal (erc--auth-source-determine-params-merge
:host '("fake") :require :host)
'(:host ("fake" "GNU.chat" "my.gnu.org" "irc.gnu.org")
:require (:host :secret)
:port ("6697" "irc"))))
(should (equal (erc--auth-source-determine-params-merge
:host '("fake" "GNU.chat") :port "1234" :x "x")
'(:host ("fake" "GNU.chat" "my.gnu.org" "irc.gnu.org")
:port ("1234" "6697" "irc")
:x ("x")
:require (:secret))))))
;; Some of the following may be related to bug#23438.
(defun erc-services-tests--auth-source-standard (search)
(ert-info ("Session wins")
(let ((erc-session-server "irc.gnu.org")
(erc-server-announced-name "my.gnu.org")
(erc-session-port 6697)
(erc-network 'fake)
(erc-server-current-nick "tester")
(erc-networks--id (erc-networks--id-create 'GNU.chat)))
(should (string= (funcall search :user "#chan") "foo"))))
(ert-info ("Network wins")
(let* ((erc-session-server "irc.gnu.org")
(erc-server-announced-name "my.gnu.org")
(erc-session-port 6697)
(erc-network 'GNU.chat)
(erc-server-current-nick "tester")
(erc-networks--id (erc-networks--id-create nil)))
(should (string= (funcall search :user "#chan") "foo"))))
(ert-info ("Announced wins")
(let ((erc-session-server "irc.gnu.org")
(erc-server-announced-name "my.gnu.org")
(erc-session-port 6697)
erc-network
(erc-networks--id (erc-networks--id-create nil)))
(should (string= (funcall search :user "#chan") "baz")))))
(defun erc-services-tests--auth-source-announced (search)
(let* ((erc--isupport-params (make-hash-table))
(erc-server-parameters '(("CHANTYPES" . "&#")))
(erc--target (erc--target-from-string "&chan")))
(ert-info ("Announced prioritized")
(ert-info ("Announced wins")
(let* ((erc-session-server "irc.gnu.org")
(erc-server-announced-name "my.gnu.org")
(erc-session-port 6697)
(erc-network 'GNU.chat)
(erc-server-current-nick "tester")
(erc-networks--id (erc-networks--id-create nil)))
(should (string= (funcall search :user "#chan") "baz"))))
(ert-info ("Peer next")
(let* ((erc-server-announced-name "irc.gnu.org")
(erc-session-port 6697)
(erc-network 'GNU.chat)
(erc-server-current-nick "tester")
(erc-networks--id (erc-networks--id-create nil)))
(should (string= (funcall search :user "#chan") "bar"))))
(ert-info ("Network used as fallback")
(let* ((erc-session-port 6697)
(erc-network 'GNU.chat)
(erc-server-current-nick "tester")
(erc-networks--id (erc-networks--id-create nil)))
(should (string= (funcall search :user "#chan") "foo")))))))
(defun erc-services-tests--auth-source-overrides (search)
(let* ((erc-session-server "irc.gnu.org")
(erc-server-announced-name "my.gnu.org")
(erc-network 'GNU.chat)
(erc-server-current-nick "tester")
(erc-networks--id (erc-networks--id-create nil))
(erc-session-port 6667))
(ert-info ("Specificity and overrides")
(ert-info ("More specific port")
(let ((erc-session-port 6697))
(should (string= (funcall search :user "#chan") "spam"))))
(ert-info ("More specific user (network loses)")
(should (string= (funcall search :user '("#fsf")) "42")))
(ert-info ("Actual override")
(should (string= (funcall search :port "6667") "sesame")))
(ert-info ("Overrides don't interfere with post-processing")
(should (string= (funcall search :host "MyHost") "123"))))))
;; auth-source netrc backend
(defvar erc-services-tests--auth-source-entries
'("machine irc.gnu.org port irc user \"#chan\" password bar"
"machine my.gnu.org port irc user \"#chan\" password baz"
"machine GNU.chat port irc user \"#chan\" password foo"))
;; FIXME explain what this is for
(defun erc-services-tests--auth-source-shuffle (&rest extra)
(string-join `(,@(sort (append erc-services-tests--auth-source-entries extra)
(lambda (&rest _) (zerop (random 2))))
"")
"\n"))
(ert-deftest erc--auth-source-search--netrc-standard ()
(ert-with-temp-file netrc-file
:prefix "erc--auth-source-search--standard"
:text (erc-services-tests--auth-source-shuffle)
(let ((auth-sources (list netrc-file))
(auth-source-do-cache nil))
(erc-services-tests--auth-source-standard #'erc-auth-source-search))))
(ert-deftest erc--auth-source-search--netrc-announced ()
(ert-with-temp-file netrc-file
:prefix "erc--auth-source-search--announced"
:text (erc-services-tests--auth-source-shuffle)
(let ((auth-sources (list netrc-file))
(auth-source-do-cache nil))
(erc-services-tests--auth-source-announced #'erc-auth-source-search))))
(ert-deftest erc--auth-source-search--netrc-overrides ()
(ert-with-temp-file netrc-file
:prefix "erc--auth-source-search--overrides"
:text (erc-services-tests--auth-source-shuffle
"machine GNU.chat port 6697 user \"#chan\" password spam"
"machine my.gnu.org port irc user \"#fsf\" password 42"
"machine irc.gnu.org port 6667 password sesame"
"machine MyHost port irc password 456"
"machine MyHost port 6667 password 123")
(let ((auth-sources (list netrc-file))
(auth-source-do-cache nil))
(erc-services-tests--auth-source-overrides #'erc-auth-source-search))))
;; auth-source plstore backend
(defun erc-services-test--call-with-plstore (&rest args)
(advice-add 'epg-decrypt-string :override
(lambda (&rest r) (prin1-to-string (cadr r)))
'((name . erc--auth-source-plstore)))
(advice-add 'epg-find-configuration :override
(lambda (&rest _) "" '((program . "/bin/true")))
'((name . erc--auth-source-plstore)))
(unwind-protect
(apply #'erc-auth-source-search args)
(advice-remove 'epg-decrypt-string 'erc--auth-source-plstore)
(advice-remove 'epg-find-configuration 'erc--auth-source-plstore)))
(defvar erc-services-tests--auth-source-plstore-standard-entries
'(("ba950d38118a76d71f9f0591bb373d6cb366a512"
:secret-secret t
:host "irc.gnu.org"
:user "#chan"
:port "irc")
("7f17ca445d11158065e911a6d0f4cbf52ca250e3"
:secret-secret t
:host "my.gnu.org"
:user "#chan"
:port "irc")
("fcd3c8bd6daf4509de0ad6ee98e744ce0fca9377"
:secret-secret t
:host "GNU.chat"
:user "#chan"
:port "irc")))
(defvar erc-services-tests--auth-source-plstore-standard-secrets
'(("ba950d38118a76d71f9f0591bb373d6cb366a512" :secret "bar")
("7f17ca445d11158065e911a6d0f4cbf52ca250e3" :secret "baz")
("fcd3c8bd6daf4509de0ad6ee98e744ce0fca9377" :secret "foo")))
(ert-deftest erc--auth-source-search--plstore-standard ()
(ert-with-temp-file plstore-file
:suffix ".plist"
:text (concat ";;; public entries -*- mode: plstore -*- \n"
(prin1-to-string
erc-services-tests--auth-source-plstore-standard-entries)
"\n;;; secret entries\n"
(prin1-to-string
erc-services-tests--auth-source-plstore-standard-secrets)
"\n")
(let ((auth-sources (list plstore-file))
(auth-source-do-cache nil))
(erc-services-tests--auth-source-standard
#'erc-services-test--call-with-plstore))))
(ert-deftest erc--auth-source-search--plstore-announced ()
(ert-with-temp-file plstore-file
:suffix ".plist"
:text (concat ";;; public entries -*- mode: plstore -*- \n"
(prin1-to-string
erc-services-tests--auth-source-plstore-standard-entries)
"\n;;; secret entries\n"
(prin1-to-string
erc-services-tests--auth-source-plstore-standard-secrets)
"\n")
(let ((auth-sources (list plstore-file))
(auth-source-do-cache nil))
(erc-services-tests--auth-source-announced
#'erc-services-test--call-with-plstore))))
(ert-deftest erc--auth-source-search--plstore-overrides ()
(ert-with-temp-file plstore-file
:suffix ".plist"
:text (concat
";;; public entries -*- mode: plstore -*- \n"
(prin1-to-string
`(,@erc-services-tests--auth-source-plstore-standard-entries
("1b3fab249a8dff77a4d8fe7eb4b0171b25cc711a"
:secret-secret t :host "GNU.chat" :user "#chan" :port "6697")
("6cbcdc39476b8cfcca6f3e9a7876f41ec3f708cc"
:secret-secret t :host "my.gnu.org" :user "#fsf" :port "irc")
("a33e2b3bd2d6f33995a4b88710a594a100c5e41d"
:secret-secret t :host "irc.gnu.org" :port "6667")
("ab2fd349b2b7d6a9215bb35a92d054261b0b1537"
:secret-secret t :host "MyHost" :port "irc")
("61a6bd552059494f479ff720e8de33e22574650a"
:secret-secret t :host "MyHost" :port "6667")))
"\n;;; secret entries\n"
(prin1-to-string
`(,@erc-services-tests--auth-source-plstore-standard-secrets
("1b3fab249a8dff77a4d8fe7eb4b0171b25cc711a" :secret "spam")
("6cbcdc39476b8cfcca6f3e9a7876f41ec3f708cc" :secret "42")
("a33e2b3bd2d6f33995a4b88710a594a100c5e41d" :secret "sesame")
("ab2fd349b2b7d6a9215bb35a92d054261b0b1537" :secret "456")
("61a6bd552059494f479ff720e8de33e22574650a" :secret "123")))
"\n")
(let ((auth-sources (list plstore-file))
(auth-source-do-cache nil))
(erc-services-tests--auth-source-overrides
#'erc-services-test--call-with-plstore))))
;; auth-source JSON backend
(defvar erc-services-tests--auth-source-json-standard-entries
[(:host "irc.gnu.org" :port "irc" :user "#chan" :secret "bar")
(:host "my.gnu.org" :port "irc" :user "#chan" :secret "baz")
(:host "GNU.chat" :port "irc" :user "#chan" :secret "foo")])
(ert-deftest erc--auth-source-search--json-standard ()
(ert-with-temp-file json-store
:suffix ".json"
:text (let ((json-object-type 'plist))
(json-encode
erc-services-tests--auth-source-json-standard-entries))
(let ((auth-sources (list json-store))
(auth-source-do-cache nil))
(erc-services-tests--auth-source-standard #'erc-auth-source-search))))
(ert-deftest erc--auth-source-search--json-announced ()
(ert-with-temp-file plstore-file
:suffix ".json"
:text (let ((json-object-type 'plist))
(json-encode
erc-services-tests--auth-source-json-standard-entries))
(let ((auth-sources (list plstore-file))
(auth-source-do-cache nil))
(erc-services-tests--auth-source-announced #'erc-auth-source-search))))
(ert-deftest erc--auth-source-search--json-overrides ()
(ert-with-temp-file json-file
:suffix ".json"
:text (let ((json-object-type 'plist))
(json-encode
(vconcat
erc-services-tests--auth-source-json-standard-entries
[(:secret "spam" :host "GNU.chat" :user "#chan" :port "6697")
(:secret "42" :host "my.gnu.org" :user "#fsf" :port "irc")
(:secret "sesame" :host "irc.gnu.org" :port "6667")
(:secret "456" :host "MyHost" :port "irc")
(:secret "123" :host "MyHost" :port "6667")])))
(let ((auth-sources (list json-file))
(auth-source-do-cache nil))
(erc-services-tests--auth-source-overrides #'erc-auth-source-search))))
;; auth-source-secrets backend
(defvar erc-services-tests--auth-source-secrets-standard-entries
'(("#chan@irc.gnu.org:irc" ; label
(:host . "irc.gnu.org")
(:user . "#chan")
(:port . "irc")
(:xdg:schema . "org.freedesktop.Secret.Generic"))
("#chan@my.gnu.org:irc"
(:host . "my.gnu.org")
(:user . "#chan")
(:port . "irc")
(:xdg:schema . "org.freedesktop.Secret.Generic"))
("#chan@GNU.chat:irc"
(:host . "GNU.chat")
(:user . "#chan")
(:port . "irc")
(:xdg:schema . "org.freedesktop.Secret.Generic"))))
(defvar erc-services-tests--auth-source-secrets-standard-secrets
'(("#chan@irc.gnu.org:irc" . "bar")
("#chan@my.gnu.org:irc" . "baz")
("#chan@GNU.chat:irc" . "foo")))
(ert-deftest erc--auth-source-search--secrets-standard ()
(skip-unless (bound-and-true-p secrets-enabled))
(let ((auth-sources '("secrets:Test"))
(auth-source-do-cache nil)
(entries erc-services-tests--auth-source-secrets-standard-entries)
(secrets erc-services-tests--auth-source-secrets-standard-secrets))
(cl-letf (((symbol-function 'secrets-search-items)
(lambda (col &rest r)
(should (equal col "Test"))
(should (plist-get r :user))
(map-keys entries)))
((symbol-function 'secrets-get-secret)
(lambda (col label)
(should (equal col "Test"))
(assoc-default label secrets)))
((symbol-function 'secrets-get-attributes)
(lambda (col label)
(should (equal col "Test"))
(assoc-default label entries))))
(erc-services-tests--auth-source-standard #'erc-auth-source-search))))
(ert-deftest erc--auth-source-search--secrets-announced ()
(skip-unless (bound-and-true-p secrets-enabled))
(let ((auth-sources '("secrets:Test"))
(auth-source-do-cache nil)
(entries erc-services-tests--auth-source-secrets-standard-entries)
(secrets erc-services-tests--auth-source-secrets-standard-secrets))
(cl-letf (((symbol-function 'secrets-search-items)
(lambda (col &rest r)
(should (equal col "Test"))
(should (plist-get r :user))
(map-keys entries)))
((symbol-function 'secrets-get-secret)
(lambda (col label)
(should (equal col "Test"))
(assoc-default label secrets)))
((symbol-function 'secrets-get-attributes)
(lambda (col label)
(should (equal col "Test"))
(assoc-default label entries))))
(erc-services-tests--auth-source-announced #'erc-auth-source-search))))
(ert-deftest erc--auth-source-search--secrets-overrides ()
(skip-unless (bound-and-true-p secrets-enabled))
(let ((auth-sources '("secrets:Test"))
(auth-source-do-cache nil)
(entries `(,@erc-services-tests--auth-source-secrets-standard-entries
("#chan@GNU.chat:6697"
(:host . "GNU.chat") (:user . "#chan") (:port . "6697")
(:xdg:schema . "org.freedesktop.Secret.Generic"))
("#fsf@my.gnu.org:irc"
(:host . "my.gnu.org") (:user . "#fsf") (:port . "irc")
(:xdg:schema . "org.freedesktop.Secret.Generic"))
("irc.gnu.org:6667"
(:host . "irc.gnu.org") (:port . "6667")
(:xdg:schema . "org.freedesktop.Secret.Generic"))
("MyHost:irc"
(:host . "MyHost") (:port . "irc")
(:xdg:schema . "org.freedesktop.Secret.Generic"))
("MyHost:6667"
(:host . "MyHost") (:port . "6667")
(:xdg:schema . "org.freedesktop.Secret.Generic"))))
(secrets `(,@erc-services-tests--auth-source-secrets-standard-secrets
("#chan@GNU.chat:6697" . "spam")
("#fsf@my.gnu.org:irc" . "42" )
("irc.gnu.org:6667" . "sesame")
("MyHost:irc" . "456")
("MyHost:6667" . "123"))))
(cl-letf (((symbol-function 'secrets-search-items)
(lambda (col &rest _)
(should (equal col "Test"))
(map-keys entries)))
((symbol-function 'secrets-get-secret)
(lambda (col label)
(should (equal col "Test"))
(assoc-default label secrets)))
((symbol-function 'secrets-get-attributes)
(lambda (col label)
(should (equal col "Test"))
(assoc-default label entries))))
(erc-services-tests--auth-source-overrides #'erc-auth-source-search))))
;; auth-source-pass backend
(require 'auth-source-pass)
;; `auth-source-pass--find-match-unambiguous' returns something like:
;;
;; (list :host "irc.gnu.org"
;; :port "6697"
;; :user "rms"
;; :secret
;; #[0 "\301\302\300\"\207"
;; [((secret . "freedom")) auth-source-pass--get-attr secret] 3])
;;
;; This function gives ^ (faked here to avoid gpg and file IO). See
;; `auth-source-pass--with-store' in ../auth-source-pass-tests.el
(defun erc-services-tests--asp-parse-entry (store entry)
(when-let ((found (cl-find entry store :key #'car :test #'string=)))
(list (assoc 'secret (cdr found)))))
(defvar erc-join-tests--auth-source-pass-entries
'(("irc.gnu.org:irc/#chan"
("port" . "irc") ("user" . "#chan") (secret . "bar"))
("my.gnu.org:irc/#chan"
("port" . "irc") ("user" . "#chan") (secret . "baz"))
("GNU.chat:irc/#chan"
("port" . "irc") ("user" . "#chan") (secret . "foo"))))
(ert-deftest erc--auth-source-search--pass-standard ()
(ert-skip "Pass backend not yet supported")
(let ((store erc-join-tests--auth-source-pass-entries)
(auth-sources '(password-store))
(auth-source-do-cache nil))
(cl-letf (((symbol-function 'auth-source-pass-parse-entry)
(apply-partially #'erc-services-tests--asp-parse-entry store))
((symbol-function 'auth-source-pass-entries)
(lambda () (mapcar #'car store))))
(erc-services-tests--auth-source-standard #'erc-auth-source-search))))
(ert-deftest erc--auth-source-search--pass-announced ()
(ert-skip "Pass backend not yet supported")
(let ((store erc-join-tests--auth-source-pass-entries)
(auth-sources '(password-store))
(auth-source-do-cache nil))
(cl-letf (((symbol-function 'auth-source-pass-parse-entry)
(apply-partially #'erc-services-tests--asp-parse-entry store))
((symbol-function 'auth-source-pass-entries)
(lambda () (mapcar #'car store))))
(erc-services-tests--auth-source-announced #'erc-auth-source-search))))
(ert-deftest erc--auth-source-search--pass-overrides ()
(ert-skip "Pass backend not yet supported")
(let ((store
`(,@erc-join-tests--auth-source-pass-entries
("GNU.chat:6697/#chan"
("port" . "6697") ("user" . "#chan") (secret . "spam"))
("my.gnu.org:irc/#fsf"
("port" . "irc") ("user" . "#fsf") (secret . "42"))
("irc.gnu.org:6667"
("port" . "6667") (secret . "sesame"))
("MyHost:irc"
("port" . "irc") (secret . "456"))
("MyHost:6667"
("port" . "6667") (secret . "123"))))
(auth-sources '(password-store))
(auth-source-do-cache nil))
(cl-letf (((symbol-function 'auth-source-pass-parse-entry)
(apply-partially #'erc-services-tests--asp-parse-entry store))
((symbol-function 'auth-source-pass-entries)
(lambda () (mapcar #'car store))))
(erc-services-tests--auth-source-overrides #'erc-auth-source-search))))
;;;; The services module
(ert-deftest erc-nickserv-get-password ()
(should erc-prompt-for-nickserv-password)
(ert-with-temp-file netrc-file
:prefix "erc-nickserv-get-password"
:text (mapconcat 'identity
'("machine GNU/chat port 6697 user bob password spam"
"machine FSF.chat port 6697 user bob password sesame"
"machine MyHost port irc password 123")
"\n")
(let* ((auth-sources (list netrc-file))
(auth-source-do-cache nil)
(erc-nickserv-passwords '((FSF.chat (("alice" . "foo")
("joe" . "bar")))))
(erc-use-auth-source-for-nickserv-password t)
(erc-session-server "irc.gnu.org")
(erc-server-announced-name "my.gnu.org")
(erc-network 'FSF.chat)
(erc-server-current-nick "tester")
(erc-networks--id (erc-networks--id-create nil))
(erc-session-port 6697))
(ert-info ("Lookup custom option")
(should (string= (erc-nickserv-get-password "alice") "foo")))
(ert-info ("Auth source")
(ert-info ("Network")
(should (string= (erc-nickserv-get-password "bob") "sesame")))
(ert-info ("Network ID")
(let ((erc-networks--id (erc-networks--id-create 'GNU/chat)))
(should (string= (erc-nickserv-get-password "bob") "spam")))))
(ert-info ("Read input")
(should (string=
(ert-simulate-keys "baz\r" (erc-nickserv-get-password "mike"))
"baz")))
(ert-info ("Failed")
(should-not (ert-simulate-keys "\r"
(erc-nickserv-get-password "fake")))))))
;;; erc-services-tests.el ends here