fixturized 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,8 @@
1
+ *.sw?
2
+ .DS_Store
3
+ coverage
4
+ rdoc
5
+ pkg
6
+ Gemfile.lock
7
+ .bundle
8
+ bin
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ script: "bundle exec rspec spec"
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.2
5
+ - ree
6
+ - jruby
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/ruby
2
+ source "http://rubygems.org"
3
+
4
+ gemspec
5
+
6
+ gem 'rspec'
7
+ gem 'mocha'
8
+ gem 'rake'
9
+ gem 'simplecov', '>= 0.4.0', :require => false, :group => :test
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Jacek Szarski
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.markdown ADDED
@@ -0,0 +1,110 @@
1
+ # fixturized [![Build Status](http://travis-ci.org/szarski/Fixturized.png)](http://travis-ci.org/szarski/Fixturized)
2
+
3
+ Fixturized makes your tests' data generation take less time.
4
+
5
+ Remember how fast fixtures used to work? But they were really painfull if you added one more after_save in your model - that filled some field in - and you had to update your fixture files.
6
+
7
+ FactoryGirl for instance is awesome because it gives you extreme flexibility. But it is also very slow if you save a lot of records to your db.
8
+
9
+ Fixturized is a solution in between fixtures and whatever you want, which means it will generate fixtures out of your FactoryGirl (or whatever you use) calls and refresh them if anything changes.
10
+
11
+ ## usage
12
+
13
+ Let's say you want to speed up an existing test.
14
+
15
+ Test case like:
16
+
17
+ ```ruby
18
+
19
+ describe User do
20
+ before :each do
21
+ @user = Factory :user
22
+ @dog = Factory :dog
23
+ end
24
+
25
+ it "should know the dog's name" do
26
+ @user.get_dog @dog
27
+ @user.dog_name.should == @dog.name
28
+ end
29
+ end
30
+
31
+ ```
32
+
33
+ Becomes:
34
+
35
+ ```ruby
36
+
37
+ describe User do
38
+ before :each do
39
+ fixturized do |o|
40
+ o.user = Factory :user
41
+ o.dog = Factory :dog
42
+ end
43
+ end
44
+
45
+ it "should know the dog's name" do
46
+ @user.get_dog @dog
47
+ @user.dog_name.should == @dog.name
48
+ end
49
+ end
50
+
51
+ ```
52
+
53
+ ## the way it works
54
+
55
+ When fixturized gets a block it:
56
+
57
+ * check if fixtures exist for this block
58
+
59
+ If so:
60
+
61
+ * clears the database
62
+ * loads database content and variables
63
+
64
+ If not:
65
+
66
+ * clears the database
67
+ * runs the fixturized block
68
+ * dumps db content
69
+ * saves variable values
70
+
71
+ The first run will be slightly slower than usualy.
72
+
73
+ Each time the block's been changed, fixturized will generate the fixture for this particular block from stretch.
74
+
75
+ If you change your models in a way that affects their database layouts, you can just <pre>rm fixturized/*</pre> and it will create all the fixtures once again.
76
+
77
+ ## drawbacks
78
+
79
+ There are two main problems with fixturized:
80
+
81
+ * you can not stack fixturized blocks (each erases the database)
82
+ * instead of using instance variables you need to use the Fixturized::Wrapper's methods:
83
+
84
+ ```ruby
85
+ @user = Factory :user
86
+ ```
87
+
88
+ becomes:
89
+
90
+ ```ruby
91
+ fixturized do |o|
92
+ o.user = Factory :user
93
+ end
94
+ ```
95
+
96
+ ## compatibility
97
+
98
+ Fixturized consits of several classes, each responsible for interactions with different interfaces:
99
+
100
+ * DatabaseHandler - clears database, dumps db, loads db content, loads db records
101
+ * FileHandler - reads and writes YAML files
102
+ * Runner - runs the fixturized block, determines whether fixtures are up to date, hooks up the Wrapper
103
+ * Wrapper - loads and saves all the data from the block using the rest of the modules
104
+
105
+ These classes currently support ActiveReord with an sql database and classic YAML fixtures.
106
+ To use different software you just need to replace one of the classes.
107
+
108
+ ## Copyright
109
+
110
+ Copyright (c) 2010 Jacek Szarski. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,32 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+
5
+ begin
6
+
7
+ require 'rspec'
8
+ require "rspec/core/rake_task"
9
+
10
+ desc "Run all examples"
11
+ RSpec::Core::RakeTask.new(:spec) do |t|
12
+ t.rspec_path = 'bin/rspec'
13
+ t.rspec_opts = %w[--color]
14
+ t.verbose = false
15
+ end
16
+
17
+ namespace :spec do
18
+ task :cleanup do
19
+ rm_rf 'coverage.data'
20
+ end
21
+
22
+ RSpec::Core::RakeTask.new :rcov do |t|
23
+ t.rcov = true
24
+ t.rcov_opts = %[-Ilib -Ispec --exclude "gems/*,features"]
25
+ t.verbose = false
26
+ end
27
+
28
+ end
29
+
30
+ rescue
31
+ puts 'Could not load RSpec Rake tasks'
32
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.4.0
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "fixturized/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "fixturized"
7
+ s.version = Fixturized::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Jacek Szarski", "Marcin Bunsch"]
10
+ s.email = ["jacek@applicake.com"]
11
+ s.homepage = "https://github.com/szarski/Fixturized"
12
+ s.summary = %q{in between fixtures and whatever you want}
13
+ s.description = %q{in between fixtures and whatever you want}
14
+
15
+ s.rubyforge_project = "fixturized"
16
+
17
+ s.add_dependency "sourcify"
18
+
19
+ s.files = `git ls-files`.split("\n")
20
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
21
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
22
+ s.require_paths = ["lib"]
23
+ end
@@ -0,0 +1,100 @@
1
+ module Fixturized::DatabaseHandler
2
+ # This module handles all features related to the db (ActiveRecrod assumend).
3
+ # If you want to hook a different mapper, here's the place
4
+
5
+ # engine required methods:
6
+ #
7
+ # is_model?
8
+ # substitute_model(value)
9
+ # load_model(value)
10
+ # data_to_object
11
+ # object_to_data
12
+ # clear_all_tables
13
+
14
+ def engine
15
+ ActiveRecordAndMysqlEngine
16
+ end
17
+
18
+ def is_model?(value)
19
+ self.engine.is_model? value
20
+ end
21
+
22
+ def substitute_model(value)
23
+ self.engine.substitute_model(value)
24
+ end
25
+
26
+ def load_model(value)
27
+ self.engine.load_model(value)
28
+ end
29
+
30
+ def collect_db_data
31
+ return self.engine.data_to_object
32
+ end
33
+
34
+ def write_db_data(data)
35
+ self.engine.object_to_data(data)
36
+ end
37
+
38
+ def clear_db
39
+ self.engine.clear_all_tables
40
+ end
41
+
42
+ module ActiveRecordAndMysqlEngine
43
+
44
+ def is_model?(value)
45
+ defined?(ActiveRecord::Base) and value.class.superclass == ActiveRecord::Base
46
+ end
47
+
48
+ def substitute_model(value)
49
+ return [value.class.to_s, value.id]
50
+ end
51
+
52
+ def load_model(value)
53
+ klass = eval value.first
54
+ id = value.last.to_i
55
+ return klass.find(id)
56
+ end
57
+
58
+ def clear_all_tables
59
+ interesting_tables.each do |tbl|
60
+ ActiveRecord::Base.connection.execute "DELETE FROM #{tbl}"
61
+ end
62
+ end
63
+
64
+ def interesting_tables
65
+ ActiveRecord::Base.connection.tables.sort.reject do |tbl|
66
+ ['schema_info', 'sessions', 'public_exceptions'].include?(tbl)
67
+ end
68
+ end
69
+
70
+ def object_to_data(objects)
71
+ objects.each do |tbl, fixtures|
72
+ unless fixtures.to_a.empty?
73
+ klass = tbl.classify.constantize
74
+ ActiveRecord::Base.transaction do
75
+ statement = "INSERT INTO #{tbl} (#{fixtures.first.keys.collect{|k| "`#{k}`"}.join(",")}) " + fixtures.collect do |fixture|
76
+ "(SELECT #{fixture.values.collect { |value| ActiveRecord::Base.connection.quote(value) }.join(', ')})"
77
+ end.join(" UNION ")
78
+ ActiveRecord::Base.connection.execute statement, 'Fixture Insert'
79
+ end
80
+ end
81
+ end
82
+ end
83
+
84
+ def data_to_object
85
+ objects = {}
86
+ interesting_tables.each do |tbl|
87
+ begin
88
+ klass = tbl.classify.constantize
89
+ objects[tbl] = klass.find(:all).collect(&:attributes)
90
+ rescue Exception
91
+ end
92
+ end
93
+ return objects
94
+ end
95
+
96
+ self.extend self
97
+ end
98
+
99
+ self.extend self
100
+ end
@@ -0,0 +1,32 @@
1
+ module Fixturized::FileHandler
2
+ # All filesystem operations are handled here
3
+
4
+ def fixture_dir
5
+ "#{RAILS_ROOT}/fixturized"
6
+ end
7
+
8
+ def create_fixture_dir
9
+ if Dir[self.fixture_dir].empty?
10
+ FileUtils.mkdir_p self.fixture_dir
11
+ end
12
+ end
13
+
14
+ def write_fixture(filename, objects)
15
+ Fixturized.create_fixture_dir
16
+ return File.open(self.fixture_path(filename), 'w') {|f| YAML.dump objects, f}
17
+ end
18
+
19
+ def load_fixture(filename)
20
+ return YAML.load_file(self.fixture_path(filename))
21
+ end
22
+
23
+ def fixture_exists?(filename)
24
+ return FileTest.exists?(self.fixture_path(filename))
25
+ end
26
+
27
+ def fixture_path(filename)
28
+ return File.join(self.fixture_dir, filename)
29
+ end
30
+
31
+ self.extend self
32
+ end
data/lib/fixturized.rb ADDED
@@ -0,0 +1,18 @@
1
+ module Fixturized
2
+
3
+ def self.create_fixture_dir
4
+ Fixturized::FileHandler.create_fixture_dir
5
+ end
6
+
7
+ end
8
+
9
+ # external requires:
10
+ require 'sourcify'
11
+ require 'digest/md5'
12
+
13
+ #internal requires:
14
+ require 'global_methods'
15
+ require 'runner'
16
+ require 'file_handler'
17
+ require 'database_handler'
18
+ require 'wrapper'
@@ -0,0 +1,3 @@
1
+ module Fixturized
2
+ VERSION = "0.4.0"
3
+ end
@@ -0,0 +1,7 @@
1
+ module Fixturized::GlobalMethods
2
+ def fixturized(&block)
3
+ Fixturized::Runner.new(self, &block)
4
+ end
5
+ end
6
+
7
+ Object.send :include, Fixturized::GlobalMethods
data/lib/runner.rb ADDED
@@ -0,0 +1,26 @@
1
+ class Fixturized::Runner
2
+ def initialize(main_object=nil, &block)
3
+ Fixturized::DatabaseHandler.clear_db
4
+ @block = block
5
+ if Fixturized::FileHandler.fixture_exists?(self.filename)
6
+ data = Fixturized::FileHandler.load_fixture self.filename
7
+ Fixturized::DatabaseHandler.write_db_data(data[:database])
8
+ wrapper = Fixturized::Wrapper.new(data[:variables],data[:models])
9
+ wrapper.set_instance_variables_on(main_object)
10
+ else
11
+ wrapper = Fixturized::Wrapper.new
12
+ @block.call wrapper
13
+ Fixturized::FileHandler.write_fixture self.filename, {:database => Fixturized::DatabaseHandler.collect_db_data, :variables => wrapper.variables, :models => wrapper.models}
14
+ wrapper.set_instance_variables_on(main_object)
15
+ end
16
+ end
17
+
18
+ def filename
19
+ return "#{self.block_hash}.yml"
20
+ end
21
+
22
+ def block_hash
23
+ Digest::MD5.hexdigest(@block.to_source)
24
+ end
25
+
26
+ end
data/lib/wrapper.rb ADDED
@@ -0,0 +1,57 @@
1
+ class Fixturized::Wrapper
2
+ attr_reader :variables, :models
3
+
4
+ def initialize(variables={},models={})
5
+ @variables = variables
6
+ @models = models
7
+ @loaded_models = {}
8
+ end
9
+
10
+ def method_missing(method_name, *args)
11
+ if method_name.to_s =~ /.+=$/
12
+ raise Exception.new('too many arguments in assignment') unless args.size == 1
13
+ method_name = method_name.to_s.gsub(/=$/,'')
14
+ self.set(method_name, args.first)
15
+ else
16
+ raise Exception.new('unexpected arguments in retrieval') unless args.empty?
17
+ method_name = method_name.to_s
18
+ self.read method_name
19
+ end
20
+ end
21
+
22
+ def set(name, value)
23
+ if Fixturized::DatabaseHandler.is_model?(value)
24
+ @models[name] = Fixturized::DatabaseHandler.substitute_model(value)
25
+ else
26
+ @variables[name] = value
27
+ end
28
+ end
29
+
30
+ def read(name)
31
+ @variables[name] || read_model(name)
32
+ end
33
+
34
+ def read_model(name)
35
+ loaded = @loaded_models[name.to_s]
36
+ value = @models[name.to_s]
37
+ if loaded
38
+ return loaded
39
+ elsif value
40
+ result = Fixturized::DatabaseHandler.load_model(value)
41
+ @loaded_models[name.to_s] = result
42
+ return result
43
+ else
44
+ return nil
45
+ end
46
+ end
47
+
48
+ def set_instance_variables_on(object)
49
+ @variables.each do |name, value|
50
+ object.instance_variable_set "@#{name}", value
51
+ end
52
+ @models.each do |name, value|
53
+ object.instance_variable_set "@#{name}", read_model(name)
54
+ end
55
+ end
56
+
57
+ end
@@ -0,0 +1,328 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+
4
+ describe "Fixturized" do
5
+ before(:each) do
6
+ Fixturized::FileHandler.stubs(:fixture_dir).returns(TEMP_FIXTURE_DIR)
7
+ end
8
+
9
+ describe "file operations" do
10
+ before(:each) do
11
+ remove_temp_dir
12
+ end
13
+ after(:each) do
14
+ remove_temp_dir
15
+ end
16
+
17
+ it "should set the fixtures path properly" do
18
+ Fixturized.create_fixture_dir
19
+ Dir[TEMP_FIXTURE_DIR].should_not be_empty
20
+ end
21
+
22
+ it "should create fixture files in the fixture dir" do
23
+ Fixturized::FileHandler.write_fixture("some_name", {:a => 3})
24
+ FileTest.exists?(File.join(TEMP_FIXTURE_DIR, 'some_name')).should be_true
25
+ end
26
+
27
+ it "should write and load proper data into and from fixtures" do
28
+ Fixturized::FileHandler.write_fixture "some_name", {:a => 3}
29
+ Fixturized::FileHandler.load_fixture("some_name").should == {:a => 3}
30
+ end
31
+
32
+ it "should check if a file exists" do
33
+ Fixturized::FileHandler.fixture_exists?("some_name").should be_false
34
+ Fixturized.create_fixture_dir
35
+ FileUtils.touch(File.join(TEMP_FIXTURE_DIR, 'some_name'))
36
+ Fixturized::FileHandler.fixture_exists?("some_name").should be_true
37
+ end
38
+
39
+ it "should not mix fixtures up" do
40
+ Fixturized::FileHandler.write_fixture "some_name", {:a => 3}
41
+ Fixturized::FileHandler.write_fixture "some_other_name", {:a => 4}
42
+ Fixturized::FileHandler.load_fixture("some_name").should == {:a => 3}
43
+ Fixturized::FileHandler.load_fixture("some_other_name").should == {:a => 4}
44
+ end
45
+
46
+ it "should overwrite files" do
47
+ Fixturized::FileHandler.write_fixture "some_name", {:a => 3}
48
+ Fixturized::FileHandler.write_fixture "some_name", {:a => 4}
49
+ Fixturized::FileHandler.load_fixture("some_name").should == {:a => 4}
50
+ end
51
+
52
+ end
53
+
54
+ describe "working with tests" do
55
+
56
+ before(:each) do
57
+ Fixturized::FileHandler.stubs(:write_fixture).raises(Exception.new('write_fixture call not stubbed!'))
58
+ Fixturized::FileHandler.stubs(:load_fixture).raises(Exception.new('load_fixture call not stubbed!'))
59
+ Fixturized::DatabaseHandler.stubs(:collect_db_data)
60
+ Fixturized::DatabaseHandler.stubs(:clear_db)
61
+ end
62
+
63
+ it "should add the fixturized command" do
64
+ Fixturized::FileHandler.stubs(:write_fixture)
65
+ fixturized do
66
+ end
67
+ end
68
+
69
+ it "should run the block first time" do
70
+ Fixturized::FileHandler.stubs(:write_fixture)
71
+ class A;end
72
+ A.expects(:method).once
73
+ fixturized do
74
+ A.method
75
+ end
76
+ end
77
+
78
+ it "should create block hashes that are their code iniections" do
79
+ Fixturized::FileHandler.stubs(:write_fixture)
80
+ runner1 = Fixturized::Runner.new do
81
+ a=1
82
+ end
83
+ runner2 = Fixturized::Runner.new do
84
+ a=2
85
+ end
86
+ runner3 = Fixturized::Runner.new do
87
+ a=1
88
+ end
89
+ runner1.block_hash.should == runner3.block_hash
90
+ runner1.block_hash.should_not == runner2.block_hash
91
+ end
92
+
93
+ it "should call write_fixture with the block hash name + '.yml' at first run" do
94
+ Fixturized::Runner.any_instance.stubs(:block_hash).returns("stubbed_block_hash")
95
+ Fixturized::FileHandler.expects(:write_fixture).with {|filename, objects| filename == "stubbed_block_hash.yml"}.once
96
+ fixturized do
97
+ end
98
+ end
99
+
100
+ it "should call write_fixture with collected db data on first run" do
101
+ @fake_data = 1
102
+ Fixturized::DatabaseHandler.expects(:collect_db_data).once.returns(@fake_data)
103
+ Fixturized::FileHandler.expects(:write_fixture).once.with {|filename, objects| objects[:database] = @fake_data}
104
+ fixturized do
105
+ end
106
+ end
107
+
108
+ it "should load fixture on second run" do
109
+ @fake_data = 1
110
+ Fixturized::Runner.any_instance.stubs(:block_hash).returns("stubbed_block_hash")
111
+ Fixturized::FileHandler.expects(:fixture_exists?).with("stubbed_block_hash.yml").returns(true)
112
+ Fixturized::FileHandler.expects(:load_fixture).once.returns({:database => @fake_data, :variables => {}, :models => {}})
113
+ Fixturized::DatabaseHandler.expects(:write_db_data).once.with(@fake_data)
114
+ fixturized do
115
+ end
116
+ end
117
+
118
+ it "should pass instance variables on first run" do
119
+ Fixturized::FileHandler.stubs(:write_fixture)
120
+ fixturized do |o|
121
+ o.variable = 123
122
+ end
123
+ @variable.should == 123
124
+ end
125
+
126
+ it "should load instance variables on second run" do
127
+ Fixturized::FileHandler.expects(:write_fixture).with {|name, content| content[:variables] == {"variable" => 123}}.once
128
+ Fixturized::FileHandler.expects(:load_fixture).returns(:variables => {:variable => 123}, :models => {})
129
+ fixturized do |o|
130
+ o.variable = 123
131
+ end
132
+ Fixturized::FileHandler.expects(:fixture_exists?).once.returns true
133
+ Fixturized::DatabaseHandler.expects(:write_db_data).once
134
+ @variable = nil
135
+ fixturized do |o|
136
+ o.variable = 123
137
+ end
138
+ @variable.should == 123
139
+ end
140
+
141
+ describe "models" do
142
+ before(:each) do
143
+ class SomeModel
144
+ def id; 5; end
145
+ end
146
+ Fixturized::DatabaseHandler.stubs(:is_model?).with{|val| val.class == SomeModel}.returns(true)
147
+ end
148
+
149
+ it "should retrieve objects on and after first run" do
150
+ Fixturized::FileHandler.expects(:write_fixture).with {|name, content| content[:models] == {"model" => ["SomeModel",5]}}.once
151
+ Fixturized::FileHandler.expects(:load_fixture).returns(:models => {"model" => ["SomeModel",5]}, :variables => {})
152
+ SomeModel.expects(:find).with(5).returns(SomeModel.new)
153
+ fixturized do |o|
154
+ o.model = SomeModel.new
155
+ end
156
+ Fixturized::FileHandler.expects(:fixture_exists?).once.returns true
157
+ Fixturized::DatabaseHandler.expects(:write_db_data).once
158
+ SomeModel.expects(:find).with(5).returns(SomeModel.new)
159
+ @model.class.should == SomeModel
160
+ @model.id.should == 5
161
+ @model = nil
162
+ fixturized do |o|
163
+ o.model = SomeModel.new
164
+ end
165
+ @model.class.should == SomeModel
166
+ @model.id.should == 5
167
+ end
168
+
169
+ it "should cache models so they're not loaded unneccesairly" do
170
+ Fixturized::FileHandler.expects(:write_fixture)
171
+ SomeModel.expects(:find).with(5).returns(SomeModel.new).once
172
+ fixturized do |o|
173
+ o.model = SomeModel.new
174
+ a=o.model
175
+ a=o.model
176
+ a=o.model
177
+ end
178
+ end
179
+
180
+ it "should request db clear on first and second run" do
181
+ Fixturized::FileHandler.stubs(:write_fixture)
182
+ Fixturized::DatabaseHandler.expects(:clear_db).twice
183
+ fixturized do
184
+ 8
185
+ end
186
+ fixturized do
187
+ 8
188
+ end
189
+ end
190
+ end
191
+
192
+ end
193
+
194
+ describe "collecting data [DB related]" do
195
+ describe "interface" do
196
+
197
+ it "should have a method #engine that returns the engine class" do
198
+ Fixturized::DatabaseHandler.engine.should be_a(Module)
199
+ Fixturized::DatabaseHandler.engine.should be_a(Fixturized::DatabaseHandler::ActiveRecordAndMysqlEngine)
200
+ end
201
+
202
+ describe "should forewart method to engine:" do
203
+
204
+ it "#collect_db_data" do
205
+ Fixturized::DatabaseHandler.engine.expects(:data_to_object).with()
206
+ Fixturized::DatabaseHandler.collect_db_data
207
+ end
208
+
209
+ it "#write_db_data" do
210
+ data = mock
211
+ Fixturized::DatabaseHandler.engine.expects(:object_to_data).with(data)
212
+ Fixturized::DatabaseHandler.write_db_data data
213
+ end
214
+
215
+ it "is_model?" do
216
+ model = mock
217
+ Fixturized::DatabaseHandler.engine.expects(:is_model?).with(model)
218
+ Fixturized::DatabaseHandler.is_model? model
219
+ end
220
+
221
+ it "#clear_db" do
222
+ Fixturized::DatabaseHandler.engine.expects(:clear_all_tables).with()
223
+ Fixturized::DatabaseHandler.clear_db
224
+ end
225
+
226
+ it "#substitute_model" do
227
+ model = mock
228
+ Fixturized::DatabaseHandler.engine.expects(:substitute_model).with(model)
229
+ Fixturized::DatabaseHandler.substitute_model model
230
+ end
231
+
232
+ it "#load_model" do
233
+ data = mock
234
+ Fixturized::DatabaseHandler.engine.expects(:load_model).with(data)
235
+ Fixturized::DatabaseHandler.load_model data
236
+ end
237
+ end
238
+ end
239
+
240
+ describe "engines" do
241
+ describe Fixturized::DatabaseHandler::ActiveRecordAndMysqlEngine do
242
+ before(:all) do
243
+ pending
244
+ #TODO: hook db here
245
+ end
246
+ after(:all) do
247
+ #TODO: close db connection here
248
+ end
249
+
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+
260
+
261
+
262
+
263
+
264
+ # def is_model?(value)
265
+ # defined?(ActiveRecord::Base) and value.class.superclass == ActiveRecord::Base
266
+ # def substitute_model(value)
267
+ # return [value.class.to_s, value.id]
268
+ # def load_model(value)
269
+ # klass = eval value.first
270
+ # id = value.last.to_i
271
+ # return klass.find(id)
272
+ # def clear_all_tables
273
+ # interesting_tables.each do |tbl|
274
+ # ActiveRecord::Base.connection.execute "DELETE FROM #{tbl}"
275
+ # end
276
+ # def interesting_tables
277
+ # ActiveRecord::Base.connection.tables.sort.reject do |tbl|
278
+ # ['schema_info', 'sessions', 'public_exceptions'].include?(tbl)
279
+ # end
280
+ # def object_to_data(objects)
281
+ # objects.each do |tbl, fixtures|
282
+ # unless fixtures.to_a.empty?
283
+ # klass = tbl.classify.constantize
284
+ # ActiveRecord::Base.transaction do
285
+ # statement = "INSERT INTO #{tbl} (#{fixtures.first.keys.collect{|k| "`#{k}`"}.join(",")}) " + fixtures.collect do |fixture|
286
+ # "(SELECT #{fixture.values.collect { |value| ActiveRecord::Base.connection.quote(value) }.join(', ')})"
287
+ # end.join(" UNION ")
288
+ # ActiveRecord::Base.connection.execute statement, 'Fixture Insert'
289
+ # end
290
+ # end
291
+ # end
292
+ # def data_to_object
293
+ # objects = {}
294
+ # interesting_tables.each do |tbl|
295
+ # begin
296
+ # klass = tbl.classify.constantize
297
+ # objects[tbl] = klass.find(:all).collect(&:attributes)
298
+ # rescue Exception
299
+ # end
300
+ # end
301
+ # return objects
302
+ # end
303
+
304
+
305
+
306
+
307
+
308
+
309
+
310
+
311
+
312
+
313
+
314
+
315
+
316
+
317
+
318
+
319
+
320
+
321
+
322
+
323
+ it "#clear_all_tables should remove all tables contents" do
324
+ end
325
+ end
326
+ end
327
+ end
328
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1,4 @@
1
+ --colour
2
+ --format nested
3
+ --loadby mtime
4
+ --reverse
@@ -0,0 +1,23 @@
1
+ require 'simplecov'
2
+ SimpleCov.start do
3
+ add_filter ".bundle"
4
+ end
5
+
6
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
7
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
8
+ require 'fixturized'
9
+ require 'rspec'
10
+ require 'mocha'
11
+
12
+ TEMP_DIR = File.join(File.dirname(__FILE__),'..','temp')
13
+ TEMP_FIXTURE_DIR = File.join(TEMP_DIR,'fixtures')
14
+
15
+ RSpec.configure do |config|
16
+ config.mock_with :mocha
17
+ end
18
+
19
+ def remove_temp_dir
20
+ if Dir[TEMP_DIR]
21
+ FileUtils.rm_rf TEMP_DIR
22
+ end
23
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fixturized
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jacek Szarski
9
+ - Marcin Bunsch
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2011-06-06 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: sourcify
17
+ requirement: &2151886400 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *2151886400
26
+ description: in between fixtures and whatever you want
27
+ email:
28
+ - jacek@applicake.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - .document
34
+ - .gitignore
35
+ - .rspec
36
+ - .travis.yml
37
+ - Gemfile
38
+ - LICENSE
39
+ - README.markdown
40
+ - Rakefile
41
+ - VERSION
42
+ - fixturized.gemspec
43
+ - lib/database_handler.rb
44
+ - lib/file_handler.rb
45
+ - lib/fixturized.rb
46
+ - lib/fixturized/version.rb
47
+ - lib/global_methods.rb
48
+ - lib/runner.rb
49
+ - lib/wrapper.rb
50
+ - spec/fixturized_spec.rb
51
+ - spec/spec.opts
52
+ - spec/spec_helper.rb
53
+ homepage: https://github.com/szarski/Fixturized
54
+ licenses: []
55
+ post_install_message:
56
+ rdoc_options: []
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ! '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ required_rubygems_version: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ requirements: []
72
+ rubyforge_project: fixturized
73
+ rubygems_version: 1.8.5
74
+ signing_key:
75
+ specification_version: 3
76
+ summary: in between fixtures and whatever you want
77
+ test_files:
78
+ - spec/fixturized_spec.rb
79
+ - spec/spec.opts
80
+ - spec/spec_helper.rb