95 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Factor
		
	
	
USING: http.server http.server.dispatchers http.server.responses
 | 
						|
tools.test kernel namespaces accessors io http math sequences
 | 
						|
assocs arrays classes words urls ;
 | 
						|
IN: http.server.dispatchers.tests
 | 
						|
 | 
						|
TUPLE: mock-responder path ;
 | 
						|
 | 
						|
C: <mock-responder> mock-responder
 | 
						|
 | 
						|
M: mock-responder call-responder*
 | 
						|
    nip
 | 
						|
    path>> on
 | 
						|
    [ ] "text/plain" <content> ;
 | 
						|
 | 
						|
: check-dispatch ( tag path -- ? )
 | 
						|
    V{ } clone responder-nesting set
 | 
						|
    over off
 | 
						|
    split-path
 | 
						|
    main-responder get call-responder
 | 
						|
    write-response get ;
 | 
						|
 | 
						|
[
 | 
						|
    <dispatcher>
 | 
						|
        "foo" <mock-responder> "foo" add-responder
 | 
						|
        "bar" <mock-responder> "bar" add-responder
 | 
						|
        <dispatcher>
 | 
						|
            "123" <mock-responder> "123" add-responder
 | 
						|
            "default" <mock-responder> >>default
 | 
						|
        "baz" add-responder
 | 
						|
    main-responder set
 | 
						|
 | 
						|
    [ "foo" ] [
 | 
						|
        { "foo" } main-responder get find-responder path>> nip
 | 
						|
    ] unit-test
 | 
						|
 | 
						|
    [ "bar" ] [
 | 
						|
        { "bar" } main-responder get find-responder path>> nip
 | 
						|
    ] unit-test
 | 
						|
 | 
						|
    [ t ] [ "foo" "foo" check-dispatch ] unit-test
 | 
						|
    [ f ] [ "foo" "bar" check-dispatch ] unit-test
 | 
						|
    [ t ] [ "bar" "bar" check-dispatch ] unit-test
 | 
						|
    [ t ] [ "default" "baz/xxx" check-dispatch ] unit-test
 | 
						|
    [ t ] [ "default" "baz/xxx//" check-dispatch ] unit-test
 | 
						|
    [ t ] [ "default" "/baz/xxx//" check-dispatch ] unit-test
 | 
						|
    [ t ] [ "123" "baz/123" check-dispatch ] unit-test
 | 
						|
    [ t ] [ "123" "baz///123" check-dispatch ] unit-test
 | 
						|
 | 
						|
] with-scope
 | 
						|
 | 
						|
[
 | 
						|
    <dispatcher>
 | 
						|
        "default" <mock-responder> >>default
 | 
						|
    main-responder set
 | 
						|
 | 
						|
    [ "/default" ] [ "/default" main-responder get find-responder drop ] unit-test
 | 
						|
] with-scope
 | 
						|
 | 
						|
! Make sure path for default responder isn't chopped
 | 
						|
TUPLE: path-check-responder ;
 | 
						|
 | 
						|
C: <path-check-responder> path-check-responder
 | 
						|
 | 
						|
M: path-check-responder call-responder*
 | 
						|
    drop
 | 
						|
    >array "text/plain" <content> ;
 | 
						|
 | 
						|
[ { "c" } ] [
 | 
						|
    V{ } clone responder-nesting set
 | 
						|
 | 
						|
    { "b" "c" }
 | 
						|
    <dispatcher>
 | 
						|
        <dispatcher>
 | 
						|
            <path-check-responder> >>default
 | 
						|
        "b" add-responder
 | 
						|
    call-responder
 | 
						|
    body>>
 | 
						|
] unit-test
 | 
						|
 | 
						|
! Test that "" dispatcher works with default>>
 | 
						|
[ ] [
 | 
						|
    <dispatcher>
 | 
						|
        "" <mock-responder> "" add-responder
 | 
						|
        "bar" <mock-responder> "bar" add-responder
 | 
						|
        "baz" <mock-responder> >>default
 | 
						|
    main-responder set
 | 
						|
 | 
						|
    [ t ] [ "" "" check-dispatch ] unit-test
 | 
						|
    [ f ] [ "" "quux" check-dispatch ] unit-test
 | 
						|
    [ t ] [ "baz" "quux" check-dispatch ] unit-test
 | 
						|
    [ f ] [ "foo" "bar" check-dispatch ] unit-test
 | 
						|
    [ t ] [ "bar" "bar" check-dispatch ] unit-test
 | 
						|
    [ t ] [ "baz" "xxx" check-dispatch ] unit-test
 | 
						|
] unit-test
 |