ohm-contrib 0.1.2 → 1.0.rc0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/ohm/{contrib/callbacks.rb → callbacks.rb} +20 -65
- data/lib/ohm/contrib.rb +9 -17
- data/lib/ohm/datatypes.rb +38 -0
- data/lib/ohm/{contrib/locking.rb → locking.rb} +1 -2
- data/lib/ohm/plugin.rb +54 -0
- data/lib/ohm/{contrib/scope.rb → scope.rb} +7 -6
- data/lib/ohm/{contrib/slug.rb → slug.rb} +11 -6
- data/lib/ohm/{contrib/soft_delete.rb → softdelete.rb} +23 -19
- data/lib/ohm/timestamping.rb +41 -0
- data/ohm-contrib.gemspec +30 -0
- data/rakefile +6 -0
- data/test/{instance_callbacks_test.rb → instance_callbacks.rb} +2 -6
- data/test/{macro_callbacks_test.rb → macro_callbacks.rb} +1 -9
- data/test/plugin.rb +212 -0
- data/test/{scope_test.rb → scope.rb} +2 -3
- data/test/slug.rb +24 -0
- data/test/{soft_delete_test.rb → soft_delete.rb} +13 -3
- data/test/{timestamping_test.rb → timestamping.rb} +5 -6
- metadata +33 -70
- data/Rakefile +0 -8
- data/lib/ohm/contrib/active_model_extension.rb +0 -87
- data/lib/ohm/contrib/boundaries.rb +0 -41
- data/lib/ohm/contrib/date_validations.rb +0 -23
- data/lib/ohm/contrib/extra_validations.rb +0 -48
- data/lib/ohm/contrib/fulltext_searching.rb +0 -80
- data/lib/ohm/contrib/length_validations.rb +0 -32
- data/lib/ohm/contrib/number_validations.rb +0 -14
- data/lib/ohm/contrib/timestamping.rb +0 -38
- data/lib/ohm/contrib/typecast.rb +0 -350
- data/lib/ohm/contrib/web_validations.rb +0 -52
- data/test/activemodel_test.rb +0 -27
- data/test/boundaries_test.rb +0 -45
- data/test/callbacks_lint.rb +0 -141
- data/test/date_validations_test.rb +0 -29
- data/test/fixtures/ascii8bit.txt +0 -1
- data/test/fulltext_searching_test.rb +0 -63
- data/test/length_validations_test.rb +0 -31
- data/test/membership_validation_test.rb +0 -31
- data/test/number_validations_test.rb +0 -37
- data/test/slug_test.rb +0 -30
- data/test/typecast_array_test.rb +0 -146
- data/test/typecast_boolean_test.rb +0 -43
- data/test/typecast_date_test.rb +0 -82
- data/test/typecast_decimal_test.rb +0 -82
- data/test/typecast_existing_attribute_test.rb +0 -22
- data/test/typecast_float_test.rb +0 -57
- data/test/typecast_hash_test.rb +0 -120
- data/test/typecast_integer_test.rb +0 -71
- data/test/typecast_string_test.rb +0 -43
- data/test/typecast_time_test.rb +0 -72
- data/test/typecast_timezone_test.rb +0 -37
- data/test/web_validations_test.rb +0 -79
@@ -1,82 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("./helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class Post < Ohm::Model
|
6
|
-
include Ohm::Typecast
|
7
|
-
|
8
|
-
attribute :price, Decimal
|
9
|
-
end
|
10
|
-
|
11
|
-
test "handles nil case correctly" do
|
12
|
-
post = Post.create(:price => nil)
|
13
|
-
post = Post[post.id]
|
14
|
-
|
15
|
-
assert nil == post.price
|
16
|
-
end
|
17
|
-
|
18
|
-
test "handles empty string case correctly" do
|
19
|
-
post = Post.create(:price => "")
|
20
|
-
post = Post[post.id]
|
21
|
-
|
22
|
-
assert "" == post.price.to_s
|
23
|
-
end
|
24
|
-
|
25
|
-
test "allows for real arithmetic" do
|
26
|
-
post = Post.create(:price => "0.01")
|
27
|
-
post = Post[post.id]
|
28
|
-
|
29
|
-
assert 0.02 == post.price + post.price
|
30
|
-
assert 0.0 == post.price - post.price
|
31
|
-
assert 0.0001 == post.price * post.price
|
32
|
-
assert 1.0 == post.price / post.price
|
33
|
-
end
|
34
|
-
|
35
|
-
test "is accurate accdg to the decimal spec" do
|
36
|
-
post = Post.create(:price => "0.0001")
|
37
|
-
post = Post[post.id]
|
38
|
-
|
39
|
-
sum = 0
|
40
|
-
1_000.times { sum += post.price }
|
41
|
-
assert 0.1 == sum
|
42
|
-
end
|
43
|
-
|
44
|
-
test "using += with price" do
|
45
|
-
post = Post.create(:price => "0.0001")
|
46
|
-
post = Post[post.id]
|
47
|
-
|
48
|
-
post.price += 1
|
49
|
-
assert 1.0001 == post.price.to_f
|
50
|
-
end
|
51
|
-
|
52
|
-
test "assigning a raw BigDecimal" do
|
53
|
-
post = Post.create(:price => BigDecimal("399.50"))
|
54
|
-
post = Post[post.id]
|
55
|
-
|
56
|
-
assert post.price.to_s.kind_of?(String)
|
57
|
-
end
|
58
|
-
|
59
|
-
test "equality and comparable matching" do
|
60
|
-
post = Post.create(:price => "399.50")
|
61
|
-
assert (post.price == "399.50")
|
62
|
-
assert (post.price < 399.51)
|
63
|
-
assert (post.price > 399.49)
|
64
|
-
assert (post.price <= 399.50)
|
65
|
-
assert (post.price <= 399.51)
|
66
|
-
assert (post.price >= 399.50)
|
67
|
-
assert (post.price >= 399.49)
|
68
|
-
end
|
69
|
-
|
70
|
-
test "inspecting a Decimal" do
|
71
|
-
post = Post.new(:price => 399.50)
|
72
|
-
assert '"399.5"' == post.price.inspect
|
73
|
-
|
74
|
-
post.price = 'FooBar'
|
75
|
-
assert '"FooBar"' == post.price.inspect
|
76
|
-
end
|
77
|
-
|
78
|
-
test "type is BigDecimal" do
|
79
|
-
post = Post.new(:price => 399.50)
|
80
|
-
assert BigDecimal == post.price.type
|
81
|
-
end
|
82
|
-
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("./helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class Post < Ohm::Model
|
6
|
-
include Ohm::Timestamping
|
7
|
-
include Ohm::Typecast
|
8
|
-
|
9
|
-
typecast :created_at, Time
|
10
|
-
typecast :updated_at, Time
|
11
|
-
end
|
12
|
-
|
13
|
-
test "created_at and updated_at are typecasted" do
|
14
|
-
post = Post.create
|
15
|
-
|
16
|
-
assert post.created_at.respond_to?(:strftime)
|
17
|
-
assert post.updated_at.respond_to?(:strftime)
|
18
|
-
|
19
|
-
assert NOW.strftime("%Y-%m-%d") == post.created_at.strftime("%Y-%m-%d")
|
20
|
-
assert NOW.strftime("%Y-%m-%d") == post.updated_at.strftime("%Y-%m-%d")
|
21
|
-
end
|
22
|
-
|
data/test/typecast_float_test.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("./helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class Post < Ohm::Model
|
6
|
-
include Ohm::Typecast
|
7
|
-
|
8
|
-
attribute :price, Float
|
9
|
-
end
|
10
|
-
|
11
|
-
test "handles nil case correctly" do
|
12
|
-
post = Post.create(:price => nil)
|
13
|
-
post = Post[post.id]
|
14
|
-
|
15
|
-
assert nil == post.price
|
16
|
-
end
|
17
|
-
|
18
|
-
test "handles empty string case correctly" do
|
19
|
-
post = Post.create(:price => "")
|
20
|
-
post = Post[post.id]
|
21
|
-
|
22
|
-
assert "" == post.price.to_s
|
23
|
-
end
|
24
|
-
|
25
|
-
test "allows for real arithmetic" do
|
26
|
-
post = Post.create(:price => "3")
|
27
|
-
post = Post[post.id]
|
28
|
-
|
29
|
-
assert 6.0 == post.price + post.price
|
30
|
-
assert 0.0 == post.price - post.price
|
31
|
-
assert 9.0 == post.price * post.price
|
32
|
-
assert 1.0 == post.price / post.price
|
33
|
-
end
|
34
|
-
|
35
|
-
test "raises when trying to do arithmetic ops on a non-float" do
|
36
|
-
|
37
|
-
post = Post.create(:price => "FooBar")
|
38
|
-
post = Post[post.id]
|
39
|
-
|
40
|
-
assert_raise ArgumentError do
|
41
|
-
post.price * post.price
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
test "inspecting" do
|
46
|
-
post = Post.new(:price => "12345.67890")
|
47
|
-
assert '"12345.67890"' == post.price.inspect
|
48
|
-
|
49
|
-
post.price = 'FooBar'
|
50
|
-
assert '"FooBar"' == post.price.inspect
|
51
|
-
end
|
52
|
-
|
53
|
-
test "type is Float" do
|
54
|
-
post = Post.new(:price => 399.50)
|
55
|
-
assert Float == post.price.type
|
56
|
-
end
|
57
|
-
|
data/test/typecast_hash_test.rb
DELETED
@@ -1,120 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("./helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class Post < Ohm::Model
|
6
|
-
include Ohm::Typecast
|
7
|
-
|
8
|
-
attribute :address, Hash
|
9
|
-
|
10
|
-
def hash
|
11
|
-
Hash.new
|
12
|
-
end
|
13
|
-
|
14
|
-
def top_level_hash
|
15
|
-
Hash
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
test "importing" do
|
20
|
-
assert Hash.new == Ohm::Types::Hash[nil]
|
21
|
-
assert Hash.new == Ohm::Types::Hash[""]
|
22
|
-
assert Hash.new == Ohm::Types::Hash[{}]
|
23
|
-
|
24
|
-
expected = Hash[:a => "b", :c => "d"]
|
25
|
-
assert expected == Ohm::Types::Hash[{ :a => "b", :c => "d" }]
|
26
|
-
end
|
27
|
-
|
28
|
-
test "exporting / dumping" do
|
29
|
-
assert "{}" == Ohm::Types::Hash[nil].to_s
|
30
|
-
assert "{}" == Ohm::Types::Hash[""].to_s
|
31
|
-
assert "{}" == Ohm::Types::Hash[{}].to_s
|
32
|
-
|
33
|
-
expected = %q{{"a":"b","c":"d"}}
|
34
|
-
assert expected == Ohm::Types::Hash[{ :a => "b", :c => "d" }].to_s
|
35
|
-
end
|
36
|
-
|
37
|
-
test "still able to get top level methods" do
|
38
|
-
assert Post.new.hash == {}
|
39
|
-
assert Hash == Post.new.top_level_hash
|
40
|
-
end
|
41
|
-
|
42
|
-
test "handles nil case correctly" do
|
43
|
-
post = Post.create(:address => nil)
|
44
|
-
assert post.address == {}
|
45
|
-
|
46
|
-
post = Post[post.id]
|
47
|
-
assert post.address == {}
|
48
|
-
end
|
49
|
-
|
50
|
-
test "handles empty string case correctly" do
|
51
|
-
post = Post.create(:address => "")
|
52
|
-
assert post.address == {}
|
53
|
-
|
54
|
-
post = Post[post.id]
|
55
|
-
assert post.address == {}
|
56
|
-
end
|
57
|
-
|
58
|
-
test "handles populated hashes" do
|
59
|
-
address = { "address1" => "#123", "city" => "Singapore", "country" => "SG"}
|
60
|
-
post = Post.create(:address => address)
|
61
|
-
assert address == post.address
|
62
|
-
|
63
|
-
post = Post[post.id]
|
64
|
-
assert address == post.address
|
65
|
-
end
|
66
|
-
|
67
|
-
test "allows for hash operations" do
|
68
|
-
address = { "address1" => "#123", "city" => "Singapore", "country" => "SG"}
|
69
|
-
post = Post.create(:address => address)
|
70
|
-
|
71
|
-
assert ["address1", "city", "country"] == post.address.keys
|
72
|
-
assert ["#123", "Singapore", "SG"] == post.address.values
|
73
|
-
|
74
|
-
post = Post[post.id]
|
75
|
-
assert ["address1", "city", "country"] == post.address.keys
|
76
|
-
assert ["#123", "Singapore", "SG"] == post.address.values
|
77
|
-
end
|
78
|
-
|
79
|
-
test "handles mutation" do
|
80
|
-
address = { "address1" => "#123", "city" => "Singapore", "country" => "SG"}
|
81
|
-
post = Post.create(:address => address)
|
82
|
-
|
83
|
-
post.address["address1"] = "#456"
|
84
|
-
post.save
|
85
|
-
|
86
|
-
assert ["address1", "city", "country"] == post.address.keys
|
87
|
-
assert ["#456", "Singapore", "SG"] == post.address.values
|
88
|
-
|
89
|
-
post = Post[post.id]
|
90
|
-
assert ["address1", "city", "country"] == post.address.keys
|
91
|
-
assert ["#456", "Singapore", "SG"] == post.address.values
|
92
|
-
end
|
93
|
-
|
94
|
-
Address = Class.new(Struct.new(:city, :country))
|
95
|
-
|
96
|
-
test "raises when trying to assign a non-hash" do
|
97
|
-
assert_raise TypeError do
|
98
|
-
Post.new(:address => [])
|
99
|
-
end
|
100
|
-
|
101
|
-
assert_raise TypeError do
|
102
|
-
Post.new(:address => Address.new)
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
test "type is Hash" do
|
107
|
-
post = Post.new(:address => { "address1" => "#456" })
|
108
|
-
assert Hash == post.address.type
|
109
|
-
end
|
110
|
-
|
111
|
-
test "ascii 8bit encoding" do
|
112
|
-
txt = File.expand_path("fixtures/ascii8bit.txt", File.dirname(__FILE__))
|
113
|
-
|
114
|
-
data = File.read(txt, :encoding => "ascii-8bit")
|
115
|
-
|
116
|
-
post = Post.create(:address => { "address1" => data.force_encoding("UTF-8") })
|
117
|
-
post = Post[post.id]
|
118
|
-
|
119
|
-
assert_equal post.address["address1"], data.force_encoding("UTF-8")
|
120
|
-
end if defined?(Encoding)
|
@@ -1,71 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("./helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class Post < Ohm::Model
|
6
|
-
include Ohm::Typecast
|
7
|
-
|
8
|
-
attribute :price, Integer
|
9
|
-
end
|
10
|
-
|
11
|
-
test "handles nil case correctly" do
|
12
|
-
post = Post.create(:price => nil)
|
13
|
-
post = Post[post.id]
|
14
|
-
|
15
|
-
assert nil == post.price
|
16
|
-
end
|
17
|
-
|
18
|
-
test "handles empty string case correctly" do
|
19
|
-
post = Post.create(:price => "")
|
20
|
-
post = Post[post.id]
|
21
|
-
|
22
|
-
assert "" == post.price.to_s
|
23
|
-
end
|
24
|
-
|
25
|
-
test "allows respond_to on an invalid integer" do
|
26
|
-
post = Post.new(:price => "FooBar")
|
27
|
-
|
28
|
-
assert_nothing_raised ArgumentError do
|
29
|
-
post.price.respond_to?(:**)
|
30
|
-
end
|
31
|
-
|
32
|
-
assert ! post.price.respond_to?(:**)
|
33
|
-
end
|
34
|
-
|
35
|
-
test "falls back to String#respond_to? when invalid" do
|
36
|
-
post = Post.new(:price => "FooBar")
|
37
|
-
assert post.price.respond_to?(:capitalize)
|
38
|
-
end
|
39
|
-
|
40
|
-
test "allows for real arithmetic" do
|
41
|
-
post = Post.create(:price => "3")
|
42
|
-
post = Post[post.id]
|
43
|
-
|
44
|
-
assert 6 == post.price + post.price
|
45
|
-
assert 0 == post.price - post.price
|
46
|
-
assert 9 == post.price * post.price
|
47
|
-
assert 1 == post.price / post.price
|
48
|
-
end
|
49
|
-
|
50
|
-
test "raises when trying to do arithmetic ops on a non-int" do
|
51
|
-
post = Post.create(:price => "FooBar")
|
52
|
-
post = Post[post.id]
|
53
|
-
|
54
|
-
assert_raise ArgumentError do
|
55
|
-
post.price * post.price
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
test "inspecting" do
|
60
|
-
post = Post.new(:price => "50000")
|
61
|
-
assert '"50000"' == post.price.inspect
|
62
|
-
|
63
|
-
post.price = 'FooBar'
|
64
|
-
assert '"FooBar"' == post.price.inspect
|
65
|
-
end
|
66
|
-
|
67
|
-
test "type is Fixnum" do
|
68
|
-
post = Post.new(:price => 399)
|
69
|
-
assert Fixnum == post.price.type
|
70
|
-
end
|
71
|
-
|
@@ -1,43 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("./helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class Post < Ohm::Model
|
6
|
-
include Ohm::Typecast
|
7
|
-
|
8
|
-
attribute :content
|
9
|
-
end
|
10
|
-
|
11
|
-
test "handles nil case correctly" do
|
12
|
-
post = Post.create(:content => nil)
|
13
|
-
post = Post[post.id]
|
14
|
-
|
15
|
-
assert nil == post.content
|
16
|
-
end
|
17
|
-
|
18
|
-
test "still responds to string methods properly" do
|
19
|
-
post = Post.create(:content => "FooBar")
|
20
|
-
post = Post[post.id]
|
21
|
-
|
22
|
-
assert "foobar" == post.content.downcase
|
23
|
-
end
|
24
|
-
|
25
|
-
test "mutating methods like upcase!" do
|
26
|
-
post = Post.create(:content => "FooBar")
|
27
|
-
post = Post[post.id]
|
28
|
-
|
29
|
-
post.content.upcase!
|
30
|
-
|
31
|
-
assert "FOOBAR" == post.content.to_s
|
32
|
-
end
|
33
|
-
|
34
|
-
test "inspecting" do
|
35
|
-
post = Post.new(:content => "FooBar")
|
36
|
-
assert 'FooBar' == post.content
|
37
|
-
end
|
38
|
-
|
39
|
-
test "type is String" do
|
40
|
-
post = Post.new(:content => "FooBar")
|
41
|
-
assert String == post.content.type
|
42
|
-
end
|
43
|
-
|
data/test/typecast_time_test.rb
DELETED
@@ -1,72 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("./helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class Post < Ohm::Model
|
6
|
-
include Ohm::Typecast
|
7
|
-
|
8
|
-
attribute :created_at, Time
|
9
|
-
|
10
|
-
def now
|
11
|
-
Time.now
|
12
|
-
end
|
13
|
-
|
14
|
-
def new_time
|
15
|
-
Time.new
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
test "still able to access top level Time" do
|
20
|
-
assert Post.new.now.to_s == Time.now.to_s
|
21
|
-
end
|
22
|
-
|
23
|
-
test "should be able to use Time.new inside the class" do
|
24
|
-
assert Post.new.new_time.to_s == Time.new.to_s
|
25
|
-
end
|
26
|
-
|
27
|
-
test "handles nil case correctly" do
|
28
|
-
post = Post.create(:created_at => nil)
|
29
|
-
post = Post[post.id]
|
30
|
-
|
31
|
-
assert nil == post.created_at
|
32
|
-
end
|
33
|
-
|
34
|
-
test "handles empty string case correctly" do
|
35
|
-
post = Post.create(:created_at => "")
|
36
|
-
post = Post[post.id]
|
37
|
-
|
38
|
-
assert "" == post.created_at.to_s
|
39
|
-
end
|
40
|
-
|
41
|
-
test "allows for real time operations" do
|
42
|
-
post = Post.create(:created_at => "2010-05-10T00:00Z")
|
43
|
-
post = Post[post.id]
|
44
|
-
|
45
|
-
assert post.created_at.respond_to?(:strftime)
|
46
|
-
assert "2010-05-10" == post.created_at.strftime('%Y-%m-%d')
|
47
|
-
end
|
48
|
-
|
49
|
-
test "raises when trying to do non-time operations" do
|
50
|
-
post = Post.create(:created_at => "FooBar")
|
51
|
-
post = Post[post.id]
|
52
|
-
|
53
|
-
assert ! post.created_at.respond_to?(:abs)
|
54
|
-
|
55
|
-
assert_raise NoMethodError do
|
56
|
-
post.created_at.abs
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
test "inspecting" do
|
61
|
-
post = Post.create(:created_at => Time.utc(2010, 05, 05))
|
62
|
-
assert '"2010-05-05 00:00:00 UTC"' == post.created_at.inspect
|
63
|
-
|
64
|
-
post.created_at = 'FooBar'
|
65
|
-
assert '"FooBar"' == post.created_at.inspect
|
66
|
-
end
|
67
|
-
|
68
|
-
test "type is Time" do
|
69
|
-
post = Post.create(:created_at => Time.utc(2010, 05, 05))
|
70
|
-
assert Time == post.created_at.type
|
71
|
-
end
|
72
|
-
|
@@ -1,37 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("./helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class Post < Ohm::Model
|
6
|
-
include Ohm::Typecast
|
7
|
-
|
8
|
-
attribute :printed_at, Time
|
9
|
-
end
|
10
|
-
|
11
|
-
test "2010-08-07T00:00Z is parsed as 2010-08-07 00:00:00 UTC" do
|
12
|
-
post = Post.new(:printed_at => "2010-08-07T00:00Z")
|
13
|
-
assert Time.utc(2010, 8, 7).to_s == post.printed_at.utc.to_s
|
14
|
-
|
15
|
-
post.save
|
16
|
-
post = Post[post.id]
|
17
|
-
assert Time.utc(2010, 8, 7).to_s == post.printed_at.utc.to_s
|
18
|
-
end
|
19
|
-
|
20
|
-
test "2010-08-07 18:29Z is parsed as 2010-08-07 18:29:00 UTC" do
|
21
|
-
post = Post.new(:printed_at => "2010-08-07 18:29Z")
|
22
|
-
assert Time.utc(2010, 8, 7, 18, 29).to_s == post.printed_at.utc.to_s
|
23
|
-
|
24
|
-
post.save
|
25
|
-
post = Post[post.id]
|
26
|
-
assert Time.utc(2010, 8, 7, 18, 29).to_s == post.printed_at.utc.to_s
|
27
|
-
end
|
28
|
-
|
29
|
-
test "2010-08-07T18:29:31Z is parsed as 2010-08-07 18:29:31 UTC" do
|
30
|
-
post = Post.new(:printed_at => "2010-08-07T18:29:31Z")
|
31
|
-
assert Time.utc(2010, 8, 7, 18, 29, 31).to_s == post.printed_at.utc.to_s
|
32
|
-
|
33
|
-
post.save
|
34
|
-
post = Post[post.id]
|
35
|
-
assert Time.utc(2010, 8, 7, 18, 29, 31).to_s == post.printed_at.utc.to_s
|
36
|
-
end
|
37
|
-
|
@@ -1,79 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("./helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class BlogPost < Ohm::Model
|
6
|
-
include Ohm::WebValidations
|
7
|
-
|
8
|
-
attribute :slug
|
9
|
-
|
10
|
-
index :slug
|
11
|
-
|
12
|
-
def validate
|
13
|
-
assert_slug :slug
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
class Comment < Ohm::Model
|
18
|
-
include Ohm::WebValidations
|
19
|
-
|
20
|
-
attribute :ip_address
|
21
|
-
attribute :homepage
|
22
|
-
attribute :email
|
23
|
-
|
24
|
-
def validate
|
25
|
-
assert_ipaddr :ip_address
|
26
|
-
assert_url :homepage
|
27
|
-
assert_email :email
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
test "invalid slug scenario" do
|
32
|
-
p = BlogPost.new(:slug => "This is a title, not a SLUG")
|
33
|
-
assert ! p.valid?
|
34
|
-
assert [[:slug, :not_slug]] == p.errors
|
35
|
-
end
|
36
|
-
|
37
|
-
test "valid slug scenario" do
|
38
|
-
p = BlogPost.new(:slug => "this-is-a-valid-slug")
|
39
|
-
assert p.valid?
|
40
|
-
end
|
41
|
-
|
42
|
-
test "slug uniqueness validation" do
|
43
|
-
p1 = BlogPost.create(:slug => "this-is-a-valid-slug")
|
44
|
-
p2 = BlogPost.create(:slug => "this-is-a-valid-slug")
|
45
|
-
|
46
|
-
assert ! p2.valid?
|
47
|
-
assert [[:slug, :not_unique]] == p2.errors
|
48
|
-
end
|
49
|
-
|
50
|
-
test "ip address validation" do
|
51
|
-
c = Comment.new(:ip_address => "400.500.600.700")
|
52
|
-
assert ! c.valid?
|
53
|
-
assert c.errors.include?([:ip_address, :not_ipaddr])
|
54
|
-
end
|
55
|
-
|
56
|
-
test "email address validation" do
|
57
|
-
c = Comment.new(:email => "something.com")
|
58
|
-
assert ! c.valid?
|
59
|
-
assert c.errors.include?([:email, :not_email])
|
60
|
-
|
61
|
-
c = Comment.new(:email => "john@doe.com")
|
62
|
-
c.valid?
|
63
|
-
assert ! c.errors.include?([:email, :not_email])
|
64
|
-
end
|
65
|
-
|
66
|
-
test "url validaiton" do
|
67
|
-
c = Comment.new(:homepage => "somehing")
|
68
|
-
assert ! c.valid?
|
69
|
-
assert c.errors.include?([:homepage, :not_url])
|
70
|
-
|
71
|
-
c = Comment.new(:homepage => "irc://irc.freenode.net/something")
|
72
|
-
assert ! c.valid?
|
73
|
-
assert c.errors.include?([:homepage, :not_url])
|
74
|
-
|
75
|
-
c = Comment.new(:homepage => "http://test.com")
|
76
|
-
c.valid?
|
77
|
-
assert ! c.errors.include?([:homepage, :not_url])
|
78
|
-
end
|
79
|
-
|