Skip to content

Commit c0b7721

Browse files
committed
Add valid and invalid test corpuses
1 parent e1b1034 commit c0b7721

File tree

5 files changed

+94
-7
lines changed

5 files changed

+94
-7
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,6 @@ exclude = [ ".github", ".gitattributes", "target", ".vscode", ".gitignore" ]
1515
[dev-dependencies]
1616
boon = "0.6"
1717
serde_json = "1.0"
18+
19+
[dependencies]
20+
serde = { version = "1", features = ["derive"] }

tests/corpus/v1/invalid.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"test":"no_version","error":"missing properties 'version'","meta":{"name":"pair","abstract":"A key/value pair data type","maintainer":"David E. Wheeler <[email protected]>","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"}}}

tests/corpus/v1/valid.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{"test":"howto1","meta":{"name":"pair","abstract":"A key/value pair data type","version":"0.1.0","maintainer":"David E. Wheeler <[email protected]>","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"}}}
2+
{"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 <[email protected]>"],"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"]}}
3+
{"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 <[email protected]>"],"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"]}}

tests/test.rs

Lines changed: 86 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
use std::{
2-
collections::HashMap,
3-
error::Error,
4-
fs::{self, File},
5-
};
1+
use std::fs::{self, File};
2+
use std::io::{prelude::*, BufReader};
3+
use std::{collections::HashMap, error::Error};
64

75
use boon::{Compiler, Schemas};
6+
use serde::{Deserialize, Serialize};
87
use serde_json::Value;
98

109
#[test]
@@ -34,11 +33,13 @@ fn test_schema_v1() -> Result<(), Box<dyn Error>> {
3433
} else {
3534
panic!("Unable to find ID in {}", path.display());
3635
}
36+
} else {
37+
println!("Skipping {}", path.display());
3738
}
3839
}
3940

4041
// Make sure we found schemas.
41-
assert!(!loaded.is_empty());
42+
assert!(!loaded.is_empty(), "No schemas loaded!");
4243

4344
// Make sure each schema we loaded is valid.
4445
let mut schemas = Schemas::new();
@@ -51,7 +52,85 @@ fn test_schema_v1() -> Result<(), Box<dyn Error>> {
5152
if let Err(e) = schemas.validate(example, index) {
5253
panic!("Example {i} failed: {e}");
5354
}
54-
println!(" Example {i} ok");
55+
// println!(" Example {i} ok");
56+
}
57+
}
58+
59+
Ok(())
60+
}
61+
62+
fn new_compiler(dir: &str) -> Result<Compiler, Box<dyn Error>> {
63+
let mut compiler = Compiler::new();
64+
let paths = fs::read_dir(dir)?;
65+
for path in paths {
66+
let path = path?.path();
67+
let bn = path.file_name().unwrap().to_str().unwrap();
68+
if bn.ends_with(".schema.json") {
69+
let schema: Value = serde_json::from_reader(File::open(path.clone())?)?;
70+
if let Value::String(s) = &schema["$id"] {
71+
// Add the schema to the compiler.
72+
compiler.add_resource(s, schema.to_owned())?;
73+
} else {
74+
panic!("Unable to find ID in {}", path.display());
75+
}
76+
} else {
77+
println!("Skipping {}", path.display());
78+
}
79+
}
80+
81+
Ok(compiler)
82+
}
83+
84+
#[derive(Deserialize, Serialize)]
85+
struct CorpusCase {
86+
test: String,
87+
error: Option<String>,
88+
meta: Value,
89+
}
90+
91+
#[test]
92+
fn test_corpus_v1_valid() -> Result<(), Box<dyn Error>> {
93+
// Load the schema and compile the root schema.
94+
let mut compiler = new_compiler("schema/v1")?;
95+
const SCHEMA_ID: &str = "https://pgxn.org/meta/v1/distribution.schema.json";
96+
let mut schemas = Schemas::new();
97+
let index = compiler.compile(SCHEMA_ID, &mut schemas)?;
98+
99+
// Test each meta JSON in the corpus.
100+
let file = File::open("tests/corpus/v1/valid.txt")?;
101+
let reader = BufReader::new(file);
102+
for line in reader.lines() {
103+
let tc: CorpusCase = serde_json::from_str(&line?)?;
104+
105+
if let Err(e) = schemas.validate(&tc.meta, index) {
106+
panic!("{} failed: {e}", &tc.test);
107+
}
108+
println!("Example {} ok", &tc.test);
109+
}
110+
111+
Ok(())
112+
}
113+
114+
#[test]
115+
fn test_corpus_v1_invalid() -> Result<(), Box<dyn Error>> {
116+
// Load the schema and compile the root schema.
117+
let mut compiler = new_compiler("schema/v1")?;
118+
const SCHEMA_ID: &str = "https://pgxn.org/meta/v1/distribution.schema.json";
119+
let mut schemas = Schemas::new();
120+
let index = compiler.compile(SCHEMA_ID, &mut schemas)?;
121+
122+
// Test each meta JSON in the corpus.
123+
let file = File::open("tests/corpus/v1/invalid.txt")?;
124+
let reader = BufReader::new(file);
125+
for line in reader.lines() {
126+
let tc: CorpusCase = serde_json::from_str(&line?)?;
127+
match schemas.validate(&tc.meta, index) {
128+
Ok(_) => panic!("{} unexpectedly passed!", &tc.test),
129+
Err(e) => assert!(
130+
e.to_string().contains(&tc.error.unwrap()),
131+
"{} error: {e}",
132+
&tc.test,
133+
),
55134
}
56135
}
57136

0 commit comments

Comments
 (0)