From db125f46398779c9355f521c359e6ae4c683582f Mon Sep 17 00:00:00 2001 From: Isaac Good Date: Thu, 27 Aug 2026 22:30:58 -0700 Subject: [PATCH] Add test generators for `rest-api` --- .../.meta/template.create_test_table.j2 | 37 ++++++++++++++++ .../practice/rest-api/.meta/template.data.j2 | 3 ++ .../practice/rest-api/create_test_table.sql | 42 +++++++++---------- exercises/practice/rest-api/data.csv | 14 +++---- 4 files changed, 68 insertions(+), 28 deletions(-) create mode 100644 exercises/practice/rest-api/.meta/template.create_test_table.j2 create mode 100644 exercises/practice/rest-api/.meta/template.data.j2 diff --git a/exercises/practice/rest-api/.meta/template.create_test_table.j2 b/exercises/practice/rest-api/.meta/template.create_test_table.j2 new file mode 100644 index 00000000..e76377b7 --- /dev/null +++ b/exercises/practice/rest-api/.meta/template.create_test_table.j2 @@ -0,0 +1,37 @@ +DROP TABLE IF EXISTS tests; + +CREATE TABLE IF NOT EXISTS tests ( + -- uuid and name are taken from the test.toml file + uuid TEXT PRIMARY KEY, + name TEXT NOT NULL, + -- The following section is needed by the online test-runner + status TEXT DEFAULT 'fail', + message TEXT, + output TEXT, + test_code TEXT, + task_id INTEGER DEFAULT NULL, + -- Here are columns for the actual tests + database TEXT NOT NULL, + payload TEXT NOT NULL, + url TEXT INT NOT NULL, + expected TEXT NOT NULL +); + +-- Note: the strings below _may_ contain literal tab, newline, or carriage returns. +INSERT INTO + tests (uuid, name, database, payload, url, expected) +VALUES +{%- for case in cases %} + ( + '{{ case["uuid"] }}', + '{{ case["description"] }}', + '{{ case["input"]["database"] | tojson }}', + '{{ case["input"].get("payload", {}) | tojson }}', + '{{ case["input"]["url"] }}', + '{{ case["expected"] | tojson }}' +{%- if loop.last %} + ); +{%- else %} + ), +{%- endif %} +{%- endfor %} diff --git a/exercises/practice/rest-api/.meta/template.data.j2 b/exercises/practice/rest-api/.meta/template.data.j2 new file mode 100644 index 00000000..5b8cf146 --- /dev/null +++ b/exercises/practice/rest-api/.meta/template.data.j2 @@ -0,0 +1,3 @@ +{%- for case in cases -%} +{{ [case["input"]["database"] | tojson, case["input"].get("payload", {}) | tojson, case["input"]["url"]] | tocsv }},"" +{% endfor %} diff --git a/exercises/practice/rest-api/create_test_table.sql b/exercises/practice/rest-api/create_test_table.sql index 8c63b3f5..9983d4ba 100644 --- a/exercises/practice/rest-api/create_test_table.sql +++ b/exercises/practice/rest-api/create_test_table.sql @@ -35,61 +35,61 @@ VALUES '{"users":[]}', '{"user":"Adam"}', '/add', - '{"name":"Adam","owes":{},"owed_by":{},"balance":0}' + '{"name":"Adam","owes":{},"owed_by":{},"balance":0.0}' ), ( 'd624e5e5-1abb-4f18-95b3-45d55c818dc3', 'get single user', - '{"users":[{"name":"Adam","owes":{},"owed_by":{},"balance":0},{"name":"Bob","owes":{},"owed_by":{},"balance":0}]}', + '{"users":[{"name":"Adam","owes":{},"owed_by":{},"balance":0.0},{"name":"Bob","owes":{},"owed_by":{},"balance":0.0}]}', '{"users":["Bob"]}', '/users', - '{"users":[{"name":"Bob","owes":{},"owed_by":{},"balance":0}]}' + '{"users":[{"name":"Bob","owes":{},"owed_by":{},"balance":0.0}]}' ), ( '7a81b82c-7276-433e-8fce-29ce983a7c56', 'both users have 0 balance', - '{"users":[{"name":"Adam","owes":{},"owed_by":{},"balance":0},{"name":"Bob","owes":{},"owed_by":{},"balance":0}]}', - '{"lender":"Adam","borrower":"Bob","amount":3}', + '{"users":[{"name":"Adam","owes":{},"owed_by":{},"balance":0.0},{"name":"Bob","owes":{},"owed_by":{},"balance":0.0}]}', + '{"lender":"Adam","borrower":"Bob","amount":3.0}', '/iou', - '{"users":[{"name":"Adam","owes":{},"owed_by":{"Bob":3},"balance":3},{"name":"Bob","owes":{"Adam":3},"owed_by":{},"balance":-3}]}' + '{"users":[{"name":"Adam","owes":{},"owed_by":{"Bob":3.0},"balance":3.0},{"name":"Bob","owes":{"Adam":3.0},"owed_by":{},"balance":-3.0}]}' ), ( '1c61f957-cf8c-48ba-9e77-b221ab068803', 'borrower has negative balance', - '{"users":[{"name":"Adam","owes":{},"owed_by":{},"balance":0},{"name":"Bob","owes":{"Chuck":3},"owed_by":{},"balance":-3},{"name":"Chuck","owes":{},"owed_by":{"Bob":3},"balance":3}]}', - '{"lender":"Adam","borrower":"Bob","amount":3}', + '{"users":[{"name":"Adam","owes":{},"owed_by":{},"balance":0.0},{"name":"Bob","owes":{"Chuck":3.0},"owed_by":{},"balance":-3.0},{"name":"Chuck","owes":{},"owed_by":{"Bob":3.0},"balance":3.0}]}', + '{"lender":"Adam","borrower":"Bob","amount":3.0}', '/iou', - '{"users":[{"name":"Adam","owes":{},"owed_by":{"Bob":3},"balance":3},{"name":"Bob","owes":{"Adam":3,"Chuck":3},"owed_by":{},"balance":-6}]}' + '{"users":[{"name":"Adam","owes":{},"owed_by":{"Bob":3.0},"balance":3.0},{"name":"Bob","owes":{"Adam":3.0,"Chuck":3.0},"owed_by":{},"balance":-6.0}]}' ), ( '8a8567b3-c097-468a-9541-6bb17d5afc85', 'lender has negative balance', - '{"users":[{"name":"Adam","owes":{},"owed_by":{},"balance":0},{"name":"Bob","owes":{"Chuck":3},"owed_by":{},"balance":-3},{"name":"Chuck","owes":{},"owed_by":{"Bob":3},"balance":3}]}', - '{"lender":"Bob","borrower":"Adam","amount":3}', + '{"users":[{"name":"Adam","owes":{},"owed_by":{},"balance":0.0},{"name":"Bob","owes":{"Chuck":3.0},"owed_by":{},"balance":-3.0},{"name":"Chuck","owes":{},"owed_by":{"Bob":3.0},"balance":3.0}]}', + '{"lender":"Bob","borrower":"Adam","amount":3.0}', '/iou', - '{"users":[{"name":"Adam","owes":{"Bob":3},"owed_by":{},"balance":-3},{"name":"Bob","owes":{"Chuck":3},"owed_by":{"Adam":3},"balance":0}]}' + '{"users":[{"name":"Adam","owes":{"Bob":3.0},"owed_by":{},"balance":-3.0},{"name":"Bob","owes":{"Chuck":3.0},"owed_by":{"Adam":3.0},"balance":0.0}]}' ), ( '29fb7c12-7099-4a85-a7c4-9c290d2dc01a', 'lender owes borrower', - '{"users":[{"name":"Adam","owes":{"Bob":3},"owed_by":{},"balance":-3},{"name":"Bob","owes":{},"owed_by":{"Adam":3},"balance":3}]}', - '{"lender":"Adam","borrower":"Bob","amount":2}', + '{"users":[{"name":"Adam","owes":{"Bob":3.0},"owed_by":{},"balance":-3.0},{"name":"Bob","owes":{},"owed_by":{"Adam":3.0},"balance":3.0}]}', + '{"lender":"Adam","borrower":"Bob","amount":2.0}', '/iou', - '{"users":[{"name":"Adam","owes":{"Bob":1},"owed_by":{},"balance":-1},{"name":"Bob","owes":{},"owed_by":{"Adam":1},"balance":1}]}' + '{"users":[{"name":"Adam","owes":{"Bob":1.0},"owed_by":{},"balance":-1.0},{"name":"Bob","owes":{},"owed_by":{"Adam":1.0},"balance":1.0}]}' ), ( 'ce969e70-163c-4135-a4a6-2c3a5da286f5', 'lender owes borrower less than new loan', - '{"users":[{"name":"Adam","owes":{"Bob":3},"owed_by":{},"balance":-3},{"name":"Bob","owes":{},"owed_by":{"Adam":3},"balance":3}]}', - '{"lender":"Adam","borrower":"Bob","amount":4}', + '{"users":[{"name":"Adam","owes":{"Bob":3.0},"owed_by":{},"balance":-3.0},{"name":"Bob","owes":{},"owed_by":{"Adam":3.0},"balance":3.0}]}', + '{"lender":"Adam","borrower":"Bob","amount":4.0}', '/iou', - '{"users":[{"name":"Adam","owes":{},"owed_by":{"Bob":1},"balance":1},{"name":"Bob","owes":{"Adam":1},"owed_by":{},"balance":-1}]}' + '{"users":[{"name":"Adam","owes":{},"owed_by":{"Bob":1.0},"balance":1.0},{"name":"Bob","owes":{"Adam":1.0},"owed_by":{},"balance":-1.0}]}' ), ( '7f4aafd9-ae9b-4e15-a406-87a87bdf47a4', 'lender owes borrower same as new loan', - '{"users":[{"name":"Adam","owes":{"Bob":3},"owed_by":{},"balance":-3},{"name":"Bob","owes":{},"owed_by":{"Adam":3},"balance":3}]}', - '{"lender":"Adam","borrower":"Bob","amount":3}', + '{"users":[{"name":"Adam","owes":{"Bob":3.0},"owed_by":{},"balance":-3.0},{"name":"Bob","owes":{},"owed_by":{"Adam":3.0},"balance":3.0}]}', + '{"lender":"Adam","borrower":"Bob","amount":3.0}', '/iou', - '{"users":[{"name":"Adam","owes":{},"owed_by":{},"balance":0},{"name":"Bob","owes":{},"owed_by":{},"balance":0}]}' + '{"users":[{"name":"Adam","owes":{},"owed_by":{},"balance":0.0},{"name":"Bob","owes":{},"owed_by":{},"balance":0.0}]}' ); diff --git a/exercises/practice/rest-api/data.csv b/exercises/practice/rest-api/data.csv index f378108e..58f6c34d 100644 --- a/exercises/practice/rest-api/data.csv +++ b/exercises/practice/rest-api/data.csv @@ -1,9 +1,9 @@ "{""users"":[]}","{}","/users","" "{""users"":[]}","{""user"":""Adam""}","/add","" -"{""users"":[{""name"":""Adam"",""owes"":{},""owed_by"":{},""balance"":0},{""name"":""Bob"",""owes"":{},""owed_by"":{},""balance"":0}]}","{""users"":[""Bob""]}","/users","" -"{""users"":[{""name"":""Adam"",""owes"":{},""owed_by"":{},""balance"":0},{""name"":""Bob"",""owes"":{},""owed_by"":{},""balance"":0}]}","{""lender"":""Adam"",""borrower"":""Bob"",""amount"":3}","/iou","" -"{""users"":[{""name"":""Adam"",""owes"":{},""owed_by"":{},""balance"":0},{""name"":""Bob"",""owes"":{""Chuck"":3},""owed_by"":{},""balance"":-3},{""name"":""Chuck"",""owes"":{},""owed_by"":{""Bob"":3},""balance"":3}]}","{""lender"":""Adam"",""borrower"":""Bob"",""amount"":3}","/iou","" -"{""users"":[{""name"":""Adam"",""owes"":{},""owed_by"":{},""balance"":0},{""name"":""Bob"",""owes"":{""Chuck"":3},""owed_by"":{},""balance"":-3},{""name"":""Chuck"",""owes"":{},""owed_by"":{""Bob"":3},""balance"":3}]}","{""lender"":""Bob"",""borrower"":""Adam"",""amount"":3}","/iou","" -"{""users"":[{""name"":""Adam"",""owes"":{""Bob"":3},""owed_by"":{},""balance"":-3},{""name"":""Bob"",""owes"":{},""owed_by"":{""Adam"":3},""balance"":3}]}","{""lender"":""Adam"",""borrower"":""Bob"",""amount"":2}","/iou","" -"{""users"":[{""name"":""Adam"",""owes"":{""Bob"":3},""owed_by"":{},""balance"":-3},{""name"":""Bob"",""owes"":{},""owed_by"":{""Adam"":3},""balance"":3}]}","{""lender"":""Adam"",""borrower"":""Bob"",""amount"":4}","/iou","" -"{""users"":[{""name"":""Adam"",""owes"":{""Bob"":3},""owed_by"":{},""balance"":-3},{""name"":""Bob"",""owes"":{},""owed_by"":{""Adam"":3},""balance"":3}]}","{""lender"":""Adam"",""borrower"":""Bob"",""amount"":3}","/iou","" +"{""users"":[{""name"":""Adam"",""owes"":{},""owed_by"":{},""balance"":0.0},{""name"":""Bob"",""owes"":{},""owed_by"":{},""balance"":0.0}]}","{""users"":[""Bob""]}","/users","" +"{""users"":[{""name"":""Adam"",""owes"":{},""owed_by"":{},""balance"":0.0},{""name"":""Bob"",""owes"":{},""owed_by"":{},""balance"":0.0}]}","{""lender"":""Adam"",""borrower"":""Bob"",""amount"":3.0}","/iou","" +"{""users"":[{""name"":""Adam"",""owes"":{},""owed_by"":{},""balance"":0.0},{""name"":""Bob"",""owes"":{""Chuck"":3.0},""owed_by"":{},""balance"":-3.0},{""name"":""Chuck"",""owes"":{},""owed_by"":{""Bob"":3.0},""balance"":3.0}]}","{""lender"":""Adam"",""borrower"":""Bob"",""amount"":3.0}","/iou","" +"{""users"":[{""name"":""Adam"",""owes"":{},""owed_by"":{},""balance"":0.0},{""name"":""Bob"",""owes"":{""Chuck"":3.0},""owed_by"":{},""balance"":-3.0},{""name"":""Chuck"",""owes"":{},""owed_by"":{""Bob"":3.0},""balance"":3.0}]}","{""lender"":""Bob"",""borrower"":""Adam"",""amount"":3.0}","/iou","" +"{""users"":[{""name"":""Adam"",""owes"":{""Bob"":3.0},""owed_by"":{},""balance"":-3.0},{""name"":""Bob"",""owes"":{},""owed_by"":{""Adam"":3.0},""balance"":3.0}]}","{""lender"":""Adam"",""borrower"":""Bob"",""amount"":2.0}","/iou","" +"{""users"":[{""name"":""Adam"",""owes"":{""Bob"":3.0},""owed_by"":{},""balance"":-3.0},{""name"":""Bob"",""owes"":{},""owed_by"":{""Adam"":3.0},""balance"":3.0}]}","{""lender"":""Adam"",""borrower"":""Bob"",""amount"":4.0}","/iou","" +"{""users"":[{""name"":""Adam"",""owes"":{""Bob"":3.0},""owed_by"":{},""balance"":-3.0},{""name"":""Bob"",""owes"":{},""owed_by"":{""Adam"":3.0},""balance"":3.0}]}","{""lender"":""Adam"",""borrower"":""Bob"",""amount"":3.0}","/iou",""