> resources) throws Exception;
/**
* Recreate a Resource object from a JSON descriptor, a base path to resolve relative file paths against
diff --git a/src/test/java/io/frictionlessdata/datapackage/ForeignKeysTest.java b/src/test/java/io/frictionlessdata/datapackage/ForeignKeysTest.java
index f4f9506..d9ba150 100644
--- a/src/test/java/io/frictionlessdata/datapackage/ForeignKeysTest.java
+++ b/src/test/java/io/frictionlessdata/datapackage/ForeignKeysTest.java
@@ -1,6 +1,8 @@
package io.frictionlessdata.datapackage;
import io.frictionlessdata.datapackage.resource.Resource;
+import io.frictionlessdata.tableschema.exception.ForeignKeyException;
+import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@@ -9,13 +11,56 @@
public class ForeignKeysTest {
@Test
- @DisplayName("Test that a schema can be defined via a URL")
- // Test for https://github.com/frictionlessdata/specs/issues/645
- void testValidationURLAsSchemaReference() throws Exception{
+ @DisplayName("Test that a schema can define foreign keys and our code resolves them")
+ // Test for https://github.com/frictionlessdata/datapackage-java/issues/4
+ void testForeignKeyValidation() throws Exception{
Path resourcePath = TestUtil.getResourcePath("/fixtures/datapackages/foreign-keys.json");
Package pkg = new Package(resourcePath, true);
- System.out.println(pkg);
Resource teams = pkg.getResource("teams");
- teams.checkRelations();
+ teams.checkRelations(pkg.getResources());
+ }
+
+ @Test
+ @DisplayName("Test that a schema can define foreign keys and our code resolves them -> must throw on invalid ref")
+ // Test for https://github.com/frictionlessdata/datapackage-java/issues/4
+ void testForeignKeyValidationError() throws Exception{
+ Path resourcePath = TestUtil.getResourcePath("/fixtures/datapackages/foreign-keys-invalid.json");
+ Package pkg = new Package(resourcePath, true);
+ Resource teams = pkg.getResource("teams");
+ ForeignKeyException fke = Assertions.assertThrows(
+ ForeignKeyException.class, () -> teams.checkRelations(pkg.getResources()));
+ Assertions.assertEquals("Foreign key 'city' violation.", fke.getMessage());
+ }
+
+ @Test
+ @DisplayName("Test that a schema can define compound foreign keys and our code resolves them")
+ // Test for https://github.com/frictionlessdata/datapackage-java/issues/4
+ void testCompoundForeignKeyValidation() throws Exception{
+ Path resourcePath = TestUtil.getResourcePath("/fixtures/datapackages/foreign-keys-extended.json");
+ Package pkg = new Package(resourcePath, true);
+ Resource teams = pkg.getResource("teams");
+ teams.checkRelations(pkg.getResources());
+ }
+
+ @Test
+ @DisplayName("Test that a schema with mismatched String and Array foreign key must throw")
+ void testCompoundForeignKeyValidationError() throws Exception{
+ Path resourcePath = TestUtil.getResourcePath("/fixtures/datapackages/foreign-keys-extended-invalid1.json");
+ ForeignKeyException fke = Assertions.assertThrows(
+ ForeignKeyException.class, () -> new Package(resourcePath, true));
+ Assertions.assertEquals(
+ "The reference's fields property must be an array if the outer fields is an array.",
+ fke.getMessage());
+ }
+
+ @Test
+ @DisplayName("Test that a schema with mismatched String and Array foreign key must throw")
+ void testCompoundForeignKeyValidationError2() throws Exception{
+ Path resourcePath = TestUtil.getResourcePath("/fixtures/datapackages/foreign-keys-extended-invalid2.json");
+ ForeignKeyException fke = Assertions.assertThrows(
+ ForeignKeyException.class, () -> new Package(resourcePath, true));
+ Assertions.assertEquals(
+ "The reference's fields property must be a string if the outer fields is a string.",
+ fke.getMessage());
}
}
diff --git a/src/test/java/io/frictionlessdata/datapackage/TestUtil.java b/src/test/java/io/frictionlessdata/datapackage/TestUtil.java
index 24a1cf5..d89dbd8 100644
--- a/src/test/java/io/frictionlessdata/datapackage/TestUtil.java
+++ b/src/test/java/io/frictionlessdata/datapackage/TestUtil.java
@@ -1,9 +1,6 @@
package io.frictionlessdata.datapackage;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
+import java.io.*;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -35,6 +32,9 @@ public static Path getResourcePath (String fileName) {
}
// Create file-URL of source file:
URL sourceFileUrl = TestUtil.class.getResource(locFileName);
+ if (null == sourceFileUrl) {
+ throw new FileNotFoundException("Resource "+fileName+" not found");
+ }
// Get path of URL
return Paths.get(sourceFileUrl.toURI());
} catch (Exception ex) {
diff --git a/src/test/resources/fixtures/datapackages/foreign-keys-extended-invalid1.json b/src/test/resources/fixtures/datapackages/foreign-keys-extended-invalid1.json
new file mode 100644
index 0000000..1eee803
--- /dev/null
+++ b/src/test/resources/fixtures/datapackages/foreign-keys-extended-invalid1.json
@@ -0,0 +1,76 @@
+{
+ "name": "foreign-keys",
+ "resources": [
+ {
+ "name": "teams",
+ "data": [
+ [
+ "id",
+ "name",
+ "city"
+ ],
+ [
+ "1",
+ "Arsenal",
+ "London"
+ ],
+ [
+ "2",
+ "Real",
+ "Madrid"
+ ],
+ [
+ "3",
+ "Bayern",
+ "Munich"
+ ]
+ ],
+ "schema": {
+ "fields": [
+ {
+ "name": "id",
+ "type": "integer"
+ },
+ {
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "name": "city",
+ "type": "string"
+ }
+ ],
+ "foreignKeys": [
+ {
+ "fields": ["id", "city"],
+ "reference": {
+ "resource": "cities",
+ "fields": "name"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "cities",
+ "data": [
+ [
+ "name",
+ "country"
+ ],
+ [
+ "London",
+ "England"
+ ],
+ [
+ "Madrid",
+ "Spain"
+ ],
+ [
+ "Munich",
+ "Germany"
+ ]
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/test/resources/fixtures/datapackages/foreign-keys-extended-invalid2.json b/src/test/resources/fixtures/datapackages/foreign-keys-extended-invalid2.json
new file mode 100644
index 0000000..8a56511
--- /dev/null
+++ b/src/test/resources/fixtures/datapackages/foreign-keys-extended-invalid2.json
@@ -0,0 +1,76 @@
+{
+ "name": "foreign-keys",
+ "resources": [
+ {
+ "name": "teams",
+ "data": [
+ [
+ "id",
+ "name",
+ "city"
+ ],
+ [
+ "1",
+ "Arsenal",
+ "London"
+ ],
+ [
+ "2",
+ "Real",
+ "Madrid"
+ ],
+ [
+ "3",
+ "Bayern",
+ "Munich"
+ ]
+ ],
+ "schema": {
+ "fields": [
+ {
+ "name": "id",
+ "type": "integer"
+ },
+ {
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "name": "city",
+ "type": "string"
+ }
+ ],
+ "foreignKeys": [
+ {
+ "fields": "city",
+ "reference": {
+ "resource": "cities",
+ "fields": ["name", "country"]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "cities",
+ "data": [
+ [
+ "name",
+ "country"
+ ],
+ [
+ "London",
+ "England"
+ ],
+ [
+ "Madrid",
+ "Spain"
+ ],
+ [
+ "Munich",
+ "Germany"
+ ]
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/test/resources/fixtures/datapackages/foreign-keys-extended.json b/src/test/resources/fixtures/datapackages/foreign-keys-extended.json
new file mode 100644
index 0000000..b3656ac
--- /dev/null
+++ b/src/test/resources/fixtures/datapackages/foreign-keys-extended.json
@@ -0,0 +1,80 @@
+{
+ "name": "foreign-keys",
+ "resources": [
+ {
+ "name": "teams",
+ "data": [
+ [
+ "id",
+ "name",
+ "city"
+ ],
+ [
+ "1",
+ "Arsenal",
+ "London"
+ ],
+ [
+ "2",
+ "Real",
+ "Madrid"
+ ],
+ [
+ "3",
+ "Bayern",
+ "Munich"
+ ]
+ ],
+ "schema": {
+ "fields": [
+ {
+ "name": "id",
+ "type": "integer"
+ },
+ {
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "name": "city",
+ "type": "string"
+ }
+ ],
+ "foreignKeys": [
+ {
+ "fields": ["id", "city"],
+ "reference": {
+ "resource": "cities",
+ "fields": ["id","name"]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "cities",
+ "data": [
+ [
+ "id",
+ "name",
+ "country"
+ ],
+ [
+ "1",
+ "London",
+ "England"
+ ],
+ [
+ "2",
+ "Madrid",
+ "Spain"
+ ],
+ [
+ "3",
+ "Munich",
+ "Germany"
+ ]
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/test/resources/fixtures/datapackages/foreign-keys-invalid.json b/src/test/resources/fixtures/datapackages/foreign-keys-invalid.json
new file mode 100644
index 0000000..e6e63db
--- /dev/null
+++ b/src/test/resources/fixtures/datapackages/foreign-keys-invalid.json
@@ -0,0 +1,72 @@
+{
+ "name": "foreign-keys",
+ "resources": [
+ {
+ "name": "teams",
+ "data": [
+ [
+ "id",
+ "name",
+ "city"
+ ],
+ [
+ "1",
+ "Arsenal",
+ "London"
+ ],
+ [
+ "2",
+ "Real",
+ "Madrid"
+ ],
+ [
+ "3",
+ "Bayern",
+ "Munich"
+ ]
+ ],
+ "schema": {
+ "fields": [
+ {
+ "name": "id",
+ "type": "integer"
+ },
+ {
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "name": "city",
+ "type": "string"
+ }
+ ],
+ "foreignKeys": [
+ {
+ "fields": "city",
+ "reference": {
+ "resource": "cities",
+ "fields": "name"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "cities",
+ "data": [
+ [
+ "name",
+ "country"
+ ],
+ [
+ "London",
+ "England"
+ ],
+ [
+ "Madrid",
+ "Spain"
+ ]
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/test/resources/fixtures/datapackages/foreign-keys.json b/src/test/resources/fixtures/datapackages/foreign-keys.json
index e6e63db..cb5559f 100644
--- a/src/test/resources/fixtures/datapackages/foreign-keys.json
+++ b/src/test/resources/fixtures/datapackages/foreign-keys.json
@@ -65,6 +65,10 @@
[
"Madrid",
"Spain"
+ ],
+ [
+ "Munich",
+ "Germany"
]
]
}
pFad - Phonifier reborn
Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy