diff --git a/.gitignore b/.gitignore index 511d7d68d..140a8d505 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,6 @@ test/profile/output/* .idea coverage/* .flooignore -.floo \ No newline at end of file +.floo +.ruby-gemset +.ruby-version diff --git a/RUNNING_UNIT_TESTS.md b/RUNNING_UNIT_TESTS.md index 8ebe4bc40..dd9a1d697 100644 --- a/RUNNING_UNIT_TESTS.md +++ b/RUNNING_UNIT_TESTS.md @@ -36,7 +36,7 @@ The tests of this adapter depend on the existence of the Rails which under the 3 $ git clone git://github.com/rails-sqlserver/activerecord-sqlserver-adapter.git ``` -Optionally, you an just let bundler do all the work and assuming there is a git tag for the Rails version, you can set `RAILS_VERSION` before bundling. +Optionally, you can just let bundler do all the work and assuming there is a git tag for the Rails version, you can set `RAILS_VERSION` before bundling. ``` $ export RAILS_VERSION='3.2.13' diff --git a/lib/active_record/tasks/sqlserver_database_tasks.rb b/lib/active_record/tasks/sqlserver_database_tasks.rb new file mode 100644 index 000000000..d5d523e56 --- /dev/null +++ b/lib/active_record/tasks/sqlserver_database_tasks.rb @@ -0,0 +1,62 @@ +module ActiveRecord + module Tasks # :nodoc: + class SQLServerDatabaseTasks # :nodoc: + delegate :connection, :establish_connection, to: ActiveRecord::Base + + def initialize(configuration) + @configuration = configuration + end + + def create(master_established = false) + establish_master_connection unless master_established + connection.create_database configuration['database'] + establish_connection configuration + + rescue ActiveRecord::StatementInvalid => error + if /Database .* already exists/ === error.message + raise DatabaseAlreadyExists + else + raise + end + end + + def drop(master_established = false) + establish_master_connection unless master_established + connection.drop_database configuration['database'] + establish_connection configuration + end + + def purge + establish_connection configuration + connection.recreate_database + end + + private + + def configuration + @configuration + end + + def creation_options + Hash.new.tap do |options| + options[:charset] = configuration['encoding'] if configuration.include? 'encoding' + options[:collation] = configuration['collation'] if configuration.include? 'collation' + + # Set default charset only when collation isn't set. + options[:charset] ||= DEFAULT_CHARSET unless options[:collation] + + # Set default collation only when charset is also default. + options[:collation] ||= DEFAULT_COLLATION if options[:charset] == DEFAULT_CHARSET + end + end + + def establish_master_connection + establish_connection configuration.merge( + 'database' => 'master' + ) + end + + ActiveRecord::Tasks::DatabaseTasks.register_task(/sqlserver/, ActiveRecord::Tasks::SQLServerDatabaseTasks) + end + end +end diff --git a/lib/activerecord-sqlserver-adapter.rb b/lib/activerecord-sqlserver-adapter.rb index b420ca178..865fdbb84 100644 --- a/lib/activerecord-sqlserver-adapter.rb +++ b/lib/activerecord-sqlserver-adapter.rb @@ -1 +1,2 @@ require 'active_record/connection_adapters/sqlserver_adapter' +require 'active_record/tasks/sqlserver_database_tasks' diff --git a/test/cases/associations_test_sqlserver.rb b/test/cases/associations_test_sqlserver.rb index eb2fbee61..797104eaa 100644 --- a/test/cases/associations_test_sqlserver.rb +++ b/test/cases/associations_test_sqlserver.rb @@ -1,5 +1,7 @@ require 'cases/sqlserver_helper' require 'models/owner' +require 'models/pet' +require 'models/toy' class HasManyThroughAssociationsTest < ActiveRecord::TestCase COERCED_TESTS = [:test_has_many_through_obeys_order_on_through_association] @@ -7,6 +9,9 @@ class HasManyThroughAssociationsTest < ActiveRecord::TestCase # Until that patch is made to rails we are preventing this test from running in this gem. include SqlserverCoercedTest + + fixtures :owners, :pets, :toys + def test_coerced_has_many_through_obeys_order_on_through_association owner = owners(:blackbeard) # assert owner.toys.to_sql.include?("pets.name desc") # What's currently in rails diff --git a/test/cases/resolver_test_sqlserver.rb b/test/cases/resolver_test_sqlserver.rb index 5718a3f11..0e19b5faa 100644 --- a/test/cases/resolver_test_sqlserver.rb +++ b/test/cases/resolver_test_sqlserver.rb @@ -8,6 +8,10 @@ class ResolverTest < ActiveRecord::TestCase include SqlserverCoercedTest + def resolve(spec, config={}) + Resolver.new(config).resolve(spec) + end + COERCED_TESTS = [ :test_url_host_no_db, :test_url_host_db, diff --git a/test/cases/tasks/sqlserver_rake_test_sqlserver.rb b/test/cases/tasks/sqlserver_rake_test_sqlserver.rb new file mode 100644 index 000000000..0bbbe5ede --- /dev/null +++ b/test/cases/tasks/sqlserver_rake_test_sqlserver.rb @@ -0,0 +1,58 @@ +require 'cases/helper' +require(Dir.pwd + '/lib/active_record/tasks/sqlserver_database_tasks.rb') + +module ActiveRecord + class SQLServerDropTest < ActiveRecord::TestCase + def setup + @connection = stub(:drop_database => true) + @configuration = { + 'adapter' => 'sqlserver', + 'database' => 'activerecord_unittest' + } + + ActiveRecord::Base.stubs(:connection).returns(@connection) + ActiveRecord::Base.stubs(:establish_connection).returns(true) + ActiveRecord::Tasks::DatabaseTasks.register_task(/sqlserver/, ActiveRecord::Tasks::SQLServerDatabaseTasks) + end + + def test_establishes_connection_to_sqlserver_database + ActiveRecord::Base.expects(:establish_connection).with @configuration + + ActiveRecord::Tasks::DatabaseTasks.drop @configuration + end + + def test_drops_database + @connection.expects(:drop_database).with('activerecord_unittest') + + ActiveRecord::Tasks::DatabaseTasks.drop @configuration + end + end + + class SQLServerPurgeTest < ActiveRecord::TestCase + def setup + @connection = stub(:recreate_database => true) + @configuration = { + 'adapter' => 'sqlserver', + 'database' => 'activerecord_unittest' + } + + ActiveRecord::Base.stubs(:connection).returns(@connection) + ActiveRecord::Base.stubs(:establish_connection).returns(true) + ActiveRecord::Tasks::DatabaseTasks.register_task(/sqlserver/, ActiveRecord::Tasks::SQLServerDatabaseTasks) + end + + def test_establishes_connection_to_test_database + ActiveRecord::Base.expects(:establish_connection).with(@configuration) + + ActiveRecord::Tasks::DatabaseTasks.purge @configuration + end + + def test_recreates_database + @connection.expects(:recreate_database) + + ActiveRecord::Tasks::DatabaseTasks.purge @configuration + end + + end + +end diff --git a/test/profile/query_plan_complex.rb b/test/profile/query_plan_complex.rb old mode 100755 new mode 100644 diff --git a/test/profile/query_plan_simple.rb b/test/profile/query_plan_simple.rb old mode 100755 new mode 100644