# vi:filetype=
my $ExePath;
BEGIN {
use FindBin;
$ExePath = "$FindBin::Bin/../haskell/bin/restyscript";
if (!-f $ExePath) {
$skip = "$ExePath is not found.\n";
return;
}
if (!-x $ExePath) {
$skip = "$ExePath is not an executable.\n";
return;
}
};
use t::OpenResty $skip ? (skip_all => $skip) : ();
plan tests => 3 * blocks();
run_tests;
__DATA__
=== TEST 1: Delete existing models
--- request
DELETE /=/model?_user=$TestAccount&_password=$TestPass&_use_cookie=1
--- response
{"success":1}
=== TEST 2: Create a model
--- request
POST /=/model/Carrie.js
{
"description": "我的书签",
"columns": [
{ "name": "title", "type":"text", "label": "标题" },
{ "name": "url", "type":"text", "label": "网址" },
{ "name": "num", "type": "integer", "label": "num" }
]
}
--- response
{"success":1}
=== TEST 3: check the model list again
--- request
GET /=/model.js
--- response
[{"src":"/=/model/Carrie","name":"Carrie","description":"我的书签"}]
=== TEST 4: insert a record
--- request
POST /=/model/Carrie/~/~.js
{ "title":"hello carrie","url":"http://www.carriezh.cn/","num":"10"}
--- response
{"success":1,"rows_affected":1,"last_row":"/=/model/Carrie/id/1"}
=== TEST 5: read a record according to url
--- request
GET /=/model/Carrie/url/http://www.carriezh.cn/.js
--- response
[{"num":"10","url":"http://www.carriezh.cn/","title":"hello carrie","id":"1"}]
=== TEST 6: insert another record
--- request
POST /=/model/Carrie/~/~.js
{ "title":"second","url":"http://zhangxiaojue.cn","num":"1"}
--- response
{"success":1,"rows_affected":1,"last_row":"/=/model/Carrie/id/2"}
=== TEST 7: find out two record assign to var hello
--- request
GET /=/model/Carrie/~/~.js?_var=hello
--- response
hello=[{"num":"10","url":"http://www.carriezh.cn/","title":"hello carrie","id":"1"},{"num":"1","url":"http://zhangxiaojue.cn","title":"second","id":"2"}];
=== TEST 8: The .Select action is now disallowed
--- request
POST /=/action/.Select/lang/minisql
"select * from Carrie where title = 'hello carrie' and num=10;"
--- response
{"error":"Action \".Select\" not found.","success":0}
--- SKIP
=== TEST 9: use minisql to find record
--- request
POST /=/action/RunView/~/~
"select * from Carrie where title = 'hello carrie' and num=10;"
--- response
[{"num":"10","url":"http://www.carriezh.cn/","title":"hello carrie","id":"1"}]
=== TEST 10: use minisql through GET & .Select
--- request
GET /=/post/action/RunView/~/~?_var=foo&_data="select * from Carrie where url = 'http://www.carriezh.cn/' and num=10"
--- response
foo=[{"num":"10","url":"http://www.carriezh.cn/","title":"hello carrie","id":"1"}];
=== TEST 11: test for offset & count
--- request
GET /=/post/action/RunView/~/~?_var=foo&_data="select * from Carrie offset 0 limit 1"
--- response
foo=[{"num":"10","url":"http://www.carriezh.cn/","title":"hello carrie","id":"1"}];
=== TEST 12: OFFSET & limit in minisql
--- request
GET /=/post/action/RunView/~/~?_var=foo&_data="select * from Carrie limit 1 offset 0"
--- response
foo=[{"num":"10","url":"http://www.carriezh.cn/","title":"hello carrie","id":"1"}];
=== TEST 13: OFFSET & limit in minisql
--- request
POST /=/action/RunView/~/~?_var=foo
"select * from Carrie limit 1 offset 1"
--- response
foo=[{"num":"1","url":"http://zhangxiaojue.cn","title":"second","id":"2"}];
=== TEST 14: Try to reference meta models
--- request
POST /=/action/RunView/~/~?_var=foo
"select * from _models limit 1 offset 1"
--- response
foo={"error":"\"view\" (line 1, column 15):\nunexpected \"_\"\nexpecting space or model","success":0};
=== TEST 15: Reference nonexistent models
--- request
POST /=/action/RunView/~/~
"select * from BlahBlah limit 1 offset 1"
--- response
{"success":0,"error":"Model \"BlahBlah\" not found."}
=== TEST 16: Empty miniSQL string
--- request
POST /=/action/RunView/~/~
""
--- response
{"error":"Restyscript source must be an non-empty literal string: \"\"","success":0}
=== TEST 17: Empty miniSQL string
--- request
POST /=/action/RunView/~/~
["abc"]
--- response
{"error":"Restyscript source must be an non-empty literal string: [\"abc\"]","success":0}
=== TEST 18: logout
--- request
GET /=/logout
--- response
{"success":1}