forminate 0.1.0 → 0.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.
@@ -1,179 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Forminate do
4
- subject(:model) { model_class.new }
5
-
6
- let :model_class do
7
- Class.new do
8
- include Forminate
9
-
10
- attribute :total
11
- attribute :tax
12
-
13
- attributes_for :dummy_user
14
- attributes_for :dummy_book, :validate => false
15
- attributes_for :dummy_credit_card, :validate => :require_credit_card?
16
-
17
- validates_numericality_of :total
18
-
19
- def self.name
20
- "Cart"
21
- end
22
-
23
- def calculate_total
24
- self.total = dummy_book.price || 0.0
25
- end
26
-
27
- def require_credit_card?
28
- dummy_book.price && dummy_book.price > 0.0
29
- end
30
- end
31
- end
32
-
33
- describe ".attributes_for" do
34
- it "adds a reader method for each attribute of the associated model" do
35
- expect(model.respond_to?(:dummy_user_first_name)).to be_true
36
- end
37
-
38
- it "adds reader and writer methods for each attribute of the associated model" do
39
- model.dummy_user_first_name = 'Mo'
40
- expect(model.dummy_user_first_name).to eq('Mo')
41
- end
42
-
43
- it "adds reader methods for each associated model" do
44
- expect(model.dummy_user).to be_an_instance_of(DummyUser)
45
- end
46
-
47
- it "adds the association to the list of association names" do
48
- expect(model_class.association_names).to include(:dummy_user)
49
- end
50
-
51
- describe ":validate option" do
52
- it "validates associated object based on true or false" do
53
- model.calculate_total
54
- expect(model.valid?).to be_false
55
- model.dummy_user_email = 'bob@example.com'
56
- expect(model.valid?).to be_true
57
- end
58
-
59
- it "validates associated objects based on a method name (as a symbol) that evaluates to true or false" do
60
- model.calculate_total
61
- model.dummy_user_email = 'bob@example.com'
62
- expect(model.valid?).to be_true
63
- model.dummy_book_price = 12.95
64
- expect(model.valid?).to be_false
65
- model.dummy_credit_card_number = 4242424242424242
66
- expect(model.valid?).to be_true
67
- end
68
- end
69
- end
70
-
71
- describe ".attribute_names" do
72
- it "includes the names of its own attributes and the attributes of associated models" do
73
- expected_attributes = [
74
- "total",
75
- "tax",
76
- "dummy_user_first_name",
77
- "dummy_user_last_name",
78
- "dummy_user_email",
79
- "dummy_book_title",
80
- "dummy_book_price",
81
- "dummy_credit_card_number",
82
- "dummy_credit_card_expiration",
83
- "dummy_credit_card_cvv",
84
- ]
85
- expect(model_class.attribute_names).to eq(expected_attributes)
86
- end
87
- end
88
-
89
- describe ".association_names" do
90
- it "includes the names of associated models" do
91
- expect(model_class.association_names).to eq([:dummy_user, :dummy_book, :dummy_credit_card])
92
- end
93
- end
94
-
95
- describe ".association_validations" do
96
- it "includes the names and conditions of association validations" do
97
- expect(model_class.association_validations).to eq({ :dummy_user => true, :dummy_book => false, :dummy_credit_card => :require_credit_card? })
98
- end
99
- end
100
-
101
- describe "#initialize" do
102
- it "builds associated objects and creates reader methods" do
103
- expect(model.dummy_user).to be_an_instance_of(DummyUser)
104
- end
105
-
106
- it "creates writer methods for associated objects" do
107
- new_dummy_user = DummyUser.new(first_name: 'Mo')
108
- expect(model.dummy_user).to_not be(new_dummy_user)
109
- model.dummy_user = new_dummy_user
110
- expect(model.dummy_user).to be(new_dummy_user)
111
- end
112
-
113
- it "sets association attributes based on an options hash" do
114
- new_model = model_class.new(dummy_user_first_name: 'Mo', dummy_user_last_name: 'Lawson')
115
- expect(new_model.dummy_user_first_name).to eq('Mo')
116
- expect(new_model.dummy_user_last_name).to eq('Lawson')
117
- end
118
-
119
- it "sets attributes based on an options hash" do
120
- new_model = model_class.new(total: 21.49)
121
- expect(new_model.total).to eq(21.49)
122
- end
123
- end
124
-
125
- describe "#association_names" do
126
- it "delegates to self.association_names" do
127
- expect(model.association_names).to eq(model_class.association_names)
128
- end
129
- end
130
-
131
- describe "#associations" do
132
- it "returns a hash of association names and associated objects" do
133
- expect(model.associations[:dummy_user]).to be_an_instance_of(DummyUser)
134
- end
135
- end
136
-
137
- describe "#save" do
138
- context "object is valid" do
139
- it "saves associations and returns self" do
140
- model.dummy_user_email = 'bob@example.com'
141
- model.calculate_total
142
- DummyUser.any_instance.should_receive(:save)
143
- expect(model.save).to eq(model)
144
- end
145
- end
146
-
147
- context "object is not valid" do
148
- it "does not save associations and returns false" do
149
- DummyUser.any_instance.should_not_receive(:save)
150
- expect(model.save).to be_false
151
- end
152
- end
153
- end
154
-
155
- context "setting an attribute using the attribute name" do
156
- it "reflects the change on the associated object" do
157
- model.dummy_user_first_name = 'Mo'
158
- expect(model.dummy_user.first_name).to eq('Mo')
159
- end
160
- end
161
-
162
- context "setting an attribute using the association's attribute" do
163
- it "reflects the change on the attribute name" do
164
- model.dummy_user.last_name = 'Lawson'
165
- expect(model.dummy_user_last_name).to eq('Lawson')
166
- end
167
- end
168
-
169
- it "delegates to attr_accessors of associated objects" do
170
- model.dummy_user_full_name = 'Mo Lawson'
171
- expect(model.dummy_user.full_name).to eq('Mo Lawson')
172
- expect(model.dummy_user_full_name).to eq('Mo Lawson')
173
- end
174
-
175
- it "inherits the validations of its associated objects" do
176
- model.valid?
177
- expect(model.errors.full_messages).to eq(["Dummy user email can't be blank", "Total is not a number"])
178
- end
179
- end