add tests for register-temp-stanza-handler-for-id
[software/gnubba.git] / spec / xmpp.scm
index 8a945d1df3318fec3fe352f895cd7d36fc96db62..9282e033a39f4fed924d2ec52988c7d93adb9f1c 100644 (file)
         (setup 'presence2 (presence "body" #:id "1234"))
         (setup 'presence3 (presence "body" #:id "1234" #:from "romeo@capulet.it"))))
 
+(suite "register-temp-stanza-handler-for-id"
+       (tests
+        (test "handler is not executed if stanza with non-matching id is received" e
+              (assert-false (error?
+                             (begin
+                               (register-temp-stanza-handler-for-id
+                                "1234a"
+                                (lambda _ (throw 'error)))
+                               ((@@ (gnubba xmpp) handle-stanza) (e 'stanza))))))
+        (test "handler remains if stanza with non-matching id is received" e
+              (assert-equal 1
+                            (begin
+                              (register-temp-stanza-handler-for-id
+                               "1234b"
+                               (lambda _ (throw 'error)))
+                              ((@@ (gnubba xmpp) handle-stanza) (e 'stanza))
+                              (hash-count (const #t)
+                                          (@@ (gnubba xmpp) *stanza-id-handlers*)))))
+        (test "handler is removed after execution" e
+              (assert-equal 0
+                            (begin
+                              (register-temp-stanza-handler-for-id
+                               "999"
+                               (lambda _ 'handler))
+                              ((@@ (gnubba xmpp) handle-stanza) (e 'stanza))
+                              (hash-count (const #t)
+                                          (@@ (gnubba xmpp) *stanza-id-handlers*))))))
+       (options)
+       (setups
+        (setup 'stanza (iq "payload" #:to "romeo@capulet.it" #:id "999")))
+       (teardowns
+        ;; always reset the internal state after each test
+        (teardown e (set! (@@ (gnubba xmpp) *stanza-id-handlers*)
+                          (make-hash-table)))))
 
 (suite "register-stanza-handler"
        (tests
         ;; always reset the internal state after each test
         (teardown e (set! (@@ (gnubba xmpp) *stanza-handlers*) '()))))
 
-
 (suite "try-stanza-handlers"
        (tests
         (test "a handler registered without a guard or #t is executed for any stanza" e
 
 ;; TODO
 (suite "next-stanza-id!" (tests))
-(suite "handle-stanza" (tests))
-(suite "register-temp-stanza-handler-for-id" (tests))
-(suite "register-stanza-handler" (tests))
+(suite "handle-stanza"
+       (tests
+        (test "calls id handler first, then generic handler" e
+              (assert-equal
+               '(generic-handler id-handler)
+               (let ((results '()))
+                 (register-stanza-handler
+                  (lambda _ (set! results (cons 'generic-handler results))))
+                 (register-temp-stanza-handler-for-id
+                  (stanza-id (e 'stanza))
+                  (lambda _ (set! results (cons 'id-handler results))))
+                 ((@@ (gnubba xmpp) handle-stanza) (e 'stanza))
+                 results)))
+        (test "catches 'halt" e
+              (assert-false
+               (error?
+                (begin
+                  (register-stanza-handler
+                   (lambda _ (throw 'never-executed)))
+                  (register-temp-stanza-handler-for-id
+                   (stanza-id (e 'stanza))
+                   (lambda _ (throw 'halt)))
+                  ((@@ (gnubba xmpp) handle-stanza) (e 'stanza)))))))
+       (options)
+       (setups
+        (setup 'stanza (iq "payload" #:to "romeo@capulet.it" #:id "1234")))
+       (teardowns
+        ;; always reset the internal state after each test
+        (teardown e (set! (@@ (gnubba xmpp) *stanza-handlers*) '()))))
 
 (suite "run-handler-loop"
        (tests