Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 14 additions & 13 deletions exercises/practice/rest-api/.meta/template.j2
Original file line number Diff line number Diff line change
Expand Up @@ -47,20 +47,21 @@ expect {
{% endfor %}
{% endfor %}

is_equivalent_to : Str, Str -> Try(Bool, _)
is_equivalent_to = |result_json, expected_json| {
if expected_json.contains("\"users\"") {
expected : RestApi.Database
expected = Json.parse(expected_json)?
result : RestApi.Database
result = Json.parse(result_json)?
Ok(result == expected)
} else {
expected : RestApi.User
expected = Json.parse(expected_json)?
result : RestApi.User
result = Json.parse(result_json)?
Ok(result == expected)
}
if expected_json.contains("\"users\"") {
expected : RestApi.Database
expected = Json.parse(expected_json)?
result : RestApi.Database
result = Json.parse(result_json)?
Ok(result == expected)
} else {
expected : RestApi.User
expected = Json.parse(expected_json)?
result : RestApi.User
result = Json.parse(result_json)?
Ok(result == expected)
}
}

{{ macros.footer() }}
39 changes: 20 additions & 19 deletions exercises/practice/rest-api/rest-api-test.roc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# These tests are auto-generated with test data from:
# https://github.com/exercism/problem-specifications/tree/main/exercises/rest-api/canonical-data.json
# File last updated on 2026-08-01
# File last updated on 2026-08-15

import RestApi exposing [get, post]

Expand All @@ -12,18 +12,18 @@ import RestApi exposing [get, post]
expect {
database = { users: [] }
result_json = database
-> get({ url: "/users", payload: "" })?
|> get({ url: "/users", payload: "" })?
expected_json = "{\"users\": []}"
result_json -> is_equivalent_to(expected_json)?
result_json |> is_equivalent_to(expected_json)?
}

# add user
expect {
database = { users: [] }
result_json = database
-> post({ url: "/add", payload: "{\"user\": \"Adam\"}" })?
|> post({ url: "/add", payload: "{\"user\": \"Adam\"}" })?
expected_json = "{\"balance\": 0.0, \"name\": \"Adam\", \"owed_by\": {}, \"owes\": {}}"
result_json -> is_equivalent_to(expected_json)?
result_json |> is_equivalent_to(expected_json)?
}

# get single user
Expand All @@ -45,9 +45,9 @@ expect {
],
}
result_json = database
-> get({ url: "/users", payload: "{\"users\": [\"Bob\"]}" })?
|> get({ url: "/users", payload: "{\"users\": [\"Bob\"]}" })?
expected_json = "{\"users\": [{\"balance\": 0.0, \"name\": \"Bob\", \"owed_by\": {}, \"owes\": {}}]}"
result_json -> is_equivalent_to(expected_json)?
result_json |> is_equivalent_to(expected_json)?
}

##
Expand All @@ -73,9 +73,9 @@ expect {
],
}
result_json = database
-> post({ url: "/iou", payload: "{\"amount\": 3.0, \"borrower\": \"Bob\", \"lender\": \"Adam\"}" })?
|> post({ url: "/iou", payload: "{\"amount\": 3.0, \"borrower\": \"Bob\", \"lender\": \"Adam\"}" })?
expected_json = "{\"users\": [{\"balance\": 3.0, \"name\": \"Adam\", \"owed_by\": {\"Bob\": 3.0}, \"owes\": {}}, {\"balance\": -3.0, \"name\": \"Bob\", \"owed_by\": {}, \"owes\": {\"Adam\": 3.0}}]}"
result_json -> is_equivalent_to(expected_json)?
result_json |> is_equivalent_to(expected_json)?
}

