Changesets can be listed by changeset number.
The Git repository is here.
- Revision:
- 373
- Log:
Initial import of Radiant 0.9.1, which is now packaged as a gem. This is an
import of the tagged 0.9.1 source checked out from GitHub, which isn't quite
the same as the gem distribution - but it doesn't seem to be available in an
archived form and the installed gem already has modifications, so this is
the closest I can get.
- Author:
- rool
- Date:
- Mon Mar 21 13:40:05 +0000 2011
- Size:
- 10872 Bytes
1 | require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') |
2 | |
3 | TestCaseRoot = Class.new(Test::Unit::TestCase) |
4 | TestCaseChild = Class.new(TestCaseRoot) |
5 | TestCaseSibling = Class.new(TestCaseRoot) |
6 | TestCaseGrandchild = Class.new(TestCaseChild) |
7 | |
8 | DatasetOne = Class.new(Dataset::Base) |
9 | DatasetTwo = Class.new(Dataset::Base) |
10 | |
11 | describe Dataset::Session do |
12 | before do |
13 | @database = Dataset::Database::Sqlite3.new({:database => SQLITE_DATABASE}, "#{SPEC_ROOT}/tmp") |
14 | @session = Dataset::Session.new(@database) |
15 | end |
16 | |
17 | describe 'dataset associations' do |
18 | it 'should allow the addition of datasets for a test' do |
19 | @session.add_dataset TestCaseRoot, DatasetOne |
20 | @session.datasets_for(TestCaseRoot).should == [DatasetOne] |
21 | |
22 | @session.add_dataset TestCaseRoot, DatasetTwo |
23 | @session.datasets_for(TestCaseRoot).should == [DatasetOne, DatasetTwo] |
24 | |
25 | @session.add_dataset TestCaseRoot, DatasetOne |
26 | @session.datasets_for(TestCaseRoot).should == [DatasetOne, DatasetTwo] |
27 | end |
28 | |
29 | it 'should combine datasets from test superclasses into subclasses' do |
30 | @session.add_dataset TestCaseRoot, DatasetOne |
31 | @session.add_dataset TestCaseChild, DatasetTwo |
32 | @session.add_dataset TestCaseChild, DatasetOne |
33 | @session.datasets_for(TestCaseChild).should == [DatasetOne, DatasetTwo] |
34 | @session.datasets_for(TestCaseGrandchild).should == [DatasetOne, DatasetTwo] |
35 | end |
36 | |
37 | it 'should include those that a dataset declares it uses' do |
38 | dataset_one = Class.new(Dataset::Base) do |
39 | uses DatasetTwo |
40 | end |
41 | dataset_two = Class.new(Dataset::Base) do |
42 | uses dataset_one, DatasetOne |
43 | end |
44 | @session.add_dataset TestCaseRoot, dataset_two |
45 | @session.add_dataset TestCaseChild, DatasetTwo |
46 | @session.datasets_for(TestCaseChild).should == [DatasetTwo, dataset_one, DatasetOne, dataset_two] |
47 | @session.datasets_for(TestCaseGrandchild).should == [DatasetTwo, dataset_one, DatasetOne, dataset_two] |
48 | end |
49 | |
50 | it 'should accept a dataset name' do |
51 | @session.add_dataset TestCaseRoot, :dataset_one |
52 | @session.datasets_for(TestCaseRoot).should == [DatasetOne] |
53 | |
54 | dataset = Class.new(Dataset::Base) do |
55 | uses :dataset_two, :dataset_one |
56 | end |
57 | @session.add_dataset TestCaseChild, dataset |
58 | @session.datasets_for(TestCaseChild).should == [DatasetOne, DatasetTwo, dataset] |
59 | end |
60 | end |
61 | |
62 | describe 'dataset loading' do |
63 | it 'should clear the database on first load' do |
64 | @database.should_receive(:clear).once() |
65 | dataset_one = Class.new(Dataset::Base) |
66 | dataset_two = Class.new(Dataset::Base) |
67 | @session.add_dataset TestCaseRoot, dataset_one |
68 | @session.add_dataset TestCaseChild, dataset_one |
69 | @session.load_datasets_for(TestCaseRoot) |
70 | @session.load_datasets_for(TestCaseChild) |
71 | end |
72 | |
73 | it 'should clear the database on loads where there is no subset' do |
74 | @database.should_receive(:clear).twice() |
75 | dataset_one = Class.new(Dataset::Base) |
76 | dataset_two = Class.new(Dataset::Base) |
77 | @session.add_dataset TestCaseChild, dataset_one |
78 | @session.add_dataset TestCaseSibling, dataset_two |
79 | @session.load_datasets_for(TestCaseChild) |
80 | @session.load_datasets_for(TestCaseSibling) |
81 | end |
82 | |
83 | it 'should not capture the dataset if it is the same as the last loaded' do |
84 | @database.should_not_receive(:capture) |
85 | dataset_one = Class.new(Dataset::Base) |
86 | @session.add_dataset TestCaseRoot, dataset_one |
87 | @session.load_datasets_for(TestCaseRoot) |
88 | @session.load_datasets_for(TestCaseChild) |
89 | @session.load_datasets_for(TestCaseSibling) |
90 | end |
91 | |
92 | it 'should happen in the order declared' do |
93 | load_order = [] |
94 | |
95 | dataset_one = Class.new(Dataset::Base) { |
96 | define_method :load do |
97 | load_order << self.class |
98 | end |
99 | } |
100 | dataset_two = Class.new(Dataset::Base) { |
101 | define_method :load do |
102 | load_order << self.class |
103 | end |
104 | } |
105 | |
106 | @session.add_dataset TestCaseRoot, dataset_two |
107 | @session.add_dataset TestCaseRoot, dataset_one |
108 | @session.load_datasets_for TestCaseRoot |
109 | load_order.should == [dataset_two, dataset_one] |
110 | end |
111 | |
112 | it 'should install dataset helpers into defining dataset, and not cross into other datasets' do |
113 | dataset_instances = [] |
114 | dataset_one = Class.new(Dataset::Base) { |
115 | helpers do |
116 | def helper_one; end |
117 | end |
118 | define_method :load do |
119 | dataset_instances << self |
120 | end |
121 | } |
122 | dataset_two = Class.new(Dataset::Base) { |
123 | helpers do |
124 | def helper_two; end |
125 | end |
126 | define_method :load do |
127 | dataset_instances << self |
128 | end |
129 | } |
130 | @session.add_dataset TestCaseRoot, dataset_one |
131 | @session.add_dataset TestCaseRoot, dataset_two |
132 | @session.load_datasets_for TestCaseRoot |
133 | dataset_instances.first.should respond_to(:helper_one) |
134 | dataset_instances.first.should_not respond_to(:helper_two) |
135 | dataset_instances.last.should_not respond_to(:helper_one) |
136 | dataset_instances.last.should respond_to(:helper_two) |
137 | |
138 | dataset_one.instance_methods.should include('helper_one') |
139 | dataset_one.instance_methods.should_not include('helper_two') |
140 | dataset_two.instance_methods.should_not include('helper_one') |
141 | dataset_two.instance_methods.should include('helper_two') |
142 | end |
143 | |
144 | it 'should install dataset helpers into datasets that are using another' do |
145 | dataset_instances = [] |
146 | dataset_one = Class.new(Dataset::Base) { |
147 | helpers do |
148 | def helper_one; end |
149 | end |
150 | define_method :load do |
151 | dataset_instances << self |
152 | end |
153 | } |
154 | dataset_two = Class.new(Dataset::Base) { |
155 | uses dataset_one |
156 | helpers do |
157 | def helper_two; end |
158 | end |
159 | define_method :load do |
160 | dataset_instances << self |
161 | end |
162 | } |
163 | @session.add_dataset TestCaseRoot, dataset_one |
164 | @session.add_dataset TestCaseRoot, dataset_two |
165 | @session.load_datasets_for TestCaseRoot |
166 | dataset_instances.first.should respond_to(:helper_one) |
167 | dataset_instances.first.should_not respond_to(:helper_two) |
168 | dataset_instances.last.should respond_to(:helper_one) |
169 | dataset_instances.last.should respond_to(:helper_two) |
170 | |
171 | dataset_one.instance_methods.should include('helper_one') |
172 | dataset_one.instance_methods.should_not include('helper_two') |
173 | dataset_two.instance_methods.should_not include('helper_one') |
174 | dataset_two.instance_methods.should include('helper_two') |
175 | end |
176 | |
177 | it 'should happen only once per test in a hierarchy' do |
178 | load_count = 0 |
179 | |
180 | dataset = Class.new(Dataset::Base) { |
181 | define_method :load do |
182 | load_count += 1 |
183 | end |
184 | } |
185 | |
186 | @session.add_dataset TestCaseRoot, dataset |
187 | @session.load_datasets_for TestCaseRoot |
188 | load_count.should == 1 |
189 | |
190 | @session.load_datasets_for TestCaseRoot |
191 | load_count.should == 1 |
192 | |
193 | @session.load_datasets_for TestCaseChild |
194 | load_count.should == 1 |
195 | end |
196 | |
197 | it 'should capture the existing data before loading a superset, restoring the subset before a peer runs' do |
198 | dataset_one_load_count = 0 |
199 | dataset_one = Class.new(Dataset::Base) do |
200 | define_method :load do |
201 | dataset_one_load_count += 1 |
202 | Thing.create! |
203 | end |
204 | end |
205 | |
206 | dataset_two_load_count = 0 |
207 | dataset_two = Class.new(Dataset::Base) do |
208 | define_method :load do |
209 | dataset_two_load_count += 1 |
210 | Place.create! |
211 | end |
212 | end |
213 | |
214 | @session.add_dataset TestCaseRoot, dataset_one |
215 | @session.add_dataset TestCaseChild, dataset_two |
216 | |
217 | @session.load_datasets_for TestCaseRoot |
218 | dataset_one_load_count.should == 1 |
219 | dataset_two_load_count.should == 0 |
220 | Thing.count.should == 1 |
221 | Place.count.should == 0 |
222 | |
223 | @session.load_datasets_for TestCaseChild |
224 | dataset_one_load_count.should == 1 |
225 | dataset_two_load_count.should == 1 |
226 | Thing.count.should == 1 |
227 | Place.count.should == 1 |
228 | |
229 | @session.load_datasets_for TestCaseSibling |
230 | dataset_one_load_count.should == 1 |
231 | dataset_two_load_count.should == 1 |
232 | Thing.count.should == 1 |
233 | Place.count.should == 0 |
234 | end |
235 | |
236 | it 'should install the record methods into the datasets' do |
237 | instance_of_dataset_one = nil |
238 | dataset_one = Class.new(Dataset::Base) do |
239 | define_method :load do |
240 | instance_of_dataset_one = self |
241 | end |
242 | end |
243 | |
244 | @session.add_dataset TestCaseRoot, dataset_one |
245 | @session.load_datasets_for TestCaseRoot |
246 | instance_of_dataset_one.should_not be_nil |
247 | instance_of_dataset_one.should respond_to(:create_record) |
248 | instance_of_dataset_one.should respond_to(:create_model) |
249 | instance_of_dataset_one.should respond_to(:name_model) |
250 | instance_of_dataset_one.should respond_to(:find_model) |
251 | instance_of_dataset_one.should respond_to(:find_id) |
252 | end |
253 | |
254 | it 'should install the instance loader methods into the dataset instance' do |
255 | instance_of_dataset_one = nil |
256 | dataset_one = Class.new(Dataset::Base) do |
257 | define_method :load do |
258 | create_record(Thing) |
259 | instance_of_dataset_one = self |
260 | end |
261 | end |
262 | |
263 | @session.add_dataset TestCaseRoot, dataset_one |
264 | @session.load_datasets_for TestCaseRoot |
265 | instance_of_dataset_one.should respond_to(:things) |
266 | end |
267 | |
268 | it 'should copy instance variables assigned in dataset blocks to binding' do |
269 | @session.add_dataset(TestCaseRoot, Class.new(Dataset::Block) { |
270 | define_method :doload do |
271 | @myvar = 'Hello' |
272 | end |
273 | }) |
274 | load = @session.load_datasets_for(TestCaseRoot) |
275 | load.dataset_binding.block_variables['@myvar'].should == 'Hello' |
276 | end |
277 | end |
278 | |
279 | describe 'bindings' do |
280 | it 'should be created for each dataset load, wrapping the outer binding' do |
281 | binding_one = Dataset::SessionBinding.new(@database) |
282 | binding_two = Dataset::SessionBinding.new(binding_one) |
283 | binding_three = Dataset::SessionBinding.new(binding_one) |
284 | |
285 | Dataset::SessionBinding.should_receive(:new).with(@database).and_return(binding_one) |
286 | Dataset::SessionBinding.should_receive(:new).with(binding_one).twice().and_return(binding_two) |
287 | |
288 | dataset_one = Class.new(Dataset::Base) { define_method :load do; end } |
289 | dataset_two = Class.new(Dataset::Base) { define_method :load do; end } |
290 | |
291 | @session.add_dataset TestCaseRoot, dataset_one |
292 | @session.add_dataset TestCaseChild, dataset_two |
293 | |
294 | @session.load_datasets_for TestCaseRoot |
295 | @session.load_datasets_for TestCaseChild |
296 | @session.load_datasets_for TestCaseSibling |
297 | end |
298 | end |
299 | end |