json-rpc / tests / run.scm

(require-extension test)
(use json-rpc-client)

; Setup global string ports and server for testing
(define input (open-input-string "some-string"))
(define output (open-output-string))
(define xbmc (json-rpc-server input output "2.0"))

; Setup own test procedure with locally scoped output ports
(define (test-server description expected method . params)
  (let ((output (open-output-string)))
    (apply (json-rpc-server input output "2.0") method #f params)
     (get-output-string output))))

(test-group "JSON-RPC string output checks"
	    (test-server "Call with only a method" "{\"jsonrpc\":\"2.0\",\"method\":\"Player.PlayPause\",\"id\":\"1\"}" "Player.PlayPause")
	    (test-server "Call with a method and a one dimensional params" "{\"jsonrpc\":\"2.0\",\"method\":\"Player.PlayPause\",\"params\":{\"playerid\":0},\"id\":\"1\"}" "Player.PlayPause" playerid: 0))
; Do some actual error testing
(test-group "Non-port or non-version calls"
	    (test-error "Non port call on input" (json-rpc-server "input" output "2.0"))
	    (test-error "Non port call on output" (json-rpc-server input "output" "2.0"))
	    (test-error "Non correct version number call" (json-rpc-server input output "3.0")))

(test-group "Non-string method calls"
	    (test-error "Call method as symbol" (xbmc #f 'foo))
	    (test-error "Call method as number" (xbmc #f 1))
	    (test-error "Call method as list" (xbmc #f '(1 2)))
	    (test-error "Call method as vector" (xbmc #f '#()))
	    (test-error "Call method as boolean" (xbmc #f #f)))

(test-group "Non-keyword param calls"
	    (test-error "Call params as a list" (xbmc #f "foo" '(a b c)))
	    (test-error "Call params as a string" (xbmc #f "foo" "bar"))
	    (test-error "Call params as a number" (xbmc #f "foo" 1)))