From 5e8df327d862e5100656cc67efad871c2793cf38 Mon Sep 17 00:00:00 2001 From: Ben Mabey Date: Tue, 3 Mar 2009 21:53:21 -0700 Subject: [PATCH] cucumber feature and example app done. Got the AR transaction strategy done as well. --- cucumber.yml | 1 + examples/features/support/env.rb | 21 +++++++--------- examples/lib/activerecord.rb | 12 +++++++++ features/cleaning.feature | 22 ++++++++++------ .../database_cleaner_steps.rb | 25 +++++++++++++++++++ .../active_record/transaction.rb | 20 +++++++++++++++ 6 files changed, 81 insertions(+), 20 deletions(-) create mode 100644 cucumber.yml create mode 100644 examples/lib/activerecord.rb diff --git a/cucumber.yml b/cucumber.yml new file mode 100644 index 0000000..c1869b5 --- /dev/null +++ b/cucumber.yml @@ -0,0 +1 @@ +default: features diff --git a/examples/features/support/env.rb b/examples/features/support/env.rb index 4232800..8a95b02 100644 --- a/examples/features/support/env.rb +++ b/examples/features/support/env.rb @@ -1,19 +1,16 @@ require 'rubygems' require 'spec/expectations' -require 'activerecord' -require '../../lib/database_cleaner' +begin + require "#{File.dirname(__FILE__)}/../../lib/#{ENV['ORM']}" +rescue LoadError + raise "I don't have the setup for the '#{ENV['ORM']}' ORM!" +end + +$:.unshift(File.dirname(__FILE__) + '/../../../lib') +require 'database_cleaner' require 'database_cleaner/cucumber' -DatabaseCleaner.strategy = :transaction #DatabaseCleaner::ActiveRecord::Transaction.new +DatabaseCleaner.strategy = ENV['STRATEGY'].to_sym -ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :dbfile => ":memory:") -ActiveRecord::Schema.define(:version => 1) do - create_table :widgets do |t| - t.string :name - end -end - -class Widget < ActiveRecord::Base -end diff --git a/examples/lib/activerecord.rb b/examples/lib/activerecord.rb new file mode 100644 index 0000000..058c4b7 --- /dev/null +++ b/examples/lib/activerecord.rb @@ -0,0 +1,12 @@ +require 'activerecord' + +ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :dbfile => ":memory:") + +ActiveRecord::Schema.define(:version => 1) do + create_table :widgets do |t| + t.string :name + end +end + +class Widget < ActiveRecord::Base +end diff --git a/features/cleaning.feature b/features/cleaning.feature index b908b60..7eb5097 100644 --- a/features/cleaning.feature +++ b/features/cleaning.feature @@ -1,9 +1,15 @@ -Feature: something something - In order to something something - A user something something - something something something +Feature: database cleaning + In order to ease example and feature writing + As a developer + I want to have my database in a clean state - Scenario: something something - Given inspiration - When I create a sweet new gem - Then everyone should see how awesome I am + Scenario Outline: ruby app + Given I am using + And the cleaning strategy + + When I run my scenarios that rely on a clean database + Then I should see all green + + Examples: + | ORM | Strategy | + | ActiveRecord | transaction | diff --git a/features/step_definitions/database_cleaner_steps.rb b/features/step_definitions/database_cleaner_steps.rb index e69de29..a790d4f 100644 --- a/features/step_definitions/database_cleaner_steps.rb +++ b/features/step_definitions/database_cleaner_steps.rb @@ -0,0 +1,25 @@ +Given /^I am using (ActiveRecord|DataMapper)$/ do |orm| + @orm = orm +end + +Given /^the (.+) cleaning strategy$/ do |strategy| + @strategy = strategy +end + +When "I run my scenarios that rely on a clean database" do + full_dir ||= File.expand_path(File.dirname(__FILE__) + "/../../examples/") + Dir.chdir(full_dir) do + ENV['ORM'] = @orm.downcase + ENV['STRATEGY'] = @strategy + @out = `cucumber features` + @status = $?.exitstatus + end +end + +Then "I should see all green" do + unless @status == 0 + raise "Expected to see all green but we saw FAIL! Output:\n#{@out}" + end +end + + diff --git a/lib/database_cleaner/active_record/transaction.rb b/lib/database_cleaner/active_record/transaction.rb index 693eb98..ced4195 100644 --- a/lib/database_cleaner/active_record/transaction.rb +++ b/lib/database_cleaner/active_record/transaction.rb @@ -1,6 +1,26 @@ module DatabaseCleaner::ActiveRecord class Transaction + def start + if ActiveRecord::Base.connection.respond_to?(:increment_open_transactions) + ActiveRecord::Base.connection.increment_open_transactions + else + ActiveRecord::Base.__send__(:increment_open_transactions) + end + + ActiveRecord::Base.connection.begin_db_transaction + end + + + def clean + ActiveRecord::Base.connection.rollback_db_transaction + + if ActiveRecord::Base.connection.respond_to?(:decrement_open_transactions) + ActiveRecord::Base.connection.decrement_open_transactions + else + ActiveRecord::Base.__send__(:decrement_open_transactions) + end + end end end