use quarb_github::GithubAdapter;
use std::io::Write;
use std::os::unix::fs::PermissionsExt;
#[test]
fn mock_github() {
let dir = tempfile::tempdir().unwrap();
let script = dir.path().join("gh");
let fixtures = format!("{}/tests/fixtures", env!("CARGO_MANIFEST_DIR"));
let mut f = std::fs::File::create(&script).unwrap();
write!(
f,
"#!/bin/sh\n\
[ \"$1\" = api ] || exit 2\n\
p=\"${{2%%\\?*}}\"\n\
f=\"{fixtures}/$(printf %s \"$p\" | tr / _).json\"\n\
[ -f \"$f\" ] || {{ echo \"HTTP 404: no fixture for $p\" >&2; exit 1; }}\n\
cat \"$f\"\n"
)
.unwrap();
drop(f);
std::fs::set_permissions(&script, std::fs::Permissions::from_mode(0o755)).unwrap();
unsafe { std::env::set_var("QUARB_GH", &script) };
let a = GithubAdapter::connect("github:").unwrap();
let v = |q: &str| match quarb::run(q, &a).unwrap() {
quarb::QueryResult::Values(vs) => vs.iter().map(|v| v.to_string()).collect::<Vec<_>>(),
quarb::QueryResult::Nodes(ns) => ns.iter().map(|&n| a.locator(n)).collect(),
};
assert_eq!(v("/ada::name"), ["Ada Lovelace"]);
assert_eq!(v("/ada/*::name @| sort"), ["boiler", "fork-of-kettle"]);
assert_eq!(v("/ada/boiler::stars"), ["42"]);
assert_eq!(v("/ada/boiler::license"), ["MIT"]);
assert_eq!(v("/ada/*<cli>::name"), ["boiler"]);
assert_eq!(v("/ada/*<fork>::name"), ["fork-of-kettle"]);
assert_eq!(v("/ada/boiler/issues/* @| count"), ["1"]);
assert_eq!(v("/ada/boiler/issues/*<bug>::title"), ["Steam leak"]);
assert_eq!(v("/ada/boiler/issues/3::state"), ["closed"]);
assert_eq!(v("/ada/boiler/pulls/2::head"), ["valve"]);
assert_eq!(v("/ada/boiler/releases/*::tag"), ["v1.0"]);
assert_eq!(v("/ada/boiler/files/*<dir>"), ["/ada/boiler/files/src"]);
assert_eq!(v("/ada/boiler/files/README.md::"), ["boil the ocean\n"]);
assert_eq!(
v("/ada/boiler/files/src/main.rs::size"),
["20"]
);
assert_eq!(v("/ada->follows::login"), ["grace"]);
assert_eq!(v("/grace<-follows::login"), ["ada"]);
assert_eq!(v("/ada->org::login"), ["tesslab"]);
assert_eq!(v("/tesslab<-org::login"), ["ada"]);
assert_eq!(v("/tesslab<org>::name"), ["Tesla Lab"]);
assert_eq!(v("/tesslab<group>::name"), ["Tesla Lab"]);
assert_eq!(v("/ada->starred::name"), ["kettle"]);
assert_eq!(v("/tesslab/kettle<-parent::full-name"), ["ada/fork-of-kettle"]);
assert_eq!(v("/ada/*<fork>::parent"), ["tesslab/kettle"]);
assert_eq!(v("/ada/fork-of-kettle::parent~>::owner"), ["tesslab"]);
assert_eq!(
v("/ada/boiler(->contributor[$-::contributions > 100])::login"),
["ada"]
);
assert_eq!(v("/ada/boiler/issues/1->author::login"), ["grace"]);
assert_eq!(v("/ada/boiler/issues/1->assignee::login"), ["ada"]);
assert_eq!(v("/ada/boiler/issues/1::author~>::bio"), ["compiler pioneer"]);
assert_eq!(v("/ada/*[::created > 2015-01-01] @| count"), ["2"]);
assert_eq!(v("/ada/boiler/issues/1::"), ["It hisses."]);
let b = GithubAdapter::connect("github:ada/boiler").unwrap();
let vb = |q: &str| match quarb::run(q, &b).unwrap() {
quarb::QueryResult::Values(vs) => vs.iter().map(|v| v.to_string()).collect::<Vec<_>>(),
quarb::QueryResult::Nodes(ns) => ns.iter().map(|&n| b.locator(n)).collect(),
};
assert_eq!(vb("/*::stars"), ["42"]);
}