rsanheim-unit_record 0.9.0.1

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.
Files changed (43) hide show
  1. data/CHANGELOG +34 -0
  2. data/LICENSE +20 -0
  3. data/README.markdown +137 -0
  4. data/Rakefile +94 -0
  5. data/lib/active_record/connection_adapters/unit_record_adapter.rb +97 -0
  6. data/lib/unit_record.rb +32 -0
  7. data/lib/unit_record/association_stubbing.rb +39 -0
  8. data/lib/unit_record/column_extension.rb +18 -0
  9. data/lib/unit_record/disconnected_active_record.rb +21 -0
  10. data/lib/unit_record/disconnected_fixtures.rb +10 -0
  11. data/lib/unit_record/disconnected_test_case.rb +13 -0
  12. data/test/active_record/connection_adapters/unit_record_adapter_test.rb +103 -0
  13. data/test/db/schema.rb +26 -0
  14. data/test/sample_spec.rb +44 -0
  15. data/test/test_helper.rb +73 -0
  16. data/test/unit_record/association_stubbing_test.rb +37 -0
  17. data/test/unit_record/column_cacher_test.rb +26 -0
  18. data/test/unit_record/column_extension_test.rb +33 -0
  19. data/test/unit_record/column_test.rb +40 -0
  20. data/test/unit_record/controller_test.rb +43 -0
  21. data/test/unit_record/disconnected_active_record_test.rb +52 -0
  22. data/test/unit_record/disconnected_fixtures_test.rb +7 -0
  23. data/test/unit_record/disconnected_test_case_test.rb +19 -0
  24. data/test/unit_record/unit_record_test.rb +14 -0
  25. data/vendor/dust-0.1.6/lib/array_extension.rb +5 -0
  26. data/vendor/dust-0.1.6/lib/definition_error.rb +20 -0
  27. data/vendor/dust-0.1.6/lib/dust.rb +8 -0
  28. data/vendor/dust-0.1.6/lib/nil_extension.rb +5 -0
  29. data/vendor/dust-0.1.6/lib/object_extension.rb +62 -0
  30. data/vendor/dust-0.1.6/lib/string_extension.rb +5 -0
  31. data/vendor/dust-0.1.6/lib/symbol_extension.rb +5 -0
  32. data/vendor/dust-0.1.6/lib/test_case_extension.rb +76 -0
  33. data/vendor/dust-0.1.6/rakefile.rb +50 -0
  34. data/vendor/dust-0.1.6/test/all_tests.rb +1 -0
  35. data/vendor/dust-0.1.6/test/failing_with_helper_unit_test.rb +16 -0
  36. data/vendor/dust-0.1.6/test/failing_with_setup_unit_test.rb +16 -0
  37. data/vendor/dust-0.1.6/test/functional_test.rb +12 -0
  38. data/vendor/dust-0.1.6/test/passing_unit_test.rb +11 -0
  39. data/vendor/dust-0.1.6/test/passing_with_helper_unit_test.rb +10 -0
  40. data/vendor/dust-0.1.6/test/passing_with_helpers_unit_test.rb +13 -0
  41. data/vendor/dust-0.1.6/test/passing_with_setup_unit_test.rb +10 -0
  42. data/vendor/dust-0.1.6/test/test_helper.rb +1 -0
  43. metadata +94 -0
