wjordan213-csvlint 0.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.coveralls.yml +1 -0
- data/.gitattributes +2 -0
- data/.gitignore +28 -0
- data/.ruby-version +1 -0
- data/.travis.yml +32 -0
- data/CHANGELOG.md +361 -0
- data/Gemfile +7 -0
- data/LICENSE.md +22 -0
- data/README.md +328 -0
- data/Rakefile +17 -0
- data/bin/create_schema +32 -0
- data/bin/csvlint +10 -0
- data/features/check_format.feature +46 -0
- data/features/cli.feature +210 -0
- data/features/csv_options.feature +35 -0
- data/features/csvupload.feature +145 -0
- data/features/csvw_schema_validation.feature +127 -0
- data/features/fixtures/cr-line-endings.csv +0 -0
- data/features/fixtures/crlf-line-endings.csv +0 -0
- data/features/fixtures/inconsistent-line-endings-unquoted.csv +0 -0
- data/features/fixtures/inconsistent-line-endings.csv +0 -0
- data/features/fixtures/invalid-byte-sequence.csv +0 -0
- data/features/fixtures/invalid_many_rows.csv +0 -0
- data/features/fixtures/lf-line-endings.csv +0 -0
- data/features/fixtures/spreadsheet.xls +0 -0
- data/features/fixtures/spreadsheet.xlsx +0 -0
- data/features/fixtures/title-row.csv +0 -0
- data/features/fixtures/valid.csv +0 -0
- data/features/fixtures/valid_many_rows.csv +0 -0
- data/features/fixtures/windows-line-endings.csv +0 -0
- data/features/information.feature +22 -0
- data/features/parse_csv.feature +90 -0
- data/features/schema_validation.feature +105 -0
- data/features/sources.feature +17 -0
- data/features/step_definitions/cli_steps.rb +11 -0
- data/features/step_definitions/csv_options_steps.rb +24 -0
- data/features/step_definitions/information_steps.rb +13 -0
- data/features/step_definitions/parse_csv_steps.rb +42 -0
- data/features/step_definitions/schema_validation_steps.rb +33 -0
- data/features/step_definitions/sources_steps.rb +7 -0
- data/features/step_definitions/validation_errors_steps.rb +90 -0
- data/features/step_definitions/validation_info_steps.rb +22 -0
- data/features/step_definitions/validation_warnings_steps.rb +60 -0
- data/features/support/aruba.rb +56 -0
- data/features/support/env.rb +26 -0
- data/features/support/load_tests.rb +114 -0
- data/features/support/webmock.rb +1 -0
- data/features/validation_errors.feature +147 -0
- data/features/validation_info.feature +16 -0
- data/features/validation_warnings.feature +86 -0
- data/lib/csvlint.rb +27 -0
- data/lib/csvlint/cli.rb +165 -0
- data/lib/csvlint/csvw/column.rb +359 -0
- data/lib/csvlint/csvw/date_format.rb +182 -0
- data/lib/csvlint/csvw/metadata_error.rb +13 -0
- data/lib/csvlint/csvw/number_format.rb +211 -0
- data/lib/csvlint/csvw/property_checker.rb +761 -0
- data/lib/csvlint/csvw/table.rb +204 -0
- data/lib/csvlint/csvw/table_group.rb +165 -0
- data/lib/csvlint/error_collector.rb +27 -0
- data/lib/csvlint/error_message.rb +15 -0
- data/lib/csvlint/field.rb +196 -0
- data/lib/csvlint/schema.rb +92 -0
- data/lib/csvlint/validate.rb +599 -0
- data/lib/csvlint/version.rb +3 -0
- data/spec/csvw/column_spec.rb +112 -0
- data/spec/csvw/date_format_spec.rb +49 -0
- data/spec/csvw/number_format_spec.rb +417 -0
- data/spec/csvw/table_group_spec.rb +143 -0
- data/spec/csvw/table_spec.rb +90 -0
- data/spec/field_spec.rb +252 -0
- data/spec/schema_spec.rb +211 -0
- data/spec/spec_helper.rb +17 -0
- data/spec/validator_spec.rb +619 -0
- data/wjordan213_csvlint.gemspec +46 -0
- metadata +490 -0
@@ -0,0 +1,22 @@
|
|
1
|
+
Given(/^I ask if there are info messages$/) do
|
2
|
+
@csv_options ||= default_csv_options
|
3
|
+
|
4
|
+
if @schema_json
|
5
|
+
if @schema_type == :json_table
|
6
|
+
@schema = Csvlint::Schema.from_json_table( @schema_url || "http://example.org ", JSON.parse(@schema_json) )
|
7
|
+
else
|
8
|
+
@schema = Csvlint::Schema.from_csvw_metadata( @schema_url || "http://example.org ", JSON.parse(@schema_json) )
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
@validator = Csvlint::Validator.new( @url, @csv_options, @schema )
|
13
|
+
@info_messages = @validator.info_messages
|
14
|
+
end
|
15
|
+
|
16
|
+
Then(/^there should be (\d+) info messages?$/) do |num|
|
17
|
+
expect( @info_messages.count ).to eq( num.to_i )
|
18
|
+
end
|
19
|
+
|
20
|
+
Then(/^one of the messages should have the type "(.*?)"$/) do |msg_type|
|
21
|
+
expect( @info_messages.find{|x| x.type == msg_type.to_sym} ).to be_present
|
22
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
Given(/^it is encoded as "(.*?)"$/) do |encoding|
|
2
|
+
@csv = @csv.encode(encoding)
|
3
|
+
@encoding = encoding
|
4
|
+
end
|
5
|
+
|
6
|
+
Given(/^I set an encoding header of "(.*?)"$/) do |encoding|
|
7
|
+
@encoding = encoding
|
8
|
+
end
|
9
|
+
|
10
|
+
Given(/^I do not set an encoding header$/) do
|
11
|
+
@encoding = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
Given(/^I have a CSV file called "(.*?)"$/) do |filename|
|
15
|
+
@csv = File.read( File.join( File.dirname(__FILE__), "..", "fixtures", filename ) )
|
16
|
+
end
|
17
|
+
|
18
|
+
When(/^I ask if there are warnings$/) do
|
19
|
+
@csv_options ||= default_csv_options
|
20
|
+
if @schema_json
|
21
|
+
if @schema_type == :json_table
|
22
|
+
@schema = Csvlint::Schema.from_json_table( @schema_url || "http://example.org ", JSON.parse(@schema_json) )
|
23
|
+
else
|
24
|
+
@schema = Csvlint::Schema.from_csvw_metadata( @schema_url || "http://example.org ", JSON.parse(@schema_json) )
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
@validator = Csvlint::Validator.new( @url, @csv_options, @schema )
|
29
|
+
@warnings = @validator.warnings
|
30
|
+
end
|
31
|
+
|
32
|
+
Then(/^there should be warnings$/) do
|
33
|
+
expect( @warnings.count ).to be > 0
|
34
|
+
end
|
35
|
+
|
36
|
+
Then(/^there should not be warnings$/) do
|
37
|
+
# this test is only used for CSVW testing, and :inconsistent_values warnings don't count in CSVW
|
38
|
+
@warnings.delete_if { |w| [:inconsistent_values, :check_options].include?(w.type) }
|
39
|
+
expect( @warnings.count ).to eq(0)
|
40
|
+
end
|
41
|
+
|
42
|
+
Then(/^there should be (\d+) warnings$/) do |count|
|
43
|
+
expect( @warnings.count ).to eq( count.to_i )
|
44
|
+
end
|
45
|
+
|
46
|
+
Given(/^the content type is set to "(.*?)"$/) do |type|
|
47
|
+
@content_type = type
|
48
|
+
end
|
49
|
+
|
50
|
+
Then(/^that warning should have the row "(.*?)"$/) do |row|
|
51
|
+
expect( @warnings.first.row ).to eq( row.to_i )
|
52
|
+
end
|
53
|
+
|
54
|
+
Then(/^that warning should have the column "(.*?)"$/) do |column|
|
55
|
+
expect( @warnings.first.column ).to eq( column.to_i )
|
56
|
+
end
|
57
|
+
|
58
|
+
Then(/^that warning should have the type "(.*?)"$/) do |type|
|
59
|
+
expect( @warnings.first.type ).to eq( type.to_sym )
|
60
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'aruba'
|
2
|
+
require 'aruba/in_process'
|
3
|
+
require 'aruba/cucumber'
|
4
|
+
|
5
|
+
require 'csvlint/cli'
|
6
|
+
|
7
|
+
module Csvlint
|
8
|
+
class CliRunner
|
9
|
+
# Allow everything fun to be injected from the outside while defaulting to normal implementations.
|
10
|
+
def initialize(argv, stdin = STDIN, stdout = STDOUT, stderr = STDERR, kernel = Kernel)
|
11
|
+
@argv, @stdin, @stdout, @stderr, @kernel = argv, stdin, stdout, stderr, kernel
|
12
|
+
end
|
13
|
+
|
14
|
+
def execute!
|
15
|
+
exit_code = begin
|
16
|
+
# Thor accesses these streams directly rather than letting them be injected, so we replace them...
|
17
|
+
$stderr = @stderr
|
18
|
+
$stdin = @stdin
|
19
|
+
$stdout = @stdout
|
20
|
+
|
21
|
+
# Run our normal Thor app the way we know and love.
|
22
|
+
Csvlint::Cli.start(@argv.dup.unshift("validate"))
|
23
|
+
|
24
|
+
# Thor::Base#start does not have a return value, assume success if no exception is raised.
|
25
|
+
0
|
26
|
+
rescue StandardError => e
|
27
|
+
# The ruby interpreter would pipe this to STDERR and exit 1 in the case of an unhandled exception
|
28
|
+
b = e.backtrace
|
29
|
+
@stderr.puts("#{b.shift}: #{e.message} (#{e.class})")
|
30
|
+
@stderr.puts(b.map{|s| "\tfrom #{s}"}.join("\n"))
|
31
|
+
1
|
32
|
+
rescue SystemExit => e
|
33
|
+
e.status
|
34
|
+
ensure
|
35
|
+
# TODO: reset your app here, free up resources, etc.
|
36
|
+
# Examples:
|
37
|
+
# MyApp.logger.flush
|
38
|
+
# MyApp.logger.close
|
39
|
+
# MyApp.logger = nil
|
40
|
+
#
|
41
|
+
# MyApp.reset_singleton_instance_variables
|
42
|
+
|
43
|
+
# ...then we put the streams back.
|
44
|
+
$stderr = STDERR
|
45
|
+
$stdin = STDIN
|
46
|
+
$stdout = STDOUT
|
47
|
+
end
|
48
|
+
|
49
|
+
# Proxy our exit code back to the injected kernel.
|
50
|
+
@kernel.exit(exit_code)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
Aruba.process = Aruba::Processes::InProcess
|
56
|
+
Aruba.process.main_class = Csvlint::CliRunner
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'coveralls'
|
2
|
+
Coveralls.wear_merged!('test_frameworks')
|
3
|
+
|
4
|
+
$:.unshift File.join( File.dirname(__FILE__), "..", "..", "lib")
|
5
|
+
|
6
|
+
require 'rspec/expectations'
|
7
|
+
require 'cucumber/rspec/doubles'
|
8
|
+
require 'csvlint'
|
9
|
+
require 'pry'
|
10
|
+
|
11
|
+
require 'spork'
|
12
|
+
|
13
|
+
Spork.each_run do
|
14
|
+
require 'csvlint'
|
15
|
+
end
|
16
|
+
|
17
|
+
class CustomWorld
|
18
|
+
def default_csv_options
|
19
|
+
return {
|
20
|
+
}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
World do
|
25
|
+
CustomWorld.new
|
26
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'open-uri'
|
3
|
+
require 'uri'
|
4
|
+
|
5
|
+
BASE_URI = "http://w3c.github.io/csvw/tests/"
|
6
|
+
BASE_PATH = File.join(File.dirname(__FILE__), "..", "fixtures", "csvw")
|
7
|
+
FEATURE_FILE_PATH = File.join(File.dirname(__FILE__), "..", "csvw_validation_tests.feature")
|
8
|
+
SCRIPT_FILE_PATH = File.join(File.dirname(__FILE__), "..", "..", "bin", "run-csvw-tests")
|
9
|
+
|
10
|
+
Dir.mkdir(BASE_PATH) unless Dir.exist?(BASE_PATH)
|
11
|
+
|
12
|
+
def cache_file(filename)
|
13
|
+
file = File.join(BASE_PATH, filename)
|
14
|
+
uri = URI.join(BASE_URI, filename)
|
15
|
+
unless File.exist?(file)
|
16
|
+
if filename.include? "/"
|
17
|
+
levels = filename.split("/")[0..-2]
|
18
|
+
for i in 0..levels.length
|
19
|
+
dir = File.join(BASE_PATH, levels[0..i].join("/"))
|
20
|
+
Dir.mkdir(dir) unless Dir.exist?(dir)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
STDERR.puts("storing #{file} locally")
|
24
|
+
File.open(file, 'wb') do |f|
|
25
|
+
f.puts open(uri, 'rb').read
|
26
|
+
end
|
27
|
+
end
|
28
|
+
return uri, file
|
29
|
+
end
|
30
|
+
|
31
|
+
File.open(SCRIPT_FILE_PATH, 'w') do |file|
|
32
|
+
File.chmod(0755, SCRIPT_FILE_PATH)
|
33
|
+
manifest = JSON.parse( open("http://w3c.github.io/csvw/tests/manifest-validation.jsonld").read )
|
34
|
+
manifest["entries"].each do |entry|
|
35
|
+
type = "valid"
|
36
|
+
case entry["type"]
|
37
|
+
when "csvt:WarningValidationTest"
|
38
|
+
type = "warnings"
|
39
|
+
when "csvt:NegativeValidationTest"
|
40
|
+
type = "errors"
|
41
|
+
end
|
42
|
+
file.puts "echo \"#{entry["id"].split("#")[-1]}: #{entry["name"].gsub("`", "'")}\""
|
43
|
+
file.puts "echo \"#{type}: #{entry["comment"].gsub("\"", "\\\"").gsub("`", "'")}\""
|
44
|
+
if entry["action"].end_with?(".json")
|
45
|
+
file.puts "csvlint --schema=features/fixtures/csvw/#{entry["action"]}"
|
46
|
+
elsif entry["option"] && entry["option"]["metadata"]
|
47
|
+
file.puts "csvlint features/fixtures/csvw/#{entry["action"]} --schema=features/fixtures/csvw/#{entry["option"]["metadata"]}"
|
48
|
+
else
|
49
|
+
file.puts "csvlint features/fixtures/csvw/#{entry["action"]}"
|
50
|
+
end
|
51
|
+
file.puts "echo"
|
52
|
+
end
|
53
|
+
end unless File.exist? SCRIPT_FILE_PATH
|
54
|
+
|
55
|
+
File.open(FEATURE_FILE_PATH, 'w') do |file|
|
56
|
+
file.puts "# Auto-generated file based on standard validation CSVW tests from http://w3c.github.io/csvw/tests/manifest-validation.jsonld"
|
57
|
+
file.puts ""
|
58
|
+
|
59
|
+
manifest = JSON.parse( open("http://w3c.github.io/csvw/tests/manifest-validation.jsonld").read )
|
60
|
+
|
61
|
+
file.puts "Feature: #{manifest["label"]}"
|
62
|
+
file.puts ""
|
63
|
+
|
64
|
+
manifest["entries"].each do |entry|
|
65
|
+
action_uri, action_file = cache_file(entry["action"])
|
66
|
+
metadata = nil
|
67
|
+
provided_files = []
|
68
|
+
missing_files = []
|
69
|
+
file.puts "\t# #{entry["id"]}"
|
70
|
+
file.puts "\t# #{entry["comment"]}"
|
71
|
+
file.puts "\tScenario: #{entry["id"]} #{entry["name"].gsub("<", "less than")}"
|
72
|
+
if entry["action"].end_with?(".json")
|
73
|
+
file.puts "\t\tGiven I have a metadata file called \"csvw/#{entry["action"]}\""
|
74
|
+
file.puts "\t\tAnd the metadata is stored at the url \"#{action_uri}\""
|
75
|
+
else
|
76
|
+
file.puts "\t\tGiven I have a CSV file called \"csvw/#{entry["action"]}\""
|
77
|
+
file.puts "\t\tAnd it has a Link header holding \"#{entry["httpLink"]}\"" if entry["httpLink"]
|
78
|
+
file.puts "\t\tAnd it is stored at the url \"#{action_uri}\""
|
79
|
+
if entry["option"] && entry["option"]["metadata"]
|
80
|
+
# no need to store the file here, as it will be listed in the 'implicit' list, which all get stored
|
81
|
+
metadata = URI.join(BASE_URI, entry["option"]["metadata"])
|
82
|
+
file.puts "\t\tAnd I have a metadata file called \"csvw/#{entry["option"]["metadata"]}\""
|
83
|
+
file.puts "\t\tAnd the metadata is stored at the url \"#{metadata}\""
|
84
|
+
end
|
85
|
+
provided_files << action_uri.to_s
|
86
|
+
missing_files = [
|
87
|
+
URI.join(action_uri, '/.well-known/csvm').to_s,
|
88
|
+
"#{action_uri}-metadata.json",
|
89
|
+
URI.join(action_uri, 'csv-metadata.json').to_s
|
90
|
+
]
|
91
|
+
end
|
92
|
+
entry["implicit"].each do |implicit|
|
93
|
+
implicit_uri, implicit_file = cache_file(implicit)
|
94
|
+
provided_files << implicit_uri.to_s
|
95
|
+
unless implicit_uri == metadata
|
96
|
+
file.puts "\t\tAnd I have a file called \"csvw/#{implicit}\" at the url \"#{implicit_uri}\""
|
97
|
+
end
|
98
|
+
end if entry["implicit"]
|
99
|
+
missing_files.each do |uri|
|
100
|
+
file.puts "\t\tAnd there is no file at the url \"#{uri}\"" unless provided_files.include? uri
|
101
|
+
end
|
102
|
+
file.puts "\t\tWhen I carry out CSVW validation"
|
103
|
+
if entry["type"] == "csvt:WarningValidationTest"
|
104
|
+
file.puts "\t\tThen there should not be errors"
|
105
|
+
file.puts "\t\tAnd there should be warnings"
|
106
|
+
elsif entry["type"] == "csvt:NegativeValidationTest"
|
107
|
+
file.puts "\t\tThen there should be errors"
|
108
|
+
else
|
109
|
+
file.puts "\t\tThen there should not be errors"
|
110
|
+
file.puts "\t\tAnd there should not be warnings"
|
111
|
+
end
|
112
|
+
file.puts "\t"
|
113
|
+
end
|
114
|
+
end unless File.exist? FEATURE_FILE_PATH
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'webmock/cucumber'
|
@@ -0,0 +1,147 @@
|
|
1
|
+
Feature: Get validation errors
|
2
|
+
|
3
|
+
Scenario: CSV with ragged rows
|
4
|
+
Given I have a CSV with the following content:
|
5
|
+
"""
|
6
|
+
"col1","col2","col3"
|
7
|
+
"1","2","3"
|
8
|
+
"4","5"
|
9
|
+
"""
|
10
|
+
And it is stored at the url "http://example.com/example1.csv"
|
11
|
+
When I ask if there are errors
|
12
|
+
Then there should be 1 error
|
13
|
+
And that error should have the type "ragged_rows"
|
14
|
+
And that error should have the row "3"
|
15
|
+
And that error should have the content ""4","5""
|
16
|
+
|
17
|
+
Scenario: CSV with incorrect quoting
|
18
|
+
Given I have a CSV with the following content:
|
19
|
+
"""
|
20
|
+
"col1","col2","col3"
|
21
|
+
"Foo","Bar","Baz
|
22
|
+
"""
|
23
|
+
And it is stored at the url "http://example.com/example1.csv"
|
24
|
+
When I ask if there are errors
|
25
|
+
Then there should be 1 error
|
26
|
+
And that error should have the type "unclosed_quote"
|
27
|
+
And that error should have the row "2"
|
28
|
+
And that error should have the content ""Foo","Bar","Baz"
|
29
|
+
|
30
|
+
Scenario: Successfully report a CSV with incorrect whitespace
|
31
|
+
Given I have a CSV with the following content:
|
32
|
+
"""
|
33
|
+
"col1","col2","col3"
|
34
|
+
"Foo","Bar", "Baz"
|
35
|
+
"""
|
36
|
+
And it is stored at the url "http://example.com/example1.csv"
|
37
|
+
When I ask if there are errors
|
38
|
+
Then there should be 1 error
|
39
|
+
And that error should have the type "whitespace"
|
40
|
+
And that error should have the row "2"
|
41
|
+
And that error should have the content ""Foo","Bar", "Baz""
|
42
|
+
|
43
|
+
Scenario: Successfully report a CSV with blank rows
|
44
|
+
Given I have a CSV with the following content:
|
45
|
+
"""
|
46
|
+
"col1","col2","col3"
|
47
|
+
"Foo","Bar","Baz"
|
48
|
+
"","",
|
49
|
+
"Baz","Bar","Foo"
|
50
|
+
"""
|
51
|
+
And it is stored at the url "http://example.com/example1.csv"
|
52
|
+
When I ask if there are errors
|
53
|
+
Then there should be 1 error
|
54
|
+
And that error should have the type "blank_rows"
|
55
|
+
And that error should have the row "3"
|
56
|
+
And that error should have the content ""","","
|
57
|
+
|
58
|
+
Scenario: Successfully report a CSV with multiple trailing empty rows
|
59
|
+
Given I have a CSV with the following content:
|
60
|
+
"""
|
61
|
+
"col1","col2","col3"
|
62
|
+
"Foo","Bar","Baz"
|
63
|
+
"Foo","Bar","Baz"
|
64
|
+
|
65
|
+
|
66
|
+
"""
|
67
|
+
And it is stored at the url "http://example.com/example1.csv"
|
68
|
+
When I ask if there are errors
|
69
|
+
Then there should be 1 error
|
70
|
+
And that error should have the type "blank_rows"
|
71
|
+
And that error should have the row "4"
|
72
|
+
|
73
|
+
Scenario: Successfully report a CSV with an empty row
|
74
|
+
Given I have a CSV with the following content:
|
75
|
+
"""
|
76
|
+
"col1","col2","col3"
|
77
|
+
"Foo","Bar","Baz"
|
78
|
+
|
79
|
+
"Foo","Bar","Baz"
|
80
|
+
"""
|
81
|
+
And it is stored at the url "http://example.com/example1.csv"
|
82
|
+
When I ask if there are errors
|
83
|
+
Then there should be 1 error
|
84
|
+
And that error should have the type "blank_rows"
|
85
|
+
And that error should have the row "3"
|
86
|
+
|
87
|
+
Scenario: Report invalid Encoding
|
88
|
+
Given I have a CSV file called "invalid-byte-sequence.csv"
|
89
|
+
And I set an encoding header of "UTF-8"
|
90
|
+
And it is stored at the url "http://example.com/example1.csv"
|
91
|
+
When I ask if there are errors
|
92
|
+
Then there should be 1 error
|
93
|
+
And that error should have the type "invalid_encoding"
|
94
|
+
|
95
|
+
Scenario: Correctly handle different encodings
|
96
|
+
Given I have a CSV file called "invalid-byte-sequence.csv"
|
97
|
+
And I set an encoding header of "ISO-8859-1"
|
98
|
+
And it is stored at the url "http://example.com/example1.csv"
|
99
|
+
When I ask if there are errors
|
100
|
+
Then there should be no "content_encoding" errors
|
101
|
+
|
102
|
+
Scenario: Report invalid file
|
103
|
+
Given I have a CSV file called "spreadsheet.xls"
|
104
|
+
And it is stored at the url "http://example.com/example1.csv"
|
105
|
+
When I ask if there are errors
|
106
|
+
Then there should be 1 error
|
107
|
+
And that error should have the type "invalid_encoding"
|
108
|
+
|
109
|
+
Scenario: Incorrect extension
|
110
|
+
Given I have a CSV with the following content:
|
111
|
+
"""
|
112
|
+
"abc","2","3"
|
113
|
+
"""
|
114
|
+
And the content type is set to "application/excel"
|
115
|
+
And it is stored at the url "http://example.com/example1.csv"
|
116
|
+
And I ask if there are errors
|
117
|
+
Then there should be 1 error
|
118
|
+
And that error should have the type "wrong_content_type"
|
119
|
+
|
120
|
+
Scenario: Handles urls that 404
|
121
|
+
Given I have a CSV that doesn't exist
|
122
|
+
When I ask if there are errors
|
123
|
+
Then there should be 1 error
|
124
|
+
And that error should have the type "not_found"
|
125
|
+
|
126
|
+
Scenario: Incorrect line endings specified in settings
|
127
|
+
Given I have a CSV file called "cr-line-endings.csv"
|
128
|
+
And I set the line endings to linefeed
|
129
|
+
And it is stored at the url "http://example.com/example1.csv"
|
130
|
+
And I ask if there are errors
|
131
|
+
Then there should be 1 error
|
132
|
+
And that error should have the type "line_breaks"
|
133
|
+
|
134
|
+
Scenario: inconsistent line endings in file cause an error
|
135
|
+
Given I have a CSV file called "inconsistent-line-endings.csv"
|
136
|
+
And it is stored at the url "http://example.com/example1.csv"
|
137
|
+
And I ask if there are errors
|
138
|
+
Then there should be 1 error
|
139
|
+
And that error should have the type "line_breaks"
|
140
|
+
|
141
|
+
|
142
|
+
Scenario: inconsistent line endings with unquoted fields in file cause an error
|
143
|
+
Given I have a CSV file called "inconsistent-line-endings-unquoted.csv"
|
144
|
+
And it is stored at the url "http://example.com/example1.csv"
|
145
|
+
And I ask if there are errors
|
146
|
+
Then there should be 1 error
|
147
|
+
And that error should have the type "line_breaks"
|
@@ -0,0 +1,16 @@
|
|
1
|
+
Feature: Get validation information messages
|
2
|
+
|
3
|
+
Scenario: LF line endings in file give an info message
|
4
|
+
Given I have a CSV file called "lf-line-endings.csv"
|
5
|
+
And it is stored at the url "http://example.com/example1.csv"
|
6
|
+
And I set header to "true"
|
7
|
+
And I ask if there are info messages
|
8
|
+
Then there should be 1 info messages
|
9
|
+
And one of the messages should have the type "nonrfc_line_breaks"
|
10
|
+
|
11
|
+
Scenario: CRLF line endings in file produces no info messages
|
12
|
+
Given I have a CSV file called "crlf-line-endings.csv"
|
13
|
+
And it is stored at the url "http://example.com/example1.csv"
|
14
|
+
And I set header to "true"
|
15
|
+
And I ask if there are info messages
|
16
|
+
Then there should be 0 info messages
|