#[allow(dead_code)] #[path = "../examples/quote_spec.rs"]
mod quote_spec;
use cairn_core::{lower, serve_request, Editor, HttpResponse, Store};
#[test]
fn the_json_quote_api_runs_on_json_and_the_stdlib() {
let editor = Editor::new(Store::open_in_memory().unwrap());
let (module, report) = editor
.apply_module("e_spec::quote_module_spec())
.unwrap();
assert!(
report.ok(),
"the quote app did not type-check: {:?}",
report.violations
);
assert_eq!(report.status, cairn_core::Status::Complete);
let wasm = lower(editor.store(), &module).unwrap();
let go = |body: &str| serve_request(&wasm, "route", "POST", "/", body).unwrap();
let ok = |body: &str| HttpResponse {
status: 200,
body: body.into(),
};
assert_eq!(
go(r#"[{"qty":2,"price":150},{"qty":1,"price":300}]"#),
ok(r#"{"count":2,"total_cents":600,"total":"$6.00"}"#)
);
assert_eq!(
go("[]"),
ok(r#"{"count":0,"total_cents":0,"total":"$0.00"}"#)
);
assert_eq!(
go(r#"[{"qty":1,"price":5}]"#),
ok(r#"{"count":1,"total_cents":5,"total":"$0.05"}"#)
);
assert_eq!(
go(r#"[{"qty":1,"price":60}]"#),
ok(r#"{"count":1,"total_cents":60,"total":"$0.60"}"#)
);
assert_eq!(
go(r#"[{"qty":3,"price":205}]"#),
ok(r#"{"count":1,"total_cents":615,"total":"$6.15"}"#)
);
assert_eq!(
go(r#" [ { "qty": 2 , "price": 150 } ] "#),
ok(r#"{"count":1,"total_cents":300,"total":"$3.00"}"#)
);
let bad = HttpResponse {
status: 400,
body: "expected a JSON array".into(),
};
assert_eq!(go(r#"{"x":1}"#), bad); assert_eq!(go(r#""hi""#), bad); assert_eq!(go("42"), bad); assert_eq!(go("true"), bad); assert_eq!(go(""), bad); }