From ea397ab24bf0592975dfce0887f7e1a62582eec6 Mon Sep 17 00:00:00 2001 From: n-dusan Date: Fri, 8 Dec 2023 19:38:15 +0100 Subject: [PATCH] feat: use `git2` to initialize archive states Rely on git2 to initialize a git repo and add files to the git repository. The framework needs to get more flexible so we can test out different repository states. --- tests/common/mod.rs | 119 +++++++++++++---------- tests/fixtures/static_files/example.js | 0 tests/fixtures/static_files/example.json | 0 tests/fixtures/static_files/example.pdf | Bin 0 -> 38907 bytes tests/fixtures/static_files/index.html | 16 +++ tests/fixtures/static_files/index.rdf | 6 ++ tests/fixtures/static_files/index.xml | 16 +++ 7 files changed, 108 insertions(+), 49 deletions(-) create mode 100644 tests/fixtures/static_files/example.js create mode 100644 tests/fixtures/static_files/example.json create mode 100644 tests/fixtures/static_files/example.pdf create mode 100644 tests/fixtures/static_files/index.html create mode 100644 tests/fixtures/static_files/index.rdf create mode 100644 tests/fixtures/static_files/index.xml diff --git a/tests/common/mod.rs b/tests/common/mod.rs index 2e2d03b..d64a93e 100644 --- a/tests/common/mod.rs +++ b/tests/common/mod.rs @@ -54,11 +54,11 @@ pub fn initialize_archive(archive_type: ArchiveType) -> Result { dbg!(&err); let error_output_directory = path.clone().join(PathBuf::from("error_output_directory")); - std::fs::remove_dir_all(&error_output_directory); + std::fs::remove_dir_all(&error_output_directory).unwrap(); std::fs::rename(td.path(), &error_output_directory) .expect("Failed to move temp directory"); eprintln!( - "{}", format!("Failed to remove '{error_output_directory:?}', please try to do that by hand. Original error: {err}") + "{}", format!("Failed to remove '{error_output_directory:?}', please try to remove directory by hand. Original error: {err}") ); Err(err) } @@ -82,7 +82,8 @@ fn initialize_archive_basic(td: &TempDir) -> Result<()> { org_name.into(), None, false, - ); + ) + .unwrap(); let stele = initialize_stele( td.path().to_path_buf(), org_name, @@ -91,13 +92,13 @@ fn initialize_archive_basic(td: &TempDir) -> Result<()> { DataRepositoryType::Rdf("rdf".into()), DataRepositoryType::Xml("xml".into()), DataRepositoryType::Xml("xml-codified".into()), - DataRepositoryType::Pdf("pdf".into()), + // DataRepositoryType::Pdf("pdf".into()), ], ) .unwrap(); // let law = make_repository("make-law-repo.sh", &path).unwrap(); // let law_html = make_repository("make-law-html-repo.sh", &path).unwrap(); - anyhow::bail!("Something went wrong!"); + // anyhow::bail!("Something went wrong!"); Ok(()) } @@ -129,7 +130,25 @@ pub fn init_auth_repository( std::fs::create_dir_all(&path).unwrap(); let repo = GitRepository::init(&path).unwrap(); - add_repositories_json(&repo, &path)?; + + path.push("targets"); + + let content = r#"{ + "repositories": { + "test_org/law-html": { + "custom": { + "type": "html", + "serve": "historical", + "location_regex": "/", + "routes": [".*"] + } + } + } + }"#; + + repo.add_file(&path, "repositories.json", content).unwrap(); + repo.commit(Some("targets/repositories.json"), "Add repositories.json") + .unwrap(); Ok(repo) } @@ -137,63 +156,65 @@ pub fn init_data_repositories( path: &Path, org_name: &str, data_repositories: &[DataRepositoryType], -) -> Result<()> { +) -> Result> { let mut data_git_repositories: Vec = Vec::new(); for data_type in data_repositories { let mut path = path.to_path_buf(); path.push(format!("{}/law-{}", org_name, data_type.to_string())); + dbg!(&path); std::fs::create_dir_all(&path).unwrap(); let repo = GitRepository::init(&path).unwrap(); - match data_type { - DataRepositoryType::Html(name) => { - add_html(&repo, &path, name)?; - } - DataRepositoryType::Rdf(name) => { - init_rdf_repository(&repo, &path, name)?; - } - DataRepositoryType::Xml(name) => { - init_xml_repository(&repo, &path, name)?; - } - DataRepositoryType::Pdf(name) => { - init_pdf_repository(&repo, &path, name)?; - } - DataRepositoryType::Other(name) => { - init_other_repository(&repo, &path, name)?; - } - } + init_data_repository(&repo, data_type, None)?; + data_git_repositories.push(repo); } - Ok(()) + Ok(data_git_repositories) } -fn add_repositories_json(repo: &GitRepository, path: &Path) -> Result<()> { - let mut path = path.to_path_buf(); - path.push("targets"); - let content = r#"{ - "law": { - "custom": { - "type": "data", - "allow-unauthenticated-commits": true, - "serve": "law", - "routes": [ - "law/{path:.*}" - ], - "serve-prefix": "law", - "is-fallback": true - } +fn init_data_repository( + repo: &GitRepository, + data_type: &DataRepositoryType, + filename: Option<&str>, +) -> Result<()> { + let filename = if let Some(f) = filename { + f + } else { + match data_type { + DataRepositoryType::Html(_) => "index.html", + DataRepositoryType::Rdf(_) => "index.rdf", + DataRepositoryType::Xml(_) => "index.xml", + DataRepositoryType::Pdf(_) => "example.pdf", + DataRepositoryType::Other(_) => "example.other", } - }"#; + }; - repo.write_file(&path, "repositories.json", content) - .unwrap(); - repo.commit("targets/repositories.json", "Add repositories.json") - .unwrap(); + let file_content = static_file_content(filename); + + for subdirectory in ["./", "./a/", "./a/b/", "./a/b/c", "./a/d/"] { + repo.add_file( + &repo.path.join(subdirectory), + filename, + file_content.as_str(), + )?; + } + repo.commit(None, "Add initial data")?; + let filename = { + let ext = Path::new(filename) + .extension() + .map_or("html", |ext| ext.to_str().map_or("", |ext_str| ext_str)); + + format!("c.{}", ext) + }; + repo.add_file(&repo.path.join("./a/b/"), &filename, file_content.as_str())?; + repo.commit(None, "Update repository")?; Ok(()) } -pub fn make_repository(script_name: &str, path: &Path) -> Result<()> { - archive_testtools::execute_script(script_name, path.canonicalize()?)?; - // TODO: return repository - Ok(()) + +fn static_file_content(filename: &str) -> String { + let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + path.push("tests/fixtures/static_files"); + path.push(filename); + std::fs::read_to_string(path).unwrap() } /// Used to initialize the test environment for git micro-server. diff --git a/tests/fixtures/static_files/example.js b/tests/fixtures/static_files/example.js new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/static_files/example.json b/tests/fixtures/static_files/example.json new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/static_files/example.pdf b/tests/fixtures/static_files/example.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6ec6ce0a1bc251a293bdcf6e6e4cbc6af8552fd2 GIT binary patch literal 38907 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/static_files/index.html b/tests/fixtures/static_files/index.html new file mode 100644 index 0000000..d8356a5 --- /dev/null +++ b/tests/fixtures/static_files/index.html @@ -0,0 +1,16 @@ + + + + + + index.html + + + + + +

index.html

+ +

+ + \ No newline at end of file diff --git a/tests/fixtures/static_files/index.rdf b/tests/fixtures/static_files/index.rdf new file mode 100644 index 0000000..05f598c --- /dev/null +++ b/tests/fixtures/static_files/index.rdf @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/tests/fixtures/static_files/index.xml b/tests/fixtures/static_files/index.xml new file mode 100644 index 0000000..9c91740 --- /dev/null +++ b/tests/fixtures/static_files/index.xml @@ -0,0 +1,16 @@ + + + Law Library + + + + help@contact.org + + 2023-12-22 + + + Resolutions + + + + \ No newline at end of file