@@ -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,21 @@
1
+ module UnitRecord
2
+ module DisconnectedActiveRecord
3
+ def disconnected?
4
+ connected? && connection.is_a?(ActiveRecord::ConnectionAdapters::UnitRecordAdapter)
5
+ end
6
+
7
+ def disconnect!(options = {})
8
+ return if disconnected?
9
+ establish_connection options.merge(:adapter => "unit_record")
10
+ if options[:stub_associations]
11
+ ActiveRecord::Base.send :include, UnitRecord::AssociationStubbing
12
+ end
13
+ Fixtures.disconnect!
14
+ UnitRecord.base_rails_test_class.disconnect!
15
+ ActiveRecord::Migration.verbose = false
16
+ ActiveRecord::Base.connection.change_strategy(:noop) do
17
+ load(RAILS_ROOT + "/db/schema.rb")
18
+ end
19
+ end
20
+ end
21
+ 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,103 @@
1
+ require File.dirname(__FILE__) + "/../../test_helper"
2
+
3
+ functional_tests do
4
+
5
+ test "reconnect works" do
6
+ ActiveRecord::Base.connection.reconnect!
7
+ assert_kind_of ActiveRecord::ConnectionAdapters::UnitRecordAdapter,
8
+ ActiveRecord::Base.connection
9
+ end
10
+
11
+ test "find(:all)" do
12
+ ActiveRecord::Base.connection.change_strategy(:raise) do
13
+ assert_raises(RuntimeError) { Person.find(:all) }
14
+ end
15
+ ActiveRecord::Base.connection.change_strategy(:noop) do
16
+ assert_equal [], Person.find(:all)
17
+ end
18
+ end
19
+
20
+ test "execute raises an exception" do
21
+ assert_raises_disconnected_exception do
22
+ ActiveRecord::Base.connection.execute "SELECT 1"
23
+ end
24
+ end
25
+
26
+ test "select_rows raises an exception" do
27
+ assert_raises_disconnected_exception do
28
+ ActiveRecord::Base.connection.select_rows "SELECT * FROM people"
29
+ end
30
+ end
31
+
32
+ test "select raises an exception" do
33
+ assert_raises_disconnected_exception do
34
+ ActiveRecord::Base.connection.send :select, "SELECT * FROM people"
35
+ end
36
+ end
37
+
38
+ test "rename_table raises an exception" do
39
+ assert_raises_disconnected_exception do
40
+ ActiveRecord::Base.connection.rename_table "people", "persons"
41
+ end
42
+ end
43
+
44
+ test "change_column raises an exception" do
45
+ assert_raises_disconnected_exception do
46
+ ActiveRecord::Base.connection.change_column "people", "first_name", :string, :null => false
47
+ end
48
+ end
49
+
50
+ test "change_column_default raises an exception" do
51
+ assert_raises_disconnected_exception do
52
+ ActiveRecord::Base.connection.change_column_default "people", "first_person", "george"
53
+ end
54
+ end
55
+
56
+ test "rename_column raises an exception" do
57
+ assert_raises_disconnected_exception do
58
+ ActiveRecord::Base.connection.rename_column "people", "first_name", "name_first"
59
+ end
60
+ end
61
+
62
+ test "insert raises an exception" do
63
+ assert_raises_disconnected_exception do
64
+ ActiveRecord::Base.connection.rename_column "people", "first_name", "name_first"
65
+ end
66
+ end
67
+
68
+ test "initialize can set strategy" do
69
+ ActiveRecord::Base.establish_connection :adapter => "unit_record", :strategy => :noop
70
+ assert_nil ActiveRecord::Base.connection.execute("SELECT 1")
71
+ ActiveRecord::Base.establish_connection :adapter => "unit_record", :strategy => :raise
72
+ assert_raises(RuntimeError) { ActiveRecord::Base.connection.execute("SELECT 1") }
73
+ end
74
+
75
+ test "noop" do
76
+ ActiveRecord::Base.connection.change_strategy(:noop) do
77
+ assert_nil ActiveRecord::Base.connection.execute("SELECT 1")
78
+ assert_nil ActiveRecord::Base.connection.insert("INSERT INTO ...")
79
+ assert_equal [], ActiveRecord::Base.connection.select_rows("SELECT * FROM people")
80
+ assert_equal [], ActiveRecord::Base.connection.send(:select, "SELECT * FROM people")
81
+ assert_nil ActiveRecord::Base.connection.rename_table("people", "persons")
82
+ assert_nil ActiveRecord::Base.connection.change_column("people", "first_name", :string, :null => false)
83
+ assert_nil ActiveRecord::Base.connection.change_column_default("people", "first_person", "george")
84
+ assert_nil ActiveRecord::Base.connection.rename_column("people", "first_name", "name_first")
85
+ end
86
+ end
87
+
88
+ test "change_strategy raises if invalid strategy" do
89
+ assert_nothing_raised { ActiveRecord::Base.connection.change_strategy(:noop) {} }
90
+ assert_nothing_raised { ActiveRecord::Base.connection.change_strategy(:raise) {} }
91
+ assert_raises(ArgumentError) { ActiveRecord::Base.connection.change_strategy(:bogus) {} }
92
+ end
93
+
94
+ def assert_raises_disconnected_exception(&block)
95
+ exception = nil
96
+ begin
97
+ yield
98
+ rescue Exception => exception
99
+ end
100
+ assert_not_nil exception
101
+ assert_equal "ActiveRecord is disconnected; database access is unavailable in unit tests.", exception.message
102
+ end
103
+ 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,44 @@
1
+ require "rubygems"
2
+ gem "rspec", "1.1.11"
3
+ require "test/unit"
4
+ require "spec"
5
+
6
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
7
+
8
+ RAILS_ROOT = File.dirname(__FILE__)
9
+
10
+ if rails_version = ENV['RAILS_VERSION']
11
+ gem "rails", rails_version
12
+ end
13
+ require "rails/version"
14
+ puts "==== Testing with Rails #{Rails::VERSION::STRING} ===="
15
+ require 'active_record'
16
+ require 'active_record/fixtures'
17
+ require "action_controller"
18
+ require "action_controller/test_process"
19
+
20
+ require "unit_record"
21
+
22
+ if UnitRecord.rails_version >= "2.3"
23
+ ActiveSupport::TestCase.class_eval { include ActiveRecord::TestFixtures }
24
+ end
25
+
26
+ # Needed because of this line in setup_with_fixtures and teardown_with_fixtures:
27
+ # return unless defined?(ActiveRecord::Base) && !ActiveRecord::Base.configurations.blank?
28
+ ActiveRecord::Base.configurations = {"irrelevant" => {:adapter => "stub"}}
29
+
30
+ ActiveRecord::Base.disconnect! :strategy => :raise, :stub_associations => true
31
+
32
+ describe UnitRecord do
33
+ it "disconnects tests from the database" do
34
+ lambda do
35
+ ActiveRecord::Base.connection.select_value("SELECT 1")
36
+ end.should raise_error
37
+ end
38
+
39
+ it "can change strategy to noop" do
40
+ ActiveRecord::Base.connection.change_strategy(:noop) do
41
+ ActiveRecord::Base.connection.select_value("SELECT 1").should == nil
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,73 @@
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
+ gem "mocha"
24
+ require 'mocha'
25
+ rescue LoadError, Gem::LoadError
26
+ raise "need mocha to test"
27
+ end
28
+ $LOAD_PATH << File.dirname(__FILE__) + "/../vendor/dust-0.1.6/lib"
29
+ require 'dust'
30
+ Test::Unit::TestCase.disallow_setup!
31
+
32
+ $LOAD_PATH << File.dirname(__FILE__) + "/../lib"
33
+ require "unit_record"
34
+
35
+ if UnitRecord.rails_version >= "2.3"
36
+ require "active_support/test_case"
37
+ ActiveSupport::TestCase.class_eval { include ActiveRecord::TestFixtures }
38
+ end
39
+
40
+ UnitRecord.base_rails_test_class.use_transactional_fixtures = true
41
+
42
+ # Needed because of this line in setup_with_fixtures and teardown_with_fixtures:
43
+ # return unless defined?(ActiveRecord::Base) && !ActiveRecord::Base.configurations.blank?
44
+ ActiveRecord::Base.configurations = {"irrelevant" => {:adapter => "stub"}}
45
+
46
+ class Preference < ActiveRecord::Base
47
+ end
48
+
49
+ class Person < ActiveRecord::Base
50
+ has_many :pets
51
+ has_one :profile
52
+ end
53
+
54
+ class Profile < ActiveRecord::Base
55
+ belongs_to :person
56
+ end
57
+
58
+ class Pet < ActiveRecord::Base
59
+ belongs_to :person
60
+ end
61
+
62
+ class Foo < ActiveRecord::Base
63
+ set_table_name :foofoo
64
+ end
65
+
66
+ class DoesNotExist < ActiveRecord::Base
67
+ set_table_name "table_does_not_exist"
68
+ end
69
+
70
+ ActiveRecord::Base.disconnect! :strategy => :raise, :stub_associations => true
71
+ # make sure calling disconnect multiple times does not cause problems
72
+ ActiveRecord::Base.disconnect! :strategy => :raise, :stub_associations => true
73
+ end
@@ -0,0 +1,37 @@
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 "using correct classes does not stub" do
18
+ person = Person.new(:first_name => "Dan")
19
+ pet = Pet.new :person => person
20
+ pet.person = Person.new(:first_name => "Tom")
21
+ assert_equal "Tom", pet.person.first_name
22
+ end
23
+
24
+ test "using other than correct classes does stub" do
25
+ person = Object.new
26
+ def person.first_name; "Dan"; end
27
+ pet = Pet.new :person => person
28
+ pet.person = Person.new(:first_name => "Tom")
29
+ assert_equal "Dan", pet.person.first_name
30
+ end
31
+
32
+ test "multiple includes doesn't hurt" do
33
+ ActiveRecord::Base.send :include, UnitRecord::AssociationStubbing
34
+ Person.new
35
+ end
36
+
37
+ 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