use std::path::PathBuf;
use assert_cmd::Command;
use predicates::prelude::*;
use serial_test::serial;
use tempfile::tempdir;
fn learner() -> Command { Command::cargo_bin("learner").unwrap() }
fn temp_db() -> (tempfile::TempDir, PathBuf) {
let dir = tempdir().unwrap();
let db_path = dir.path().join("test.db");
(dir, db_path)
}
#[ignore]
#[test]
#[serial]
fn test_init_and_clean() {
let (dir, db_path) = temp_db();
learner()
.arg("init")
.arg("--path")
.arg(&db_path)
.arg("--accept-defaults")
.assert()
.success()
.stdout(predicate::str::contains("initialized successfully"));
assert!(db_path.exists());
learner()
.arg("clean")
.arg("--path")
.arg(&db_path)
.arg("--accept-defaults")
.assert()
.success()
.stdout(predicate::str::contains("Database files cleaned"));
assert!(!db_path.exists());
dir.close().unwrap();
}
#[ignore]
#[tokio::test]
#[serial]
async fn test_basic_paper_workflow() {
let (dir, db_path) = temp_db();
learner().arg("init").arg("--path").arg(&db_path).arg("--accept-defaults").assert().success();
learner()
.arg("add")
.arg("2301.07041")
.arg("--path")
.arg(&db_path)
.arg("--accept-defaults")
.assert()
.success()
.stdout(predicate::str::contains("Found paper"))
.stdout(predicate::str::contains("Verifiable Fully Homomorphic"));
learner()
.arg("add")
.arg("2301.07041")
.arg("--path")
.arg(&db_path)
.arg("--accept-defaults")
.assert()
.success()
.stdout(predicate::str::contains("already in your database"));
learner()
.arg("get")
.arg("arxiv")
.arg("2301.07041")
.arg("--path")
.arg(&db_path)
.arg("--accept-defaults")
.assert()
.success()
.stdout(predicate::str::contains("Paper details"))
.stdout(predicate::str::contains("Verifiable Fully Homomorphic"));
learner()
.arg("search")
.arg("Homomorphic")
.arg("--path")
.arg(&db_path)
.arg("--accept-defaults")
.assert()
.success()
.stdout(predicate::str::contains("Found"))
.stdout(predicate::str::contains("Verifiable Fully Homomorphic"));
learner()
.arg("search")
.arg("ThisPaperDoesNotExist123")
.arg("--path")
.arg(&db_path)
.arg("--accept-defaults")
.assert()
.success()
.stdout(predicate::str::contains("No papers found"));
dir.close().unwrap();
}