ardm-validations 1.2.0

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.
Files changed (153) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +35 -0
  3. data/.travis.yml +11 -0
  4. data/Gemfile +51 -0
  5. data/LICENSE +21 -0
  6. data/README.rdoc +122 -0
  7. data/Rakefile +4 -0
  8. data/ardm-validations.gemspec +28 -0
  9. data/lib/ardm-validations.rb +1 -0
  10. data/lib/dm-validations.rb +169 -0
  11. data/lib/dm-validations/auto_validate.rb +252 -0
  12. data/lib/dm-validations/context.rb +66 -0
  13. data/lib/dm-validations/contextual_validators.rb +220 -0
  14. data/lib/dm-validations/exceptions.rb +5 -0
  15. data/lib/dm-validations/formats/email.rb +65 -0
  16. data/lib/dm-validations/formats/url.rb +27 -0
  17. data/lib/dm-validations/support/object.rb +18 -0
  18. data/lib/dm-validations/support/ordered_hash.rb +434 -0
  19. data/lib/dm-validations/validation_errors.rb +137 -0
  20. data/lib/dm-validations/validators/absent_field_validator.rb +58 -0
  21. data/lib/dm-validations/validators/acceptance_validator.rb +79 -0
  22. data/lib/dm-validations/validators/block_validator.rb +61 -0
  23. data/lib/dm-validations/validators/confirmation_validator.rb +92 -0
  24. data/lib/dm-validations/validators/format_validator.rb +124 -0
  25. data/lib/dm-validations/validators/generic_validator.rb +184 -0
  26. data/lib/dm-validations/validators/length_validator.rb +249 -0
  27. data/lib/dm-validations/validators/method_validator.rb +64 -0
  28. data/lib/dm-validations/validators/numeric_validator.rb +182 -0
  29. data/lib/dm-validations/validators/primitive_validator.rb +58 -0
  30. data/lib/dm-validations/validators/required_field_validator.rb +83 -0
  31. data/lib/dm-validations/validators/uniqueness_validator.rb +67 -0
  32. data/lib/dm-validations/validators/within_validator.rb +74 -0
  33. data/lib/dm-validations/version.rb +5 -0
  34. data/spec/fixtures/barcode.rb +40 -0
  35. data/spec/fixtures/basketball_court.rb +58 -0
  36. data/spec/fixtures/basketball_player.rb +34 -0
  37. data/spec/fixtures/beta_tester_account.rb +33 -0
  38. data/spec/fixtures/bill_of_landing.rb +47 -0
  39. data/spec/fixtures/boat_dock.rb +26 -0
  40. data/spec/fixtures/city.rb +24 -0
  41. data/spec/fixtures/company.rb +93 -0
  42. data/spec/fixtures/corporate_world.rb +39 -0
  43. data/spec/fixtures/country.rb +24 -0
  44. data/spec/fixtures/ethernet_frame.rb +56 -0
  45. data/spec/fixtures/event.rb +44 -0
  46. data/spec/fixtures/g3_concert.rb +57 -0
  47. data/spec/fixtures/jabberwock.rb +27 -0
  48. data/spec/fixtures/kayak.rb +28 -0
  49. data/spec/fixtures/lernean_hydra.rb +39 -0
  50. data/spec/fixtures/llama_spaceship.rb +15 -0
  51. data/spec/fixtures/mathematical_function.rb +34 -0
  52. data/spec/fixtures/memory_object.rb +30 -0
  53. data/spec/fixtures/mittelschnauzer.rb +39 -0
  54. data/spec/fixtures/motor_launch.rb +21 -0
  55. data/spec/fixtures/multibyte.rb +16 -0
  56. data/spec/fixtures/page.rb +32 -0
  57. data/spec/fixtures/phone_number.rb +28 -0
  58. data/spec/fixtures/pirogue.rb +28 -0
  59. data/spec/fixtures/programming_language.rb +83 -0
  60. data/spec/fixtures/reservation.rb +38 -0
  61. data/spec/fixtures/scm_operation.rb +56 -0
  62. data/spec/fixtures/sms_message.rb +22 -0
  63. data/spec/fixtures/udp_packet.rb +49 -0
  64. data/spec/integration/absent_field_validator/absent_field_validator_spec.rb +90 -0
  65. data/spec/integration/absent_field_validator/spec_helper.rb +7 -0
  66. data/spec/integration/acceptance_validator/acceptance_validator_spec.rb +196 -0
  67. data/spec/integration/acceptance_validator/spec_helper.rb +7 -0
  68. data/spec/integration/automatic_validation/custom_messages_for_inferred_validation_spec.rb +57 -0
  69. data/spec/integration/automatic_validation/disabling_inferred_validation_spec.rb +49 -0
  70. data/spec/integration/automatic_validation/inferred_boolean_properties_validation_spec.rb +100 -0
  71. data/spec/integration/automatic_validation/inferred_float_property_validation_spec.rb +45 -0
  72. data/spec/integration/automatic_validation/inferred_format_validation_spec.rb +35 -0
  73. data/spec/integration/automatic_validation/inferred_integer_properties_validation_spec.rb +70 -0
  74. data/spec/integration/automatic_validation/inferred_length_validation_spec.rb +142 -0
  75. data/spec/integration/automatic_validation/inferred_presence_validation_spec.rb +45 -0
  76. data/spec/integration/automatic_validation/inferred_primitive_validation_spec.rb +22 -0
  77. data/spec/integration/automatic_validation/inferred_uniqueness_validation_spec.rb +52 -0
  78. data/spec/integration/automatic_validation/inferred_within_validation_spec.rb +39 -0
  79. data/spec/integration/automatic_validation/spec_helper.rb +57 -0
  80. data/spec/integration/block_validator/block_validator_spec.rb +32 -0
  81. data/spec/integration/block_validator/spec_helper.rb +5 -0
  82. data/spec/integration/conditional_validation/if_condition_spec.rb +63 -0
  83. data/spec/integration/conditional_validation/spec_helper.rb +5 -0
  84. data/spec/integration/confirmation_validator/confirmation_validator_spec.rb +76 -0
  85. data/spec/integration/confirmation_validator/spec_helper.rb +5 -0
  86. data/spec/integration/datamapper_models/association_validation_spec.rb +29 -0
  87. data/spec/integration/datamapper_models/inheritance_spec.rb +82 -0
  88. data/spec/integration/dirty_attributes/dirty_attributes_spec.rb +13 -0
  89. data/spec/integration/duplicated_validations/duplicated_validations_spec.rb +24 -0
  90. data/spec/integration/duplicated_validations/spec_helper.rb +5 -0
  91. data/spec/integration/format_validator/email_format_validator_spec.rb +139 -0
  92. data/spec/integration/format_validator/format_validator_spec.rb +64 -0
  93. data/spec/integration/format_validator/regexp_validator_spec.rb +33 -0
  94. data/spec/integration/format_validator/spec_helper.rb +5 -0
  95. data/spec/integration/format_validator/url_format_validator_spec.rb +93 -0
  96. data/spec/integration/length_validator/default_value_spec.rb +14 -0
  97. data/spec/integration/length_validator/equality_spec.rb +87 -0
  98. data/spec/integration/length_validator/error_message_spec.rb +22 -0
  99. data/spec/integration/length_validator/maximum_spec.rb +49 -0
  100. data/spec/integration/length_validator/minimum_spec.rb +54 -0
  101. data/spec/integration/length_validator/range_spec.rb +87 -0
  102. data/spec/integration/length_validator/spec_helper.rb +7 -0
  103. data/spec/integration/method_validator/method_validator_spec.rb +241 -0
  104. data/spec/integration/method_validator/spec_helper.rb +5 -0
  105. data/spec/integration/numeric_validator/equality_with_float_type_spec.rb +65 -0
  106. data/spec/integration/numeric_validator/equality_with_integer_type_spec.rb +41 -0
  107. data/spec/integration/numeric_validator/float_type_spec.rb +90 -0
  108. data/spec/integration/numeric_validator/gt_with_float_type_spec.rb +37 -0
  109. data/spec/integration/numeric_validator/gte_with_float_type_spec.rb +37 -0
  110. data/spec/integration/numeric_validator/integer_only_true_spec.rb +91 -0
  111. data/spec/integration/numeric_validator/integer_type_spec.rb +86 -0
  112. data/spec/integration/numeric_validator/lt_with_float_type_spec.rb +37 -0
  113. data/spec/integration/numeric_validator/lte_with_float_type_spec.rb +37 -0
  114. data/spec/integration/numeric_validator/spec_helper.rb +5 -0
  115. data/spec/integration/primitive_validator/primitive_validator_spec.rb +92 -0
  116. data/spec/integration/primitive_validator/spec_helper.rb +5 -0
  117. data/spec/integration/pure_ruby_objects/plain_old_ruby_object_validation_spec.rb +118 -0
  118. data/spec/integration/required_field_validator/association_spec.rb +72 -0
  119. data/spec/integration/required_field_validator/boolean_type_value_spec.rb +155 -0
  120. data/spec/integration/required_field_validator/date_type_value_spec.rb +127 -0
  121. data/spec/integration/required_field_validator/datetime_type_value_spec.rb +127 -0
  122. data/spec/integration/required_field_validator/float_type_value_spec.rb +131 -0
  123. data/spec/integration/required_field_validator/integer_type_value_spec.rb +99 -0
  124. data/spec/integration/required_field_validator/plain_old_ruby_object_spec.rb +35 -0
  125. data/spec/integration/required_field_validator/shared_examples.rb +26 -0
  126. data/spec/integration/required_field_validator/spec_helper.rb +7 -0
  127. data/spec/integration/required_field_validator/string_type_value_spec.rb +167 -0
  128. data/spec/integration/required_field_validator/text_type_value_spec.rb +49 -0
  129. data/spec/integration/shared/default_validation_context.rb +13 -0
  130. data/spec/integration/shared/valid_and_invalid_model.rb +35 -0
  131. data/spec/integration/uniqueness_validator/spec_helper.rb +5 -0
  132. data/spec/integration/uniqueness_validator/uniqueness_validator_spec.rb +116 -0
  133. data/spec/integration/within_validator/spec_helper.rb +5 -0
  134. data/spec/integration/within_validator/within_validator_spec.rb +168 -0
  135. data/spec/public/resource_spec.rb +105 -0
  136. data/spec/rcov.opts +6 -0
  137. data/spec/spec.opts +4 -0
  138. data/spec/spec_helper.rb +29 -0
  139. data/spec/unit/contextual_validators/emptiness_spec.rb +50 -0
  140. data/spec/unit/contextual_validators/execution_spec.rb +48 -0
  141. data/spec/unit/contextual_validators/spec_helper.rb +37 -0
  142. data/spec/unit/generic_validator/equality_operator_spec.rb +26 -0
  143. data/spec/unit/generic_validator/optional_spec.rb +54 -0
  144. data/spec/unit/validation_errors/adding_spec.rb +54 -0
  145. data/spec/unit/validation_errors/emptiness_spec.rb +38 -0
  146. data/spec/unit/validation_errors/enumerable_spec.rb +32 -0
  147. data/spec/unit/validation_errors/reading_spec.rb +35 -0
  148. data/spec/unit/validation_errors/respond_to_spec.rb +15 -0
  149. data/spec/unit/validators/within_validator_spec.rb +23 -0
  150. data/tasks/spec.rake +38 -0
  151. data/tasks/yard.rake +9 -0
  152. data/tasks/yardstick.rake +19 -0
  153. metadata +256 -0
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'DataMapper::Validations::Fixtures::ServiceCompany' do
4
+ before :all do
5
+ DataMapper::Validations::Fixtures::ServiceCompany.auto_migrate!
6
+
7
+ @model = DataMapper::Validations::Fixtures::ServiceCompany.new(:title => "Monsters, Inc.", :area_of_expertise => "Little children's nightmares")
8
+ @model.valid?
9
+ end
10
+
11
+ describe "without title" do
12
+ before :all do
13
+ @model.title = nil
14
+ end
15
+
16
+ it_should_behave_like "invalid model"
17
+
18
+ it "has a meaningful error message for inherited property" do
19
+ @model.errors.on(:title).should == [ 'Company name is a required field' ]
20
+ end
21
+ end
22
+
23
+ describe "without area of expertise" do
24
+ before :all do
25
+ @model.area_of_expertise = nil
26
+ end
27
+
28
+ it_should_behave_like "invalid model"
29
+
30
+ it "has a meaningful error message for own property" do
31
+ @model.errors.on(:area_of_expertise).should == [ 'Area of expertise must not be blank' ]
32
+ end
33
+ end
34
+ end
35
+
36
+
37
+
38
+ describe 'DataMapper::Validations::Fixtures::ProductCompany' do
39
+ before :all do
40
+ DataMapper::Validations::Fixtures::ProductCompany.auto_migrate!
41
+
42
+ @model = DataMapper::Validations::Fixtures::ProductCompany.new(:title => "Apple", :flagship_product => "Macintosh")
43
+ @model.valid?
44
+ end
45
+
46
+ it_should_behave_like "valid model"
47
+
48
+ describe "without title" do
49
+ before :all do
50
+ @model.title = nil
51
+ end
52
+
53
+ it_should_behave_like "invalid model"
54
+
55
+ it "has error message from the subclass itself" do
56
+ @model.errors.on(:title).should include('Product company must have a name')
57
+ end
58
+
59
+ # this may or may not be a desired behavior,
60
+ # but append vs. replace is a matter of opinion
61
+ # anyway
62
+ #
63
+ # TODO: there should be a way to clear validations for a field
64
+ # that subclasses can use
65
+ it "has error message from superclass" do
66
+ @model.errors.on(:title).should include('Company name is a required field')
67
+ end
68
+ end
69
+
70
+
71
+ describe "without flagship product" do
72
+ before :all do
73
+ @model.flagship_product = nil
74
+ end
75
+
76
+ it_should_behave_like "invalid model"
77
+
78
+ it "has a meaningful error message for own property" do
79
+ @model.errors.on(:flagship_product).should == [ 'Flagship product must not be blank' ]
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'DataMapper::Validations::Fixtures::LlamaSpaceship' do
4
+ before :all do
5
+ DataMapper::Validations::Fixtures::LlamaSpaceship.auto_migrate!
6
+ end
7
+
8
+ it "validates even non dirty attributes" do
9
+ spaceship = DataMapper::Validations::Fixtures::LlamaSpaceship.create(:type => "custom", :color => "pink")
10
+ spaceship.type = "standard"
11
+ spaceship.should_not be_valid
12
+ end
13
+ end
@@ -0,0 +1,24 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+ require 'integration/duplicated_validations/spec_helper'
5
+
6
+ describe 'DataMapper::Validations::Fixtures::Page' do
7
+ before :all do
8
+ DataMapper::Validations::Fixtures::Page.auto_migrate!
9
+
10
+ @model = DataMapper::Validations::Fixtures::Page.new(:id => 1024)
11
+ end
12
+
13
+ describe "without body" do
14
+ before :all do
15
+ @model.body = nil
16
+ end
17
+
18
+ it_should_behave_like "invalid model"
19
+
20
+ it "does not have duplicated error messages" do
21
+ @model.errors.on(:body).should == ["Body must not be blank"]
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,5 @@
1
+ # make sure you check out spec/fixtures to see fixture models
2
+ # already written
3
+ #
4
+ # DataMapper developers feels strongly against foobars in the spec
5
+ # suite
@@ -0,0 +1,139 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+ require 'integration/format_validator/spec_helper'
4
+
5
+ describe 'DataMapper::Validations::Fixtures::BillOfLading' do
6
+ before :all do
7
+ DataMapper::Validations::Fixtures::BillOfLading.auto_migrate!
8
+ end
9
+
10
+ def valid_attributes
11
+ { :id => 1, :doc_no => 'A1234', :email => 'user@example.com', :url => 'http://example.com' }
12
+ end
13
+
14
+ @valid_email_addresses = [
15
+ '+1~1+@example.com',
16
+ '{_dave_}@example.com',
17
+ '"[[ dave ]]"@example.com',
18
+ 'dave."dave"@example.com',
19
+ 'test@example.com',
20
+ 'test@example.co.uk',
21
+ 'test@example.com.br',
22
+ '"J. P. \'s-Gravezande, a.k.a. The Hacker!"@example.com',
23
+ 'me@[187.223.45.119]',
24
+ 'someone@123.com',
25
+ 'simon&garfunkel@songs.com'].each do |email|
26
+
27
+ describe "with email value of #{email} (RFC2822 compliant)" do
28
+ before :all do
29
+ @model = DataMapper::Validations::Fixtures::BillOfLading.new(valid_attributes.merge(:email => email))
30
+ end
31
+
32
+ it_should_behave_like "valid model"
33
+ end
34
+ end
35
+
36
+
37
+ @invalid_email_addresses = [
38
+ '-- dave --@example.com',
39
+ '[dave]@example.com',
40
+ '.dave@example.com',
41
+ 'Max@Job 3:14',
42
+ 'Job@Book of Job',
43
+ 'test@localhost',
44
+ 'J. P. \'s-Gravezande, a.k.a. The Hacker!@example.com',
45
+ "test@example.com\nsomething after the newline"].each do |email|
46
+ describe "with email value of #{email} (non RFC2822 compliant)" do
47
+ before :all do
48
+ @model = DataMapper::Validations::Fixtures::BillOfLading.new(valid_attributes.merge(:email => email))
49
+ end
50
+
51
+ it_should_behave_like "invalid model"
52
+ end
53
+ end
54
+
55
+ describe "with valid email including unicode characters" do
56
+ before :all do
57
+ @model = DataMapper::Validations::Fixtures::BillOfLading.new(valid_attributes.merge(:email => 'pelé@gmail.com'))
58
+ end
59
+
60
+ if (RUBY_VERSION == '1.9.2' && RUBY_ENGINE == 'jruby') || RUBY_VERSION == '1.9.3'
61
+ # Not supported on jruby 1.9 or 1.9.3 yet - see formats/email.rb
62
+ it 'should not raise an error' do
63
+ lambda { @model.valid? }.should_not raise_error
64
+ end
65
+ else
66
+ # Unicode emails not supported on MRI18
67
+ unless !defined?(RUBY_ENGINE) && RUBY_VERSION == '1.8.7'
68
+ it 'should behave like valid model' do
69
+ @model.should be_valid
70
+ end
71
+ end
72
+ end
73
+ end
74
+
75
+
76
+ it 'should have a pre-defined URL format' do
77
+ bad = [ 'http:// example.com',
78
+ 'ftp://example.com',
79
+ 'http://.com',
80
+ 'http://',
81
+ 'test',
82
+ '...'
83
+ ]
84
+
85
+ good = [
86
+ 'http://example.com',
87
+ 'http://www.example.com',
88
+ ]
89
+
90
+ bol = DataMapper::Validations::Fixtures::BillOfLading.new(valid_attributes.except(:url))
91
+ bol.should_not be_valid
92
+ bol.errors.on(:url).should == [ 'Url has an invalid format' ]
93
+
94
+ bad.map do |e|
95
+ bol.url = e
96
+ bol.valid?
97
+ bol.errors.on(:url).should == [ 'Url has an invalid format' ]
98
+ end
99
+
100
+ good.map do |e|
101
+ bol.url = e
102
+ bol.valid?
103
+ bol.errors.on(:url).should be_nil
104
+ end
105
+
106
+ end
107
+
108
+ describe 'with a regexp' do
109
+ before do
110
+ @bol = DataMapper::Validations::Fixtures::BillOfLading.new(valid_attributes)
111
+ @bol.should be_valid
112
+ end
113
+
114
+ describe 'if matched' do
115
+ before do
116
+ @bol.username = 'a12345'
117
+ end
118
+
119
+ it 'should validate' do
120
+ @bol.should be_valid
121
+ end
122
+ end
123
+
124
+ describe 'if not matched' do
125
+ before do
126
+ @bol.username = '12345'
127
+ end
128
+
129
+ it 'should not validate' do
130
+ @bol.should_not be_valid
131
+ end
132
+
133
+ it 'should set an error message' do
134
+ @bol.valid?
135
+ @bol.errors.on(:username).should == [ 'Username must have at least one letter' ]
136
+ end
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+ require 'integration/format_validator/spec_helper'
3
+
4
+ describe 'DataMapper::Validations::Fixtures::BillOfLading' do
5
+ before :all do
6
+ DataMapper::Validations::Fixtures::BillOfLading.auto_migrate!
7
+ end
8
+
9
+ def valid_attributes
10
+ { :id => 1, :doc_no => 'A1234', :email => 'user@example.com', :url => 'http://example.com' }
11
+ end
12
+
13
+ describe "with doc no with value of 'BAD CODE :)'" do
14
+ before :all do
15
+ @model = DataMapper::Validations::Fixtures::BillOfLading.new(valid_attributes.merge(:doc_no => 'BAD CODE :)'))
16
+ end
17
+
18
+ it_should_behave_like 'invalid model'
19
+
20
+ it "has meaningful error message on invalid field" do
21
+ @model.errors.on(:doc_no).should == [ 'Doc no has an invalid format' ]
22
+ end
23
+ end
24
+
25
+ describe "with doc no with value of 'A1234'" do
26
+ before :all do
27
+ @model = DataMapper::Validations::Fixtures::BillOfLading.new(valid_attributes.merge(:doc_no => 'A1234'))
28
+ end
29
+
30
+ it_should_behave_like 'valid model'
31
+ end
32
+
33
+ describe "with doc no with value of 'B123456X12'" do
34
+ before :all do
35
+ @model = DataMapper::Validations::Fixtures::BillOfLading.new(valid_attributes.merge(:doc_no => 'B123456X12'))
36
+ end
37
+
38
+ it_should_behave_like 'valid model'
39
+ end
40
+
41
+ describe "with missing url" do
42
+ before :all do
43
+ @model = DataMapper::Validations::Fixtures::BillOfLading.new(valid_attributes.except(:url))
44
+ end
45
+
46
+ it_should_behave_like 'invalid model'
47
+ end
48
+
49
+ describe "with blank name" do
50
+ before :all do
51
+ @model = DataMapper::Validations::Fixtures::BillOfLading.new(valid_attributes.merge(:username => ''))
52
+ end
53
+
54
+ it_should_behave_like 'valid model'
55
+ end
56
+
57
+ describe "with blank email" do
58
+ before :all do
59
+ @model = DataMapper::Validations::Fixtures::BillOfLading.new(valid_attributes.merge(:email => ''))
60
+ end
61
+
62
+ it_should_behave_like 'valid model'
63
+ end
64
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+ require 'integration/format_validator/spec_helper'
3
+
4
+ describe 'DataMapper::Validations::Fixtures::BillOfLading' do
5
+ before :all do
6
+ DataMapper::Validations::Fixtures::BillOfLading.auto_migrate!
7
+ end
8
+
9
+ def valid_attributes
10
+ { :id => 1, :doc_no => 'A1234', :email => 'user@example.com', :url => 'http://example.com' }
11
+ end
12
+
13
+ describe "with code of 123456" do
14
+ before :all do
15
+ @model = DataMapper::Validations::Fixtures::BillOfLading.new(valid_attributes.merge(:code => '123456'))
16
+ end
17
+
18
+ it_should_behave_like 'valid model'
19
+ end
20
+
21
+
22
+ describe "with code of 12" do
23
+ before :all do
24
+ @model = DataMapper::Validations::Fixtures::BillOfLading.new(valid_attributes.merge(:code => '12'))
25
+ end
26
+
27
+ it_should_behave_like 'invalid model'
28
+
29
+ it "has a meaningful error message" do
30
+ @model.errors.on(:code).should == [ 'Code format is invalid' ]
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,5 @@
1
+ # make sure you check out spec/fixtures to see fixture models
2
+ # already written
3
+ #
4
+ # DataMapper developers feels strongly against foobars in the spec
5
+ # suite
@@ -0,0 +1,93 @@
1
+ require 'spec_helper'
2
+ require 'integration/format_validator/spec_helper'
3
+
4
+ describe 'DataMapper::Validations::Fixtures::BillOfLading' do
5
+ before :all do
6
+ DataMapper::Validations::Fixtures::BillOfLading.auto_migrate!
7
+ end
8
+
9
+ def valid_attributes
10
+ { :id => 1, :doc_no => 'A1234', :email => 'user@example.com', :url => 'http://example.com' }
11
+ end
12
+
13
+ invalid_uris = [ 'http:// example.com', 'ftp://example.com', 'http://.com', 'http://', 'test', '...',
14
+ # these are valid URIs from RFC perspective,
15
+ # but too often not the case for web apps
16
+ #
17
+ # TODO: add another format that is strictly
18
+ # RFC compliant so it can be used, for instance,
19
+ # for internal apps that may refer to local domains
20
+ # like http://backend:8080
21
+ "http://localhost:4000", "http://localhost" ]
22
+
23
+ invalid_uris.each do |uri|
24
+ describe "with URL of #{uri}" do
25
+ before :all do
26
+ @model = DataMapper::Validations::Fixtures::BillOfLading.new(valid_attributes.merge(:url => uri))
27
+ end
28
+
29
+ it_should_behave_like "invalid model"
30
+
31
+ it "has a meaningful error message" do
32
+ @model.errors.on(:url).should == [ 'Url has an invalid format' ]
33
+ end
34
+ end
35
+ end
36
+
37
+ # http:// throws an exception in Addressable::URI, so it wouldn't make it to the validation part anyway :)
38
+ (invalid_uris - ['http://']).each do |uri|
39
+ describe "with dm-type URI of #{uri}" do
40
+ before(:all) do
41
+ @model = DataMapper::Validations::Fixtures::SurrenderBillOfLading.new(valid_attributes.merge(:bank_url => uri))
42
+ end
43
+
44
+ it_should_behave_like "invalid model"
45
+
46
+ it "has a meaningful error message" do
47
+ @model.errors.on(:bank_url).should == [ 'Bank url has an invalid format' ]
48
+ end
49
+
50
+ end
51
+ end
52
+
53
+
54
+ [ 'http://apple.com',
55
+ 'http://www.apple.com',
56
+ "http://apple.com/",
57
+ "http://apple.com/iphone",
58
+ "http://www.google.com/search?client=safari&rls=en-us&q=LED&ie=UTF-8&oe=UTF-8",
59
+ "http://books.google.com",
60
+ "http://books.google.com/",
61
+ "http://db2.clouds.megacorp.net:8080",
62
+ "https://github.com",
63
+ "https://github.com/",
64
+ "http://www.example.com:8088/never/ending/path/segments/",
65
+ "http://db2.clouds.megacorp.net:8080/resources/10",
66
+ "http://www.example.com:8088/never/ending/path/segments",
67
+ "http://books.google.com/books?id=uSUJ3VhH4BsC&printsec=frontcover&dq=subject:%22+Linguistics+%22&as_brr=3&ei=DAHPSbGQE5rEzATk1sShAQ&rview=1",
68
+ "http://books.google.com:80/books?uid=14472359158468915761&rview=1",
69
+ "http://books.google.com/books?id=Ar3-TXCYXUkC&printsec=frontcover&rview=1",
70
+ "http://books.google.com/books/vp6ae081e454d30f89b6bca94e0f96fc14.js",
71
+ "http://www.google.com/images/cleardot.gif",
72
+ "http://books.google.com:80/books?id=Ar3-TXCYXUkC&printsec=frontcover&rview=1#PPA5,M1",
73
+ "http://www.hulu.com/watch/64923/terminator-the-sarah-connor-chronicles-to-the-lighthouse",
74
+ "http://hulu.com:80/browse/popular/tv",
75
+ "http://www.hulu.com/watch/62475/the-simpsons-gone-maggie-gone#s-p1-so-i0"
76
+ ].each do |uri|
77
+ describe "with URL of #{uri}" do
78
+ before :all do
79
+ @model = DataMapper::Validations::Fixtures::BillOfLading.new(valid_attributes.merge(:url => uri))
80
+ end
81
+
82
+ it_should_behave_like "valid model"
83
+ end
84
+
85
+ describe "with dm-type URI of #{uri}" do
86
+ before(:all) do
87
+ @model = DataMapper::Validations::Fixtures::SurrenderBillOfLading.new(valid_attributes.merge(:bank_url => uri))
88
+ end
89
+
90
+ it_should_behave_like "valid model"
91
+ end
92
+ end
93
+ end