# vi:filetype= use t::OpenResty 'no_plan'; =pod This test file tests URLs in the forms /=/model and /=/model/xxx XXX [TODO] * Invalid column type in the model schema * Invalid column label in the model schema * Unrecoginzed keys in model's { ... } * Unrecoginzied keys in model column's { ... } * Too many columns * Chinese characters in model names which also mach /\w/ =cut #plan tests => 2 * blocks(); run_tests; __DATA__ === TEST 1: Delete existing models --- request DELETE /=/model.js?_user=$TestAccount&_password=$TestPass&_use_cookie=1 --- response {"success":1} === TEST 2: Create a new model --- request POST /=/model/Human { "description":"人类", "columns": [ { "name": "gender", "type":"text", "label": "性别","default": "'male'","unique": false,"not_null":true } ] } --- response {"success":1} === TEST 3: Create a model with the same name --- request POST /=/model/Human { "description":"人类", "columns": [ { "name": "gender", "label": "性别" } ] } --- response {"error":"Value for \"type\" for \"columns\" array element required.","success":0} === TEST 4: Create a model with 'name' specified --- request POST /=/model/Foo { "name": "Blah", "description":"人类", "columns": [ { "name": "gender", "type":"text", "label": "性别" } ] } --- response {"success":1,"warning":"name \"Blah\" in POST content ignored."} === TEST 5: No description specified --- request POST /=/model/Blah { "columns": [ { "name": "gender", "label": "性别" } ] } --- response {"error":"Value for \"description\" required.","success":0} === TEST 6: No label specified for column --- request POST /=/model/Blah { "description":"人类", "columns": [ { "name": "gender", "type": "text" } ] } --- response {"error":"Value for \"label\" for \"columns\" array element required.","success":0} === TEST 7: No column specified for the model --- request POST /=/model/Blah { "description":"Blah", "columns": [] } --- response {"success":1,"warning":"'columns' empty for model \"Blah\"."} === TEST 8: Check the model (we have the preserved 'id' column :) --- request GET /=/model/Blah --- response { "columns": [{"name":"id","label":"ID","type":"serial"}], "name":"Blah", "description":"Blah" } === TEST 9: Syntax error in JSON data --- request POST /=/model/Baz { "description":"BAZ", } --- response_like {"success":0,"error":"Syntax error found in the JSON input: '\\"' expected, at character offset 25 === TEST 10: columns slot is not specified --- request POST /=/model/Baz { "description":"BAZ" } --- response {"success":1,"warning":"No 'columns' specified for model \"Baz\"."} === TEST 11: Check the model (we still have the preserved 'id' column :) --- request GET /=/model/Baz --- response { "columns": [{"name":"id","label":"ID","type":"serial"}], "name":"Baz", "description":"BAZ" } === TEST 12: Check the model list again --- request GET /=/model --- response [ {"src":"/=/model/Human","name":"Human","description":"人类"}, {"src":"/=/model/Foo","name":"Foo","description":"人类"}, {"src":"/=/model/Blah","name":"Blah","description":"Blah"}, {"src":"/=/model/Baz","name":"Baz","description":"BAZ"} ] === TEST 13: Delete a model with a bad name --- request DELETE /=/model/@! --- response {"success":0,"error":"Bad model name: \"@!\""} === TEST 14: Delete a non-existent model --- request DELETE /=/model/NotExist --- response {"success":0,"error":"Model \"NotExist\" not found."} === TEST 15: Post model as a list --- request POST /=/model/Tiger [{ "description": "Tiger" }] --- response {"success":0,"error":"The model schema must be a HASH."} === TEST 16: Create a model w/o POST content --- request POST /=/model/laser --- response {"success":0,"error":"No POST content specified or no \"data\" field found."} === TEST 17: invalid columns in the model schema --- request POST /=/model/Tiger { "description": "Tiger", "columns": 32 } --- response {"error":"Invalid value for \"columns\": Array expected.","success":0} === TEST 18: invalid 'description' slot value in the schema --- request POST /=/model/Tiger { "description": ["hello"] } --- response {"error":"Bad value for \"description\": String expected.","success":0} === TEST 19: invalid model column name in schema --- request POST /=/model/Tiger { "description": "Tiger", "columns": [ { "name":[32], "label":"bad col" } ] } --- response {"error":"Bad value for \"name\" for \"columns\" array element: Identifier expected.","success":0} === TEST 20: model column name too long --- request POST /=/model/Tiger { "description": "Tiger", "columns": [ { "name":"dddddddddddddddddddddddddddddddd", "label":"hiya", "type":"char(3)" } ] } --- response {"success":0,"error":"Column name too long: dddddddddddddddddddddddddddddddd"} === TEST 21: model column name JUST NOT too long --- request POST /=/model/Tiger { "description": "Tiger", "columns": [ { "name":"ddddddddddddddddddddddddddddddd", "type":"text", "label":"hiya","unique": false} ] } --- response {"success":1} === TEST 22: model name too long --- request POST /=/model/ABCDEFGHIJKLMNOPQRSTUVWXYZ123456 { "description": "Bad model" } --- response {"success":0,"error":"Model name too long: ABCDEFGHIJKLMNOPQRSTUVWXYZ123456"} === TEST 23: model name JUST NOT too long --- request POST /=/model/ABCDEFGHIJKLMNOPQRSTUVWXYZ12345 { "description": "Bad model" } --- response {"success":1,"warning":"No 'columns' specified for model \"ABCDEFGHIJKLMNOPQRSTUVWXYZ12345\"."} === TEST 24: Unrecoginzed key in model's block (POST) --- request POST /=/model/TTT { "\uFFFE": "key named \uFFFE", "description": "bad" } --- response_like {"success":0,"error":"Unrecognized key in hash: .+?"} === TEST 25: Unrecoginzed keys in model's block (POST) --- request POST /=/model/TTT { "\uFFFE": "key named \uFFFE", "\uFFFF": "key named \uFFFF", "description": "bad" } --- response_like {"success":0,"error":"Unrecognized key in hash: .+?"} === TEST 26: when column def is bad --- request POST /=/model/Foo2 { "description": "blah", "columns": [ [1,2] ] } --- response {"error":"Invalid value for \"columns\" array element: Hash expected.","success":0} === TEST 27: Put a description --- request PUT /=/model/Tiger { "description": "Hello!" } --- response {"success":"1"} === TEST 28: Read the model again --- request GET /=/model/Tiger --- response { "columns": [{"name":"id","label":"ID","type":"serial"}, {"name":"ddddddddddddddddddddddddddddddd","default":null,"label":"hiya","type":"text", "unique": false, "not_null": false}], "name":"Tiger","description":"Hello!"} === TEST 29: Create a model with unknown column keys --- request POST /=/model/Post {"description":"Post", "columns":[{"name":"name","label":"Name","type":"text","blah":true}, {"name":"age","label":"Age","type":"integer"}] } --- response {"error":"Unrecognized key in hash for \"columns\" array element: blah","success":0} === TEST 30: logout --- request GET /=/logout --- response {"success":1}