The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# This does not need to be indexed by PAUSE
package
    RPC::ExtDirect::Test::Data::Router;

use strict;
use warnings;

# This aref contains definitions/data for Router tests
my $tests = [{
    name => 'Invalid raw POST',
    
    config => {
        api_path => '/api',
        router_path => '/router',
        poll_path => '/events',
        debug => 1,
    },
    
    input => {
        method => 'POST',
        url => '/router',
        cgi_url => '/router1',
    
        content => {
            type => 'raw_post',
            arg => [
                'http://localhost/router',
                '{"something":"invalid":"here"}',
            ],
        },
    },
    
    output => {
        status => 200,
        content_type => qr|^application/json\b|,
        content_length => 249,
        comparator => 'cmp_json',
        content => 
            q|{"action":null,"message":"ExtDirect error decoding POST data: |.
            q|            ', or } expected while parsing object/hash,|.
            q|             at character offset 22 (before \":\"here\"}\")'",|.
            q| "method":null, "tid": null, "type":"exception",|.
            q| "where":"RPC::ExtDirect::Serializer->decode_post"}|,
    },
}, {
    name => 'Valid raw POST, single request',
    
    config => {
        api_path => '/api',
        router_path => '/router',
        poll_path => '/events',
        debug => 1,
    },
    
    input => {
        method => 'POST',
        url => '/router',
        cgi_url  => '/router1',
    
        content => {
            type => 'raw_post',
            arg  => [
                'http://localhost/router',
                q|{"type":"rpc","tid":1,"action":"Foo",|.
                q| "method":"foo_foo","data":["bar"]}|,
            ],
        },
    },
    
    output => {
        status => 200,
        content_type => qr|^application/json\b|,
        content_length => 78,
        comparator => 'cmp_json',
        content => 
            q|{"action":"Foo","method":"foo_foo",|.
            q|"result":"foo! 'bar'","tid":1,"type":"rpc"}|,
    },
}, {
    name => 'Valid raw POST, multiple requests',
    
    config => {
        api_path => '/api',
        router_path => '/router',
        poll_path => '/events',
        debug => 1,
    },
    
    input => {
        method => 'POST',
        url => '/router',
        cgi_url  => '/router1',
    
        content => {
            type => 'raw_post',
            arg  => [
                'http://localhost/router',
                q|[{"tid":1,"action":"Qux","method":"foo_foo",|.
                q|  "data":["foo"],"type":"rpc"},|.
                q| {"tid":2,"action":"Qux","method":"foo_bar",|.
                q|  "data":["bar1","bar2"],"type":"rpc"},|.
                q| {"tid":3,"action":"Qux","method":"foo_baz",|.
                q|  "data":{"foo":"baz1","bar":"baz2",|.
                q|  "baz":"baz3"},"type":"rpc"}]|,
            ],
        },
    },
    
    output => {
        status => 200,
        content_type => qr|^application/json\b|,
        content_length => 304,
        comparator => 'cmp_str',
        content => 
            q|[{"action":"Qux","method":"foo_foo",|.
            q|"result":"foo! 'foo'","tid":1,"type":"rpc"},|.
            q|{"action":"Qux","method":"foo_bar",|.
            q|"result":["foo! bar!","bar1","bar2"],"tid":2,"type":"rpc"},|.
            q|{"action":"Qux","method":"foo_baz",|.
            q|"result":{"bar":"baz2","baz":"baz3","foo":"baz1",|.
            q|"msg":"foo! bar! baz!"},"tid":3,"type":"rpc"}]|,
    },
}, {
    name => 'Valid POST with invalid metadata 1',
    
    config => {
        api_path => '/api',
        router_path => '/router',
        poll_path => '/events',
        debug => 1,
    },
    
    input => {
        method => 'POST',
        url => '/router',
        cgi_url => '/router4',
        
        content => {
            type => 'raw_post',
            arg => [
                'http://localhost/router',
                q|{"type":"rpc","tid":1,"action":"Meta",|.
                q|"method":"arg0","data":null,|.
                q|"metadata":[42]}|,
            ],
        },
    },
    
    output => {
        status => 200,
        content_type => qr|^application/json\b|,
        content_length => 213,
        comparator => 'cmp_str',
        content =>
            q|{"action":"Meta",|.
            q|"message":"ExtDirectMethodMeta.arg0requires|.
            q|2metadatavalue(s)butonly1areprovided",|.
            q|"method":"arg0","tid":1,"type":"exception",|.
            q|"where":"RPC::ExtDirect::API::Method->check_method_metadata"}|,
    },
}, {
    name => 'Valid POST with metadata 1',
    
    config => {
        api_path => '/api',
        router_path => '/router',
        poll_path => '/events',
        debug => 1,
    },
    
    input => {
        method => 'POST',
        url => '/router',
        cgi_url => '/router4',
        
        content => {
            type => 'raw_post',
            arg => [
                'http://localhost/router',
                q|{"type":"rpc","tid":1,"action":"Meta",|.
                q|"method":"arg0","data":null,|.
                q|"metadata":[42,"foo"]}|,
            ],
        },
    },
    
    output => {
        status => 200,
        content_type => qr|^application/json\b|,
        content_length => 83,
        comparator => 'cmp_str',
        content =>
            q|{"action":"Meta","method":"arg0",|.
            q|"result":{"meta":[42,"foo"]},"tid":1,|.
            q|"type":"rpc"}|,
    },
}, {
    name => 'Valid POST with metadata 2',
    
    config => {
        api_path => '/api',
        router_path => '/router',
        poll_path => '/events',
        debug => 1,
    },
    
    input => {
        method => 'POST',
        url => '/router',
        cgi_url => '/router4',
        
        content => {
            type => 'raw_post',
            arg => [
                'http://localhost/router',
                q|{"type":"rpc","tid":1,"action":"Meta",|.
                q|"method":"arg1_last","data":["foo"],|.
                q|"metadata":[42]}|,
            ],
        },
    },
    
    output => {
        status => 200,
        content_type => qr|^application/json\b|,
        content_length => 95,
        comparator => 'cmp_str',
        content =>
            q|{"action":"Meta","method":"arg1_last",|.
            q|"result":{"arg1":"foo","meta":[42]},|.
            q|"tid":1,"type":"rpc"}|,
    },
}, {
    name => 'Valid POST with metadata 3',
    
    config => {
        api_path => '/api',
        router_path => '/router',
        poll_path => '/events',
        debug => 1,
    },
    
    input => {
        method => 'POST',
        url => '/router',
        cgi_url => '/router4',
        
        content => {
            type => 'raw_post',
            arg => [
                'http://localhost/router',
                q|{"type":"rpc","tid":1,"action":"Meta",|.
                q|"method":"arg1_first","data":["foo"],|.
                q|"metadata":[42,43]}|,
            ],
        },
    },
    
    output => {
        status => 200,
        content_type => qr|^application/json\b|,
        content_length => 99,
        comparator => 'cmp_str',
        content =>
            q|{"action":"Meta","method":"arg1_first",|.
            q|"result":{"arg1":"foo","meta":[42,43]},|.
            q|"tid":1,"type":"rpc"}|,
    },
}, {
    name => 'Valid POST with metadata 4',
    
    config => {
        api_path => '/api',
        router_path => '/router',
        poll_path => '/events',
        debug => 1,
    },
    
    input => {
        method => 'POST',
        url => '/router',
        cgi_url => '/router4',
        
        content => {
            type => 'raw_post',
            arg => [
                'http://localhost/router',
                q|{"type":"rpc","tid":1,"action":"Meta",|.
                q|"method":"arg2_last","data":[42,43],|.
                q|"metadata":["foo","bar"]}|,
            ],
        },
    },
    
    output => {
        status => 200,
        content_type => qr|^application/json\b|,
        content_length => 105,
        comparator => 'cmp_str',
        content =>
            q|{"action":"Meta","method":"arg2_last",|.
            q|"result":{"arg1":42,"arg2":43,"meta":["foo"]},|.
            q|"tid":1,"type":"rpc"}|,
    },
}, {
    name => 'Valid POST with metadata 5',
    
    config => {
        api_path => '/api',
        router_path => '/router',
        poll_path => '/events',
        debug => 1,
    },
    
    input => {
        method => 'POST',
        url => '/router',
        cgi_url => '/router4',
        
        content => {
            type => 'raw_post',
            arg => [
                'http://localhost/router',
                q|{"type":"rpc","tid":1,"action":"Meta",|.
                q|"method":"arg2_middle","data":[44,45],|.
                q|"metadata":["fred","bonzo","qux"]}|,
            ],
        },
    },
    
    output => {
        status => 200,
        content_type => qr|^application/json\b|,
        content_length => 116,
        comparator => 'cmp_str',
        content =>
            q|{"action":"Meta","method":"arg2_middle",|.
            q|"result":{"arg1":44,"arg2":45,"meta":|.
            q|["fred","bonzo"]},"tid":1,"type":"rpc"}|,
    },
}, {
    name => 'Valid POST with metadata 6',
    
    config => {
        api_path => '/api',
        router_path => '/router',
        poll_path => '/events',
        debug => 1,
    },
    
    input => {
        method => 'POST',
        url => '/router',
        cgi_url => '/router4',
        
        content => {
            type => 'raw_post',
            arg => [
                'http://localhost/router',
                q|{"type":"rpc","tid":1,"action":"Meta",|.
                q|"method":"named_default",|.
                q|"data":{"foo":"bar","fred":"bonzo"},|.
                q|"metadata":[42]}|,
            ],
        },
    },
    
    output => {
        status => 200,
        content_type => qr|^application/json\b|,
        content_length => 113,
        comparator => 'cmp_str',
        content =>
            q|{"action":"Meta","method":"named_default",|.
            q|"result":{"foo":"bar","fred":"bonzo",|.
            q|"meta":[42]},"tid":1,"type":"rpc"}|,
    },
}, {
    name => 'Valid POST with metadata 7',
    
    config => {
        api_path => '/api',
        router_path => '/router',
        poll_path => '/events',
        debug => 1,
    },
    
    input => {
        method => 'POST',
        url => '/router',
        cgi_url => '/router4',
        
        content => {
            type => 'raw_post',
            arg => [
                'http://localhost/router',
                q|{"type":"rpc","tid":1,"action":"Meta",|.
                q|"method":"named_arg",|.
                q|"data":{"qux":"fred"},|.
                q|"metadata":["blerg"]}|,                
            ],
        },
    },
    
    output => {
        status => 200,
        content_type => qr|^application/json\b|,
        content_length => 100,
        comparator => 'cmp_str',
        content =>
            q|{"action":"Meta","method":"named_arg",|.
            q|"result":{"meta":["blerg"],"qux":"fred"},|.
            q|"tid":1,"type":"rpc"}|,
    },
}, {
    name => 'Valid POST with metadata 8',
    
    config => {
        api_path => '/api',
        router_path => '/router',
        poll_path => '/events',
        debug => 1,
    },
    
    input => {
        method => 'POST',
        url => '/router',
        cgi_url => '/router4',
        
        content => {
            type => 'raw_post',
            arg => [
                'http://localhost/router',
                q|{"type":"rpc","tid":1,"action":"Meta",|.
                q|"method":"named_arg",|.
                q|"data":{"foo":"bar"},|.
                q|"metadata":["blerg"]}|,
            ],
        },
    },
    
    output => {
        status => 200,
        content_type => qr|^application/json\b|,
        content_length => 87,
        comparator => 'cmp_str',
        content =>
            q|{"action":"Meta","method":"named_arg",|.
            q|"result":{"meta":["blerg"]},|.
            q|"tid":1,"type":"rpc"}|,
    },
}, {
    name => 'Valid POST with metadata 9',
    
    config => {
        api_path => '/api',
        router_path => '/router',
        poll_path => '/events',
        debug => 1,
    },
    
    input => {
        method => 'POST',
        url => '/router',
        cgi_url => '/router4',
        
        content => {
            type => 'raw_post',
            arg => [
                'http://localhost/router',
                q|{"type":"rpc","tid":1,"action":"Meta",|.
                q|"method":"named_strict",|.
                q|"data":{"frob":"dux","frogg":"bonzo"},|.
                q|"metadata":{"foo":{"bar":{"baz":42}}}}|,
            ],
        },
    },
    
    output => {
        status => 200,
        content_type => qr|^application/json\b|,
        content_length => 136,
        comparator => 'cmp_str',
        content =>
            q|{"action":"Meta","method":"named_strict",|.
            q|"result":{"frob":"dux","frogg":"bonzo",|.
            q|"meta":{"foo":{"bar":{"baz":42}}}},|.
            q|"tid":1,"type":"rpc"}|,
    },
}, {
    name => 'Valid POST with metadata 10',
    
    config => {
        api_path => '/api',
        router_path => '/router',
        poll_path => '/events',
        debug => 1,
    },
    
    input => {
        method => 'POST',
        url => '/router',
        cgi_url => '/router4',
        
        content => {
            type => 'raw_post',
            arg => [
                'http://localhost/router',
                q|{"type":"rpc","tid":1,"action":"Meta",|.
                q|"method":"named_unstrict",|.
                q|"data":{"qux":null},"metadata":{}}|,
            ],
        },
    },
    
    output => {
        status => 200,
        content_type => qr|^application/json\b|,
        content_length => 96,
        comparator => 'cmp_str',
        content =>
            q|{"action":"Meta","method":"named_unstrict",|.
            q|"result":{"meta":{},"qux":null},|.
            q|"tid":1,"type":"rpc"}|,
    },
}, {
    name => 'Valid POST with ancillary properties',
    
    config => {
        api_path => '/api',
        router_path => '/router',
        poll_path => '/events',
        debug => 1,
    },
    
    input => {
        method => 'POST',
        url => '/router',
        cgi_url => '/router4',
        
        content => {
            type => 'raw_post',
            arg => [
                'http://localhost/router',
                q|{"type":"rpc","tid":1,"action":"Meta",|.
                q|"method":"aux","data":null,"foo":"bar",|.
                q|"token":"kaboom!"}|,
            ],
        },
    },
    
    output => {
        status => 200,
        content_type => qr|^application/json\b|,
        content_length => 102,
        comparator => 'cmp_str',
        content =>
            q|{"action":"Meta","method":"aux",|.
            q|"result":{"aux":{"foo":"bar","token":"kaboom!"}},|.
            q|"tid":1,"type":"rpc"}|,
    },
}, {
    name => 'Form request, no uploads',
    
    config => {
        api_path => '/api',
        router_path => '/router',
        poll_path => '/events',
        debug => 1,
    },
    
    input => {
        method => 'POST',
        url => '/router',
        cgi_url => '/router1',
    
        content => {
            type => 'form_post',
            arg  => [
                'http://localhost/router',
                action => '/router.cgi',
                method => 'POST',
                extAction => 'Bar',
                extMethod => 'bar_baz',
                extTID => 123,
                field1 => 'foo',
                field2 => 'bar',
                extType => 'rpc',
            ],
        },
    },
    
    output => {
        status => 200,
        content_type => qr|^application/json\b|,
        content_length => 99,
        comparator => 'cmp_str',
        content =>
            q|{"action":"Bar","method":"bar_baz",|.
            q|"result":{"field1":"foo","field2":"bar"},|.
            q|"tid":123,"type":"rpc"}|,
    },
}, {
    name => 'Form request with ordered metadata',
    
    config => {
        api_path => '/api',
        router_path => '/router',
        poll_path => '/events',
        debug => 1,
    },
    
    input => {
        method => 'POST',
        url => '/router',
        cgi_url => '/router4',
    
        content => {
            type => 'form_post',
            arg  => [
                'http://localhost/router',
                action => '/router.cgi',
                method => 'POST',
                extAction => 'Meta',
                extMethod => 'form_ordered',
                extType => 'rpc',
                extTID => 42,
                fred => 'frob',
                
                # Client sends JSON encoded metadata with forms
                metadata => '[42]',
            ],
        },
    },
    
    output => {
        status => 200,
        content_type => qr|^application/json\b|,
        content_length => 104,
        comparator => 'cmp_str',
        content =>
            q|{"action":"Meta","method":"form_ordered",|.
            q|"result":{"fred":"frob","metadata":[42]},|.
            q|"tid":42,"type":"rpc"}|,
    },
}, {
    name => 'Form request with named metadata',
    
    config => {
        api_path => '/api',
        router_path => '/router',
        poll_path => '/events',
        debug => 1,
    },
    
    input => {
        method => 'POST',
        url => '/router',
        cgi_url => '/router4',
    
        content => {
            type => 'form_post',
            arg  => [
                'http://localhost/router',
                action => '/router.cgi',
                method => 'POST',
                extAction => 'Meta',
                extMethod => 'form_named',
                extType => 'rpc',
                extTID => 58,
                frogg => 'splurge',
                boogaloo => 1916,

                # Client sends JSON encoded metadata with forms
                metadata => '{"foo":1,"bar":2,"baz":3}',
            ],
        },
    },
    
    output => {
        status => 200,
        content_type => qr|^application/json\b|,
        content_length => 139,
        comparator => 'cmp_str',
        
        # Note that we send a number in boogaloo field above
        # but expect a string in return. This is due to the nature
        # of form POST submits; in either URL encoding or form-multipart
        # the data is sent as 
        content =>
            q|{"action":"Meta","method":"form_named",|.
            q|"result":{"_m":{"bar":2,"baz":3,"foo":1},|.
            q|"boogaloo":"1916","frogg":"splurge"},|.
            q|"tid":58,"type":"rpc"}|,
    },
}, {
    name => 'Form request with named metadata, multipart encoded',
    
    config => {
        api_path => '/api',
        router_path => '/router',
        poll_path => '/events',
        debug => 1,
    },
    
    input => {
        method => 'POST',
        url => '/router',
        cgi_url => '/router4',
    
        content => {
            type => 'form_upload',
            arg  => [
                'http://localhost/router',
                [],
                action => '/router.cgi',
                method => 'POST',
                extAction => 'Meta',
                extMethod => 'form_named',
                extType => 'rpc',
                extUpload => 'true',
                extTID => 63,
                frogg => 'splurge',
                boogaloo => 1916,

                # Client sends JSON encoded metadata with forms
                metadata => '{"foo":1,"bar":2,"baz":3}',
            ],
        },
    },
    
    output => {
        status => 200,
        content_type => qr|^text/html\b|,
        content_length => 186,
        comparator => 'cmp_str',
        content =>
            q|<html><body><textarea>|.
            q|{"action":"Meta","method":"form_named",|.
            q|"result":{"_m":{"bar":2,"baz":3,"foo":1},|.
            q|"boogaloo":"1916","frogg":"splurge"},|.
            q|"tid":63,"type":"rpc"}|.
            q|</textarea></body></html>|,
    },
}, {
    name => 'Form request, one upload',
    
    config => {
        api_path => '/api',
        router_path => '/router',
        poll_path => '/events',
        debug => 1,
    },
    
    input => {
        method => 'POST',
        url => '/router',
        cgi_url => '/router2',
    
        content => {
            type => 'form_upload',
            arg  => [
                'http://localhost/router',
                ['qux.txt'],
                action => '/router.cgi',
                method => 'POST',
                extAction => 'JuiceBar',
                extMethod => 'bar_baz',
                extTID => 7,
                extType => 'rpc',
                foo_field => 'foo',
                bar_field => 'bar',
                extUpload => 'true',
            ],
        },
    },
    
    output => {
        status => 200,
        content_type => qr|^text/html\b|,
        content_length => 253,
        comparator => 'cmp_str',
        content =>
            q|<html><body><textarea>|.
            q|{"action":"JuiceBar","method":"bar_baz",|.
            q|"result":{"bar_field":"bar",|.
            q|"foo_field":"foo",|.
            q|"upload_response":"The following files were |.
            q|processed:\n|.
            q|qux.txt application/octet-stream 31 ok\n"|.
            q|},"tid":7,|.
            q|"type":"rpc"}|.
            q|</textarea></body></html>|,
    },
}, {
    name => 'Form request, multiple uploads',
    
    config => {
        api_path => '/api',
        router_path => '/router',
        poll_path => '/events',
        debug => 1,
    },
    
    input => {
        method => 'POST',
        cgi_url => '/router2',
        url => '/router',
    
        content => {
            type => 'form_upload',
            arg  => [
                'http://localhost/router',
                ['foo.jpg', 'bar.png', 'script.js'],
                action => '/router.cgi',
                method => 'POST',
                extAction => 'JuiceBar',
                extMethod => 'bar_baz',
                extTID => 8,
                field => 'value',
                extUpload => 'true',
                extType => 'rpc',
            ],
        },
    },
    
    output => {
        status => 200,
        content_type => qr|^text/html\b|,
        content_length => 321,
        comparator => 'cmp_str',
        content =>
            q|<html><body><textarea>|.
            q|{"action":"JuiceBar","method":"bar_baz",|.
            q|"result":{|.
            q|"field":"value",|.
            q|"upload_response":"The following files were |.
            q|processed:\n|.
            q|foo.jpg application/octet-stream 16159 ok\n|.
            q|bar.png application/octet-stream 20693 ok\n|.
            q|script.js application/octet-stream 80 ok\n"|.
            q|},"tid":8,"type":"rpc"}|.
            q|</textarea></body></html>|,
    },
}];

sub get_tests { return $tests };

1;