# borrower has negative balance
Expand Down Expand Up @@ -107,9 +107,9 @@ expect {
],
}
result_json = database
-> post({ url: "/iou", payload: "{\"amount\": 3.0, \"borrower\": \"Bob\", \"lender\": \"Adam\"}" })?
|> post({ url: "/iou", payload: "{\"amount\": 3.0, \"borrower\": \"Bob\", \"lender\": \"Adam\"}" })?
expected_json = "{\"users\": [{\"balance\": 3.0, \"name\": \"Adam\", \"owed_by\": {\"Bob\": 3.0}, \"owes\": {}}, {\"balance\": -6.0, \"name\": \"Bob\", \"owed_by\": {}, \"owes\": {\"Adam\": 3.0, \"Chuck\": 3.0}}]}"
result_json -> is_equivalent_to(expected_json)?
result_json |> is_equivalent_to(expected_json)?
}

# lender has negative balance
Expand Down Expand Up @@ -141,9 +141,9 @@ expect {
],
}
result_json = database
-> post({ url: "/iou", payload: "{\"amount\": 3.0, \"borrower\": \"Adam\", \"lender\": \"Bob\"}" })?
|> post({ url: "/iou", payload: "{\"amount\": 3.0, \"borrower\": \"Adam\", \"lender\": \"Bob\"}" })?
expected_json = "{\"users\": [{\"balance\": -3.0, \"name\": \"Adam\", \"owed_by\": {}, \"owes\": {\"Bob\": 3.0}}, {\"balance\": 0.0, \"name\": \"Bob\", \"owed_by\": {\"Adam\": 3.0}, \"owes\": {\"Chuck\": 3.0}}]}"
result_json -> is_equivalent_to(expected_json)?
result_json |> is_equivalent_to(expected_json)?
}

# lender owes borrower
Expand All @@ -169,9 +169,9 @@ expect {
],
}
result_json = database
-> post({ url: "/iou", payload: "{\"amount\": 2.0, \"borrower\": \"Bob\", \"lender\": \"Adam\"}" })?
|> post({ url: "/iou", payload: "{\"amount\": 2.0, \"borrower\": \"Bob\", \"lender\": \"Adam\"}" })?
expected_json = "{\"users\": [{\"balance\": -1.0, \"name\": \"Adam\", \"owed_by\": {}, \"owes\": {\"Bob\": 1.0}}, {\"balance\": 1.0, \"name\": \"Bob\", \"owed_by\": {\"Adam\": 1.0}, \"owes\": {}}]}"
result_json -> is_equivalent_to(expected_json)?
result_json |> is_equivalent_to(expected_json)?
}

# lender owes borrower less than new loan
Expand All @@ -197,9 +197,9 @@ expect {
],
}
result_json = database
-> post({ url: "/iou", payload: "{\"amount\": 4.0, \"borrower\": \"Bob\", \"lender\": \"Adam\"}" })?
|> post({ url: "/iou", payload: "{\"amount\": 4.0, \"borrower\": \"Bob\", \"lender\": \"Adam\"}" })?
expected_json = "{\"users\": [{\"balance\": 1.0, \"name\": \"Adam\", \"owed_by\": {\"Bob\": 1.0}, \"owes\": {}}, {\"balance\": -1.0, \"name\": \"Bob\", \"owed_by\": {}, \"owes\": {\"Adam\": 1.0}}]}"
result_json -> is_equivalent_to(expected_json)?
result_json |> is_equivalent_to(expected_json)?
}

# lender owes borrower same as new loan
Expand All @@ -225,11 +225,12 @@ expect {
],
}
result_json = database
-> post({ url: "/iou", payload: "{\"amount\": 3.0, \"borrower\": \"Bob\", \"lender\": \"Adam\"}" })?
|> post({ url: "/iou", payload: "{\"amount\": 3.0, \"borrower\": \"Bob\", \"lender\": \"Adam\"}" })?
expected_json = "{\"users\": [{\"balance\": 0.0, \"name\": \"Adam\", \"owed_by\": {}, \"owes\": {}}, {\"balance\": 0.0, \"name\": \"Bob\", \"owed_by\": {}, \"owes\": {}}]}"
result_json -> is_equivalent_to(expected_json)?
result_json |> is_equivalent_to(expected_json)?
}

is_equivalent_to : Str, Str -> Try(Bool, _)
is_equivalent_to = |result_json, expected_json| {
if expected_json.contains("\"users\"") {
expected : RestApi.Database
Expand Down