# vi:filetype= use lib 'lib'; use Test::Nginx::Socket; repeat_each(2); plan tests => repeat_each() * 2 * blocks(); $ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1'; $ENV{TEST_NGINX_MYSQL_PORT} ||= 3306; our $http_config = <<'_EOC_'; upstream backend { drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql dbname=ngx_test user=ngx_test password=ngx_test; } _EOC_ no_diff(); no_long_string(); run_tests(); __DATA__ === TEST 1: sanity --- http_config eval: $::http_config --- config location /mysql { drizzle_query ' select * from cats order by id asc '; drizzle_pass backend; rds_json on; rds_json_root rows; } --- request GET /mysql --- response_body chomp {"rows":[{"id":2,"name":null},{"id":3,"name":"bob"}]} === TEST 2: update (root) --- http_config eval: $::http_config --- config location /mysql { drizzle_pass backend; #drizzle_dbname $dbname; drizzle_query "update cats set name='bob' where name='bob'"; rds_json on; rds_json_root data; } --- request GET /mysql --- response_body chop {"errcode":0,"errstr":"Rows matched: 1 Changed: 0 Warnings: 0"} === TEST 3: select empty result --- http_config eval: $::http_config --- config location /mysql { drizzle_pass backend; drizzle_query "select * from cats where name='tom'"; rds_json on; rds_json_root data; } --- request GET /mysql --- response_body chop {"data":[]} === TEST 4: sanity + compact --- http_config eval: $::http_config --- config location /mysql { drizzle_query ' select * from cats order by id asc '; drizzle_pass backend; rds_json on; rds_json_root rows; rds_json_format compact; } --- request GET /mysql --- response_body chomp {"rows":[["id","name"],[2,null],[3,"bob"]]} === TEST 5: select empty result + compact --- http_config eval: $::http_config --- config location /mysql { drizzle_pass backend; drizzle_query "select * from cats where name='tom'"; rds_json on; rds_json_root data; rds_json_format compact; } --- request GET /mysql --- response_body chop {"data":[["id","name"]]} === TEST 6: select empty result + compact + escaping --- http_config eval: $::http_config --- config location /mysql { drizzle_pass backend; drizzle_query "select * from cats where name='tom'"; rds_json on; rds_json_root "'\"\\:"; rds_json_format compact; } --- request GET /mysql --- response_body chop {"'\"\\:":[["id","name"]]} === TEST 7: success property (inherited) --- http_config eval: $::http_config --- config rds_json_success_property "suc"; location /mysql { drizzle_pass backend; drizzle_query "select * from cats where name='tom'"; rds_json on; rds_json_root "rows"; rds_json_format compact; } --- request GET /mysql --- response_body chop {"suc":true,"rows":[["id","name"]]} === TEST 8: success property (root inherited) --- http_config eval: $::http_config --- config rds_json_root "rows"; location /mysql { drizzle_pass backend; drizzle_query "select * from cats where name='tom'"; rds_json on; rds_json_success_property "suc"; rds_json_format compact; } --- request GET /mysql --- response_body chop {"suc":true,"rows":[["id","name"]]} === TEST 9: success property --- http_config eval: $::http_config --- config location /mysql { drizzle_pass backend; drizzle_query "select * from cats where name='tom'"; rds_json on; #rds_json_root "data"; rds_json_success_property "suc"; rds_json_format compact; } --- request GET /mysql --- response_body chop {"suc":true,"data":[["id","name"]]} === TEST 10: success property with an odd key --- http_config eval: $::http_config --- config location /mysql { drizzle_pass backend; drizzle_query "select * from cats where name='tom'"; rds_json on; rds_json_root "data"; rds_json_success_property "a\"'\\:"; rds_json_format compact; } --- request GET /mysql --- response_body chop {"a\"'\\:":true,"data":[["id","name"]]} === TEST 11: update (root + success prop) --- http_config eval: $::http_config --- config location /mysql { drizzle_pass backend; #drizzle_dbname $dbname; drizzle_query "update cats set name='bob' where name='bob'"; rds_json on; rds_json_root rows; rds_json_success_property success; } --- request GET /mysql --- response_body chop {"success":true,"errcode":0,"errstr":"Rows matched: 1 Changed: 0 Warnings: 0"} === TEST 12: update (user property) --- http_config eval: $::http_config --- config location /mysql { drizzle_pass backend; #drizzle_dbname $dbname; drizzle_query "update cats set name='bob' where name='bob'"; rds_json on; set $name 'Jimmy'; rds_json_user_property name $name; } --- request GET /mysql --- response_body chop {"name":"Jimmy","errcode":0,"errstr":"Rows matched: 1 Changed: 0 Warnings: 0"} === TEST 13: update (multi user property) --- http_config eval: $::http_config --- config location /mysql { drizzle_pass backend; #drizzle_dbname $dbname; drizzle_query "update cats set name='bob' where name='bob'"; rds_json on; set $name 'Jimmy"'; set $age 32; rds_json_user_property name $name; rds_json_user_property age $age; } --- request GET /mysql --- response_body chop {"name":"Jimmy\"","age":"32","errcode":0,"errstr":"Rows matched: 1 Changed: 0 Warnings: 0"} === TEST 14: compact + user property --- http_config eval: $::http_config --- config location /mysql { drizzle_query ' select * from cats order by id asc '; drizzle_pass backend; rds_json on; rds_json_root rows; set $val 'bar"'; rds_json_user_property foo $val; rds_json_format compact; } --- request GET /mysql --- response_body chomp {"foo":"bar\"","rows":[["id","name"],[2,null],[3,"bob"]]} === TEST 15: compact + user property + success --- http_config eval: $::http_config --- config location /mysql { drizzle_query ' select * from cats order by id asc '; drizzle_pass backend; rds_json on; rds_json_root rows; rds_json_success_property suc; set $val 'bar"'; rds_json_user_property foo $val; set $baz '"baz"\\'; rds_json_user_property '\\bar' $baz; rds_json_format compact; } --- request GET /mysql --- response_body chomp {"suc":true,"foo":"bar\"","\\bar":"\"baz\"\\","rows":[["id","name"],[2,null],[3,"bob"]]} === TEST 16: rds_json_ret with success property --- http_config eval: $::http_config --- config location /ret { rds_json_success_property ret; rds_json_ret 400 'Non zero ret'; } --- request GET /ret --- response_body chomp {"errcode":400,"errstr":"Non zero ret","ret":false} === TEST 17: rds_json_ret with user property --- http_config eval: $::http_config --- config location /ret { set $city 'beijing'; rds_json_user_property city $city; rds_json_ret 400 'Non zero ret'; } --- request GET /ret --- response_body chomp {"errcode":400,"errstr":"Non zero ret","city":"beijing"} === TEST 18: rds_json_ret with property --- http_config eval: $::http_config --- config location /ret { rds_json_success_property ret; set $city 'beijing'; rds_json_user_property city $city; rds_json_ret 400 'Non zero ret'; } --- request GET /ret --- response_body chomp {"errcode":400,"errstr":"Non zero ret","ret":false,"city":"beijing"} === TEST 19: rds_json_ret when errcode equal 0 --- http_config eval: $::http_config --- config location /ret { rds_json_success_property ret; set $city 'beijing'; rds_json_user_property city $city; rds_json_ret 0 'Zero errcode'; } --- request GET /ret --- response_body chomp {"errcode":0,"errstr":"Zero errcode","ret":true,"city":"beijing"} === TEST 20: rds_json_ret with multiple user properties --- http_config eval: $::http_config --- config location /ret { set $city 'beijing'; rds_json_user_property city $city; rds_json_user_property '"hi"' '"hello\n"'; rds_json_ret 400 'Non zero ret'; } --- request GET /ret --- response_body chomp {"errcode":400,"errstr":"Non zero ret","city":"beijing","\"hi\"":"\"hello\n\""} === TEST 21: location internal rewrite --- config location @err403 { rds_json_success_property ret; rds_json_ret 403 "Forbidden"; } location /foo { error_page 403 = @err403; return 403; } --- request GET /foo --- response_body chop {"errcode":403,"errstr":"Forbidden","ret":false} === TEST 22: rds_json_errcode_key --- config location /foo { rds_json_errcode_key "ecode"; rds_json_success_property ret; rds_json_ret 403 "Forbidden"; } --- request GET /foo --- response_body chop {"ecode":403,"errstr":"Forbidden","ret":false} === TEST 23: rds_json_errcode_key --- config rds_json_errcode_key "ecoderoot"; location /foo { rds_json_success_property ret; rds_json_ret 403 "Forbidden"; } --- request GET /foo --- response_body chop {"ecoderoot":403,"errstr":"Forbidden","ret":false} === TEST 24: rds_json_errcode_key --- config rds_json_errcode_key "ecoderoot"; location /foo { rds_json_errcode_key "ecode"; rds_json_success_property ret; rds_json_ret 403 "Forbidden"; } --- request GET /foo --- response_body chop {"ecode":403,"errstr":"Forbidden","ret":false} === TEST 25: rds_json_errstr_key --- config rds_json_errstr_key "msg"; location /foo { rds_json_success_property ret; rds_json_ret 403 "Forbidden"; } --- request GET /foo --- response_body chop {"errcode":403,"msg":"Forbidden","ret":false} === TEST 26: rds_json_errstr_key --- config rds_json_errstr_key "msg"; location /foo { rds_json_errstr_key "msg2"; rds_json_success_property ret; rds_json_ret 403 "Forbidden"; } --- request GET /foo --- response_body chop {"errcode":403,"msg2":"Forbidden","ret":false} === TEST 27: rds_json_errstr_key & rds_json_root --- config rds_json_errstr_key "msg2"; rds_json_root rows; location /foo { rds_json_success_property ret; rds_json_ret 403 "Forbidden"; } --- request GET /foo --- response_body chop {"errcode":403,"msg2":"Forbidden","ret":false} === TEST 28: rds_json_errcode_key & rds_json_root --- config rds_json_root rows; rds_json_errcode_key "code"; location /foo { rds_json_success_property ret; rds_json_ret 403 "Forbidden"; } --- request GET /foo --- response_body chop {"code":403,"errstr":"Forbidden","ret":false} === TEST 29: update - custom errstr_key --- http_config eval: $::http_config --- config location /mysql { drizzle_pass backend; #drizzle_dbname $dbname; drizzle_query "update cats set name='bob' where name='bob'"; rds_json on; rds_json_errcode_key "\"code\""; rds_json_errstr_key "\"str\""; set $name 'Jimmy"'; set $age 32; rds_json_user_property name $name; rds_json_user_property age $age; } --- request GET /mysql --- response_body chop {"name":"Jimmy\"","age":"32","\"code\"":0,"\"str\"":"Rows matched: 1 Changed: 0 Warnings: 0"} === TEST 30: select - custom errstr_key --- http_config eval: $::http_config --- config location /mysql { drizzle_pass backend; drizzle_query "select 'aaa' as a, 'bbb' as b"; rds_json on; rds_json_errcode_key "\"code\""; rds_json_errstr_key "\"str\""; rds_json_root data; set $name 'Jimmy"'; set $age 32; rds_json_user_property name $name; rds_json_user_property age $age; } --- request GET /mysql --- response_body chop {"name":"Jimmy\"","age":"32","data":[{"a":"aaa","b":"bbb"}]}