From 22a6b1c93e6dfaad03e5f957c7040c04f817e493 Mon Sep 17 00:00:00 2001 From: "David E. Wheeler" Date: Tue, 30 Jul 2024 13:54:16 -0400 Subject: [PATCH] Move v1 corpus to files --- src/valid/mod.rs | 86 ++++++++++++++++++------------------- tests/common/mod.rs | 25 +++++++++++ tests/corpus/v1/howto.json | 19 ++++++++ tests/corpus/v1/howto2.json | 39 +++++++++++++++++ tests/corpus/v1/invalid.txt | 1 - tests/corpus/v1/valid.txt | 3 -- tests/corpus/v1/widget.json | 36 ++++++++++++++++ tests/v1_schema_test.rs | 48 +-------------------- tests/v2_schema_test.rs | 23 +--------- 9 files changed, 164 insertions(+), 116 deletions(-) create mode 100644 tests/corpus/v1/howto.json create mode 100644 tests/corpus/v1/howto2.json delete mode 100644 tests/corpus/v1/invalid.txt delete mode 100644 tests/corpus/v1/valid.txt create mode 100644 tests/corpus/v1/widget.json diff --git a/src/valid/mod.rs b/src/valid/mod.rs index e4fdfb4..294e599 100644 --- a/src/valid/mod.rs +++ b/src/valid/mod.rs @@ -124,46 +124,46 @@ fn is_license(v: &Value) -> Result<(), Box> { Ok(()) } -#[cfg(test)] -mod tests { - use super::*; - use serde::{Deserialize, Serialize}; - use serde_json::Value; - use std::error::Error; - use std::io::{prelude::*, BufReader}; - use std::path::PathBuf; - - #[derive(Deserialize, Serialize)] - struct CorpusCase { - test: String, - error: Option, - meta: Value, - } - - #[test] - fn test_validator() -> Result<(), Box> { - let schemas_dir: PathBuf = [env!("CARGO_MANIFEST_DIR"), "schema"].iter().collect(); - - let mut validator = Validator::new(schemas_dir)?; - let valid_file: PathBuf = [ - env!("CARGO_MANIFEST_DIR"), - "tests", - "corpus", - "v1", - "valid.txt", - ] - .iter() - .collect(); - let file = File::open(&valid_file)?; - let reader = BufReader::new(file); - for line in reader.lines() { - let tc: CorpusCase = serde_json::from_str(&line?)?; - if let Err(e) = validator.validate(&tc.meta) { - panic!("{} failed: {e}", &tc.test); - } - println!("Example {} ok", &tc.test); - } - - Ok(()) - } -} +// #[cfg(test)] +// mod tests { +// use super::*; +// use serde::{Deserialize, Serialize}; +// use serde_json::Value; +// use std::error::Error; +// use std::io::{prelude::*, BufReader}; +// use std::path::PathBuf; + +// #[derive(Deserialize, Serialize)] +// struct CorpusCase { +// test: String, +// error: Option, +// meta: Value, +// } + +// #[test] +// fn test_validator() -> Result<(), Box> { +// let schemas_dir: PathBuf = [env!("CARGO_MANIFEST_DIR"), "schema"].iter().collect(); + +// let mut validator = Validator::new(schemas_dir)?; +// let valid_file: PathBuf = [ +// env!("CARGO_MANIFEST_DIR"), +// "tests", +// "corpus", +// "v1", +// "valid.txt", +// ] +// .iter() +// .collect(); +// let file = File::open(&valid_file)?; +// let reader = BufReader::new(file); +// for line in reader.lines() { +// let tc: CorpusCase = serde_json::from_str(&line?)?; +// if let Err(e) = validator.validate(&tc.meta) { +// panic!("{} failed: {e}", &tc.test); +// } +// println!("Example {} ok", &tc.test); +// } + +// Ok(()) +// } +// } diff --git a/tests/common/mod.rs b/tests/common/mod.rs index 5fdd14f..30e5287 100644 --- a/tests/common/mod.rs +++ b/tests/common/mod.rs @@ -1,8 +1,11 @@ use std::fs::{self, File}; +use std::path::PathBuf; use std::{collections::HashMap, error::Error}; use boon::{Compiler, Schemas}; +use pgxn_meta::*; use serde_json::{json, Value}; +use wax::Glob; const SCHEMA_BASE: &str = "https://pgxn.org/meta/v"; @@ -237,3 +240,25 @@ pub fn test_schema_version(version: u8) -> Result<(), Box> { Ok(()) } + +pub fn test_corpus(version: u8) -> Result<(), Box> { + let schemas_dir: PathBuf = [env!("CARGO_MANIFEST_DIR"), "schema"].iter().collect(); + let mut validator = Validator::new(schemas_dir)?; + let v_dir = format!("v{version}"); + + let dir: PathBuf = [env!("CARGO_MANIFEST_DIR"), "tests", "corpus", &v_dir] + .iter() + .collect(); + let glob = Glob::new("*.json")?; + + for path in glob.walk(dir) { + let path = path?.into_path(); + let meta: Value = serde_json::from_reader(File::open(&path)?)?; + if let Err(e) = validator.validate(&meta) { + panic!("{v_dir}/{:?} failed: {e}", path.file_name().unwrap()); + } + println!("Example {v_dir}/{:?} ok", path.file_name().unwrap()); + } + + Ok(()) +} diff --git a/tests/corpus/v1/howto.json b/tests/corpus/v1/howto.json new file mode 100644 index 0000000..538f12b --- /dev/null +++ b/tests/corpus/v1/howto.json @@ -0,0 +1,19 @@ +{ + "name": "pair", + "abstract": "A key/value pair data type", + "version": "0.1.0", + "maintainer": "David E. Wheeler ", + "license": "postgresql", + "provides": { + "pair": { + "abstract": "A key/value pair data type", + "file": "sql/pair.sql", + "docfile": "doc/pair.md", + "version": "0.1.0" + } + }, + "meta-spec": { + "version": "1.0.0", + "url": "https://pgxn.org/meta/spec.txt" + } +} diff --git a/tests/corpus/v1/howto2.json b/tests/corpus/v1/howto2.json new file mode 100644 index 0000000..2da2b22 --- /dev/null +++ b/tests/corpus/v1/howto2.json @@ -0,0 +1,39 @@ +{ + "name": "pair", + "abstract": "A key/value pair data type", + "description": "This library contains a single PostgreSQL extension, a key/value pair data type called “pair”, along with a convenience function for constructing key/value pairs.", + "version": "0.1.4", + "maintainer": ["David E. Wheeler "], + "license": "postgresql", + "provides": { + "pair": { + "abstract": "A key/value pair data type", + "file": "sql/pair.sql", + "docfile": "doc/pair.md", + "version": "0.1.0" + } + }, + "resources": { + "bugtracker": { + "web": "https://github.com/theory/kv-pair/issues/" + }, + "repository": { + "url": "git://github.com/theory/kv-pair.git", + "web": "https://github.com/theory/kv-pair/", + "type": "git" + } + }, + "generated_by": "David E. Wheeler", + "meta-spec": { + "version": "1.0.0", + "url": "https://pgxn.org/meta/spec.txt" + }, + "tags": [ + "variadic function", + "ordered pair", + "pair", + "key value", + "key value pair", + "data type" + ] +} diff --git a/tests/corpus/v1/invalid.txt b/tests/corpus/v1/invalid.txt deleted file mode 100644 index 0cccc65..0000000 --- a/tests/corpus/v1/invalid.txt +++ /dev/null @@ -1 +0,0 @@ -{"test":"no_version","error":"missing properties 'version'","meta":{"name":"pair","abstract":"A key/value pair data type","maintainer":"David E. Wheeler ","license":"postgresql","provides":{"pair":{"abstract":"A key/value pair data type","file":"sql/pair.sql","docfile":"doc/pair.md","version":"0.1.0"}},"meta-spec":{"version":"1.0.0","url":"https://pgxn.org/meta/spec.txt"}}} diff --git a/tests/corpus/v1/valid.txt b/tests/corpus/v1/valid.txt deleted file mode 100644 index ae9d804..0000000 --- a/tests/corpus/v1/valid.txt +++ /dev/null @@ -1,3 +0,0 @@ -{"test":"howto1","meta":{"name":"pair","abstract":"A key/value pair data type","version":"0.1.0","maintainer":"David E. Wheeler ","license":"postgresql","provides":{"pair":{"abstract":"A key/value pair data type","file":"sql/pair.sql","docfile":"doc/pair.md","version":"0.1.0"}},"meta-spec":{"version":"1.0.0","url":"https://pgxn.org/meta/spec.txt"}}} -{"test":"howto2","meta":{"name":"pair","abstract":"A key/value pair data type","description":"This library contains a single PostgreSQL extension, a key/value pair data type called “pair”, along with a convenience function for constructing key/value pairs.","version":"0.1.4","maintainer":["David E. Wheeler "],"license":"postgresql","provides":{"pair":{"abstract":"A key/value pair data type","file":"sql/pair.sql","docfile":"doc/pair.md","version":"0.1.0"}},"resources":{"bugtracker":{"web":"https://github.com/theory/kv-pair/issues/"},"repository":{"url":"git://github.com/theory/kv-pair.git","web":"https://github.com/theory/kv-pair/","type":"git"}},"generated_by":"David E. Wheeler","meta-spec":{"version":"1.0.0","url":"https://pgxn.org/meta/spec.txt"},"tags":["variadic function","ordered pair","pair","key value","key value pair","data type"]}} -{"test":"widget","meta":{"name":"widget","abstract":"Widget for PostgreSQL","description":"¿A widget is just thing thing, yoŭ know?","version":"0.2.5","maintainer":["David E. Wheeler "],"license":{"PostgreSQL":"https://www.postgresql.org/about/licence"},"prereqs":{"runtime":{"requires":{"plpgsql":0,"PostgreSQL":"8.0.0"},"recommends":{"PostgreSQL":"8.4.0"}}},"provides":{"widget":{"file":"sql/widget.sql.in","version":"0.2.5"}},"resources":{"homepage":"http://widget.example.org/"},"generated_by":"theory","meta-spec":{"version":"1.0.0","url":"https://pgxn.org/meta/spec.txt"},"tags":["widget","gadget","full text search"]}} diff --git a/tests/corpus/v1/widget.json b/tests/corpus/v1/widget.json new file mode 100644 index 0000000..0e39d92 --- /dev/null +++ b/tests/corpus/v1/widget.json @@ -0,0 +1,36 @@ +{ + "name": "widget", + "abstract": "Widget for PostgreSQL", + "description": "¿A widget is just thing thing, yoŭ know?", + "version": "0.2.5", + "maintainer": ["David E. Wheeler "], + "license": { + "PostgreSQL": "https://www.postgresql.org/about/licence" + }, + "prereqs": { + "runtime": { + "requires": { + "plpgsql": 0, + "PostgreSQL": "8.0.0" + }, + "recommends": { + "PostgreSQL": "8.4.0" + } + } + }, + "provides": { + "widget": { + "file": "sql/widget.sql.in", + "version": "0.2.5" + } + }, + "resources": { + "homepage": "http://widget.example.org/" + }, + "generated_by": "theory", + "meta-spec": { + "version": "1.0.0", + "url": "https://pgxn.org/meta/spec.txt" + }, + "tags": ["widget", "gadget", "full text search"] +} diff --git a/tests/v1_schema_test.rs b/tests/v1_schema_test.rs index 6299575..304a4f0 100644 --- a/tests/v1_schema_test.rs +++ b/tests/v1_schema_test.rs @@ -1,6 +1,4 @@ use std::error::Error; -use std::fs::File; -use std::io::{prelude::*, BufReader}; use boon::Schemas; use serde::{Deserialize, Serialize}; @@ -28,51 +26,7 @@ struct CorpusCase { #[test] fn test_corpus_v1_valid() -> Result<(), Box> { - // Load the schemas and compile the root schema. - let mut compiler = new_compiler("schema/v1")?; - let mut schemas = Schemas::new(); - let id = id_for(SCHEMA_VERSION, "distribution"); - let index = compiler.compile(&id, &mut schemas)?; - - // Test each meta JSON in the corpus. - let file = File::open("tests/corpus/v1/valid.txt")?; - let reader = BufReader::new(file); - for line in reader.lines() { - let tc: CorpusCase = serde_json::from_str(&line?)?; - - if let Err(e) = schemas.validate(&tc.meta, index) { - panic!("{} failed: {e}", &tc.test); - } - println!("Example {} ok", &tc.test); - } - - Ok(()) -} - -#[test] -fn test_corpus_v1_invalid() -> Result<(), Box> { - // Load the schemas and compile the root schema. - let mut compiler = new_compiler("schema/v1")?; - let mut schemas = Schemas::new(); - let id = id_for(SCHEMA_VERSION, "distribution"); - let index = compiler.compile(&id, &mut schemas)?; - - // Test each meta JSON in the corpus. - let file = File::open("tests/corpus/v1/invalid.txt")?; - let reader = BufReader::new(file); - for line in reader.lines() { - let tc: CorpusCase = serde_json::from_str(&line?)?; - match schemas.validate(&tc.meta, index) { - Ok(_) => panic!("{} unexpectedly passed!", &tc.test), - Err(e) => assert!( - e.to_string().contains(&tc.error.unwrap()), - "{} error: {e}", - &tc.test, - ), - } - } - - Ok(()) + test_corpus(1) } #[test] diff --git a/tests/v2_schema_test.rs b/tests/v2_schema_test.rs index 7b76d04..37e0c18 100644 --- a/tests/v2_schema_test.rs +++ b/tests/v2_schema_test.rs @@ -1,18 +1,14 @@ use std::error::Error; -use std::fs::File; -use std::path::PathBuf; use boon::Schemas; use serde::{Deserialize, Serialize}; use serde_json::{json, Map, Value}; -use wax::Glob; // importing common module. mod common; use common::*; use pgxn_meta::valid::_test_support::*; -use pgxn_meta::*; const SCHEMA_VERSION: u8 = 2; @@ -3348,22 +3344,5 @@ struct CorpusCase { #[test] fn test_corpus_v2_valid() -> Result<(), Box> { - let schemas_dir: PathBuf = [env!("CARGO_MANIFEST_DIR"), "schema"].iter().collect(); - let mut validator = Validator::new(schemas_dir)?; - - let dir: PathBuf = [env!("CARGO_MANIFEST_DIR"), "tests", "corpus", "v2"] - .iter() - .collect(); - let glob = Glob::new("*.json")?; - - for path in glob.walk(dir) { - let path = path?.into_path(); - let meta: Value = serde_json::from_reader(File::open(&path)?)?; - if let Err(e) = validator.validate(&meta) { - panic!("{:?} failed: {e}", path.file_name().unwrap()); - } - println!("Example {:?} ok", path.file_name().unwrap()); - } - - Ok(()) + test_corpus(2) }