Added support for alternate (cleaner) syntax
[doozer.git] / test / unit / alt_definition_test.rb
blob1c936cbb4b5693e9be9e2cfd76b51f1de3ef1494
1 require File.dirname(__FILE__) + '/../test_helper'
2 require 'doozer'
3 require 'doozer/alt_definition'
5 require 'pp'
7 class AltDefinitionTest < Test::Unit::TestCase
9   def setup
10     Doozer.reset!
11   end
13   should "generate fixture definition data structure" do # ---------------
14     
15     doozer :user
16     
17     doozer :page do 
18       fields {  # Defaults
19         title     'My Title'
20         content
21         author 
22       }  
23     end
24     
25     expected_structure = {
26       :user=>{ 
27         :target=>:user,
28         :row_names=>[],
29         :data_rows=>{},
30         :default_values=>{},
31         :block_affects=>[{:child=>:belongs_to}]
32       },
33       :page=>{ 
34         :target=>:page,
35         :default_values=>{:title=>"My Title"},
36         :block_affects=>[{:child=>:belongs_to}],
37         :field_order=>[:title, :content, :author],
38         :row_names=>[],
39         :data_rows=>{}
40       }
41     }
42     
43     assert_equal expected_structure, Doozer.object_list
44   end
46   should "generate helper methods" do # ----------------------------------
47     
48     doozer :page
49     
50     assert_not_nil defined?(page)
51     assert_not_nil defined?(page_id)
52     assert_not_nil defined?(page_name)
53     assert_not_nil defined?(pages)
55     doozer :person
56     
57     assert_not_nil defined?(person)
58     assert_not_nil defined?(person_id)
59     assert_not_nil defined?(person_name)
60     assert_not_nil defined?(people)
61   end
62   
63   should "return next object id" do # ------------------------------------
65     doozer :user
67     assert_equal 1, Doozer.next_object_id( :user )
68     user :bob, :name=>'Bob'
69     assert_equal 2, Doozer.next_object_id( :user )
70   end
71   
72   should "add objects to data pool from named arguments" do # ------------
74     doozer :user
75     
76     user :bob, :name=>'Bob'
77     assert_equal 1, user_id(:bob)
78     assert_equal "Bob", users(:bob)[:name]
80     user :name=>'Matt'
81     user :name=>'Dan'
83     assert_equal 3, user_id(:user_3)
84     assert_equal 'Dan', users(:user_3)[:name]
85   end
86   
87   should "add objects to data pool from positional arguments" do # -------
89     doozer :user do
90       fields { name } 
91     end
92     
93     user :bob, 'Bob'
94     assert_equal 1, user_id(:bob)
95     assert_equal "Bob", users(:bob)[:name]
97     user :matt, 'Matt'
98     user 'Dan'
100     assert_equal 3, user_id(:user_3)
101     assert_equal 'Dan', users(:user_3)[:name]
102   end
103   
104   should "add default values to data objects" do # -----------------------
105     created_on_time = Time.now
106     
107     doozer :page do
108       fields {    # DEFAULTS: 
109        title        'New Title'
110        author       'System'
111        content      'Content'
112        created_on   created_on_time
113        slug         'Slugline'
114       }
115     end
116     
117     page "A beginning"
118     page 
119     page "Stuff", "Junk", "And more!"
121     assert_equal 3, Doozer.object_list[:page][:data_rows].keys.length
122     assert_equal created_on_time, pages(:page_1)[:created_on]
123     assert_equal "Slugline", pages(:page_1)[:slug]
124     assert_equal "A beginning", pages(:page_1)[:title]
125   end
126   
127   should "allow multiple updates to a single named fixture" do # ---------
128     
129     doozer :car do
130       fields { 
131         name      'CAR'
132         type      'TYPE'
133         year      'YEAR'
134       }
135     end
136     
137     car :fast
138     assert_equal 1,      cars(:fast)[:id]
139     assert_equal 'CAR',  cars(:fast)[:name]
140     assert_equal 'TYPE', cars(:fast)[:type]
141     assert_equal 'YEAR', cars(:fast)[:year]
142     
143     car :fast, 'Corvette'
144     car :fast, :type=>'Sportscar'
145     car :fast, :year=>2002
146     
147     assert_equal 'Corvette',  cars(:fast)[:name]
148     assert_equal 'Sportscar', cars(:fast)[:type]
149     assert_equal 2002,        cars(:fast)[:year]
152     # Last one in should win
153     car :fast, 'Tiburon'
154     assert_equal 'Tiburon', cars(:fast)[:name]
156     # Positional params 'beat' named params
157     car :fast, 'Viper', :name=>'Porche'
158     assert_equal 'Viper', cars(:fast)[:name]
159     
160     # Shouldn't wind up with multiple :fast keys in object list
161     assert_equal [:fast], Doozer.object_list[:car][:row_names]
162   end
164   should "be able to override the target AR class" do # ------------------
165     
166     doozer :page do
167       target 'Comatose::Page'
168     end
169     
170     assert_equal 'Comatose::Page', Doozer.object_list[:page][:target]
171     
172   end
173   
174   should "support block association definition" do # ---------------------
176     doozer :node do
177       fields   { name }
178       children :act_as_tree
179     end
180     
181     assert_equal Doozer.object_list[:node][:block_affects], [{:child=>:parent_id}]
182   end
183   
184   should "correctly nest fixtures" do # ----------------------------------
186     doozer :node do
187       fields   { name }
188       children :act_as_tree
189     end
191     node "Root Node" do
192       node "First Child" do
193         assert_equal 2, Doozer.object_stack.length
194         node "Sub Child 1"
195         node "Sub Child 2"
196       end
197       node "Second Child"
198     end
199     
200     assert_equal 1, nodes(:node_2)[:parent_id]
201     assert_equal 2, nodes(:node_3)[:parent_id]
202     assert_equal 2, nodes(:node_4)[:parent_id]
203   end
204   
205   should "allow macro aliases" do # --------------------------------------
206     doozer :node, as=>:n do
207       fields   { name }
208       children :act_as_tree
209     end
210     
211     assert_not_nil defined?(n)
212     assert_not_nil defined?(n_id)
213     assert_not_nil defined?(ns)
215     n "Root Node" do
216       n "First Child" do
217         n "Sub Child 1"
218         n "Sub Child 2"
219       end
220       n "Second Child"
221     end
222     
223     assert_equal 1, ns(:node_2)[:parent_id]
224     assert_equal 2, ns(:node_3)[:parent_id]
225     assert_equal 2, ns(:node_4)[:parent_id]
226   end
227   
228   should "allow alternate block syntax" do # -----------------------------
229     doozer(:node, as=>:n){
230       fields   {name}
231       children :act_as_tree
232     }
233     
234     n("Root Node") { 
235       n("First Child") {
236         n "Sub Child 1"
237         n "Sub Child 2"
238       }
239       n "Second Child"
240     }
241     
242     assert_equal 1, ns(:node_2)[:parent_id]
243     assert_equal 2, ns(:node_3)[:parent_id]
244     assert_equal 2, ns(:node_4)[:parent_id]
245     
246     expected_row_data = {
247        :node_1=>{:name=>"Root Node", :id=>1},
248        :node_2=>{:parent_id=>1, :name=>"First Child", :id=>2},
249        :node_3=>{:parent_id=>2, :name=>"Sub Child 1", :id=>3},
250        :node_4=>{:parent_id=>2, :name=>"Sub Child 2", :id=>4},
251        :node_5=>{:parent_id=>1, :name=>"Second Child", :id=>5}
252     }
253     
254     assert_equal expected_row_data, Doozer.object_list[:node][:data_rows]
255   end
256   
257   should "allow `belongs_to` relationships" do # --------------------------
258     
259     doozer :page do 
260       fields { title } 
261       parent :belongs_to
262     end
263     doozer :user do
264       fields    { name; email }
265       children  :belong_to
266     end
267     doozer :comment do
268       fields { body }
269       # Use the default block_affects, which should be `block_affects :child=>:belongs_to`
270     end
271     
272     # Data definitiions:
273     
274     page :welcome, 'Welcome' do
275       user :matt, 'Matt' do
276         comment :matt_first_comment, 'The beginning'
277       end
278     end
279     
280     assert_equal user_id(:matt), pages(:welcome)[:user_id]
281     assert_equal user_id(:matt), comments(:matt_first_comment)[:user_id]
282   end
283   
284   should "remove macro names on `reset!`" do # ---------------------------
285     doozer :page
286     
287     assert_not_nil defined?(page)
288     assert_not_nil defined?(page_id)
289     assert_not_nil defined?(page_name)
290     assert_not_nil defined?(pages)
291     
292     Doozer.reset!
294     assert_nil defined?(page)
295     assert_nil defined?(page_id)
296     assert_nil defined?(page_name)
297     assert_nil defined?(pages)
298   end
299   
300   should "allow access to the fixture name and data and from `ID`" do # --
301     doozer :page do
302       fields { title }
303     end
304     
305     page :one,   "Page One"
306     page :two,   "Page Two"
307     page :three, "Page Three"
308     
309     assert_equal :one, page_name( page_id(:one) )
310     assert_equal :two, page_name( page_id(:two) )
311     
312     assert_equal 'Page One',   pages( page_id(:one) )[:title]
313     assert_equal 'Page Three', pages( page_id(:three) )[:title]
314   end