Empact-sexy_pg_constraints 0.2.2 → 0.2.3
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.
- data/Empact-sexy_pg_constraints.gemspec +39 -8
- data/VERSION +1 -1
- data/lib/sexy_pg_constraints/constraints.rb +41 -1
- data/test/alphanumeric_test.rb +39 -0
- data/test/blacklist_test.rb +39 -0
- data/test/email_test.rb +39 -0
- data/test/exact_length_test.rb +47 -0
- data/test/format_test.rb +91 -0
- data/test/general_test.rb +132 -0
- data/test/greater_less_than_test.rb +83 -0
- data/test/length_within_test.rb +91 -0
- data/test/lowercase_test.rb +21 -0
- data/test/not_blank_test.rb +39 -0
- data/test/odd_event_test.rb +75 -0
- data/test/positive_test.rb +47 -0
- data/test/reference_test.rb +79 -0
- data/test/test_helper.rb +12 -0
- data/test/whitelist_test.rb +39 -0
- data/test/within_test.rb +135 -0
- data/test/xor_test.rb +27 -0
- metadata +34 -4
- data/test/sexy_pg_constraints_test.rb +0 -943
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class WhitelistTest < SexyPgConstraintsTest
|
4
|
+
def test_whitelist
|
5
|
+
ActiveRecord::Migration.constrain :books, :author, :whitelist => %w(whitelisted1 whitelisted2 whitelisted3)
|
6
|
+
|
7
|
+
assert_prohibits Book, :author, :whitelist do |book|
|
8
|
+
book.author = 'not_whitelisted'
|
9
|
+
end
|
10
|
+
|
11
|
+
assert_allows Book do |book|
|
12
|
+
book.author = 'whitelisted2'
|
13
|
+
end
|
14
|
+
|
15
|
+
ActiveRecord::Migration.deconstrain :books, :author, :whitelist
|
16
|
+
|
17
|
+
assert_allows Book do |book|
|
18
|
+
book.author = 'not_whitelisted'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_whitelist_on_a_column_whose_name_is_a_sql_keyword
|
23
|
+
ActiveRecord::Migration.constrain :books, :as, :whitelist => %w(whitelisted1 whitelisted2 whitelisted3)
|
24
|
+
|
25
|
+
assert_prohibits Book, :as, :whitelist do |book|
|
26
|
+
book.as = 'not_whitelisted'
|
27
|
+
end
|
28
|
+
|
29
|
+
assert_allows Book do |book|
|
30
|
+
book.as = 'whitelisted2'
|
31
|
+
end
|
32
|
+
|
33
|
+
ActiveRecord::Migration.deconstrain :books, :as, :whitelist
|
34
|
+
|
35
|
+
assert_allows Book do |book|
|
36
|
+
book.as = 'not_whitelisted'
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/test/within_test.rb
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class WithinTest < SexyPgConstraintsTest
|
4
|
+
def test_within_inclusive
|
5
|
+
ActiveRecord::Migration.constrain :books, :quantity, :within => 5..11
|
6
|
+
|
7
|
+
assert_prohibits Book, :quantity, :within do |book|
|
8
|
+
book.quantity = 12
|
9
|
+
end
|
10
|
+
|
11
|
+
assert_prohibits Book, :quantity, :within do |book|
|
12
|
+
book.quantity = 4
|
13
|
+
end
|
14
|
+
|
15
|
+
assert_allows Book do |book|
|
16
|
+
book.quantity = 7
|
17
|
+
end
|
18
|
+
|
19
|
+
ActiveRecord::Migration.deconstrain :books, :quantity, :within
|
20
|
+
|
21
|
+
assert_allows Book do |book|
|
22
|
+
book.quantity = 12
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_within_inclusive_on_a_column_whose_name_is_a_sql_keyword
|
27
|
+
ActiveRecord::Migration.constrain :books, :from, :within => 5..11
|
28
|
+
|
29
|
+
assert_prohibits Book, :from, :within do |book|
|
30
|
+
book.from = 12
|
31
|
+
end
|
32
|
+
|
33
|
+
assert_prohibits Book, :from, :within do |book|
|
34
|
+
book.from = 4
|
35
|
+
end
|
36
|
+
|
37
|
+
assert_allows Book do |book|
|
38
|
+
book.from = 7
|
39
|
+
end
|
40
|
+
|
41
|
+
ActiveRecord::Migration.deconstrain :books, :from, :within
|
42
|
+
|
43
|
+
assert_allows Book do |book|
|
44
|
+
book.from = 12
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_within_non_inclusive
|
49
|
+
ActiveRecord::Migration.constrain :books, :quantity, :within => 5...11
|
50
|
+
|
51
|
+
assert_prohibits Book, :quantity, :within do |book|
|
52
|
+
book.quantity = 11
|
53
|
+
end
|
54
|
+
|
55
|
+
assert_prohibits Book, :quantity, :within do |book|
|
56
|
+
book.quantity = 4
|
57
|
+
end
|
58
|
+
|
59
|
+
assert_allows Book do |book|
|
60
|
+
book.quantity = 10
|
61
|
+
end
|
62
|
+
|
63
|
+
ActiveRecord::Migration.deconstrain :books, :quantity, :within
|
64
|
+
|
65
|
+
assert_allows Book do |book|
|
66
|
+
book.quantity = 11
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_within_non_inclusive_on_a_column_whose_name_is_a_sql_keyword
|
71
|
+
ActiveRecord::Migration.constrain :books, :from, :within => 5...11
|
72
|
+
|
73
|
+
assert_prohibits Book, :from, :within do |book|
|
74
|
+
book.from = 11
|
75
|
+
end
|
76
|
+
|
77
|
+
assert_prohibits Book, :from, :within do |book|
|
78
|
+
book.from = 4
|
79
|
+
end
|
80
|
+
|
81
|
+
assert_allows Book do |book|
|
82
|
+
book.from = 10
|
83
|
+
end
|
84
|
+
|
85
|
+
ActiveRecord::Migration.deconstrain :books, :from, :within
|
86
|
+
|
87
|
+
assert_allows Book do |book|
|
88
|
+
book.from = 11
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_within_exclude_beginning
|
93
|
+
ActiveRecord::Migration.constrain :books, :from, :within => {:range => 5...11, :exclude_beginning => true}
|
94
|
+
|
95
|
+
assert_prohibits Book, :from, :within do |book|
|
96
|
+
book.from = 11
|
97
|
+
end
|
98
|
+
|
99
|
+
assert_prohibits Book, :from, :within do |book|
|
100
|
+
book.from = 5
|
101
|
+
end
|
102
|
+
|
103
|
+
assert_allows Book do |book|
|
104
|
+
book.from = 10
|
105
|
+
end
|
106
|
+
|
107
|
+
ActiveRecord::Migration.deconstrain :books, :from, :within
|
108
|
+
|
109
|
+
assert_allows Book do |book|
|
110
|
+
book.from = 5
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_within_exclude_end_overrides_range
|
115
|
+
ActiveRecord::Migration.constrain :books, :from, :within => {:range => 5...11, :exclude_end => false}
|
116
|
+
|
117
|
+
assert_prohibits Book, :from, :within do |book|
|
118
|
+
book.from = 12
|
119
|
+
end
|
120
|
+
|
121
|
+
assert_prohibits Book, :from, :within do |book|
|
122
|
+
book.from = 4
|
123
|
+
end
|
124
|
+
|
125
|
+
assert_allows Book do |book|
|
126
|
+
book.from = 11
|
127
|
+
end
|
128
|
+
|
129
|
+
ActiveRecord::Migration.deconstrain :books, :from, :within
|
130
|
+
|
131
|
+
assert_allows Book do |book|
|
132
|
+
book.from = 12
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
data/test/xor_test.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class XorTest < SexyPgConstraintsTest
|
4
|
+
def test_xor
|
5
|
+
ActiveRecord::Migration.constrain :books, [:xor_col_1, :xor_col_2], :xor => true
|
6
|
+
|
7
|
+
assert_prohibits Book, [:xor_col_1, :xor_col_2], :xor do |book|
|
8
|
+
book.xor_col_1 = 123
|
9
|
+
book.xor_col_2 = 321
|
10
|
+
end
|
11
|
+
|
12
|
+
assert_allows Book do |book|
|
13
|
+
book.xor_col_1 = 123
|
14
|
+
end
|
15
|
+
|
16
|
+
assert_allows Book do |book|
|
17
|
+
book.xor_col_2 = 123
|
18
|
+
end
|
19
|
+
|
20
|
+
ActiveRecord::Migration.deconstrain :books, [:xor_col_1, :xor_col_2], :xor
|
21
|
+
|
22
|
+
assert_allows Book do |book|
|
23
|
+
book.xor_col_1 = 123
|
24
|
+
book.xor_col_2 = 123
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: Empact-sexy_pg_constraints
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.2.
|
5
|
+
version: 0.2.3
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Maxim Chernyak
|
@@ -105,11 +105,26 @@ files:
|
|
105
105
|
- lib/sexy_pg_constraints/helpers.rb
|
106
106
|
- lib/sexy_pg_constraints/railtie.rb
|
107
107
|
- lib/sexy_pg_constraints/schema_definitions.rb
|
108
|
-
- test/
|
108
|
+
- test/alphanumeric_test.rb
|
109
|
+
- test/blacklist_test.rb
|
110
|
+
- test/email_test.rb
|
111
|
+
- test/exact_length_test.rb
|
112
|
+
- test/format_test.rb
|
113
|
+
- test/general_test.rb
|
114
|
+
- test/greater_less_than_test.rb
|
115
|
+
- test/length_within_test.rb
|
116
|
+
- test/lowercase_test.rb
|
117
|
+
- test/not_blank_test.rb
|
118
|
+
- test/odd_event_test.rb
|
119
|
+
- test/positive_test.rb
|
120
|
+
- test/reference_test.rb
|
109
121
|
- test/support/assert_prohibits_allows.rb
|
110
122
|
- test/support/database.yml.example
|
111
123
|
- test/support/models.rb
|
112
124
|
- test/test_helper.rb
|
125
|
+
- test/whitelist_test.rb
|
126
|
+
- test/within_test.rb
|
127
|
+
- test/xor_test.rb
|
113
128
|
homepage: http://github.com/maxim/sexy_pg_constraints
|
114
129
|
licenses: []
|
115
130
|
|
@@ -123,7 +138,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
123
138
|
requirements:
|
124
139
|
- - ">="
|
125
140
|
- !ruby/object:Gem::Version
|
126
|
-
hash:
|
141
|
+
hash: 1636863430316657218
|
127
142
|
segments:
|
128
143
|
- 0
|
129
144
|
version: "0"
|
@@ -141,7 +156,22 @@ signing_key:
|
|
141
156
|
specification_version: 3
|
142
157
|
summary: ""
|
143
158
|
test_files:
|
144
|
-
- test/
|
159
|
+
- test/alphanumeric_test.rb
|
160
|
+
- test/blacklist_test.rb
|
161
|
+
- test/email_test.rb
|
162
|
+
- test/exact_length_test.rb
|
163
|
+
- test/format_test.rb
|
164
|
+
- test/general_test.rb
|
165
|
+
- test/greater_less_than_test.rb
|
166
|
+
- test/length_within_test.rb
|
167
|
+
- test/lowercase_test.rb
|
168
|
+
- test/not_blank_test.rb
|
169
|
+
- test/odd_event_test.rb
|
170
|
+
- test/positive_test.rb
|
171
|
+
- test/reference_test.rb
|
145
172
|
- test/support/assert_prohibits_allows.rb
|
146
173
|
- test/support/models.rb
|
147
174
|
- test/test_helper.rb
|
175
|
+
- test/whitelist_test.rb
|
176
|
+
- test/within_test.rb
|
177
|
+
- test/xor_test.rb
|
@@ -1,943 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class SexyPgConstraintsTest < Test::Unit::TestCase
|
4
|
-
def setup
|
5
|
-
CreateBooks.up
|
6
|
-
CreateAuthors.up
|
7
|
-
end
|
8
|
-
|
9
|
-
def teardown
|
10
|
-
CreateBooks.down
|
11
|
-
CreateAuthors.down
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_should_create_book
|
15
|
-
Book.create
|
16
|
-
assert_equal 1, Book.count
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_whitelist
|
20
|
-
ActiveRecord::Migration.constrain :books, :author, :whitelist => %w(whitelisted1 whitelisted2 whitelisted3)
|
21
|
-
|
22
|
-
assert_prohibits Book, :author, :whitelist do |book|
|
23
|
-
book.author = 'not_whitelisted'
|
24
|
-
end
|
25
|
-
|
26
|
-
assert_allows Book do |book|
|
27
|
-
book.author = 'whitelisted2'
|
28
|
-
end
|
29
|
-
|
30
|
-
ActiveRecord::Migration.deconstrain :books, :author, :whitelist
|
31
|
-
|
32
|
-
assert_allows Book do |book|
|
33
|
-
book.author = 'not_whitelisted'
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def test_whitelist_on_a_column_whose_name_is_a_sql_keyword
|
38
|
-
ActiveRecord::Migration.constrain :books, :as, :whitelist => %w(whitelisted1 whitelisted2 whitelisted3)
|
39
|
-
|
40
|
-
assert_prohibits Book, :as, :whitelist do |book|
|
41
|
-
book.as = 'not_whitelisted'
|
42
|
-
end
|
43
|
-
|
44
|
-
assert_allows Book do |book|
|
45
|
-
book.as = 'whitelisted2'
|
46
|
-
end
|
47
|
-
|
48
|
-
ActiveRecord::Migration.deconstrain :books, :as, :whitelist
|
49
|
-
|
50
|
-
assert_allows Book do |book|
|
51
|
-
book.as = 'not_whitelisted'
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def test_blacklist
|
56
|
-
ActiveRecord::Migration.constrain :books, :author, :blacklist => %w(blacklisted1 blacklisted2 blacklisted3)
|
57
|
-
|
58
|
-
assert_prohibits Book, :author, :blacklist do |book|
|
59
|
-
book.author = 'blacklisted2'
|
60
|
-
end
|
61
|
-
|
62
|
-
assert_allows Book do |book|
|
63
|
-
book.author = 'not_blacklisted'
|
64
|
-
end
|
65
|
-
|
66
|
-
ActiveRecord::Migration.deconstrain :books, :author, :blacklist
|
67
|
-
|
68
|
-
assert_allows Book do |book|
|
69
|
-
book.author = 'blacklisted2'
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
def test_blacklist_on_a_column_whose_name_is_a_sql_keyword
|
74
|
-
ActiveRecord::Migration.constrain :books, :as, :blacklist => %w(blacklisted1 blacklisted2 blacklisted3)
|
75
|
-
|
76
|
-
assert_prohibits Book, :as, :blacklist do |book|
|
77
|
-
book.as = 'blacklisted2'
|
78
|
-
end
|
79
|
-
|
80
|
-
assert_allows Book do |book|
|
81
|
-
book.as = 'not_blacklisted'
|
82
|
-
end
|
83
|
-
|
84
|
-
ActiveRecord::Migration.deconstrain :books, :as, :blacklist
|
85
|
-
|
86
|
-
assert_allows Book do |book|
|
87
|
-
book.as = 'blacklisted2'
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
def test_not_blank
|
92
|
-
ActiveRecord::Migration.constrain :books, :author, :not_blank => true
|
93
|
-
|
94
|
-
assert_prohibits Book, :author, :not_blank do |book|
|
95
|
-
book.author = ' '
|
96
|
-
end
|
97
|
-
|
98
|
-
assert_allows Book do |book|
|
99
|
-
book.author = 'foo'
|
100
|
-
end
|
101
|
-
|
102
|
-
ActiveRecord::Migration.deconstrain :books, :author, :not_blank
|
103
|
-
|
104
|
-
assert_allows Book do |book|
|
105
|
-
book.author = ' '
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
def test_not_blank_on_a_column_whose_name_is_a_sql_keyword
|
110
|
-
ActiveRecord::Migration.constrain :books, :as, :not_blank => true
|
111
|
-
|
112
|
-
assert_prohibits Book, :as, :not_blank do |book|
|
113
|
-
book.as = ' '
|
114
|
-
end
|
115
|
-
|
116
|
-
assert_allows Book do |book|
|
117
|
-
book.as = 'foo'
|
118
|
-
end
|
119
|
-
|
120
|
-
ActiveRecord::Migration.deconstrain :books, :as, :not_blank
|
121
|
-
|
122
|
-
assert_allows Book do |book|
|
123
|
-
book.as = ' '
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
def test_within_inclusive
|
128
|
-
ActiveRecord::Migration.constrain :books, :quantity, :within => 5..11
|
129
|
-
|
130
|
-
assert_prohibits Book, :quantity, :within do |book|
|
131
|
-
book.quantity = 12
|
132
|
-
end
|
133
|
-
|
134
|
-
assert_prohibits Book, :quantity, :within do |book|
|
135
|
-
book.quantity = 4
|
136
|
-
end
|
137
|
-
|
138
|
-
assert_allows Book do |book|
|
139
|
-
book.quantity = 7
|
140
|
-
end
|
141
|
-
|
142
|
-
ActiveRecord::Migration.deconstrain :books, :quantity, :within
|
143
|
-
|
144
|
-
assert_allows Book do |book|
|
145
|
-
book.quantity = 12
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
def test_within_inclusive_on_a_column_whose_name_is_a_sql_keyword
|
150
|
-
ActiveRecord::Migration.constrain :books, :from, :within => 5..11
|
151
|
-
|
152
|
-
assert_prohibits Book, :from, :within do |book|
|
153
|
-
book.from = 12
|
154
|
-
end
|
155
|
-
|
156
|
-
assert_prohibits Book, :from, :within do |book|
|
157
|
-
book.from = 4
|
158
|
-
end
|
159
|
-
|
160
|
-
assert_allows Book do |book|
|
161
|
-
book.from = 7
|
162
|
-
end
|
163
|
-
|
164
|
-
ActiveRecord::Migration.deconstrain :books, :from, :within
|
165
|
-
|
166
|
-
assert_allows Book do |book|
|
167
|
-
book.from = 12
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
def test_within_non_inclusive
|
172
|
-
ActiveRecord::Migration.constrain :books, :quantity, :within => 5...11
|
173
|
-
|
174
|
-
assert_prohibits Book, :quantity, :within do |book|
|
175
|
-
book.quantity = 11
|
176
|
-
end
|
177
|
-
|
178
|
-
assert_prohibits Book, :quantity, :within do |book|
|
179
|
-
book.quantity = 4
|
180
|
-
end
|
181
|
-
|
182
|
-
assert_allows Book do |book|
|
183
|
-
book.quantity = 10
|
184
|
-
end
|
185
|
-
|
186
|
-
ActiveRecord::Migration.deconstrain :books, :quantity, :within
|
187
|
-
|
188
|
-
assert_allows Book do |book|
|
189
|
-
book.quantity = 11
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
|
-
def test_within_non_inclusive_on_a_column_whose_name_is_a_sql_keyword
|
194
|
-
ActiveRecord::Migration.constrain :books, :from, :within => 5...11
|
195
|
-
|
196
|
-
assert_prohibits Book, :from, :within do |book|
|
197
|
-
book.from = 11
|
198
|
-
end
|
199
|
-
|
200
|
-
assert_prohibits Book, :from, :within do |book|
|
201
|
-
book.from = 4
|
202
|
-
end
|
203
|
-
|
204
|
-
assert_allows Book do |book|
|
205
|
-
book.from = 10
|
206
|
-
end
|
207
|
-
|
208
|
-
ActiveRecord::Migration.deconstrain :books, :from, :within
|
209
|
-
|
210
|
-
assert_allows Book do |book|
|
211
|
-
book.from = 11
|
212
|
-
end
|
213
|
-
end
|
214
|
-
|
215
|
-
def test_within_exclude_beginning
|
216
|
-
ActiveRecord::Migration.constrain :books, :from, :within => {:range => 5...11, :exclude_beginning => true}
|
217
|
-
|
218
|
-
assert_prohibits Book, :from, :within do |book|
|
219
|
-
book.from = 11
|
220
|
-
end
|
221
|
-
|
222
|
-
assert_prohibits Book, :from, :within do |book|
|
223
|
-
book.from = 5
|
224
|
-
end
|
225
|
-
|
226
|
-
assert_allows Book do |book|
|
227
|
-
book.from = 10
|
228
|
-
end
|
229
|
-
|
230
|
-
ActiveRecord::Migration.deconstrain :books, :from, :within
|
231
|
-
|
232
|
-
assert_allows Book do |book|
|
233
|
-
book.from = 5
|
234
|
-
end
|
235
|
-
end
|
236
|
-
|
237
|
-
def test_within_exclude_end_overrides_range
|
238
|
-
ActiveRecord::Migration.constrain :books, :from, :within => {:range => 5...11, :exclude_end => false}
|
239
|
-
|
240
|
-
assert_prohibits Book, :from, :within do |book|
|
241
|
-
book.from = 12
|
242
|
-
end
|
243
|
-
|
244
|
-
assert_prohibits Book, :from, :within do |book|
|
245
|
-
book.from = 4
|
246
|
-
end
|
247
|
-
|
248
|
-
assert_allows Book do |book|
|
249
|
-
book.from = 11
|
250
|
-
end
|
251
|
-
|
252
|
-
ActiveRecord::Migration.deconstrain :books, :from, :within
|
253
|
-
|
254
|
-
assert_allows Book do |book|
|
255
|
-
book.from = 12
|
256
|
-
end
|
257
|
-
end
|
258
|
-
|
259
|
-
def test_length_within_inclusive
|
260
|
-
ActiveRecord::Migration.constrain :books, :title, :length_within => 5..11
|
261
|
-
|
262
|
-
assert_prohibits Book, :title, :length_within do |book|
|
263
|
-
book.title = 'abcdefghijkl'
|
264
|
-
end
|
265
|
-
|
266
|
-
assert_prohibits Book, :title, :length_within do |book|
|
267
|
-
book.title = 'abcd'
|
268
|
-
end
|
269
|
-
|
270
|
-
assert_allows Book do |book|
|
271
|
-
book.title = 'abcdefg'
|
272
|
-
end
|
273
|
-
|
274
|
-
ActiveRecord::Migration.deconstrain :books, :title, :length_within
|
275
|
-
|
276
|
-
assert_allows Book do |book|
|
277
|
-
book.title = 'abcdefghijkl'
|
278
|
-
end
|
279
|
-
end
|
280
|
-
|
281
|
-
def test_length_within_inclusive_on_a_column_whose_name_is_a_sql_keyword
|
282
|
-
ActiveRecord::Migration.constrain :books, :as, :length_within => 5..11
|
283
|
-
|
284
|
-
assert_prohibits Book, :as, :length_within do |book|
|
285
|
-
book.as = 'abcdefghijkl'
|
286
|
-
end
|
287
|
-
|
288
|
-
assert_prohibits Book, :as, :length_within do |book|
|
289
|
-
book.as = 'abcd'
|
290
|
-
end
|
291
|
-
|
292
|
-
assert_allows Book do |book|
|
293
|
-
book.as = 'abcdefg'
|
294
|
-
end
|
295
|
-
|
296
|
-
ActiveRecord::Migration.deconstrain :books, :as, :length_within
|
297
|
-
|
298
|
-
assert_allows Book do |book|
|
299
|
-
book.as = 'abcdefghijkl'
|
300
|
-
end
|
301
|
-
end
|
302
|
-
|
303
|
-
def test_length_within_non_inclusive
|
304
|
-
ActiveRecord::Migration.constrain :books, :title, :length_within => 5...11
|
305
|
-
|
306
|
-
assert_prohibits Book, :title, :length_within do |book|
|
307
|
-
book.title = 'abcdefghijk'
|
308
|
-
end
|
309
|
-
|
310
|
-
assert_prohibits Book, :title, :length_within do |book|
|
311
|
-
book.title = 'abcd'
|
312
|
-
end
|
313
|
-
|
314
|
-
assert_allows Book do |book|
|
315
|
-
book.title = 'abcdefg'
|
316
|
-
end
|
317
|
-
|
318
|
-
ActiveRecord::Migration.deconstrain :books, :title, :length_within
|
319
|
-
|
320
|
-
assert_allows Book do |book|
|
321
|
-
book.title = 'abcdefghijk'
|
322
|
-
end
|
323
|
-
end
|
324
|
-
|
325
|
-
def test_length_within_non_inclusive_on_a_column_whose_name_is_a_sql_keyword
|
326
|
-
ActiveRecord::Migration.constrain :books, :as, :length_within => 5...11
|
327
|
-
|
328
|
-
assert_prohibits Book, :as, :length_within do |book|
|
329
|
-
book.as = 'abcdefghijk'
|
330
|
-
end
|
331
|
-
|
332
|
-
assert_prohibits Book, :as, :length_within do |book|
|
333
|
-
book.as = 'abcd'
|
334
|
-
end
|
335
|
-
|
336
|
-
assert_allows Book do |book|
|
337
|
-
book.as = 'abcdefg'
|
338
|
-
end
|
339
|
-
|
340
|
-
ActiveRecord::Migration.deconstrain :books, :as, :length_within
|
341
|
-
|
342
|
-
assert_allows Book do |book|
|
343
|
-
book.as = 'abcdefghijk'
|
344
|
-
end
|
345
|
-
end
|
346
|
-
|
347
|
-
def test_email
|
348
|
-
ActiveRecord::Migration.constrain :books, :author, :email => true
|
349
|
-
|
350
|
-
assert_prohibits Book, :author, :email do |book|
|
351
|
-
book.author = 'blah@example'
|
352
|
-
end
|
353
|
-
|
354
|
-
assert_allows Book do |book|
|
355
|
-
book.author = 'blah@example.com'
|
356
|
-
end
|
357
|
-
|
358
|
-
ActiveRecord::Migration.deconstrain :books, :author, :email
|
359
|
-
|
360
|
-
assert_allows Book do |book|
|
361
|
-
book.author = 'blah@example'
|
362
|
-
end
|
363
|
-
end
|
364
|
-
|
365
|
-
def test_email_on_a_column_whose_name_is_a_sql_keyword
|
366
|
-
ActiveRecord::Migration.constrain :books, :as, :email => true
|
367
|
-
|
368
|
-
assert_prohibits Book, :as, :email do |book|
|
369
|
-
book.as = 'blah@example'
|
370
|
-
end
|
371
|
-
|
372
|
-
assert_allows Book do |book|
|
373
|
-
book.as = 'blah@example.com'
|
374
|
-
end
|
375
|
-
|
376
|
-
ActiveRecord::Migration.deconstrain :books, :as, :email
|
377
|
-
|
378
|
-
assert_allows Book do |book|
|
379
|
-
book.as = 'blah@example'
|
380
|
-
end
|
381
|
-
end
|
382
|
-
|
383
|
-
def test_alphanumeric
|
384
|
-
ActiveRecord::Migration.constrain :books, :title, :alphanumeric => true
|
385
|
-
|
386
|
-
assert_prohibits Book, :title, :alphanumeric do |book|
|
387
|
-
book.title = 'asdf@asdf'
|
388
|
-
end
|
389
|
-
|
390
|
-
assert_allows Book do |book|
|
391
|
-
book.title = 'asdf'
|
392
|
-
end
|
393
|
-
|
394
|
-
ActiveRecord::Migration.deconstrain :books, :title, :alphanumeric
|
395
|
-
|
396
|
-
assert_allows Book do |book|
|
397
|
-
book.title = 'asdf@asdf'
|
398
|
-
end
|
399
|
-
end
|
400
|
-
|
401
|
-
def test_alphanumeric_on_a_column_whose_name_is_a_sql_keyword
|
402
|
-
ActiveRecord::Migration.constrain :books, :as, :alphanumeric => true
|
403
|
-
|
404
|
-
assert_prohibits Book, :as, :alphanumeric do |book|
|
405
|
-
book.as = 'asdf@asdf'
|
406
|
-
end
|
407
|
-
|
408
|
-
assert_allows Book do |book|
|
409
|
-
book.as = 'asdf'
|
410
|
-
end
|
411
|
-
|
412
|
-
ActiveRecord::Migration.deconstrain :books, :as, :alphanumeric
|
413
|
-
|
414
|
-
assert_allows Book do |book|
|
415
|
-
book.as = 'asdf@asdf'
|
416
|
-
end
|
417
|
-
end
|
418
|
-
|
419
|
-
def test_positive
|
420
|
-
ActiveRecord::Migration.constrain :books, :quantity, :positive => true
|
421
|
-
|
422
|
-
assert_prohibits Book, :quantity, :positive do |book|
|
423
|
-
book.quantity = -1
|
424
|
-
end
|
425
|
-
|
426
|
-
assert_allows Book do |book|
|
427
|
-
book.quantity = 0
|
428
|
-
end
|
429
|
-
|
430
|
-
assert_allows Book do |book|
|
431
|
-
book.quantity = 1
|
432
|
-
end
|
433
|
-
|
434
|
-
ActiveRecord::Migration.deconstrain :books, :quantity, :positive
|
435
|
-
|
436
|
-
assert_allows Book do |book|
|
437
|
-
book.quantity = -1
|
438
|
-
end
|
439
|
-
end
|
440
|
-
|
441
|
-
def test_positive_on_a_column_whose_name_is_a_sql_keyword
|
442
|
-
ActiveRecord::Migration.constrain :books, :from, :positive => true
|
443
|
-
|
444
|
-
assert_prohibits Book, :from, :positive do |book|
|
445
|
-
book.from = -1
|
446
|
-
end
|
447
|
-
|
448
|
-
assert_allows Book do |book|
|
449
|
-
book.from = 0
|
450
|
-
end
|
451
|
-
|
452
|
-
assert_allows Book do |book|
|
453
|
-
book.from = 1
|
454
|
-
end
|
455
|
-
|
456
|
-
ActiveRecord::Migration.deconstrain :books, :from, :positive
|
457
|
-
|
458
|
-
assert_allows Book do |book|
|
459
|
-
book.from = -1
|
460
|
-
end
|
461
|
-
end
|
462
|
-
|
463
|
-
def test_odd
|
464
|
-
ActiveRecord::Migration.constrain :books, :quantity, :odd => true
|
465
|
-
|
466
|
-
assert_prohibits Book, :quantity, :odd do |book|
|
467
|
-
book.quantity = 2
|
468
|
-
end
|
469
|
-
|
470
|
-
assert_allows Book do |book|
|
471
|
-
book.quantity = 1
|
472
|
-
end
|
473
|
-
|
474
|
-
ActiveRecord::Migration.deconstrain :books, :quantity, :odd
|
475
|
-
|
476
|
-
assert_allows Book do |book|
|
477
|
-
book.quantity = 2
|
478
|
-
end
|
479
|
-
end
|
480
|
-
|
481
|
-
def test_odd_on_a_column_whose_name_is_a_sql_keyword
|
482
|
-
ActiveRecord::Migration.constrain :books, :from, :odd => true
|
483
|
-
|
484
|
-
assert_prohibits Book, :from, :odd do |book|
|
485
|
-
book.from = 2
|
486
|
-
end
|
487
|
-
|
488
|
-
assert_allows Book do |book|
|
489
|
-
book.from = 1
|
490
|
-
end
|
491
|
-
|
492
|
-
ActiveRecord::Migration.deconstrain :books, :from, :odd
|
493
|
-
|
494
|
-
assert_allows Book do |book|
|
495
|
-
book.from = 2
|
496
|
-
end
|
497
|
-
end
|
498
|
-
|
499
|
-
def test_even
|
500
|
-
ActiveRecord::Migration.constrain :books, :quantity, :even => true
|
501
|
-
|
502
|
-
assert_prohibits Book, :quantity, :even do |book|
|
503
|
-
book.quantity = 1
|
504
|
-
end
|
505
|
-
|
506
|
-
assert_allows Book do |book|
|
507
|
-
book.quantity = 2
|
508
|
-
end
|
509
|
-
|
510
|
-
ActiveRecord::Migration.deconstrain :books, :quantity, :even
|
511
|
-
|
512
|
-
assert_allows Book do |book|
|
513
|
-
book.quantity = 1
|
514
|
-
end
|
515
|
-
end
|
516
|
-
|
517
|
-
def test_even_on_a_column_whose_name_is_a_sql_keyword
|
518
|
-
ActiveRecord::Migration.constrain :books, :from, :even => true
|
519
|
-
|
520
|
-
assert_prohibits Book, :from, :even do |book|
|
521
|
-
book.from = 1
|
522
|
-
end
|
523
|
-
|
524
|
-
assert_allows Book do |book|
|
525
|
-
book.from = 2
|
526
|
-
end
|
527
|
-
|
528
|
-
ActiveRecord::Migration.deconstrain :books, :from, :even
|
529
|
-
|
530
|
-
assert_allows Book do |book|
|
531
|
-
book.from = 1
|
532
|
-
end
|
533
|
-
end
|
534
|
-
|
535
|
-
def test_unique
|
536
|
-
ActiveRecord::Migration.constrain :books, :isbn, :unique => true
|
537
|
-
|
538
|
-
assert_allows Book do |book|
|
539
|
-
book.isbn = 'foo'
|
540
|
-
end
|
541
|
-
|
542
|
-
assert_prohibits Book, :isbn, :unique, 'unique', ActiveRecord::RecordNotUnique do |book|
|
543
|
-
book.isbn = 'foo'
|
544
|
-
end
|
545
|
-
|
546
|
-
ActiveRecord::Migration.deconstrain :books, :isbn, :unique
|
547
|
-
|
548
|
-
assert_allows Book do |book|
|
549
|
-
book.isbn = 'foo'
|
550
|
-
end
|
551
|
-
end
|
552
|
-
|
553
|
-
def test_unique_on_a_column_whose_name_is_a_sql_keyword
|
554
|
-
ActiveRecord::Migration.constrain :books, :as, :unique => true
|
555
|
-
|
556
|
-
assert_allows Book do |book|
|
557
|
-
book.as = 'foo'
|
558
|
-
end
|
559
|
-
|
560
|
-
assert_prohibits Book, :as, :unique, 'unique', ActiveRecord::RecordNotUnique do |book|
|
561
|
-
book.as = 'foo'
|
562
|
-
end
|
563
|
-
|
564
|
-
ActiveRecord::Migration.deconstrain :books, :as, :unique
|
565
|
-
|
566
|
-
assert_allows Book do |book|
|
567
|
-
book.as = 'foo'
|
568
|
-
end
|
569
|
-
end
|
570
|
-
|
571
|
-
def test_exact_length
|
572
|
-
ActiveRecord::Migration.constrain :books, :isbn, :exact_length => 5
|
573
|
-
|
574
|
-
assert_prohibits Book, :isbn, :exact_length do |book|
|
575
|
-
book.isbn = '123456'
|
576
|
-
end
|
577
|
-
|
578
|
-
assert_prohibits Book, :isbn, :exact_length do |book|
|
579
|
-
book.isbn = '1234'
|
580
|
-
end
|
581
|
-
|
582
|
-
assert_allows Book do |book|
|
583
|
-
book.isbn = '12345'
|
584
|
-
end
|
585
|
-
|
586
|
-
ActiveRecord::Migration.deconstrain :books, :isbn, :exact_length
|
587
|
-
|
588
|
-
assert_allows Book do |book|
|
589
|
-
book.isbn = '123456'
|
590
|
-
end
|
591
|
-
end
|
592
|
-
|
593
|
-
def test_exact_length_on_a_column_whose_name_is_a_sql_keyword
|
594
|
-
ActiveRecord::Migration.constrain :books, :as, :exact_length => 5
|
595
|
-
|
596
|
-
assert_prohibits Book, :as, :exact_length do |book|
|
597
|
-
book.as = '123456'
|
598
|
-
end
|
599
|
-
|
600
|
-
assert_prohibits Book, :as, :exact_length do |book|
|
601
|
-
book.as = '1234'
|
602
|
-
end
|
603
|
-
|
604
|
-
assert_allows Book do |book|
|
605
|
-
book.as = '12345'
|
606
|
-
end
|
607
|
-
|
608
|
-
ActiveRecord::Migration.deconstrain :books, :as, :exact_length
|
609
|
-
|
610
|
-
assert_allows Book do |book|
|
611
|
-
book.as = '123456'
|
612
|
-
end
|
613
|
-
end
|
614
|
-
|
615
|
-
def test_format_case_insensitive
|
616
|
-
ActiveRecord::Migration.constrain :books, :title, :format => /^[a-z]+$/i
|
617
|
-
|
618
|
-
assert_prohibits Book, :title, :format do |book|
|
619
|
-
book.title = 'abc3'
|
620
|
-
end
|
621
|
-
|
622
|
-
assert_prohibits Book, :title, :format do |book|
|
623
|
-
book.title = ''
|
624
|
-
end
|
625
|
-
|
626
|
-
assert_allows Book do |book|
|
627
|
-
book.title = 'abc'
|
628
|
-
end
|
629
|
-
|
630
|
-
assert_allows Book do |book|
|
631
|
-
book.title = 'ABc'
|
632
|
-
end
|
633
|
-
|
634
|
-
ActiveRecord::Migration.deconstrain :books, :title, :format
|
635
|
-
|
636
|
-
assert_allows Book do |book|
|
637
|
-
book.title = 'abc3'
|
638
|
-
end
|
639
|
-
end
|
640
|
-
|
641
|
-
def test_format_case_insensitive_on_a_column_whose_name_is_a_sql_keyword
|
642
|
-
ActiveRecord::Migration.constrain :books, :as, :format => /^[a-z]+$/i
|
643
|
-
|
644
|
-
assert_prohibits Book, :as, :format do |book|
|
645
|
-
book.as = 'abc3'
|
646
|
-
end
|
647
|
-
|
648
|
-
assert_prohibits Book, :as, :format do |book|
|
649
|
-
book.as = ''
|
650
|
-
end
|
651
|
-
|
652
|
-
assert_allows Book do |book|
|
653
|
-
book.as = 'abc'
|
654
|
-
end
|
655
|
-
|
656
|
-
assert_allows Book do |book|
|
657
|
-
book.as = 'ABc'
|
658
|
-
end
|
659
|
-
|
660
|
-
ActiveRecord::Migration.deconstrain :books, :as, :format
|
661
|
-
|
662
|
-
assert_allows Book do |book|
|
663
|
-
book.as = 'abc3'
|
664
|
-
end
|
665
|
-
end
|
666
|
-
|
667
|
-
def test_format_case_sensitive
|
668
|
-
ActiveRecord::Migration.constrain :books, :title, :format => /^[a-z]+$/
|
669
|
-
|
670
|
-
assert_prohibits Book, :title, :format do |book|
|
671
|
-
book.title = 'aBc'
|
672
|
-
end
|
673
|
-
|
674
|
-
assert_allows Book do |book|
|
675
|
-
book.title = 'abc'
|
676
|
-
end
|
677
|
-
|
678
|
-
ActiveRecord::Migration.deconstrain :books, :title, :format
|
679
|
-
|
680
|
-
assert_allows Book do |book|
|
681
|
-
book.title = 'aBc'
|
682
|
-
end
|
683
|
-
end
|
684
|
-
|
685
|
-
def test_format_case_sensitive_on_a_column_whose_name_is_a_sql_keyword
|
686
|
-
ActiveRecord::Migration.constrain :books, :as, :format => /^[a-z]+$/
|
687
|
-
|
688
|
-
assert_prohibits Book, :as, :format do |book|
|
689
|
-
book.as = 'aBc'
|
690
|
-
end
|
691
|
-
|
692
|
-
assert_allows Book do |book|
|
693
|
-
book.as = 'abc'
|
694
|
-
end
|
695
|
-
|
696
|
-
ActiveRecord::Migration.deconstrain :books, :as, :format
|
697
|
-
|
698
|
-
assert_allows Book do |book|
|
699
|
-
book.as = 'aBc'
|
700
|
-
end
|
701
|
-
end
|
702
|
-
|
703
|
-
def test_reference
|
704
|
-
ActiveRecord::Migration.constrain :books, :author_id, :reference => {:authors => :id}
|
705
|
-
|
706
|
-
assert_prohibits Book, :author_id, :reference, 'foreign key', ActiveRecord::InvalidForeignKey do |book|
|
707
|
-
book.author_id = 1
|
708
|
-
end
|
709
|
-
|
710
|
-
author = Author.new
|
711
|
-
author.name = "Mark Twain"
|
712
|
-
author.bio = "American writer"
|
713
|
-
assert author.save
|
714
|
-
|
715
|
-
assert_equal 1, author.id
|
716
|
-
|
717
|
-
assert_allows Book do |book|
|
718
|
-
book.author_id = 1
|
719
|
-
end
|
720
|
-
|
721
|
-
ActiveRecord::Migration.deconstrain :books, :author_id, :reference
|
722
|
-
|
723
|
-
assert_allows Book do |book|
|
724
|
-
book.author_id = 2
|
725
|
-
end
|
726
|
-
end
|
727
|
-
|
728
|
-
def test_reference_on_a_column_whose_name_is_a_sql_keyword
|
729
|
-
ActiveRecord::Migration.constrain :books, :from, :reference => {:authors => :id}
|
730
|
-
|
731
|
-
assert_prohibits Book, :from, :reference, 'foreign key', ActiveRecord::InvalidForeignKey do |book|
|
732
|
-
book.from = 1
|
733
|
-
end
|
734
|
-
|
735
|
-
author = Author.new
|
736
|
-
author.name = "Mark Twain"
|
737
|
-
author.bio = "American writer"
|
738
|
-
assert author.save
|
739
|
-
|
740
|
-
assert_equal 1, author.id
|
741
|
-
|
742
|
-
assert_allows Book do |book|
|
743
|
-
book.from = 1
|
744
|
-
end
|
745
|
-
|
746
|
-
ActiveRecord::Migration.deconstrain :books, :from, :reference
|
747
|
-
|
748
|
-
assert_allows Book do |book|
|
749
|
-
book.from = 2
|
750
|
-
end
|
751
|
-
end
|
752
|
-
|
753
|
-
def test_reference_with_on_delete
|
754
|
-
ActiveRecord::Migration.constrain :books, :author_id, :reference => {:authors => :id, :on_delete => :cascade}
|
755
|
-
|
756
|
-
author = Author.new
|
757
|
-
author.name = "Mark Twain"
|
758
|
-
author.bio = "American writer"
|
759
|
-
assert author.save
|
760
|
-
|
761
|
-
assert_equal 1, Author.count
|
762
|
-
|
763
|
-
assert_allows Book do |book|
|
764
|
-
book.title = "The Adventures of Tom Sawyer"
|
765
|
-
book.author_id = 1
|
766
|
-
end
|
767
|
-
|
768
|
-
assert_allows Book do |book|
|
769
|
-
book.title = "The Adventures of Huckleberry Finn"
|
770
|
-
book.author_id = 1
|
771
|
-
end
|
772
|
-
|
773
|
-
author.destroy
|
774
|
-
|
775
|
-
assert_equal 0, Author.count
|
776
|
-
assert_equal 0, Book.count
|
777
|
-
end
|
778
|
-
|
779
|
-
def test_block_syntax
|
780
|
-
ActiveRecord::Migration.constrain :books do |t|
|
781
|
-
t.title :not_blank => true
|
782
|
-
t.isbn :exact_length => 15
|
783
|
-
t.author :alphanumeric => true
|
784
|
-
end
|
785
|
-
|
786
|
-
assert_prohibits Book, :title, :not_blank do |book|
|
787
|
-
book.title = ' '
|
788
|
-
end
|
789
|
-
|
790
|
-
assert_prohibits Book, :isbn, :exact_length do |book|
|
791
|
-
book.isbn = 'asdf'
|
792
|
-
end
|
793
|
-
|
794
|
-
assert_prohibits Book, :author, :alphanumeric do |book|
|
795
|
-
book.author = 'foo#bar'
|
796
|
-
end
|
797
|
-
|
798
|
-
ActiveRecord::Migration.deconstrain :books do |t|
|
799
|
-
t.title :not_blank
|
800
|
-
t.isbn :exact_length
|
801
|
-
t.author :alphanumeric
|
802
|
-
end
|
803
|
-
|
804
|
-
assert_allows Book do |book|
|
805
|
-
book.title = ' '
|
806
|
-
book.isbn = 'asdf'
|
807
|
-
book.author = 'foo#bar'
|
808
|
-
end
|
809
|
-
end
|
810
|
-
|
811
|
-
def test_multiple_constraints_per_line
|
812
|
-
ActiveRecord::Migration.constrain :books do |t|
|
813
|
-
t.title :not_blank => true, :alphanumeric => true, :blacklist => %w(foo bar)
|
814
|
-
end
|
815
|
-
|
816
|
-
assert_prohibits Book, :title, [:not_blank, :alphanumeric] do |book|
|
817
|
-
book.title = ' '
|
818
|
-
end
|
819
|
-
|
820
|
-
assert_prohibits Book, :title, :alphanumeric do |book|
|
821
|
-
book.title = 'asdf@asdf'
|
822
|
-
end
|
823
|
-
|
824
|
-
assert_prohibits Book, :title, :blacklist do |book|
|
825
|
-
book.title = 'foo'
|
826
|
-
end
|
827
|
-
|
828
|
-
ActiveRecord::Migration.deconstrain :books do |t|
|
829
|
-
t.title :not_blank, :alphanumeric, :blacklist
|
830
|
-
end
|
831
|
-
|
832
|
-
assert_allows Book do |book|
|
833
|
-
book.title = ' '
|
834
|
-
end
|
835
|
-
|
836
|
-
assert_allows Book do |book|
|
837
|
-
book.title = 'asdf@asdf'
|
838
|
-
end
|
839
|
-
|
840
|
-
assert_allows Book do |book|
|
841
|
-
book.title = 'foo'
|
842
|
-
end
|
843
|
-
end
|
844
|
-
|
845
|
-
def test_multicolumn_constraint
|
846
|
-
ActiveRecord::Migration.constrain :books, [:title, :isbn], :unique => true
|
847
|
-
|
848
|
-
assert_allows Book do |book|
|
849
|
-
book.title = 'foo'
|
850
|
-
book.isbn = 'bar'
|
851
|
-
end
|
852
|
-
|
853
|
-
assert_allows Book do |book|
|
854
|
-
book.title = 'foo'
|
855
|
-
book.isbn = 'foo'
|
856
|
-
end
|
857
|
-
|
858
|
-
assert_prohibits Book, [:title, :isbn], :unique, 'unique', ActiveRecord::RecordNotUnique do |book|
|
859
|
-
book.title = 'foo'
|
860
|
-
book.isbn = 'bar'
|
861
|
-
end
|
862
|
-
|
863
|
-
ActiveRecord::Migration.deconstrain :books, [:title, :isbn], :unique
|
864
|
-
|
865
|
-
assert_allows Book do |book|
|
866
|
-
book.title = 'foo'
|
867
|
-
book.isbn = 'bar'
|
868
|
-
end
|
869
|
-
end
|
870
|
-
|
871
|
-
def test_multicolumn_constraint_block_syntax
|
872
|
-
ActiveRecord::Migration.constrain :books do |t|
|
873
|
-
t[:title, :isbn].all :unique => true
|
874
|
-
end
|
875
|
-
|
876
|
-
assert_allows Book do |book|
|
877
|
-
book.title = 'foo'
|
878
|
-
book.isbn = 'bar'
|
879
|
-
end
|
880
|
-
|
881
|
-
assert_allows Book do |book|
|
882
|
-
book.title = 'foo'
|
883
|
-
book.isbn = 'foo'
|
884
|
-
end
|
885
|
-
|
886
|
-
assert_prohibits Book, [:title, :isbn], :unique, 'unique', ActiveRecord::RecordNotUnique do |book|
|
887
|
-
book.title = 'foo'
|
888
|
-
book.isbn = 'bar'
|
889
|
-
end
|
890
|
-
|
891
|
-
ActiveRecord::Migration.deconstrain :books do |t|
|
892
|
-
t[:title, :isbn].all :unique
|
893
|
-
end
|
894
|
-
|
895
|
-
assert_allows Book do |book|
|
896
|
-
book.title = 'foo'
|
897
|
-
book.isbn = 'bar'
|
898
|
-
end
|
899
|
-
end
|
900
|
-
|
901
|
-
def test_lowercase
|
902
|
-
ActiveRecord::Migration.constrain :books, :author, :lowercase => true
|
903
|
-
|
904
|
-
assert_prohibits Book, :author, :lowercase do |book|
|
905
|
-
book.author = 'UPPER'
|
906
|
-
end
|
907
|
-
|
908
|
-
assert_allows Book do |book|
|
909
|
-
book.author = 'lower with 1337'
|
910
|
-
end
|
911
|
-
|
912
|
-
ActiveRecord::Migration.deconstrain :books, :author, :lowercase
|
913
|
-
|
914
|
-
assert_allows Book do |book|
|
915
|
-
book.author = 'UPPER'
|
916
|
-
end
|
917
|
-
|
918
|
-
end
|
919
|
-
|
920
|
-
def test_xor
|
921
|
-
ActiveRecord::Migration.constrain :books, [:xor_col_1, :xor_col_2], :xor => true
|
922
|
-
|
923
|
-
assert_prohibits Book, [:xor_col_1, :xor_col_2], :xor do |book|
|
924
|
-
book.xor_col_1 = 123
|
925
|
-
book.xor_col_2 = 321
|
926
|
-
end
|
927
|
-
|
928
|
-
assert_allows Book do |book|
|
929
|
-
book.xor_col_1 = 123
|
930
|
-
end
|
931
|
-
|
932
|
-
assert_allows Book do |book|
|
933
|
-
book.xor_col_2 = 123
|
934
|
-
end
|
935
|
-
|
936
|
-
ActiveRecord::Migration.deconstrain :books, [:xor_col_1, :xor_col_2], :xor
|
937
|
-
|
938
|
-
assert_allows Book do |book|
|
939
|
-
book.xor_col_1 = 123
|
940
|
-
book.xor_col_2 = 123
|
941
|
-
end
|
942
|
-
end
|
943
|
-
end
|