spec/schema_spec.rb in csvlint-1.0.0 vs spec/schema_spec.rb in csvlint-1.1.0

- old
+ new

@@ -1,211 +1,201 @@ -require 'spec_helper' +require "spec_helper" describe Csvlint::Schema do - it "should tolerate missing fields" do schema = Csvlint::Schema.from_json_table("http://example.org", {}) - expect( schema ).to_not be(nil) - expect( schema.fields.empty? ).to eql(true) + expect(schema).to_not be(nil) + expect(schema.fields.empty?).to eql(true) end it "should tolerate fields with no constraints" do schema = Csvlint::Schema.from_json_table("http://example.org", { - "fields" => [ { "name" => "test" } ] + "fields" => [{"name" => "test"}] }) - expect( schema ).to_not be(nil) - expect( schema.fields[0].name ).to eql("test") - expect( schema.fields[0].constraints ).to eql({}) + expect(schema).to_not be(nil) + expect(schema.fields[0].name).to eql("test") + expect(schema.fields[0].constraints).to eql({}) end it "should validate against the schema" do - field = Csvlint::Field.new("test", { "required" => true } ) - field2 = Csvlint::Field.new("test", { "minLength" => 3 } ) - schema = Csvlint::Schema.new("http://example.org", [field, field2] ) + field = Csvlint::Field.new("test", {"required" => true}) + field2 = Csvlint::Field.new("test", {"minLength" => 3}) + schema = Csvlint::Schema.new("http://example.org", [field, field2]) - expect( schema.validate_row( ["", "x"] ) ).to eql(false) - expect( schema.errors.size ).to eql(2) - expect( schema.errors.first.type).to eql(:missing_value) - expect( schema.errors.first.category).to eql(:schema) - expect( schema.errors.first.column).to eql(1) - expect( schema.validate_row( ["abc", "1234"] ) ).to eql(true) - + expect(schema.validate_row(["", "x"])).to eql(false) + expect(schema.errors.size).to eql(2) + expect(schema.errors.first.type).to eql(:missing_value) + expect(schema.errors.first.category).to eql(:schema) + expect(schema.errors.first.column).to eql(1) + expect(schema.validate_row(["abc", "1234"])).to eql(true) end it "should include validations for missing columns" do - minimum = Csvlint::Field.new("test", { "minLength" => 3 } ) - required = Csvlint::Field.new("test2", { "required" => true } ) - schema = Csvlint::Schema.new("http://example.org", [minimum, required] ) + minimum = Csvlint::Field.new("test", {"minLength" => 3}) + required = Csvlint::Field.new("test2", {"required" => true}) + schema = Csvlint::Schema.new("http://example.org", [minimum, required]) - expect( schema.validate_row( ["abc", "x"] ) ).to eql(true) + expect(schema.validate_row(["abc", "x"])).to eql(true) - expect( schema.validate_row( ["abc"] ) ).to eql(false) - expect( schema.errors.size ).to eql(1) - expect( schema.errors.first.type).to eql(:missing_value) + expect(schema.validate_row(["abc"])).to eql(false) + expect(schema.errors.size).to eql(1) + expect(schema.errors.first.type).to eql(:missing_value) - schema = Csvlint::Schema.new("http://example.org", [required, minimum] ) - expect( schema.validate_row( ["abc"] ) ).to eql(false) - expect( schema.errors.size ).to eql(1) - expect( schema.errors.first.type).to eql(:min_length) + schema = Csvlint::Schema.new("http://example.org", [required, minimum]) + expect(schema.validate_row(["abc"])).to eql(false) + expect(schema.errors.size).to eql(1) + expect(schema.errors.first.type).to eql(:min_length) end it "should warn if the data has fewer columns" do - minimum = Csvlint::Field.new("test", { "minLength" => 3 } ) - required = Csvlint::Field.new("test2", { "maxLength" => 5 } ) - schema = Csvlint::Schema.new("http://example.org", [minimum, required] ) + minimum = Csvlint::Field.new("test", {"minLength" => 3}) + required = Csvlint::Field.new("test2", {"maxLength" => 5}) + schema = Csvlint::Schema.new("http://example.org", [minimum, required]) - expect( schema.validate_row( ["abc"], 1 ) ).to eql(true) - expect( schema.warnings.size ).to eql(1) - expect( schema.warnings.first.type).to eql(:missing_column) - expect( schema.warnings.first.category).to eql(:schema) - expect( schema.warnings.first.row).to eql(1) - expect( schema.warnings.first.column).to eql(2) + expect(schema.validate_row(["abc"], 1)).to eql(true) + expect(schema.warnings.size).to eql(1) + expect(schema.warnings.first.type).to eql(:missing_column) + expect(schema.warnings.first.category).to eql(:schema) + expect(schema.warnings.first.row).to eql(1) + expect(schema.warnings.first.column).to eql(2) - #no ragged row error - expect( schema.errors.size ).to eql(0) + # no ragged row error + expect(schema.errors.size).to eql(0) end it "should warn if the data has additional columns" do - minimum = Csvlint::Field.new("test", { "minLength" => 3 } ) - required = Csvlint::Field.new("test2", { "required" => true } ) - schema = Csvlint::Schema.new("http://example.org", [minimum, required] ) + minimum = Csvlint::Field.new("test", {"minLength" => 3}) + required = Csvlint::Field.new("test2", {"required" => true}) + schema = Csvlint::Schema.new("http://example.org", [minimum, required]) - expect( schema.validate_row( ["abc", "x", "more", "columns"], 1 ) ).to eql(true) - expect( schema.warnings.size ).to eql(2) - expect( schema.warnings.first.type).to eql(:extra_column) - expect( schema.warnings.first.category).to eql(:schema) - expect( schema.warnings.first.row).to eql(1) - expect( schema.warnings.first.column).to eql(3) + expect(schema.validate_row(["abc", "x", "more", "columns"], 1)).to eql(true) + expect(schema.warnings.size).to eql(2) + expect(schema.warnings.first.type).to eql(:extra_column) + expect(schema.warnings.first.category).to eql(:schema) + expect(schema.warnings.first.row).to eql(1) + expect(schema.warnings.first.column).to eql(3) - expect( schema.warnings[1].type).to eql(:extra_column) - expect( schema.warnings[1].column).to eql(4) + expect(schema.warnings[1].type).to eql(:extra_column) + expect(schema.warnings[1].column).to eql(4) - #no ragged row error - expect( schema.errors.size ).to eql(0) + # no ragged row error + expect(schema.errors.size).to eql(0) end context "when validating header" do it "should warn if column names are different to field names" do - minimum = Csvlint::Field.new("minimum", { "minLength" => 3 } ) - required = Csvlint::Field.new("required", { "required" => true } ) - schema = Csvlint::Schema.new("http://example.org", [minimum, required] ) + minimum = Csvlint::Field.new("minimum", {"minLength" => 3}) + required = Csvlint::Field.new("required", {"required" => true}) + schema = Csvlint::Schema.new("http://example.org", [minimum, required]) - expect( schema.validate_header(["minimum", "required"]) ).to eql(true) - expect( schema.warnings.size ).to eql(0) + expect(schema.validate_header(["minimum", "required"])).to eql(true) + expect(schema.warnings.size).to eql(0) - expect( schema.validate_header(["wrong", "required"]) ).to eql(true) - expect( schema.warnings.size ).to eql(1) - expect( schema.warnings.first.row ).to eql(1) - expect( schema.warnings.first.type ).to eql(:malformed_header) - expect( schema.warnings.first.content ).to eql('wrong,required') - expect( schema.warnings.first.column ).to eql(nil) - expect( schema.warnings.first.category ).to eql(:schema) - expect schema.warnings.first.constraints.has_value?('minimum,required') + expect(schema.validate_header(["wrong", "required"])).to eql(true) + expect(schema.warnings.size).to eql(1) + expect(schema.warnings.first.row).to eql(1) + expect(schema.warnings.first.type).to eql(:malformed_header) + expect(schema.warnings.first.content).to eql("wrong,required") + expect(schema.warnings.first.column).to eql(nil) + expect(schema.warnings.first.category).to eql(:schema) + expect schema.warnings.first.constraints.has_value?("minimum,required") # expect( schema.warnings.first.constraints.values ).to eql(['minimum,required']) - expect( schema.validate_header(["minimum", "Required"]) ).to eql(true) - expect( schema.warnings.size ).to eql(1) - + expect(schema.validate_header(["minimum", "Required"])).to eql(true) + expect(schema.warnings.size).to eql(1) end it "should warn if column count is less than field count" do - minimum = Csvlint::Field.new("minimum", { "minLength" => 3 } ) - required = Csvlint::Field.new("required", { "required" => true } ) - schema = Csvlint::Schema.new("http://example.org", [minimum, required] ) + minimum = Csvlint::Field.new("minimum", {"minLength" => 3}) + required = Csvlint::Field.new("required", {"required" => true}) + schema = Csvlint::Schema.new("http://example.org", [minimum, required]) - expect( schema.validate_header(["minimum"]) ).to eql(true) - expect( schema.warnings.size ).to eql(1) - expect( schema.warnings.first.row ).to eql(1) - expect( schema.warnings.first.type ).to eql(:malformed_header) - expect( schema.warnings.first.content ).to eql("minimum") - expect( schema.warnings.first.column ).to eql(nil) - expect( schema.warnings.first.category ).to eql(:schema) - expect schema.warnings.first.constraints.has_value?('minimum,required') + expect(schema.validate_header(["minimum"])).to eql(true) + expect(schema.warnings.size).to eql(1) + expect(schema.warnings.first.row).to eql(1) + expect(schema.warnings.first.type).to eql(:malformed_header) + expect(schema.warnings.first.content).to eql("minimum") + expect(schema.warnings.first.column).to eql(nil) + expect(schema.warnings.first.category).to eql(:schema) + expect schema.warnings.first.constraints.has_value?("minimum,required") # expect( schema.warnings.first.constraints.values ).to eql(['minimum,required']) - end it "should warn if column count is more than field count" do - minimum = Csvlint::Field.new("minimum", { "minLength" => 3 } ) - schema = Csvlint::Schema.new("http://example.org", [minimum] ) + minimum = Csvlint::Field.new("minimum", {"minLength" => 3}) + schema = Csvlint::Schema.new("http://example.org", [minimum]) - expect( schema.validate_header(["wrong", "required"]) ).to eql(true) - expect( schema.warnings.size ).to eql(1) - expect( schema.warnings.first.row ).to eql(1) - expect( schema.warnings.first.type ).to eql(:malformed_header) - expect( schema.warnings.first.content ).to eql("wrong,required") - expect( schema.warnings.first.column ).to eql(nil) - expect( schema.warnings.first.category ).to eql(:schema) + expect(schema.validate_header(["wrong", "required"])).to eql(true) + expect(schema.warnings.size).to eql(1) + expect(schema.warnings.first.row).to eql(1) + expect(schema.warnings.first.type).to eql(:malformed_header) + expect(schema.warnings.first.content).to eql("wrong,required") + expect(schema.warnings.first.column).to eql(nil) + expect(schema.warnings.first.category).to eql(:schema) # expect( schema.warnings.first.constraints.values ).to eql('minimum') - expect( schema.warnings.first.constraints.has_value?('minimum')) - + expect(schema.warnings.first.constraints.has_value?("minimum")) end - end context "when parsing JSON Tables" do - before(:each) do - @example=<<-EOL + @example = <<-EOL { "title": "Schema title", "description": "schema", "fields": [ { "name": "ID", "constraints": { "required": true }, "title": "id", "description": "house identifier" }, { "name": "Price", "constraints": { "required": true, "minLength": 1 } }, { "name": "Postcode", "constraints": { "required": true, "pattern": "[A-Z]{1,2}[0-9][0-9A-Z]? ?[0-9][A-Z]{2}" } } ] } - EOL - stub_request(:get, "http://example.com/example.json").to_return(:status => 200, :body => @example) + EOL + stub_request(:get, "http://example.com/example.json").to_return(status: 200, body: @example) end it "should create a schema from a pre-parsed JSON table" do - json = JSON.parse( @example ) + json = JSON.parse(@example) schema = Csvlint::Schema.from_json_table("http://example.org", json) - expect( schema.uri ).to eql("http://example.org") - expect( schema.title ).to eql("Schema title") - expect( schema.description ).to eql("schema") - expect( schema.fields.length ).to eql(3) - expect( schema.fields[0].name ).to eql("ID") - expect( schema.fields[0].constraints["required"] ).to eql(true) - expect( schema.fields[0].title ).to eql("id") - expect( schema.fields[0].description ).to eql("house identifier") - expect( schema.fields[2].constraints["pattern"]).to eql("[A-Z]{1,2}[0-9][0-9A-Z]? ?[0-9][A-Z]{2}") + expect(schema.uri).to eql("http://example.org") + expect(schema.title).to eql("Schema title") + expect(schema.description).to eql("schema") + expect(schema.fields.length).to eql(3) + expect(schema.fields[0].name).to eql("ID") + expect(schema.fields[0].constraints["required"]).to eql(true) + expect(schema.fields[0].title).to eql("id") + expect(schema.fields[0].description).to eql("house identifier") + expect(schema.fields[2].constraints["pattern"]).to eql("[A-Z]{1,2}[0-9][0-9A-Z]? ?[0-9][A-Z]{2}") end it "should create a schema from a JSON Table URL" do schema = Csvlint::Schema.load_from_uri("http://example.com/example.json") - expect( schema.uri ).to eql("http://example.com/example.json") - expect( schema.fields.length ).to eql(3) - expect( schema.fields[0].name ).to eql("ID") - expect( schema.fields[0].constraints["required"] ).to eql(true) - + expect(schema.uri).to eql("http://example.com/example.json") + expect(schema.fields.length).to eql(3) + expect(schema.fields[0].name).to eql("ID") + expect(schema.fields[0].constraints["required"]).to eql(true) end end context "when parsing CSVW metadata" do - before(:each) do - @example=<<-EOL -{ - "@context": "http://www.w3.org/ns/csvw", - "url": "http://example.com/example1.csv", - "tableSchema": { - "columns": [ - { "name": "Name", "required": true, "datatype": { "base": "string", "format": ".+" } }, - { "name": "Id", "required": true, "datatype": { "base": "string", "minLength": 3 } }, - { "name": "Email", "required": true } - ] - } -} - EOL - stub_request(:get, "http://example.com/metadata.json").to_return(:status => 200, :body => @example) + @example = <<~EOL + { + "@context": "http://www.w3.org/ns/csvw", + "url": "http://example.com/example1.csv", + "tableSchema": { + "columns": [ + { "name": "Name", "required": true, "datatype": { "base": "string", "format": ".+" } }, + { "name": "Id", "required": true, "datatype": { "base": "string", "minLength": 3 } }, + { "name": "Email", "required": true } + ] + } + } + EOL + stub_request(:get, "http://example.com/metadata.json").to_return(status: 200, body: @example) end it "should create a table group from a CSVW metadata URL" do schema = Csvlint::Schema.load_from_uri("http://example.com/metadata.json") - expect( schema.class ).to eq(Csvlint::Csvw::TableGroup) + expect(schema.class).to eq(Csvlint::Csvw::TableGroup) end end - end