88import io .frictionlessdata .datapackage .exceptions .DataPackageValidationException ;
99import io .frictionlessdata .datapackage .resource .*;
1010import io .frictionlessdata .tableschema .exception .ConstraintsException ;
11+ import io .frictionlessdata .tableschema .exception .TableValidationException ;
1112import io .frictionlessdata .tableschema .exception .ValidationException ;
1213import io .frictionlessdata .tableschema .field .DateField ;
1314import io .frictionlessdata .tableschema .schema .Schema ;
2425import java .nio .file .Path ;
2526import java .nio .file .Paths ;
2627import java .nio .file .attribute .FileAttribute ;
27- import java .security .DigestInputStream ;
2828import java .security .MessageDigest ;
29- import java .security .NoSuchAlgorithmException ;
3029import java .time .ZonedDateTime ;
3130import java .util .*;
32- import java .util .stream .Collectors ;
3331
3432import static io .frictionlessdata .datapackage .Profile .*;
3533import static io .frictionlessdata .datapackage .TestUtil .getBasePath ;
@@ -982,39 +980,66 @@ void validateDataPackage() throws Exception {
982980 }
983981
984982 @ Test
985- @ Disabled
986- @ DisplayName ("Datapackage with same data in different formats" )
983+ @ DisplayName ("Datapackage with same data in different formats, lenient validation" )
987984 void validateDataPackageDifferentFormats () throws Exception {
988- Path resourcePath = TestUtil .getResourcePath ("/fixtures/datapackages/different-data-formats/datapackage.json" );
985+ Path resourcePath = TestUtil .getResourcePath ("/fixtures/datapackages/different-data-formats_incl_invalid/datapackage.json" );
986+ Package dp = new Package (resourcePath , false );
987+ List <Object []> teamsWithHeaders = dp .getResource ("teams_with_headers_csv_file_with_schema" ).getData (false , false , true , false );
988+ List <Object []> teamsWithHeadersCsvFileNoSchema = dp .getResource ("teams_with_headers_csv_file_no_schema" ).getData (false , false , true , false );
989+ List <Object []> teamsNoHeadersCsvFileNoSchema = dp .getResource ("teams_no_headers_csv_file_no_schema" ).getData (false , false , true , false );
990+ List <Object []> teamsNoHeadersCsvInlineNoSchema = dp .getResource ("teams_no_headers_inline_csv_no_schema" ).getData (false , false , true , false );
991+
992+ List <Object []> teamsArraysInline = dp .getResource ("teams_arrays_inline_with_headers_with_schema" ).getData (false , false , true , false );
993+ List <Object []> teamsObjectsInline = dp .getResource ("teams_objects_inline_with_schema" ).getData (false , false , true , false );
994+ List <Object []> teamsArrays = dp .getResource ("teams_arrays_file_with_headers_with_schema" ).getData (false , false , true , false );
995+ List <Object []> teamsObjects = dp .getResource ("teams_objects_file_with_schema" ).getData (false , false , true , false );
996+ List <Object []> teamsArraysInlineNoSchema = dp .getResource ("teams_arrays_inline_with_headers_no_schema" ).getData (false , false , true , false );
997+
998+ // ensure tables without headers throw errors on reading if a Schema is set
999+ TableValidationException ex = assertThrows (TableValidationException .class ,
1000+ () -> dp .getResource ("teams_arrays_no_headers_inline_with_schema" ).getData (false , false , true , false ));
1001+ Assertions .assertEquals ("Field 'id' not found in table headers or table has no headers." , ex .getMessage ());
1002+
1003+ TableValidationException ex2 = assertThrows (TableValidationException .class ,
1004+ () -> dp .getResource ("teams_no_headers_inline_csv_with_schema" ).getData (false , false , true , false ));
1005+ Assertions .assertEquals ("Field 'id' not found in table headers or table has no headers." , ex2 .getMessage ());
1006+
1007+ TableValidationException ex3 = assertThrows (TableValidationException .class ,
1008+ () -> dp .getResource ("teams_no_headers_csv_file_with_schema" ).getData (false , false , true , false ));
1009+ Assertions .assertEquals ("Field 'id' not found in table headers or table has no headers." , ex3 .getMessage ());
1010+
1011+ Assertions .assertArrayEquals (getFullTeamsData ().toArray (), teamsWithHeaders .toArray ());
1012+ Assertions .assertArrayEquals (getFullTeamsData ().toArray (), teamsArraysInline .toArray ());
1013+ Assertions .assertArrayEquals (getFullTeamsData ().toArray (), teamsObjectsInline .toArray ());
1014+ Assertions .assertArrayEquals (getFullTeamsData ().toArray (), teamsArrays .toArray ());
1015+ Assertions .assertArrayEquals (getFullTeamsData ().toArray (), teamsObjects .toArray ());
1016+
1017+ // those without Schema lose the type information. With header row means all data is there
1018+ Assertions .assertArrayEquals (getFullTeamsDataString ().toArray (), teamsWithHeadersCsvFileNoSchema .toArray ());
1019+ Assertions .assertArrayEquals (getFullTeamsDataString ().toArray (), teamsArraysInlineNoSchema .toArray ());
1020+
1021+ // those without a header row and with no Schema will lose the first row of data (skipped as a header row). Seems wrong but that's what the python port does
1022+ Assertions .assertArrayEquals (getTeamsDataStringMissingFirstRow ().toArray (), teamsNoHeadersCsvFileNoSchema .toArray ());
1023+ Assertions .assertArrayEquals (getTeamsDataStringMissingFirstRow ().toArray (), teamsNoHeadersCsvInlineNoSchema .toArray ());
1024+ }
1025+
1026+ @ Test
1027+ @ DisplayName ("Datapackage with same data in different valid formats, strict validation" )
1028+ void validateDataPackageDifferentFormatsStrict () throws Exception {
1029+ Path resourcePath = TestUtil .getResourcePath ("/fixtures/datapackages/different-valid-data-formats/datapackage.json" );
9891030 Package dp = new Package (resourcePath , true );
1031+
9901032 List <Object []> teamsWithHeaders = dp .getResource ("teams_with_headers_csv_file" ).getData (false , false , true , false );
991- List <Object []> teamsNoHeaders = dp .getResource ("teams_arrays_no_headers_inline" ).getData (false , false , true , false );
992- List <Object []> teamsNoHeadersCsv = dp .getResource ("teams_no_headers_inline_csv" ).getData (false , false , true , false );
993- List <Object []> teamsNoHeadersFile = dp .getResource ("teams_no_headers_csv_file" ).getData (false , false , true , false );
9941033 List <Object []> teamsArraysInline = dp .getResource ("teams_arrays_inline" ).getData (false , false , true , false );
9951034 List <Object []> teamsObjectsInline = dp .getResource ("teams_objects_inline" ).getData (false , false , true , false );
9961035 List <Object []> teamsArrays = dp .getResource ("teams_arrays_file" ).getData (false , false , true , false );
9971036 List <Object []> teamsObjects = dp .getResource ("teams_objects_file" ).getData (false , false , true , false );
9981037
999- // Assert the validation messages
1000- System .out .println (teamsWithHeaders .stream ().map (Arrays ::toString ).collect (Collectors .joining ("\n " )));
1001- System .out .println (teamsNoHeaders .stream ().map (Arrays ::toString ).collect (Collectors .joining ("\n " )));
1002- System .out .println (teamsNoHeadersCsv .stream ().map (Arrays ::toString ).collect (Collectors .joining ("\n " )));
1003- System .out .println (teamsNoHeadersFile .stream ().map (Arrays ::toString ).collect (Collectors .joining ("\n " )));
1004- System .out .println (teamsArraysInline .stream ().map (Arrays ::toString ).collect (Collectors .joining ("\n " )));
1005- System .out .println (teamsObjectsInline .stream ().map (Arrays ::toString ).collect (Collectors .joining ("\n " )));
1006- System .out .println (teamsArrays .stream ().map (Arrays ::toString ).collect (Collectors .joining ("\n " )));
1007- System .out .println (teamsObjects .stream ().map (Arrays ::toString ).collect (Collectors .joining ("\n " )));
1008-
10091038 Assertions .assertArrayEquals (teamsWithHeaders .toArray (), getFullTeamsData ().toArray ());
10101039 Assertions .assertArrayEquals (teamsArraysInline .toArray (), getFullTeamsData ().toArray ());
10111040 Assertions .assertArrayEquals (teamsObjectsInline .toArray (), getFullTeamsData ().toArray ());
10121041 Assertions .assertArrayEquals (teamsArrays .toArray (), getFullTeamsData ().toArray ());
10131042 Assertions .assertArrayEquals (teamsObjects .toArray (), getFullTeamsData ().toArray ());
1014-
1015- // those without a header row will lose the first row of data. Seems wrong but that's what the python port does
1016- Assertions .assertArrayEquals (teamsNoHeaders .toArray (), getTeamsDataMissingFirstRow ().toArray ());
1017- Assertions .assertArrayEquals (teamsNoHeadersFile .toArray (), getTeamsDataMissingFirstRow ().toArray ());
10181043 }
10191044
10201045 private static List <Object []> getFullTeamsData () {
@@ -1025,10 +1050,18 @@ private static List<Object[]> getFullTeamsData() {
10251050 return expectedData ;
10261051 }
10271052
1028- private static List <Object []> getTeamsDataMissingFirstRow () {
1053+ private static List <Object []> getFullTeamsDataString () {
10291054 List <Object []> expectedData = new ArrayList <>();
1030- expectedData .add (new Object []{BigInteger .valueOf (2 ), "Real" , "Madrid" });
1031- expectedData .add (new Object []{BigInteger .valueOf (3 ), "Bayern" , "Munich" });
1055+ expectedData .add (new Object []{"1" , "Arsenal" , "London" });
1056+ expectedData .add (new Object []{"2" , "Real" , "Madrid" });
1057+ expectedData .add (new Object []{"3" , "Bayern" , "Munich" });
1058+ return expectedData ;
1059+ }
1060+
1061+ private static List <Object []> getTeamsDataStringMissingFirstRow () {
1062+ List <Object []> expectedData = new ArrayList <>();
1063+ expectedData .add (new Object []{"2" , "Real" , "Madrid" });
1064+ expectedData .add (new Object []{"3" , "Bayern" , "Munich" });
10321065 return expectedData ;
10331066 }
10341067
0 commit comments