dan-manges-unit_record 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG ADDED
@@ -0,0 +1,25 @@
1
+ *HEAD
2
+
3
+ * Added UnitRecord::AssociationStubbing module to stub associations. Is not included by default.
4
+ * Give exception message if trying to use fixtures instead of failing silently.
5
+
6
+ *0.4.1* (December 10th, 2007)
7
+
8
+ * Stub caching for compatibility with ActionController::Caching::SqlCache in Rails 2.
9
+
10
+ *0.4.0* (December 9th, 2007)
11
+
12
+ * Rails 2.0 compatibility.
13
+
14
+ *0.3.0* (August 22nd, 2007)
15
+
16
+ * Works with models using non-conventional table names.
17
+
18
+ *0.2.0* (August 16th, 2007)
19
+
20
+ * Cache columns based on schema.rb
21
+
22
+ *0.1.0* (August 15th, 2007)
23
+
24
+ * Converted plugin into a gem.
25
+ * No longer depend on Rake task to dump and cache columns.
data/Rakefile ADDED
@@ -0,0 +1,85 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+ require 'rake/gempackagetask'
5
+ require 'rake/contrib/sshpublisher'
6
+
7
+ desc "Default: run tests"
8
+ task :default => :test
9
+
10
+ Rake::TestTask.new("test") do |t|
11
+ t.libs << 'lib'
12
+ t.pattern = 'test/**/*_test.rb'
13
+ t.verbose = true
14
+ end
15
+
16
+ desc "Generate documentation"
17
+ Rake::RDocTask.new(:rdoc) do |rdoc|
18
+ rdoc.rdoc_dir = "doc"
19
+ rdoc.title = "UnitRecord"
20
+ rdoc.options << '--line-numbers'
21
+ rdoc.rdoc_files.include('README.rdoc', 'CHANGELOG')
22
+ end
23
+
24
+ desc "Upload RDoc to RubyForge"
25
+ task :publish_rdoc => [:rdoc] do
26
+ Rake::SshDirPublisher.new("dcmanges@rubyforge.org", "/var/www/gforge-projects/unit-test-ar", "doc").upload
27
+ end
28
+
29
+ Gem.manage_gems
30
+ require "date"
31
+
32
+ gem_spec = Gem::Specification.new do |s|
33
+ s.name = "unit_record"
34
+ s.summary = "UnitRecord enables unit testing without hitting the database."
35
+ s.version = "0.4.1"
36
+ s.author = "Dan Manges"
37
+ s.description = "UnitRecord enables unit testing without hitting the database."
38
+ s.email = "daniel.manges@gmail.com"
39
+ s.homepage = "http://unit-test-ar.rubyforge.org"
40
+ s.rubyforge_project = "unit-test-ar"
41
+
42
+ s.has_rdoc = true
43
+ s.extra_rdoc_files = ['README.rdoc', 'CHANGELOG']
44
+ s.rdoc_options << '--title' << "UnitRecord" << '--main' << 'README.rdoc' << '--line-numbers'
45
+
46
+ s.autorequire = "unit_record"
47
+ s.files = FileList['{lib,test}/**/*.rb', 'CHANGELOG', 'README.rdoc', 'Rakefile'].to_a
48
+ end
49
+
50
+ Rake::GemPackageTask.new(gem_spec) do |package|
51
+ package.need_zip = false
52
+ package.need_tar = false
53
+ end
54
+ Rake::Task["gem"].prerequisites.unshift "test:multi"
55
+
56
+ namespace :gemspec do
57
+ desc "generates unit_record.gemspec"
58
+ task :generate do
59
+ File.open("unit_record.gemspec", "w") do |f|
60
+ f.puts "# this file is generated by rake gemspec:generate for github"
61
+ f.write gem_spec.to_ruby
62
+ end
63
+ end
64
+ end
65
+
66
+ task :readme do
67
+ require "rubygems"; gem "BlueCloth"; require "BlueCloth"; require 'tmpdir'
68
+ file = "#{Dir.tmpdir}/readme.html"
69
+ File.open(file, "w") { |f| f.write BlueCloth.new(File.read("README.markdown")).to_html }
70
+ sh "open #{file}"
71
+ end
72
+
73
+ RAILS_VERSIONS = %w[1.2.6 2.0.2 2.1.0 2.1.1]
74
+
75
+ namespace :test do
76
+ desc "test with multiple versions of rails"
77
+ task :multi do
78
+ RAILS_VERSIONS.each do |rails_version|
79
+ sh "RAILS_VERSION='#{rails_version}' rake test > /dev/null 2>&1"
80
+ end
81
+ end
82
+ end
83
+
84
+ desc "pre-commit task"
85
+ task :pc => %w[test:multi gemspec:generate]
@@ -0,0 +1,93 @@
1
+ class ActiveRecord::ConnectionAdapters::UnitRecordAdapter < ::ActiveRecord::ConnectionAdapters::AbstractAdapter
2
+ EXCEPTION_MESSAGE = "ActiveRecord is disconnected; database access is unavailable in unit tests."
3
+
4
+ def initialize(config = {})
5
+ super
6
+ @strategy = config[:strategy] || :raise
7
+ @cached_columns = {"schema_info" => []}
8
+ end
9
+
10
+ def columns(table_name, name = nil)#:nodoc:
11
+ @cached_columns[table_name.to_s] ||
12
+ raise("Columns are not cached for '#{table_name}' - check schema.rb")
13
+ end
14
+
15
+ def create_table(table_name, options={})
16
+ table_definition = ActiveRecord::ConnectionAdapters::TableDefinition.new(self)
17
+ table_definition.primary_key(options[:primary_key] || "id") unless options[:id] == false
18
+ yield table_definition
19
+ @cached_columns[table_name.to_s] =
20
+ table_definition.columns.map do |c|
21
+ ActiveRecord::ConnectionAdapters::Column.new(c.name.to_s, c.default, c.sql_type, c.null)
22
+ end
23
+ end
24
+
25
+ def native_database_types
26
+ # Copied from the MysqlAdapter so ColumnDefinition#sql_type will work
27
+ {
28
+ :primary_key => "int(11) DEFAULT NULL auto_increment PRIMARY KEY",
29
+ :string => { :name => "varchar", :limit => 255 },
30
+ :text => { :name => "text" },
31
+ :integer => { :name => "int", :limit => 11 },
32
+ :float => { :name => "float" },
33
+ :decimal => { :name => "decimal" },
34
+ :datetime => { :name => "datetime" },
35
+ :timestamp => { :name => "datetime" },
36
+ :time => { :name => "time" },
37
+ :date => { :name => "date" },
38
+ :binary => { :name => "blob" },
39
+ :boolean => { :name => "tinyint", :limit => 1 }
40
+ }
41
+ end
42
+
43
+ def change_strategy(new_strategy, &block)
44
+ unless [:noop, :raise].include?(new_strategy.to_sym)
45
+ raise ArgumentError, "#{new_strategy.inspect} is not a valid strategy - valid values are :noop and :raise"
46
+ end
47
+ begin
48
+ old_strategy = @strategy
49
+ @strategy = new_strategy.to_sym
50
+ yield
51
+ ensure
52
+ @strategy = old_strategy
53
+ end
54
+ end
55
+
56
+ def execute(sql, name = nil)
57
+ raise_or_noop
58
+ end
59
+
60
+ def select_rows(sql, name = nil)
61
+ raise_or_noop []
62
+ end
63
+
64
+ def rename_table(table_name, new_name)
65
+ raise_or_noop
66
+ end
67
+
68
+ def change_column(table_name, column_name, type, options = {})
69
+ raise_or_noop
70
+ end
71
+
72
+ def change_column_default(table_name, column_name, default)
73
+ raise_or_noop
74
+ end
75
+
76
+ def rename_column(table_name, column_name, new_column_name)
77
+ raise_or_noop
78
+ end
79
+
80
+ def tables
81
+ @cached_columns.keys
82
+ end
83
+
84
+ protected
85
+
86
+ def raise_or_noop(noop_return_value = nil)
87
+ @strategy == :raise ? raise(EXCEPTION_MESSAGE) : noop_return_value
88
+ end
89
+
90
+ def select(sql, name = nil)
91
+ raise_or_noop []
92
+ end
93
+ end
@@ -0,0 +1,37 @@
1
+ module UnitRecord
2
+ module AssociationStubbing
3
+
4
+ private
5
+
6
+ def initialize_with_association_stubbing(attributes = {})
7
+ attributes ||= {}
8
+ associations = extract_associations attributes
9
+ initialize_without_association_stubbing attributes
10
+ stub_associations associations
11
+ end
12
+
13
+ protected
14
+
15
+ def extract_associations(attributes = {})
16
+ attributes.inject({}) do |associations,(attr,value)|
17
+ next associations unless self.class.reflections.keys.include? attr
18
+ associations[attr] = attributes.delete attr
19
+ associations
20
+ end
21
+ end
22
+
23
+ def stub_associations(associations = {})
24
+ associations.each do |attr,value|
25
+ self.stubs(attr).returns(value)
26
+ end
27
+ end
28
+
29
+ def self.included(klass)
30
+ klass.class_eval do
31
+ unless (instance_methods + private_instance_methods).include?("initialize_without_association_stubbing")
32
+ alias_method_chain :initialize, :association_stubbing
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,18 @@
1
+ module UnitRecord
2
+ module ColumnExtension
3
+ def self.included(base)
4
+ base.class_eval do
5
+ alias_method_chain :simplified_type, :boolean
6
+ end
7
+ end
8
+
9
+ def simplified_type_with_boolean(field_type)
10
+ return :boolean if field_type.to_s.downcase.index("tinyint(1)")
11
+ simplified_type_without_boolean field_type
12
+ end
13
+
14
+ def ==(other)
15
+ other && instance_variables.all? { |ivar| instance_variable_get(ivar) == other.instance_variable_get(ivar) }
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,22 @@
1
+ module UnitRecord
2
+ module DisconnectedActiveRecord
3
+ def disconnected?
4
+ false
5
+ end
6
+
7
+ def disconnect!(options = {})
8
+ return if disconnected?
9
+ establish_connection options.merge(:adapter => "unit_record")
10
+ (class << self; self; end).class_eval do
11
+ def disconnected?
12
+ true
13
+ end
14
+ end
15
+ Fixtures.disconnect!
16
+ Test::Unit::TestCase.disconnect!
17
+ ActiveRecord::Base.connection.change_strategy(:noop) do
18
+ load(RAILS_ROOT + "/db/schema.rb")
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,10 @@
1
+ module UnitRecord
2
+ module DisconnectedFixtures
3
+ def disconnect!
4
+ (class << self; self; end).class_eval do
5
+ def create_fixtures(*args); end
6
+ def reset_cache; end
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,13 @@
1
+ module UnitRecord
2
+ module DisconnectedTestCase
3
+ def disconnect!
4
+ self.use_transactional_fixtures = false
5
+
6
+ class_eval do
7
+ def self.fixtures(*args)
8
+ raise "Fixtures cannot be used with UnitRecord. ActiveRecord is disconnected; database access is unavailable in unit tests."
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ require "unit_record/association_stubbing"
2
+ require "unit_record/column_extension"
3
+ require "unit_record/disconnected_active_record"
4
+ require "unit_record/disconnected_test_case"
5
+ require "unit_record/disconnected_fixtures"
6
+ require "active_record/connection_adapters/unit_record_adapter"
7
+
8
+ require "active_record/fixtures"
9
+
10
+ ActiveRecord::ConnectionAdapters::Column.send :include, UnitRecord::ColumnExtension
11
+ ActiveRecord::Base.extend UnitRecord::DisconnectedActiveRecord
12
+ Test::Unit::TestCase.extend UnitRecord::DisconnectedTestCase
13
+ Fixtures.extend UnitRecord::DisconnectedFixtures
14
+
15
+ ActiveRecord::Base.class_eval do
16
+ def self.unit_record_connection(config)
17
+ ActiveRecord::ConnectionAdapters::UnitRecordAdapter.new(config)
18
+ end
19
+ end
@@ -0,0 +1,90 @@
1
+ require File.dirname(__FILE__) + "/../../test_helper"
2
+
3
+ functional_tests do
4
+
5
+ test "find(:all)" do
6
+ ActiveRecord::Base.connection.change_strategy(:raise) do
7
+ assert_raises(RuntimeError) { Person.find(:all) }
8
+ end
9
+ ActiveRecord::Base.connection.change_strategy(:noop) do
10
+ assert_equal [], Person.find(:all)
11
+ end
12
+ end
13
+
14
+ test "execute raises an exception" do
15
+ assert_raises_disconnected_exception do
16
+ ActiveRecord::Base.connection.execute "SELECT 1"
17
+ end
18
+ end
19
+
20
+ test "select_rows raises an exception" do
21
+ assert_raises_disconnected_exception do
22
+ ActiveRecord::Base.connection.select_rows "SELECT * FROM people"
23
+ end
24
+ end
25
+
26
+ test "select raises an exception" do
27
+ assert_raises_disconnected_exception do
28
+ ActiveRecord::Base.connection.send :select, "SELECT * FROM people"
29
+ end
30
+ end
31
+
32
+ test "rename_table raises an exception" do
33
+ assert_raises_disconnected_exception do
34
+ ActiveRecord::Base.connection.rename_table "people", "persons"
35
+ end
36
+ end
37
+
38
+ test "change_column raises an exception" do
39
+ assert_raises_disconnected_exception do
40
+ ActiveRecord::Base.connection.change_column "people", "first_name", :string, :null => false
41
+ end
42
+ end
43
+
44
+ test "change_column_default raises an exception" do
45
+ assert_raises_disconnected_exception do
46
+ ActiveRecord::Base.connection.change_column_default "people", "first_person", "george"
47
+ end
48
+ end
49
+
50
+ test "rename_column raises an exception" do
51
+ assert_raises_disconnected_exception do
52
+ ActiveRecord::Base.connection.rename_column "people", "first_name", "name_first"
53
+ end
54
+ end
55
+
56
+ test "initialize can set strategy" do
57
+ ActiveRecord::Base.establish_connection :adapter => "unit_record", :strategy => :noop
58
+ assert_nil ActiveRecord::Base.connection.execute("SELECT 1")
59
+ ActiveRecord::Base.establish_connection :adapter => "unit_record", :strategy => :raise
60
+ assert_raises(RuntimeError) { ActiveRecord::Base.connection.execute("SELECT 1") }
61
+ end
62
+
63
+ test "noop" do
64
+ ActiveRecord::Base.connection.change_strategy(:noop) do
65
+ assert_nil ActiveRecord::Base.connection.execute("SELECT 1")
66
+ assert_equal [], ActiveRecord::Base.connection.select_rows("SELECT * FROM people")
67
+ assert_equal [], ActiveRecord::Base.connection.send(:select, "SELECT * FROM people")
68
+ assert_nil ActiveRecord::Base.connection.rename_table("people", "persons")
69
+ assert_nil ActiveRecord::Base.connection.change_column("people", "first_name", :string, :null => false)
70
+ assert_nil ActiveRecord::Base.connection.change_column_default("people", "first_person", "george")
71
+ assert_nil ActiveRecord::Base.connection.rename_column("people", "first_name", "name_first")
72
+ end
73
+ end
74
+
75
+ test "change_strategy raises if invalid strategy" do
76
+ assert_nothing_raised { ActiveRecord::Base.connection.change_strategy(:noop) {} }
77
+ assert_nothing_raised { ActiveRecord::Base.connection.change_strategy(:raise) {} }
78
+ assert_raises(ArgumentError) { ActiveRecord::Base.connection.change_strategy(:bogus) {} }
79
+ end
80
+
81
+ def assert_raises_disconnected_exception(&block)
82
+ exception = nil
83
+ begin
84
+ yield
85
+ rescue Exception => exception
86
+ end
87
+ assert_not_nil exception
88
+ assert_equal "ActiveRecord is disconnected; database access is unavailable in unit tests.", exception.message
89
+ end
90
+ end
data/test/db/schema.rb ADDED
@@ -0,0 +1,26 @@
1
+ ActiveRecord::Schema.define(:version => 0) do
2
+ create_table :preferences, :force => true do |t|
3
+ t.column :some_count, :integer
4
+ t.column :show_help, :boolean, :default => true
5
+ end
6
+
7
+ create_table :people, :force => true do |t|
8
+ t.column :first_name, :string
9
+ t.column :last_name, :string
10
+ end
11
+
12
+ create_table "profiles", :force => true do |t|
13
+ t.column "description", :string
14
+ t.column "person_id", :integer
15
+ end
16
+
17
+ create_table :pets, :force => true do |t|
18
+ t.column :name, :string
19
+ end
20
+
21
+ create_table :foofoo, :force => true do |t|
22
+ t.column :bar, :string
23
+ end
24
+
25
+ add_index "people", ["first_name"]
26
+ end
@@ -0,0 +1,67 @@
1
+ unless defined?(TEST_HELPER_LOADED)
2
+ TEST_HELPER_LOADED = true
3
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
4
+ RAILS_ROOT = File.dirname(__FILE__)
5
+
6
+ require 'rubygems'
7
+ require 'test/unit'
8
+
9
+ if rails_version = ENV['RAILS_VERSION']
10
+ gem "rails", rails_version
11
+ end
12
+ require "rails/version"
13
+ puts "==== Testing with Rails #{Rails::VERSION::STRING} ===="
14
+ require 'active_record'
15
+ require 'active_record/fixtures'
16
+ require "action_controller"
17
+ if Rails::VERSION::MAJOR == 2
18
+ require "action_controller/test_case"
19
+ end
20
+ require "action_controller/test_process"
21
+
22
+ begin
23
+ require 'mocha'
24
+ require 'dust'
25
+ rescue LoadError
26
+ raise "Need Mocha and Dust gems to Test"
27
+ end
28
+ Test::Unit::TestCase.disallow_setup!
29
+
30
+ require "#{File.dirname(__FILE__)}/../init"
31
+
32
+ Test::Unit::TestCase.use_transactional_fixtures = true
33
+
34
+ # Needed because of this line in setup_with_fixtures and teardown_with_fixtures:
35
+ # return unless defined?(ActiveRecord::Base) && !ActiveRecord::Base.configurations.blank?
36
+ ActiveRecord::Base.configurations = {"irrelevant" => {:adapter => "stub"}}
37
+
38
+ ActiveRecord::Base.send :include, UnitRecord::AssociationStubbing
39
+
40
+ class Preference < ActiveRecord::Base
41
+ end
42
+
43
+ class Person < ActiveRecord::Base
44
+ has_many :pets
45
+ has_one :profile
46
+ end
47
+
48
+ class Profile < ActiveRecord::Base
49
+ belongs_to :person
50
+ end
51
+
52
+ class Pet < ActiveRecord::Base
53
+ belongs_to :person
54
+ end
55
+
56
+ class Foo < ActiveRecord::Base
57
+ set_table_name :foofoo
58
+ end
59
+
60
+ class DoesNotExist < ActiveRecord::Base
61
+ set_table_name "table_does_not_exist"
62
+ end
63
+
64
+ ActiveRecord::Base.disconnect! :strategy => :raise
65
+ # make sure calling disconnect multiple times does not cause problems
66
+ ActiveRecord::Base.disconnect!
67
+ end
@@ -0,0 +1,22 @@
1
+ require File.dirname(__FILE__) + "/../test_helper"
2
+
3
+ functional_tests do
4
+
5
+ test "stubbing a has_many" do
6
+ pets = [stub, stub]
7
+ person = Person.new :pets => pets
8
+ assert_equal pets, person.pets
9
+ end
10
+
11
+ test "stubbing a belongs_to" do
12
+ person = stub
13
+ pet = Pet.new :person => person
14
+ assert_equal person, pet.person
15
+ end
16
+
17
+ test "multiple includes doesn't hurt" do
18
+ ActiveRecord::Base.send :include, UnitRecord::AssociationStubbing
19
+ Person.new
20
+ end
21
+
22
+ end
@@ -0,0 +1,26 @@
1
+ require File.dirname(__FILE__) + "/../test_helper"
2
+
3
+ functional_tests do
4
+ test "caching columns with no defaults or not nulls" do
5
+ expected = [
6
+ ActiveRecord::ConnectionAdapters::Column.new("id", nil, "int(11) DEFAULT NULL auto_increment PRIMARY KEY", nil),
7
+ ActiveRecord::ConnectionAdapters::Column.new("first_name", nil, "varchar(255)", nil),
8
+ ActiveRecord::ConnectionAdapters::Column.new("last_name", nil, "varchar(255)", nil)
9
+ ]
10
+ expected[0].primary = true
11
+ expected[1..-1].each { |column| column.primary = false }
12
+ assert_equal expected, Person.columns
13
+ end
14
+
15
+ test "caching column with default" do
16
+ expected = ActiveRecord::ConnectionAdapters::Column.new("show_help", true, "tinyint(1)", nil)
17
+ expected.primary = false
18
+ assert_equal expected, Preference.columns.detect { |c| c.name == "show_help" }
19
+ end
20
+
21
+ test "boolean columns" do
22
+ expected = ActiveRecord::ConnectionAdapters::Column.new("show_help", true, "tinyint(1)", nil)
23
+ expected.primary = false
24
+ assert_equal :boolean, Preference.columns.detect { |c| c.name == "show_help" }.type
25
+ end
26
+ end
@@ -0,0 +1,33 @@
1
+ require File.dirname(__FILE__) + "/../test_helper"
2
+
3
+ unit_tests do
4
+ test "equality" do
5
+ column1 = ActiveRecord::ConnectionAdapters::Column.new("name", nil, :string, nil)
6
+ column2 = ActiveRecord::ConnectionAdapters::Column.new("name", nil, :string, nil)
7
+ assert_equal column1, column2
8
+ end
9
+
10
+ test "non-equality on name" do
11
+ column1 = ActiveRecord::ConnectionAdapters::Column.new("name", nil, :string, nil)
12
+ column2 = ActiveRecord::ConnectionAdapters::Column.new("different name", nil, :string, nil)
13
+ assert column1 != column2
14
+ end
15
+
16
+ test "non-equality on sql_type" do
17
+ column1 = ActiveRecord::ConnectionAdapters::Column.new("name", nil, :string, nil)
18
+ column2 = ActiveRecord::ConnectionAdapters::Column.new("name", nil, :text, nil)
19
+ assert column1 != column2
20
+ end
21
+
22
+ test "non-equality on default" do
23
+ column1 = ActiveRecord::ConnectionAdapters::Column.new("name", nil, :string, nil)
24
+ column2 = ActiveRecord::ConnectionAdapters::Column.new("name", "Dan", :string, nil)
25
+ assert column1 != column2
26
+ end
27
+
28
+ test "non-equality on null" do
29
+ column1 = ActiveRecord::ConnectionAdapters::Column.new("name", nil, :string, nil)
30
+ column2 = ActiveRecord::ConnectionAdapters::Column.new("name", nil, :string, true)
31
+ assert column1 != column2
32
+ end
33
+ end
@@ -0,0 +1,40 @@
1
+ require File.dirname(__FILE__) + "/../test_helper"
2
+
3
+ functional_tests do
4
+ test "instantiating" do
5
+ person = Person.new :first_name => "Dan", :last_name => "Manges"
6
+ assert_equal "Dan", person.first_name
7
+ assert_equal "Manges", person.last_name
8
+ end
9
+
10
+ test "using model with column with a default" do
11
+ record = Preference.new
12
+ assert_equal true, record.show_help?
13
+ end
14
+
15
+ test "typecasting happens for integer attributes" do
16
+ record = Preference.new
17
+ record.some_count = "42"
18
+ assert_equal 42, record.some_count
19
+ end
20
+
21
+ test "a model with a non-convential table name does not blow up" do
22
+ assert_nothing_raised { Foo.columns }
23
+ end
24
+
25
+ test "using attribute on a model with a non-conventional table name" do
26
+ foo = Foo.new
27
+ foo.bar = "baz"
28
+ assert_equal "baz", foo.bar
29
+ end
30
+
31
+ test "should get a descriptive error message if no cached columns" do
32
+ exception = nil
33
+ begin
34
+ DoesNotExist.columns
35
+ rescue => exception
36
+ end
37
+ assert_not_nil exception
38
+ assert_equal "Columns are not cached for 'table_does_not_exist' - check schema.rb", exception.message
39
+ end
40
+ end
@@ -0,0 +1,41 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class SampleController < ActionController::Base
4
+ def sample_action
5
+ render :text => "OK"
6
+ end
7
+ end
8
+
9
+ ActionController::Routing::Routes.add_route "/sample/sample_action", :controller => "sample", :action => "sample_action"
10
+
11
+ if defined?(ActionController::TestCase) # Rails 2
12
+
13
+ class ControllerTest < ActionController::TestCase
14
+ tests SampleController
15
+
16
+ test "render" do
17
+ get :sample_action
18
+ assert_equal "OK", @response.body
19
+ end
20
+
21
+ test "sql caching is enabled" do
22
+ assert_equal true, (SampleController < ActionController::Caching::SqlCache)
23
+ end
24
+ end
25
+
26
+ else # Rails 1.x
27
+
28
+ class ControllerTest < Test::Unit::TestCase
29
+ def setup
30
+ @controller = SampleController.new
31
+ @request = ActionController::TestRequest.new
32
+ @response = ActionController::TestResponse.new
33
+ end
34
+
35
+ test "render" do
36
+ get :sample_action
37
+ assert_equal "OK", @response.body
38
+ end
39
+ end
40
+
41
+ end
@@ -0,0 +1,48 @@
1
+ require File.dirname(__FILE__) + "/../test_helper"
2
+
3
+ functional_tests do
4
+ test "find_by_sql gives disconnected exception message" do
5
+ exception = nil
6
+ begin
7
+ Person.find_by_sql "SELECT * FROM people"
8
+ rescue => exception
9
+ end
10
+ assert_not_nil exception
11
+ assert_equal "ActiveRecord is disconnected; database access is unavailable in unit tests.", exception.message
12
+ end
13
+
14
+ test "connected? is true" do
15
+ assert_equal true, ActiveRecord::Base.connected?
16
+ end
17
+
18
+ test "disconnected? is true" do
19
+ assert_equal true, ActiveRecord::Base.disconnected?
20
+ end
21
+
22
+ test "inspect does not blow up" do
23
+ assert_nothing_raised { Person.inspect }
24
+ end
25
+
26
+ test "table_exists?" do
27
+ assert_equal true, Person.table_exists?
28
+ if ActiveRecord::Base.connection.respond_to?(:table_exists?)
29
+ assert_equal false, ActiveRecord::Base.connection.table_exists?("bogus_table")
30
+ end
31
+ end
32
+
33
+ test "setting a has_one association" do
34
+ person = Person.new
35
+ person.profile = Profile.new
36
+ end
37
+
38
+ test "boolean columns do type casting" do
39
+ pref = Preference.new
40
+ pref.show_help = "0"
41
+ assert_equal false, pref.send(:read_attribute, :show_help)
42
+ assert_equal false, pref.show_help
43
+ assert_equal false, pref.show_help?
44
+ pref.show_help = "1"
45
+ assert_equal true, pref.show_help
46
+ assert_equal true, pref.show_help?
47
+ end
48
+ end
@@ -0,0 +1,7 @@
1
+ require File.dirname(__FILE__) + "/../test_helper"
2
+
3
+ functional_tests do
4
+ test "create_fixtures does nothing" do
5
+ assert_nothing_raised { Fixtures.create_fixtures }
6
+ end
7
+ end
@@ -0,0 +1,19 @@
1
+ require File.dirname(__FILE__) + "/../test_helper"
2
+
3
+ functional_tests do
4
+ test "use_transactional_fixtures is false" do
5
+ assert_equal false, Test::Unit::TestCase.use_transactional_fixtures
6
+ end
7
+
8
+ test "trying to use fixtures gives useful message" do
9
+ exception = nil
10
+ begin
11
+ Class.new(Test::Unit::TestCase) do
12
+ fixtures :users
13
+ end
14
+ rescue => exception
15
+ end
16
+ assert_not_nil exception
17
+ assert_equal "Fixtures cannot be used with UnitRecord. ActiveRecord is disconnected; database access is unavailable in unit tests.", exception.message
18
+ end
19
+ end
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dan-manges-unit_record
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.1
5
+ platform: ruby
6
+ authors:
7
+ - Dan Manges
8
+ autorequire: unit_record
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-10-10 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: UnitRecord enables unit testing without hitting the database.
17
+ email: daniel.manges@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README.rdoc
24
+ - CHANGELOG
25
+ files:
26
+ - lib/active_record/connection_adapters/unit_record_adapter.rb
27
+ - lib/unit_record/association_stubbing.rb
28
+ - lib/unit_record/column_extension.rb
29
+ - lib/unit_record/disconnected_active_record.rb
30
+ - lib/unit_record/disconnected_fixtures.rb
31
+ - lib/unit_record/disconnected_test_case.rb
32
+ - lib/unit_record.rb
33
+ - test/active_record/connection_adapters/unit_record_adapter_test.rb
34
+ - test/db/schema.rb
35
+ - test/test_helper.rb
36
+ - test/unit_record/association_stubbing_test.rb
37
+ - test/unit_record/column_cacher_test.rb
38
+ - test/unit_record/column_extension_test.rb
39
+ - test/unit_record/column_test.rb
40
+ - test/unit_record/controller_test.rb
41
+ - test/unit_record/disconnected_active_record_test.rb
42
+ - test/unit_record/disconnected_fixtures_test.rb
43
+ - test/unit_record/disconnected_test_case_test.rb
44
+ - CHANGELOG
45
+ - README.rdoc
46
+ - Rakefile
47
+ has_rdoc: true
48
+ homepage: http://unit-test-ar.rubyforge.org
49
+ post_install_message:
50
+ rdoc_options:
51
+ - --title
52
+ - UnitRecord
53
+ - --main
54
+ - README.rdoc
55
+ - --line-numbers
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: "0"
63
+ version:
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ version:
70
+ requirements: []
71
+
72
+ rubyforge_project: unit-test-ar
73
+ rubygems_version: 1.2.0
74
+ signing_key:
75
+ specification_version: 2
76
+ summary: UnitRecord enables unit testing without hitting the database.
77
+ test_files: []
78
+