Skip to content

Commit

Permalink
Test is_valid
Browse files Browse the repository at this point in the history
  • Loading branch information
theory committed Apr 12, 2024
1 parent ba61d5d commit e0856b4
Show file tree
Hide file tree
Showing 7 changed files with 190 additions and 69 deletions.
13 changes: 7 additions & 6 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ DISTNAME = $(shell perl -nE '/^name\s*=\s*"([^"]+)/ && do { say $$1; exit }'
DISTVERSION = $(shell perl -nE '/^version\s*=\s*"([^"]+)/ && do { say $$1; exit }' Cargo.toml)
PGRXV = $(shell perl -nE '/^pgrx\s+=\s"=?([^"]+)/ && do { say $$1; exit }' Cargo.toml)
PGV = $(shell perl -E 'shift =~ /(\d+)/ && say $$1' "$(shell $(PG_CONFIG) --version)")
EXTRA_CLEAN = META.json $(DISTNAME)-$(DISTVERSION).zip target
TESTS = $(wildcard test/sql/*.sql)
REGRESS = $(patsubst test/sql/%.sql,%,$(TESTS))
REGRESS_OPTS = --inputdir=test
REGRESS_OPTS = --inputdir=test --load-extension=$(DISTNAME) --outputdir=target/installcheck

PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
Expand Down Expand Up @@ -49,15 +50,15 @@ lint:
@cargo fmt --all --check
@cargo clippy --features "pg$(PGV)" --no-default-features

## clean: Remove build artifacts and intermediate files.
clean: target
@cargo clean
@rm -rf META.json $(DISTNAME)-$(DISTVERSION).zip

# Create the PGXN META.json file.
META.json: META.json.in Cargo.toml
@sed "s/@CARGO_VERSION@/$(DISTVERSION)/g" $< > $@

# Expected test output regeneration
target/installcheck/results/%.out: installcheck
test/expected/%.out: target/installcheck/results/%.out
@cp $^ $@

# Create a PGXN-compatible zip file.
$(DISTNAME)-$(DISTVERSION).zip: META.json
git archive --format zip --prefix $(DISTNAME)-$(DISTVERSION)/ --add-file $< -o $(DISTNAME)-$(DISTVERSION).zip HEAD
Expand Down
28 changes: 0 additions & 28 deletions results/jsonschema.out

This file was deleted.

128 changes: 128 additions & 0 deletions test/expected/is_valid.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
-- Valid schema
SELECT jsonschema_is_valid('{"type": "object"}'::json);
jsonschema_is_valid
---------------------
t
(1 row)

SELECT jsonschema_is_valid('{"type": "object"}'::jsonb);
jsonschema_is_valid
---------------------
t
(1 row)

-- Invalid schema
SELECT jsonschema_is_valid('["not a schema"]'::json);
INFO: file:///schema.json is not valid against metaschema
jsonschema_is_valid
---------------------
f
(1 row)

SELECT jsonschema_is_valid('["not a schema"]'::jsonb);
INFO: file:///schema.json is not valid against metaschema
jsonschema_is_valid
---------------------
f
(1 row)

-- NULLs
SELECT jsonschema_is_valid(NULL::json);
jsonschema_is_valid
---------------------

(1 row)

SELECT jsonschema_is_valid(NULL::jsonb);
jsonschema_is_valid
---------------------

(1 row)

-- Load schemas
\set addr_schema `cat eg/address.schema.json`
\set user_schema `cat eg/user-profile.schema.json`
SELECT :'addr_schema'::json ->> '$id' AS addr_schema_id \gset
SELECT :'user_schema'::json ->> '$id' AS user_schema_id \gset
-- Single named schema
SELECT jsonschema_is_valid(:'addr_schema_id', :'addr_schema'::json);
jsonschema_is_valid
---------------------
t
(1 row)

SELECT jsonschema_is_valid(:'addr_schema_id', :'addr_schema'::jsonb);
jsonschema_is_valid
---------------------
t
(1 row)

-- Multiple schema
SELECT jsonschema_is_valid(:'user_schema_id', :'addr_schema'::json, :'user_schema'::json);
jsonschema_is_valid
---------------------
t
(1 row)

SELECT jsonschema_is_valid(:'user_schema_id', :'addr_schema'::jsonb, :'user_schema'::jsonb);
jsonschema_is_valid
---------------------
t
(1 row)

-- Invalid
SELECT jsonschema_is_valid('foo', :'addr_schema'::json);
INFO: error loading file:///Users/david/.pgenv/pgsql-16.2/data/foo
jsonschema_is_valid
---------------------
f
(1 row)

SELECT jsonschema_is_valid('bar', :'addr_schema'::jsonb);
INFO: error loading file:///Users/david/.pgenv/pgsql-16.2/data/bar
jsonschema_is_valid
---------------------
f
(1 row)

-- Default ID
SELECT jsonschema_is_valid('nonesuch', '{"type": "object"}'::json);
jsonschema_is_valid
---------------------
t
(1 row)

SELECT jsonschema_is_valid('nonesuch', '{"type": "object"}'::jsonb);
jsonschema_is_valid
---------------------
t
(1 row)

-- No such ID
SELECT jsonschema_is_valid('file:///nonesuch', :'addr_schema'::json);
INFO: error loading file:///nonesuch
jsonschema_is_valid
---------------------
f
(1 row)

SELECT jsonschema_is_valid('file:///nonesuch', :'addr_schema'::jsonb);
INFO: error loading file:///nonesuch
jsonschema_is_valid
---------------------
f
(1 row)

-- pg_jsonschema-compatible functions
SELECT json_matches_schema('{"type": "object"}'::json, '{"hi": "there"}'::json);
json_matches_schema
---------------------
t
(1 row)

SELECT jsonb_matches_schema('{"type": "object"}'::json, '{"hi": "there"}'::jsonb);
jsonb_matches_schema
----------------------
t
(1 row)

28 changes: 0 additions & 28 deletions test/expected/jsonschema.out

This file was deleted.

16 changes: 9 additions & 7 deletions test/sql/jsonschema.sql → test/expected/validates.out
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
BEGIN;
CREATE EXTENSION jsonschema;

SELECT jsonschema_is_valid('{"type": "object"}'::jsonb);
SELECT jsonschema_is_valid('{"type": "object"}'::json);

-- pg_jsonschema-compatible functions
SELECT json_matches_schema('{"type": "object"}'::json, '{"hi": "there"}'::json);
json_matches_schema
---------------------
t
(1 row)

SELECT jsonb_matches_schema('{"type": "object"}'::json, '{"hi": "there"}'::jsonb);
jsonb_matches_schema
----------------------
t
(1 row)

ROLLBACK;
43 changes: 43 additions & 0 deletions test/sql/is_valid.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
-- Valid schema
SELECT jsonschema_is_valid('{"type": "object"}'::json);
SELECT jsonschema_is_valid('{"type": "object"}'::jsonb);

-- Invalid schema
SELECT jsonschema_is_valid('["not a schema"]'::json);
SELECT jsonschema_is_valid('["not a schema"]'::jsonb);

-- NULLs
SELECT jsonschema_is_valid(NULL::json);
SELECT jsonschema_is_valid(NULL::jsonb);

-- Load schemas
\set addr_schema `cat eg/address.schema.json`
\set user_schema `cat eg/user-profile.schema.json`
SELECT :'addr_schema'::json ->> '$id' AS addr_schema_id \gset
SELECT :'user_schema'::json ->> '$id' AS user_schema_id \gset

-- Single named schema
SELECT jsonschema_is_valid(:'addr_schema_id', :'addr_schema'::json);
SELECT jsonschema_is_valid(:'addr_schema_id', :'addr_schema'::jsonb);

-- Multiple schema
SELECT jsonschema_is_valid(:'user_schema_id', :'addr_schema'::json, :'user_schema'::json);
SELECT jsonschema_is_valid(:'user_schema_id', :'addr_schema'::jsonb, :'user_schema'::jsonb);

-- Invalid
SELECT jsonschema_is_valid('foo', :'addr_schema'::json);
SELECT jsonschema_is_valid('bar', :'addr_schema'::jsonb);

-- Default ID
SELECT jsonschema_is_valid('nonesuch', '{"type": "object"}'::json);
SELECT jsonschema_is_valid('nonesuch', '{"type": "object"}'::jsonb);

-- No such ID
SELECT jsonschema_is_valid('file:///nonesuch', :'addr_schema'::json);
SELECT jsonschema_is_valid('file:///nonesuch', :'addr_schema'::jsonb);



-- pg_jsonschema-compatible functions
SELECT json_matches_schema('{"type": "object"}'::json, '{"hi": "there"}'::json);
SELECT jsonb_matches_schema('{"type": "object"}'::json, '{"hi": "there"}'::jsonb);
3 changes: 3 additions & 0 deletions test/sql/validates.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
-- pg_jsonschema-compatible functions
SELECT json_matches_schema('{"type": "object"}'::json, '{"hi": "there"}'::json);
SELECT jsonb_matches_schema('{"type": "object"}'::json, '{"hi": "there"}'::jsonb);

0 comments on commit e0856b4

Please sign in to comment.