diff --git a/.travis.yml b/.travis.yml index 87962ed7..2ab16057 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,36 +13,36 @@ env: - DB=redis - DB=active_record gemfile: - - Gemfile + - gemfiles/rails2.gemfile - gemfiles/rails3.gemfile - gemfiles/rails31.gemfile - gemfiles/rails32.gemfile - gemfiles/rails4.gemfile before_script: - 'echo ''gem: --no-ri --no-rdoc'' > ~/.gemrc' # skip installing docs for gems -- if [[ "`basename $BUNDLE_GEMFILE`" == "Gemfile" ]]; then rvm rubygems 1.8.25; fi # Rubygems 2.0.x fails with Rails 2.3 +- if [[ "`basename $BUNDLE_GEMFILE`" == "gemfiles/rails2.gemfile" ]]; then rvm rubygems 1.8.25; fi # Rubygems 2.0.x fails with Rails 2.3 matrix: exclude: # Rails 2 is not officially supported on Ruby 1.9.3 - rvm: 1.9.3 env: DB=mongodb - gemfile: Gemfile + gemfile: gemfiles/rails2.gemfile - rvm: 1.9.3 env: DB=redis - gemfile: Gemfile + gemfile: gemfiles/rails2.gemfile - rvm: 1.9.3 env: DB=active_record - gemfile: Gemfile + gemfile: gemfiles/rails2.gemfile # Rails <= 3.2 is not officially supported on Ruby 2.0.0 - rvm: 2.0.0 env: DB=mongodb - gemfile: Gemfile + gemfile: gemfiles/rails2.gemfile - rvm: 2.0.0 env: DB=redis - gemfile: Gemfile + gemfile: gemfiles/rails2.gemfile - rvm: 2.0.0 env: DB=active_record - gemfile: Gemfile + gemfile: gemfiles/rails2.gemfile - rvm: 2.0.0 env: DB=mongodb gemfile: gemfiles/rails3.gemfile diff --git a/Appraisals b/Appraisals index 5939b115..b34a1eaf 100644 --- a/Appraisals +++ b/Appraisals @@ -1,22 +1,36 @@ +appraise "rails2" do + gem "rails", "~>2.3.8" + gem "passenger", "~>2.0" + gem "mocha", "~> 0.10.5", :require=>false + gem "minitest", "~>4.2.0" +end + appraise "rails3" do + gem "mocha", "~> 0.12.8", :require=>false + gem "minitest", "~>4.2.0" gem "rails", "3.0.11" gem "fastthread", :git => "git://github.com/zoltankiss/fastthread.git", :platforms => :mri_20 gem "passenger", "~>3.0" end appraise "rails31" do + gem "mocha", "~>0.12.8", :require=>false + gem "minitest", "~>4.2.0" gem "rails", "3.1.3" gem "fastthread", :git => "git://github.com/zoltankiss/fastthread.git", :platforms => :mri_20 gem "passenger", "~>3.0" end appraise "rails32" do + gem "mocha", "~> 0.12.8", :require=>false + gem "minitest", "~>4.2.0" gem "rails", "3.2.1" gem "fastthread", :git => "git://github.com/zoltankiss/fastthread.git", :platforms => :mri_20 gem "passenger", "~>3.0" end appraise "rails4" do + gem "mocha", "~> 1.0", :require=>false gem "rails", "4.0.0" gem "fastthread", :git => "git://github.com/zoltankiss/fastthread.git", :platforms => :mri_20 gem "passenger", "~>3.0" diff --git a/Gemfile b/Gemfile index e98b1b1c..d647fba3 100644 --- a/Gemfile +++ b/Gemfile @@ -3,10 +3,6 @@ gemspec # Frameworks gem "rack" -gem "rails", "~>2.3.8" - -# Servers -gem "passenger", "~>2.0" # Persistence gem "redis", ">= 2.1" @@ -27,8 +23,6 @@ gem "garb" gem "SystemTimer", "1.2.3", :platforms => :mri_18 # Testing -gem "mocha", :require=>false -gem "shoulda", :require=>false # Requires test/unit gem "timecop", :require=>false gem "webmock", :require=>false diff --git a/Gemfile.lock b/Gemfile.lock index 97f9a023..d274438a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -8,15 +8,6 @@ GEM specs: RedCloth (4.2.9) SystemTimer (1.2.3) - actionmailer (2.3.14) - actionpack (= 2.3.14) - actionpack (2.3.14) - activesupport (= 2.3.14) - rack (~> 1.1.0) - activerecord (2.3.14) - activesupport (= 2.3.14) - activeresource (2.3.14) - activesupport (= 2.3.14) activesupport (2.3.14) addressable (2.2.7) albino (1.3.3) @@ -34,7 +25,6 @@ GEM crack (0.3.1) directory_watcher (1.4.1) fast-stemmer (1.0.0) - fastthread (1.0.7) garb (0.9.1) activesupport (>= 2.2.0) crack (>= 0.1.6) @@ -50,34 +40,16 @@ GEM liquid (2.3.0) maruku (0.6.0) syntax (>= 1.0.0) - metaclass (0.0.1) - mocha (0.10.5) - metaclass (~> 0.0.1) + minitest (4.7.5) mongo (1.6.0) bson (= 1.6.0) - passenger (2.2.15) - fastthread (>= 1.0.1) - rack - rake (>= 0.8.1) posix-spawn (0.3.6) rack (1.1.3) - rails (2.3.14) - actionmailer (= 2.3.14) - actionpack (= 2.3.14) - activerecord (= 2.3.14) - activeresource (= 2.3.14) - activesupport (= 2.3.14) - rake (>= 0.8.3) rake (10.1.0) redis (3.0.6) redis-namespace (1.3.2) redis (~> 3.0.4) rubystats (0.2.3) - shoulda (3.0.1) - shoulda-context (~> 1.0.0) - shoulda-matchers (~> 1.0.0) - shoulda-context (1.0.0) - shoulda-matchers (1.0.0) sqlite3 (1.3.8) syntax (1.0.0) thor (0.18.1) @@ -100,16 +72,13 @@ DEPENDENCIES garb integration jekyll - mocha + minitest (>= 4.2) mongo - passenger (~> 2.0) rack - rails (~> 2.3.8) rake redis (>= 2.1) redis-namespace (>= 1.1.0) rubystats - shoulda sqlite3 timecop vanity! diff --git a/Rakefile b/Rakefile index e7af9f8f..e29831b4 100644 --- a/Rakefile +++ b/Rakefile @@ -64,21 +64,15 @@ task "test:adapters", :adapter do |t, args| end # Run the test suit. +Rake::TestTask.new(:test) do |task| + task.libs << "lib" + task.libs << "test" + task.pattern = "test/**/*_test.rb" + task.verbose = false +end task :default=>:test desc "Run all tests" -Rake::TestTask.new do |task| - task.test_files = FileList['test/**/*_test.rb'] - if Rake.application.options.trace - #task.warning = true - task.verbose = true - elsif Rake.application.options.silent - task.ruby_opts << "-W0" - else - task.verbose = true - end - task.ruby_opts << "-I." -end task(:clobber) { rm_rf "tmp" } diff --git a/gemfiles/rails2.gemfile b/gemfiles/rails2.gemfile new file mode 100644 index 00000000..629432d5 --- /dev/null +++ b/gemfiles/rails2.gemfile @@ -0,0 +1,31 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "rack" +gem "redis", ">= 2.1" +gem "redis-namespace", ">= 1.1.0" +gem "bson_ext" +gem "mongo" +gem "sqlite3" +gem "backports", :platforms=>:mri_18 +gem "integration" +gem "rubystats" +gem "garb" +gem "SystemTimer", "1.2.3", :platforms=>:mri_18 +gem "timecop", :require=>false +gem "webmock", :require=>false +gem "rails", "~>2.3.8" +gem "passenger", "~>2.0" +gem "mocha", "~> 0.10.5", :require=>false +gem "minitest", "~>4.2.0" + +group :development do + gem "appraisal", ">= 1.0.0.beta2" + gem "jekyll" + gem "rake" + gem "RedCloth" + gem "yard" +end + +gemspec :path=>".././" diff --git a/gemfiles/rails2.gemfile.lock b/gemfiles/rails2.gemfile.lock new file mode 100644 index 00000000..5277407b --- /dev/null +++ b/gemfiles/rails2.gemfile.lock @@ -0,0 +1,138 @@ +PATH + remote: .././ + specs: + vanity (1.9.1) + +GEM + remote: https://rubygems.org/ + specs: + RedCloth (4.2.9) + SystemTimer (1.2.3) + actionmailer (2.3.18) + actionpack (= 2.3.18) + actionpack (2.3.18) + activesupport (= 2.3.18) + rack (~> 1.1.0) + activerecord (2.3.18) + activesupport (= 2.3.18) + activeresource (2.3.18) + activesupport (= 2.3.18) + activesupport (2.3.18) + addressable (2.3.6) + appraisal (1.0.0) + bundler + rake + thor (>= 0.14.0) + backports (3.6.0) + blankslate (2.1.2.4) + bson (1.10.0) + bson_ext (1.10.0) + bson (~> 1.10.0) + classifier (1.3.4) + fast-stemmer (>= 1.0.0) + colorator (0.1) + commander (4.1.6) + highline (~> 1.6.11) + crack (0.4.2) + safe_yaml (~> 1.0.0) + fast-stemmer (1.0.2) + fastthread (1.0.7) + ffi (1.9.3) + garb (0.9.1) + activesupport (>= 2.2) + multi_json (>= 1.3) + highline (1.6.21) + integration (0.1.0) + jekyll (1.5.1) + classifier (~> 1.3) + colorator (~> 0.1) + commander (~> 4.1.3) + liquid (~> 2.5.5) + listen (~> 1.3) + maruku (= 0.7.0) + pygments.rb (~> 0.5.0) + redcarpet (~> 2.3.0) + safe_yaml (~> 1.0) + toml (~> 0.1.0) + liquid (2.5.5) + listen (1.3.1) + rb-fsevent (>= 0.9.3) + rb-inotify (>= 0.9) + rb-kqueue (>= 0.2) + maruku (0.7.0) + metaclass (0.0.4) + minitest (4.2.0) + mocha (0.10.5) + metaclass (~> 0.0.1) + mongo (1.10.0) + bson (~> 1.10.0) + multi_json (1.9.3) + parslet (1.5.0) + blankslate (~> 2.0) + passenger (2.2.15) + fastthread (>= 1.0.1) + rack + rake (>= 0.8.1) + posix-spawn (0.3.8) + pygments.rb (0.5.4) + posix-spawn (~> 0.3.6) + yajl-ruby (~> 1.1.0) + rack (1.1.6) + rails (2.3.18) + actionmailer (= 2.3.18) + actionpack (= 2.3.18) + activerecord (= 2.3.18) + activeresource (= 2.3.18) + activesupport (= 2.3.18) + rake (>= 0.8.3) + rake (10.1.0) + rb-fsevent (0.9.4) + rb-inotify (0.9.4) + ffi (>= 0.5.0) + rb-kqueue (0.2.2) + ffi (>= 0.5.0) + redcarpet (2.3.0) + redis (3.0.7) + redis-namespace (1.4.1) + redis (~> 3.0.4) + rubystats (0.2.3) + safe_yaml (1.0.3) + sqlite3 (1.3.9) + thor (0.19.1) + timecop (0.3.5) + toml (0.1.1) + parslet (~> 1.5.0) + webmock (1.17.4) + addressable (>= 2.2.7) + crack (>= 0.3.2) + yajl-ruby (1.1.0) + yard (0.8.7.4) + +PLATFORMS + ruby + +DEPENDENCIES + RedCloth + SystemTimer (= 1.2.3) + appraisal (>= 1.0.0.beta2) + backports + bson_ext + bundler (>= 1.0.0) + garb + integration + jekyll + minitest (~> 4.2.0) + mocha (~> 0.10.5) + mongo + passenger (~> 2.0) + rack + rails (~> 2.3.8) + rake + redis (>= 2.1) + redis-namespace (>= 1.1.0) + rubystats + sqlite3 + timecop + vanity! + webmock + yard diff --git a/gemfiles/rails3.gemfile b/gemfiles/rails3.gemfile index 34a18b67..4dfe0c42 100644 --- a/gemfiles/rails3.gemfile +++ b/gemfiles/rails3.gemfile @@ -13,10 +13,10 @@ gem "integration" gem "rubystats" gem "garb" gem "SystemTimer", "1.2.3", :platforms=>:mri_18 -gem "mocha", :require=>false -gem "shoulda", :require=>false gem "timecop", :require=>false gem "webmock", :require=>false +gem "mocha", "~> 0.12.8", :require=>false +gem "minitest", "~>4.2.0" gem "rails", "3.0.11" gem "fastthread", :git=>"git://github.com/zoltankiss/fastthread.git", :platforms=>:mri_20 gem "passenger", "~>3.0" diff --git a/gemfiles/rails3.gemfile.lock b/gemfiles/rails3.gemfile.lock index b6f71760..839d4a44 100644 --- a/gemfiles/rails3.gemfile.lock +++ b/gemfiles/rails3.gemfile.lock @@ -84,9 +84,10 @@ GEM treetop (~> 1.4.8) maruku (0.6.0) syntax (>= 1.0.0) - metaclass (0.0.1) + metaclass (0.0.4) mime-types (1.17.2) - mocha (0.10.5) + minitest (4.2.0) + mocha (0.12.10) metaclass (~> 0.0.1) mongo (1.6.0) bson (= 1.6.0) @@ -123,11 +124,6 @@ GEM redis-namespace (1.3.2) redis (~> 3.0.4) rubystats (0.2.3) - shoulda (3.0.1) - shoulda-context (~> 1.0.0) - shoulda-matchers (~> 1.0.0) - shoulda-context (1.0.0) - shoulda-matchers (1.0.0) sqlite3 (1.3.8) syntax (1.0.0) thor (0.14.6) @@ -155,7 +151,8 @@ DEPENDENCIES garb integration jekyll - mocha + minitest (~> 4.2.0) + mocha (~> 0.12.8) mongo passenger (~> 3.0) rack @@ -164,7 +161,6 @@ DEPENDENCIES redis (>= 2.1) redis-namespace (>= 1.1.0) rubystats - shoulda sqlite3 timecop vanity! diff --git a/gemfiles/rails31.gemfile b/gemfiles/rails31.gemfile index 61c1e3b2..b76050a4 100644 --- a/gemfiles/rails31.gemfile +++ b/gemfiles/rails31.gemfile @@ -13,10 +13,10 @@ gem "integration" gem "rubystats" gem "garb" gem "SystemTimer", "1.2.3", :platforms=>:mri_18 -gem "mocha", :require=>false -gem "shoulda", :require=>false gem "timecop", :require=>false gem "webmock", :require=>false +gem "mocha", "~>0.12.8", :require=>false +gem "minitest", "~>4.2.0" gem "rails", "3.1.3" gem "fastthread", :git=>"git://github.com/zoltankiss/fastthread.git", :platforms=>:mri_20 gem "passenger", "~>3.0" diff --git a/gemfiles/rails31.gemfile.lock b/gemfiles/rails31.gemfile.lock index c2a1a203..91f5ad14 100644 --- a/gemfiles/rails31.gemfile.lock +++ b/gemfiles/rails31.gemfile.lock @@ -83,9 +83,10 @@ GEM treetop (~> 1.4.8) maruku (0.6.0) syntax (>= 1.0.0) - metaclass (0.0.1) + metaclass (0.0.4) mime-types (1.17.2) - mocha (0.10.5) + minitest (4.2.0) + mocha (0.12.10) metaclass (~> 0.0.1) mongo (1.6.0) bson (= 1.6.0) @@ -128,11 +129,6 @@ GEM redis-namespace (1.3.2) redis (~> 3.0.4) rubystats (0.2.3) - shoulda (3.0.1) - shoulda-context (~> 1.0.0) - shoulda-matchers (~> 1.0.0) - shoulda-context (1.0.0) - shoulda-matchers (1.0.0) sprockets (2.0.3) rack (~> 1.0) tilt (~> 1.1, != 1.3.0) @@ -164,7 +160,8 @@ DEPENDENCIES garb integration jekyll - mocha + minitest (~> 4.2.0) + mocha (~> 0.12.8) mongo passenger (~> 3.0) rack @@ -173,7 +170,6 @@ DEPENDENCIES redis (>= 2.1) redis-namespace (>= 1.1.0) rubystats - shoulda sqlite3 timecop vanity! diff --git a/gemfiles/rails32.gemfile b/gemfiles/rails32.gemfile index 0d4d2871..ae513585 100644 --- a/gemfiles/rails32.gemfile +++ b/gemfiles/rails32.gemfile @@ -13,10 +13,10 @@ gem "integration" gem "rubystats" gem "garb" gem "SystemTimer", "1.2.3", :platforms=>:mri_18 -gem "mocha", :require=>false -gem "shoulda", :require=>false gem "timecop", :require=>false gem "webmock", :require=>false +gem "mocha", "~> 0.12.8", :require=>false +gem "minitest", "~>4.2.0" gem "rails", "3.2.1" gem "fastthread", :git=>"git://github.com/zoltankiss/fastthread.git", :platforms=>:mri_20 gem "passenger", "~>3.0" diff --git a/gemfiles/rails32.gemfile.lock b/gemfiles/rails32.gemfile.lock index 1b9131a1..826725c6 100644 --- a/gemfiles/rails32.gemfile.lock +++ b/gemfiles/rails32.gemfile.lock @@ -84,9 +84,10 @@ GEM treetop (~> 1.4.8) maruku (0.6.0) syntax (>= 1.0.0) - metaclass (0.0.1) + metaclass (0.0.4) mime-types (1.17.2) - mocha (0.10.5) + minitest (4.2.0) + mocha (0.12.10) metaclass (~> 0.0.1) mongo (1.6.0) bson (= 1.6.0) @@ -127,11 +128,6 @@ GEM redis-namespace (1.3.2) redis (~> 3.0.4) rubystats (0.2.3) - shoulda (3.0.1) - shoulda-context (~> 1.0.0) - shoulda-matchers (~> 1.0.0) - shoulda-context (1.0.0) - shoulda-matchers (1.0.0) sprockets (2.1.2) hike (~> 1.2) rack (~> 1.0) @@ -164,7 +160,8 @@ DEPENDENCIES garb integration jekyll - mocha + minitest (~> 4.2.0) + mocha (~> 0.12.8) mongo passenger (~> 3.0) rack @@ -173,7 +170,6 @@ DEPENDENCIES redis (>= 2.1) redis-namespace (>= 1.1.0) rubystats - shoulda sqlite3 timecop vanity! diff --git a/gemfiles/rails4.gemfile b/gemfiles/rails4.gemfile index 0481fad2..12fa8740 100644 --- a/gemfiles/rails4.gemfile +++ b/gemfiles/rails4.gemfile @@ -13,10 +13,9 @@ gem "integration" gem "rubystats" gem "garb" gem "SystemTimer", "1.2.3", :platforms=>:mri_18 -gem "mocha", :require=>false -gem "shoulda", :require=>false gem "timecop", :require=>false gem "webmock", :require=>false +gem "mocha", "~> 1.0", :require=>false gem "rails", "4.0.0" gem "fastthread", :git=>"git://github.com/zoltankiss/fastthread.git", :platforms=>:mri_20 gem "passenger", "~>3.0" diff --git a/gemfiles/rails4.gemfile.lock b/gemfiles/rails4.gemfile.lock index 0a8ad7f3..9f690c0e 100644 --- a/gemfiles/rails4.gemfile.lock +++ b/gemfiles/rails4.gemfile.lock @@ -80,10 +80,10 @@ GEM treetop (~> 1.4.8) maruku (0.6.0) syntax (>= 1.0.0) - metaclass (0.0.1) + metaclass (0.0.4) mime-types (1.25) minitest (4.7.5) - mocha (0.14.0) + mocha (1.0.0) metaclass (~> 0.0.1) mongo (1.9.2) bson (~> 1.9.2) @@ -117,12 +117,6 @@ GEM redis (~> 3.0.4) rubystats (0.2.3) safe_yaml (0.9.7) - shoulda (3.5.0) - shoulda-context (~> 1.0, >= 1.0.1) - shoulda-matchers (>= 1.4.1, < 3.0) - shoulda-context (1.1.6) - shoulda-matchers (2.4.0) - activesupport (>= 3.0.0) sprockets (2.10.0) hike (~> 1.2) multi_json (~> 1.0) @@ -162,7 +156,8 @@ DEPENDENCIES garb integration jekyll - mocha + minitest (>= 4.2) + mocha (~> 1.0) mongo passenger (~> 3.0) rack @@ -171,7 +166,6 @@ DEPENDENCIES redis (>= 2.1) redis-namespace (>= 1.1.0) rubystats - shoulda sqlite3 timecop vanity! diff --git a/test/adapters/redis_adapter_test.rb b/test/adapters/redis_adapter_test.rb index 95041c56..fbc90448 100644 --- a/test/adapters/redis_adapter_test.rb +++ b/test/adapters/redis_adapter_test.rb @@ -1,7 +1,8 @@ -require 'test/test_helper' +require "test_helper" class RedisAdapterTest < Test::Unit::TestCase def setup + super require "vanity/adapters/redis_adapter" require "redis" require "redis/namespace" diff --git a/test/autoconnect_test.rb b/test/autoconnect_test.rb index 594f89de..f6c1de77 100644 --- a/test/autoconnect_test.rb +++ b/test/autoconnect_test.rb @@ -1,22 +1,24 @@ -require "test/test_helper" +require "test_helper" -context ".playground_should_autoconnect?" do +describe Vanity::Autoconnect do + describe ".playground_should_autoconnect?" do - test "returns true by default" do - autoconnect = Vanity::Autoconnect.playground_should_autoconnect? - assert autoconnect == true - end + it "returns true by default" do + autoconnect = Vanity::Autoconnect.playground_should_autoconnect? + assert autoconnect == true + end - test "returns false if environment flag is set" do - ENV['VANITY_DISABLED'] = '1' - autoconnect = Vanity::Autoconnect.playground_should_autoconnect? - assert autoconnect == false - ENV['VANITY_DISABLED'] = nil - end + it "returns false if environment flag is set" do + ENV['VANITY_DISABLED'] = '1' + autoconnect = Vanity::Autoconnect.playground_should_autoconnect? + assert autoconnect == false + ENV['VANITY_DISABLED'] = nil + end - test "returns false if in assets:precompile rake task" do - Rake.expects(:application).returns(stub(:top_level_tasks => ['assets:precompile'])) - autoconnect = Vanity::Autoconnect.playground_should_autoconnect? - assert autoconnect == false + it "returns false if in assets:precompile rake task" do + Rake.expects(:application).returns(stub(:top_level_tasks => ['assets:precompile'])) + autoconnect = Vanity::Autoconnect.playground_should_autoconnect? + assert autoconnect == false + end end -end +end \ No newline at end of file diff --git a/test/cli_test.rb b/test/cli_test.rb index 19be6577..4e906409 100644 --- a/test/cli_test.rb +++ b/test/cli_test.rb @@ -1,4 +1,4 @@ -require "test/test_helper" +require "test_helper" class PlaygroundTest < Test::Unit::TestCase diff --git a/test/experiment/ab_test.rb b/test/experiment/ab_test.rb index 138311d7..461b1d65 100644 --- a/test/experiment/ab_test.rb +++ b/test/experiment/ab_test.rb @@ -1,4 +1,4 @@ -require "test/test_helper" +require "test_helper" class AbTestController < ActionController::Base use_vanity :current_user @@ -35,15 +35,6 @@ def setup metric "Coolness" end - def teardown - super - if RUBY_VERSION == '1.8.7' - GC.enable - GC.start - GC.disable - end - end - # -- Experiment definition -- def test_requires_at_least_two_alternatives_per_experiment diff --git a/test/experiment/base_test.rb b/test/experiment/base_test.rb index 3c714cec..986a5551 100644 --- a/test/experiment/base_test.rb +++ b/test/experiment/base_test.rb @@ -1,4 +1,4 @@ -require "test/test_helper" +require "test_helper" class ExperimentTest < Test::Unit::TestCase @@ -109,10 +109,7 @@ def test_experiment_has_created_timestamp def test_experiment_keeps_created_timestamp_across_definitions past = Date.today - 1 Timecop.freeze past.to_time do - puts "timecop: #{Time.now.to_i}" - assert_equal past.to_time.to_i, Time.now.to_i new_ab_test(:ice_cream_flavor) { metrics :happiness } - assert_equal past.to_time.to_i, experiment(:ice_cream_flavor).created_at.to_i end new_playground diff --git a/test/frameworks/rails/action_controller_test.rb b/test/frameworks/rails/action_controller_test.rb new file mode 100644 index 00000000..0c48b077 --- /dev/null +++ b/test/frameworks/rails/action_controller_test.rb @@ -0,0 +1,189 @@ +require "test_helper" + +class UseVanityController < ActionController::Base + attr_accessor :current_user + + def index + render :text=>ab_test(:pie_or_cake) + end + + def js + ab_test(:pie_or_cake) + render :inline => "<%= vanity_js -%>" + end +end + +# Pages accessible to everyone, e.g. sign in, community search. +class UseVanityControllerTest < ActionController::TestCase + tests UseVanityController + + def setup + super + metric :sugar_high + new_ab_test :pie_or_cake do + metrics :sugar_high + end + UseVanityController.class_eval do + use_vanity :current_user + end + if ::Rails.respond_to?(:application) # Rails 3 configuration + ::Rails.application.config.session_options[:domain] = '.foo.bar' + end + end + + def test_render_js_for_tests + Vanity.playground.use_js! + get :js + assert_match /script.*e=pie_or_cake.*script/m, @response.body + end + + def test_chooses_sets_alternatives_for_rails_tests + experiment(:pie_or_cake).chooses(true) + get :index + assert_equal 'true', @response.body + + experiment(:pie_or_cake).chooses(false) + get :index + assert_equal 'false', @response.body + end + + def test_adds_participant_to_experiment + get :index + assert_equal 1, experiment(:pie_or_cake).alternatives.map(&:participants).sum + end + + def test_does_not_add_invalid_participant_to_experiment + @request.user_agent = "Googlebot/2.1 ( http://www.google.com/bot.html)" + get :index + assert_equal 0, experiment(:pie_or_cake).alternatives.map(&:participants).sum + end + + def test_vanity_cookie_is_persistent + get :index + cookie = @response["Set-Cookie"].to_s + assert_match /vanity_id=[a-f0-9]{32};/, cookie + expires = cookie[/expires=(.*)(;|$)/, 1] + assert expires + assert_in_delta Time.parse(expires), Time.now + 1.month, 1.day + end + + def test_vanity_cookie_default_id + get :index + assert cookies["vanity_id"] =~ /^[a-f0-9]{32}$/ + end + + def test_vanity_cookie_retains_id + @request.cookies["vanity_id"] = "from_last_time" + get :index + # Rails 2 funkieness: if the cookie isn't explicitly set in the response, + # cookies[] is empty. Just make sure it's not re-set. + assert_equal rails3? ? "from_last_time" : nil, cookies["vanity_id"] + end + + def test_vanity_identity_set_from_cookie + @request.cookies["vanity_id"] = "from_last_time" + get :index + assert_equal "from_last_time", @controller.send(:vanity_identity) + end + + def test_vanity_identity_set_from_user + @controller.current_user = mock("user", :id=>"user_id") + get :index + assert_equal "user_id", @controller.send(:vanity_identity) + end + + def test_vanity_identity_with_no_user_model + UseVanityController.class_eval do + use_vanity nil + end + @controller.current_user = Object.new + get :index + assert cookies["vanity_id"] =~ /^[a-f0-9]{32}$/ + end + + def test_vanity_identity_set_with_block + UseVanityController.class_eval do + attr_accessor :project_id + use_vanity { |controller| controller.project_id } + end + @controller.project_id = "576" + get :index + assert_equal "576", @controller.send(:vanity_identity) + end + + def test_vanity_identity_set_with_indentity_paramater + get :index, :_identity => "id_from_params" + assert_equal "id_from_params", @controller.send(:vanity_identity) + end + + def test_vanity_identity_prefers_block_over_symbol + UseVanityController.class_eval do + attr_accessor :project_id + use_vanity(:current_user) { |controller| controller.project_id } + end + @controller.project_id = "576" + @controller.current_user = stub(:id=>"user_id") + + get :index + assert_equal "576", @controller.send(:vanity_identity) + end + + def test_vanity_identity_prefers_parameter_over_cookie + @request.cookies['vanity_id'] = "old_id" + get :index, :_identity => "id_from_params" + assert_equal "id_from_params", @controller.send(:vanity_identity) + assert cookies['vanity_id'], "id_from_params" + end + + def test_vanity_identity_prefers_cookie_over_object + @request.cookies['vanity_id'] = "from_last_time" + @controller.current_user = stub(:id=>"user_id") + get :index + assert_equal "from_last_time", @controller.send(:vanity_identity) + end + + # query parameter filter + + def test_redirects_and_loses_vanity_query_parameter + get :index, :foo=>"bar", :_vanity=>"567" + assert_redirected_to "/use_vanity?foo=bar" + end + + def test_sets_choices_from_vanity_query_parameter + first = experiment(:pie_or_cake).alternatives.first + fingerprint = experiment(:pie_or_cake).fingerprint(first) + 10.times do + @controller = nil ; setup_controller_request_and_response + get :index, :_vanity => fingerprint + assert_equal experiment(:pie_or_cake).choose, experiment(:pie_or_cake).alternatives.first + assert experiment(:pie_or_cake).showing?(first) + end + end + + def test_does_nothing_with_vanity_query_parameter_for_posts + experiment(:pie_or_cake).chooses(experiment(:pie_or_cake).alternatives.last.value) + first = experiment(:pie_or_cake).alternatives.first + fingerprint = experiment(:pie_or_cake).fingerprint(first) + post :index, :foo => "bar", :_vanity => fingerprint + assert_response :success + assert !experiment(:pie_or_cake).showing?(first) + end + + def test_track_param_tracks_a_metric + get :index, :_identity => "123", :_track => "sugar_high" + assert_equal experiment(:pie_or_cake).alternatives[0].converted, 1 + end + + def test_cookie_domain_from_rails_configuration + get :index + assert_match /domain=.foo.bar/, @response["Set-Cookie"] if ::Rails.respond_to?(:application) + end + + def teardown + super + if !rails3? + UseVanityController.send(:filter_chain).clear + end + end + +end \ No newline at end of file diff --git a/test/frameworks/rails/action_mailer_test.rb b/test/frameworks/rails/action_mailer_test.rb new file mode 100644 index 00000000..ca73a27d --- /dev/null +++ b/test/frameworks/rails/action_mailer_test.rb @@ -0,0 +1,65 @@ +require "test_helper" + +class VanityMailer < ActionMailer::Base + include Vanity::Rails::Helpers + include ActionView::Helpers::AssetTagHelper + include ActionView::Helpers::TagHelper + + def ab_test_subject(user, forced_outcome=true) + use_vanity_mailer user + experiment(:pie_or_cake).chooses(forced_outcome) + + if defined?(Rails::Railtie) + mail :subject =>ab_test(:pie_or_cake).to_s, :body => "" + else + subject ab_test(:pie_or_cake).to_s + body "" + end + end + + def ab_test_content(user) + use_vanity_mailer user + + if defined?(Rails::Railtie) + mail do |format| + format.html { render :text=>view_context.vanity_tracking_image(Vanity.context.vanity_identity, :open, :host => "127.0.0.1:3000") } + end + else + body vanity_tracking_image(Vanity.context.vanity_identity, :open, :host => "127.0.0.1:3000") + end + end +end + +class UseVanityMailerTest < ActionMailer::TestCase + tests VanityMailer + + def setup + super + metric :sugar_high + new_ab_test :pie_or_cake do + metrics :sugar_high + end + end + + def test_js_enabled_still_adds_participant + Vanity.playground.use_js! + rails3? ? VanityMailer.ab_test_subject(nil, true) : VanityMailer.deliver_ab_test_subject(nil, true) + + alts = experiment(:pie_or_cake).alternatives + assert_equal 1, alts.map(&:participants).sum + end + + def test_returns_different_alternatives + email = rails3? ? VanityMailer.ab_test_subject(nil, true) : VanityMailer.deliver_ab_test_subject(nil, true) + assert_equal 'true', email.subject + + email = rails3? ? VanityMailer.ab_test_subject(nil, false) : VanityMailer.deliver_ab_test_subject(nil, false) + assert_equal 'false', email.subject + end + + def test_tracking_image_is_rendered + email = rails3? ? VanityMailer.ab_test_content(nil) : VanityMailer.deliver_ab_test_content(nil) + assert email.body =~ /ab_test(:pie_or_cake) - end - - def js - ab_test(:pie_or_cake) - render :inline => "<%= vanity_js -%>" - end -end - -# Pages accessible to everyone, e.g. sign in, community search. -class UseVanityControllerTest < ActionController::TestCase - tests UseVanityController - - def setup - super - metric :sugar_high - new_ab_test :pie_or_cake do - metrics :sugar_high - end - UseVanityController.class_eval do - use_vanity :current_user - end - if ::Rails.respond_to?(:application) # Rails 3 configuration - ::Rails.application.config.session_options[:domain] = '.foo.bar' - end - end - - def test_render_js_for_tests - Vanity.playground.use_js! - get :js - assert_match /script.*e=pie_or_cake.*script/m, @response.body - end - - def test_chooses_sets_alternatives_for_rails_tests - experiment(:pie_or_cake).chooses(true) - get :index - assert_equal 'true', @response.body - - experiment(:pie_or_cake).chooses(false) - get :index - assert_equal 'false', @response.body - end - - def test_adds_participant_to_experiment - get :index - assert_equal 1, experiment(:pie_or_cake).alternatives.map(&:participants).sum - end - - def test_does_not_add_invalid_participant_to_experiment - @request.user_agent = "Googlebot/2.1 ( http://www.google.com/bot.html)" - get :index - assert_equal 0, experiment(:pie_or_cake).alternatives.map(&:participants).sum - end - - def test_vanity_cookie_is_persistent - get :index - cookie = @response["Set-Cookie"].to_s - assert_match /vanity_id=[a-f0-9]{32};/, cookie - expires = cookie[/expires=(.*)(;|$)/, 1] - assert expires - assert_in_delta Time.parse(expires), Time.now + 1.month, 1.day - end - - def test_vanity_cookie_default_id - get :index - assert cookies["vanity_id"] =~ /^[a-f0-9]{32}$/ - end - - def test_vanity_cookie_retains_id - @request.cookies["vanity_id"] = "from_last_time" - get :index - # Rails 2 funkieness: if the cookie isn't explicitly set in the response, - # cookies[] is empty. Just make sure it's not re-set. - assert_equal rails3? ? "from_last_time" : nil, cookies["vanity_id"] - end - - def test_vanity_identity_set_from_cookie - @request.cookies["vanity_id"] = "from_last_time" - get :index - assert_equal "from_last_time", @controller.send(:vanity_identity) - end - - def test_vanity_identity_set_from_user - @controller.current_user = mock("user", :id=>"user_id") - get :index - assert_equal "user_id", @controller.send(:vanity_identity) - end - - def test_vanity_identity_with_no_user_model - UseVanityController.class_eval do - use_vanity nil - end - @controller.current_user = Object.new - get :index - assert cookies["vanity_id"] =~ /^[a-f0-9]{32}$/ - end - - def test_vanity_identity_set_with_block - UseVanityController.class_eval do - attr_accessor :project_id - use_vanity { |controller| controller.project_id } - end - @controller.project_id = "576" - get :index - assert_equal "576", @controller.send(:vanity_identity) - end - - def test_vanity_identity_set_with_indentity_paramater - get :index, :_identity => "id_from_params" - assert_equal "id_from_params", @controller.send(:vanity_identity) - end - - def test_vanity_identity_prefers_block_over_symbol - UseVanityController.class_eval do - attr_accessor :project_id - use_vanity(:current_user) { |controller| controller.project_id } - end - @controller.project_id = "576" - @controller.current_user = stub(:id=>"user_id") - - get :index - assert_equal "576", @controller.send(:vanity_identity) - end - - def test_vanity_identity_prefers_parameter_over_cookie - @request.cookies['vanity_id'] = "old_id" - get :index, :_identity => "id_from_params" - assert_equal "id_from_params", @controller.send(:vanity_identity) - assert cookies['vanity_id'], "id_from_params" - end - - def test_vanity_identity_prefers_cookie_over_object - @request.cookies['vanity_id'] = "from_last_time" - @controller.current_user = stub(:id=>"user_id") - get :index - assert_equal "from_last_time", @controller.send(:vanity_identity) - end - - # query parameter filter - - def test_redirects_and_loses_vanity_query_parameter - get :index, :foo=>"bar", :_vanity=>"567" - assert_redirected_to "/use_vanity?foo=bar" - end - - def test_sets_choices_from_vanity_query_parameter - first = experiment(:pie_or_cake).alternatives.first - fingerprint = experiment(:pie_or_cake).fingerprint(first) - 10.times do - @controller = nil ; setup_controller_request_and_response - get :index, :_vanity => fingerprint - assert_equal experiment(:pie_or_cake).choose, experiment(:pie_or_cake).alternatives.first - assert experiment(:pie_or_cake).showing?(first) - end - end - - def test_does_nothing_with_vanity_query_parameter_for_posts - experiment(:pie_or_cake).chooses(experiment(:pie_or_cake).alternatives.last.value) - first = experiment(:pie_or_cake).alternatives.first - fingerprint = experiment(:pie_or_cake).fingerprint(first) - post :index, :foo => "bar", :_vanity => fingerprint - assert_response :success - assert !experiment(:pie_or_cake).showing?(first) - end - - def test_track_param_tracks_a_metric - get :index, :_identity => "123", :_track => "sugar_high" - assert_equal experiment(:pie_or_cake).alternatives[0].converted, 1 - end - - def test_cookie_domain_from_rails_configuration - get :index - assert_match /domain=.foo.bar/, @response["Set-Cookie"] if ::Rails.respond_to?(:application) - end - - def teardown - super - if !rails3? - UseVanityController.send(:filter_chain).clear - end - end - -end - -class VanityMailer < ActionMailer::Base - include Vanity::Rails::Helpers - include ActionView::Helpers::AssetTagHelper - include ActionView::Helpers::TagHelper - - def ab_test_subject(user, forced_outcome=true) - use_vanity_mailer user - experiment(:pie_or_cake).chooses(forced_outcome) - - if defined?(Rails::Railtie) - mail :subject =>ab_test(:pie_or_cake).to_s, :body => "" - else - subject ab_test(:pie_or_cake).to_s - body "" - end - end - - def ab_test_content(user) - use_vanity_mailer user - - if defined?(Rails::Railtie) - mail do |format| - format.html { render :text=>view_context.vanity_tracking_image(Vanity.context.vanity_identity, :open, :host => "127.0.0.1:3000") } - end - else - body vanity_tracking_image(Vanity.context.vanity_identity, :open, :host => "127.0.0.1:3000") - end - end -end - -class UseVanityMailerTest < ActionMailer::TestCase - tests VanityMailer - - def setup - super - metric :sugar_high - new_ab_test :pie_or_cake do - metrics :sugar_high - end - end - - def test_js_enabled_still_adds_participant - Vanity.playground.use_js! - rails3? ? VanityMailer.ab_test_subject(nil, true) : VanityMailer.deliver_ab_test_subject(nil, true) - - alts = experiment(:pie_or_cake).alternatives - assert_equal 1, alts.map(&:participants).sum - end - - def test_returns_different_alternatives - email = rails3? ? VanityMailer.ab_test_subject(nil, true) : VanityMailer.deliver_ab_test_subject(nil, true) - assert_equal 'true', email.subject - - email = rails3? ? VanityMailer.ab_test_subject(nil, false) : VanityMailer.deliver_ab_test_subject(nil, false) - assert_equal 'false', email.subject - end - - def test_tracking_image_is_rendered - email = rails3? ? VanityMailer.ab_test_content(nil) : VanityMailer.deliver_ab_test_content(nil) - assert email.body =~ /'quux', :values=>[2] +describe Object do + describe "#track!" do + it "identity option sets identity" do + metric "Coolness" + new_ab_test :foobar do + alternatives "foo", "bar" + metrics :coolness + end + track! :coolness, :identity=>'quux', :values=>[2] - assert_equal 2, experiment(:foobar).alternatives.sum(&:conversions) + # experiment(:foobar).alternatives.sum(&:conversions).must_equal 2 + assert_equal 2, experiment(:foobar).alternatives.sum(&:conversions) + end end end \ No newline at end of file diff --git a/test/metric/active_record_test.rb b/test/metric/active_record_test.rb index 2ada6ba7..813c9342 100644 --- a/test/metric/active_record_test.rb +++ b/test/metric/active_record_test.rb @@ -1,4 +1,4 @@ -require "test/test_helper" +require "test_helper" class Sky < ActiveRecord::Base if connected? @@ -18,9 +18,20 @@ class Sky < ActiveRecord::Base if ActiveRecord::Base.connected? -context "ActiveRecord Metric" do +describe "ActiveRecord Metric" do - test "record count" do + after do + Sky.delete_all + if rails3? + Sky.reset_callbacks(:create) + Sky.reset_callbacks(:save) + else + Sky.after_create.clear + Sky.after_save.clear + end + end + + it "record count" do File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f| f.write <<-RUBY metric "Sky is limit" do @@ -34,7 +45,7 @@ class Sky < ActiveRecord::Base assert_equal 1, Vanity::Metric.data(metric(:sky_is_limit)).last.last end - test "record sum" do + it "record sum" do File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f| f.write <<-RUBY metric "Sky is limit" do @@ -48,7 +59,7 @@ class Sky < ActiveRecord::Base assert_equal 6, Vanity::Metric.data(metric(:sky_is_limit)).last.last end - test "record average" do + it "record average" do File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f| f.write <<-RUBY metric "Sky is limit" do @@ -62,7 +73,7 @@ class Sky < ActiveRecord::Base assert_equal 5, Vanity::Metric.data(metric(:sky_is_limit)).last.last end - test "record minimum" do + it "record minimum" do File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f| f.write <<-RUBY metric "Sky is limit" do @@ -76,7 +87,7 @@ class Sky < ActiveRecord::Base assert_equal 2, Vanity::Metric.data(metric(:sky_is_limit)).last.last end - test "record maximum" do + it "record maximum" do File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f| f.write <<-RUBY metric "Sky is limit" do @@ -90,7 +101,7 @@ class Sky < ActiveRecord::Base assert_equal 4, Vanity::Metric.data(metric(:sky_is_limit)).last.last end - test "with conditions" do + it "with conditions" do File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f| f.write <<-RUBY metric "Sky is limit" do @@ -111,7 +122,7 @@ class Sky < ActiveRecord::Base assert_equal 11, high_skies end - test "with scope" do + it "with scope" do File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f| f.write <<-RUBY metric "Sky is limit" do @@ -130,7 +141,7 @@ class Sky < ActiveRecord::Base assert_equal 1, total end - test "with timestamp" do + it "with timestamp" do File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f| f.write <<-RUBY metric "Sky is limit" do @@ -144,7 +155,7 @@ class Sky < ActiveRecord::Base assert_equal 1, Vanity::Metric.data(metric(:sky_is_limit)).last.last end - test "with timestamp and table" do + it "with timestamp and table" do File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f| f.write <<-RUBY metric "Sky is limit" do @@ -158,7 +169,7 @@ class Sky < ActiveRecord::Base assert_equal 1, Vanity::Metric.data(metric(:sky_is_limit)).last.last end - test "hooks" do + it "hooks" do File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f| f.write <<-RUBY metric "Sky is limit" do @@ -177,7 +188,7 @@ class Sky < ActiveRecord::Base assert_equal 4, total end - test "no hooks when metrics disabled" do + it "no hooks when metrics disabled" do not_collecting! File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f| f.write <<-RUBY @@ -195,7 +206,7 @@ class Sky < ActiveRecord::Base assert_equal 0, total end - test "after_create not after_save" do + it "after_create not after_save" do File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f| f.write <<-RUBY metric "Sky is limit" do @@ -213,7 +224,7 @@ class Sky < ActiveRecord::Base Sky.last.update_attributes :height=>4 end - test "with after_save" do + it "with after_save" do if rails3? File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f| f.write <<-RUBY @@ -245,7 +256,7 @@ class Sky < ActiveRecord::Base assert_equal 2, times end - test "do it youself" do + it "do it youself" do if rails3? File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f| f.write <<-RUBY @@ -272,7 +283,7 @@ class Sky < ActiveRecord::Base assert_equal 3, Vanity::Metric.data(metric(:sky_is_limit)).last.last end - test "last update for new metric" do + it "last update for new metric" do File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f| f.write <<-RUBY metric "Sky is limit" do @@ -283,7 +294,7 @@ class Sky < ActiveRecord::Base assert_nil metric(:sky_is_limit).last_update_at end - test "last update with records" do + it "last update with records" do File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f| f.write <<-RUBY metric "Sky is limit" do @@ -297,17 +308,6 @@ class Sky < ActiveRecord::Base end assert_in_delta metric(:sky_is_limit).last_update_at.to_i, (Time.now + 1.day).to_i, 1 end - - teardown do - Sky.delete_all - if rails3? - Sky.reset_callbacks(:create) - Sky.reset_callbacks(:save) - else - Sky.after_create.clear - Sky.after_save.clear - end - end end end \ No newline at end of file diff --git a/test/metric/base_test.rb b/test/metric/base_test.rb index b4fcc366..8cd17560 100644 --- a/test/metric/base_test.rb +++ b/test/metric/base_test.rb @@ -1,15 +1,14 @@ -require "test/test_helper" +require "test_helper" +describe "Metric via playground" do -context "Metric via playground" do - - test "knows all loaded metrics" do + it "knows all loaded metrics" do metric "Yawns/sec", "Cheers/sec" assert Vanity.playground.metrics.keys.include?(:yawns_sec) assert Vanity.playground.metrics.keys.include?(:cheers_sec) end - test "loads metric definitions" do + it "loads metric definitions" do File.open "tmp/experiments/metrics/yawns_sec.rb", "w" do |f| f.write <<-RUBY metric "Yawns/sec" do @@ -22,7 +21,7 @@ def xmts assert_equal "x", Vanity.playground.metric(:yawns_sec).xmts end - test "bubbles up loaded metrics" do + it "bubbles up loaded metrics" do File.open "tmp/experiments/metrics/yawns_sec.rb", "w" do |f| f.write "fail 'yawn!'" end @@ -31,7 +30,7 @@ def xmts end end - test "map identifier from file name" do + it "map identifier from file name" do File.open "tmp/experiments/metrics/yawns_sec.rb", "w" do |f| f.write <<-RUBY metric "yawns/hour" do @@ -41,13 +40,13 @@ def xmts assert Vanity.playground.metric(:yawns_sec) end - test "fails tracking unknown metric" do + it "fails tracking unknown metric" do assert_raises NameError do Vanity.playground.track! :yawns_sec end end - test "reloading metrics" do + it "reloading metrics" do metric "Yawns/sec", "Cheers/sec" Vanity.playground.metric(:yawns_sec) Vanity.playground.metric(:cheers_sec) @@ -55,10 +54,10 @@ def xmts metrics = Vanity.playground.metrics.values Vanity.playground.reload! assert_equal 0, Vanity.playground.metrics.size - assert_not_equal metrics, Vanity.playground.metrics.values + refute_equal metrics, Vanity.playground.metrics.values end - test "ignores undefined metrics in database" do + it "ignores undefined metrics in database" do metric "Yawns/sec" Vanity.playground.reload! assert Vanity.playground.metrics.empty? @@ -67,15 +66,15 @@ def xmts end -context "Metric tracking" do - test "disabled when metrics are disabled" do +describe "Metric tracking" do + it "disabled when metrics are disabled" do not_collecting! metric "Yawns/sec", "Cheers/sec" Vanity.playground.track! :yawns_sec Vanity.playground.track! :cheers_sec end - test "can count" do + it "can count" do metric "Yawns/sec", "Cheers/sec" 4.times { Vanity.playground.track! :yawns_sec } 2.times { Vanity.playground.track! :cheers_sec } @@ -84,7 +83,7 @@ def xmts assert yawns == 2 * cheers end - test "can tell the time" do + it "can tell the time" do metric "Yawns/sec" Timecop.freeze((today - 4).to_time) { 4.times { Vanity.playground.track! :yawns_sec } } Timecop.freeze((today - 2).to_time) { 2.times { Vanity.playground.track! :yawns_sec } } @@ -93,7 +92,7 @@ def xmts assert_equal [0,4,0,2,0,1], boredom end - test "with no value" do + it "with no value" do metric "Yawns/sec", "Cheers/sec", "Looks" Vanity.playground.track! :yawns_sec, 0 Vanity.playground.track! :cheers_sec @@ -101,7 +100,7 @@ def xmts assert_equal 1, Vanity.playground.metric(:cheers_sec).values(today, today).sum end - test "with count" do + it "with count" do metric "Yawns/sec" Timecop.freeze((today - 4).to_time) { Vanity.playground.track! :yawns_sec, 4 } Timecop.freeze((today - 2).to_time) { Vanity.playground.track! :yawns_sec, 2 } @@ -110,7 +109,7 @@ def xmts assert_equal [0,4,0,2,0,1], boredom end - test "runs hook" do + it "runs hook" do metric "Many Happy Returns" total = 0 Vanity.playground.metric(:many_happy_returns).hook do |metric_id, timestamp, count| @@ -122,7 +121,7 @@ def xmts assert_equal 6, total end - test "doesn't runs hook when metrics disabled" do + it "doesn't runs hook when metrics disabled" do not_collecting! metric "Many Happy Returns" total = 0 @@ -133,7 +132,7 @@ def xmts assert_equal 0, total end - test "runs multiple hooks" do + it "runs multiple hooks" do metric "Many Happy Returns" returns = 0 Vanity.playground.metric(:many_happy_returns).hook { returns += 1 } @@ -143,7 +142,7 @@ def xmts assert_equal 3, returns end - test "destroy wipes metrics" do + it "destroy wipes metrics" do metric "Many Happy Returns" Vanity.playground.track! :many_happy_returns, 3 assert_equal [3], Vanity.playground.metric(:many_happy_returns).values(today, today) @@ -153,8 +152,8 @@ def xmts end -context "Metric name" do - test "can be whatever" do +describe "Metric name" do + it "can be whatever" do File.open "tmp/experiments/metrics/yawns_sec.rb", "w" do |f| f.write <<-RUBY metric "Yawns per second" do @@ -166,8 +165,8 @@ def xmts end -context "Metric description" do - test "metric with description" do +describe "Metric description" do + it "metric with description" do File.open "tmp/experiments/metrics/yawns_sec.rb", "w" do |f| f.write <<-RUBY metric "Yawns/sec" do @@ -178,7 +177,7 @@ def xmts assert_equal "Am I that boring?", Vanity::Metric.description(Vanity.playground.metric(:yawns_sec)) end - test "metric without description" do + it "metric without description" do File.open "tmp/experiments/metrics/yawns_sec.rb", "w" do |f| f.write <<-RUBY metric "Yawns/sec" do @@ -188,15 +187,15 @@ def xmts assert_nil Vanity::Metric.description(Vanity.playground.metric(:yawns_sec)) end - test "metric with no method description" do + it "metric with no method description" do metric = Object.new assert_nil Vanity::Metric.description(metric) end end -context "Metric bounds" do - test "metric with bounds" do +describe "Metric bounds" do + it "metric with bounds" do File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f| f.write <<-RUBY metric "Sky is limit" do @@ -209,26 +208,26 @@ def bounds assert_equal [6,12], Vanity::Metric.bounds(Vanity.playground.metric(:sky_is_limit)) end - test "metric without bounds" do + it "metric without bounds" do metric "Sky is limit" assert_equal [nil, nil], Vanity::Metric.bounds(Vanity.playground.metric(:sky_is_limit)) end - test "metric with no method bounds" do + it "metric with no method bounds" do metric = Object.new assert_equal [nil, nil], Vanity::Metric.bounds(metric) end end -context "Metric last_update_at" do - test "for new metric" do +describe "Metric last_update_at" do + it "for new metric" do metric "Coolness" metric = Vanity.playground.metric(:coolness) assert_nil metric.last_update_at end - test "with data point" do + it "with data point" do metric "Coolness" metric = Vanity.playground.metric(:coolness) metric.track! @@ -240,8 +239,8 @@ def bounds end -context "Metric data" do - test "explicit dates" do +describe "Metric data" do + it "explicit dates" do metric "Yawns/sec" Timecop.freeze((today - 4).to_time) { Vanity.playground.track! :yawns_sec, 4 } Timecop.freeze((today - 2).to_time) { Vanity.playground.track! :yawns_sec, 2 } @@ -250,7 +249,7 @@ def bounds assert_equal [[today - 5, 0], [today - 4, 4], [today - 3, 0], [today - 2, 2], [today - 1, 0], [today, 1]], boredom end - test "start date only" do + it "start date only" do metric "Yawns/sec" Timecop.freeze((today - 4).to_time) { Vanity.playground.track! :yawns_sec, 4 } Timecop.freeze((today - 2).to_time) { Vanity.playground.track! :yawns_sec, 2 } @@ -259,7 +258,7 @@ def bounds assert_equal [[today - 4, 4], [today - 3, 0], [today - 2, 2], [today - 1, 0], [today, 1]], boredom end - test "start date and duration" do + it "start date and duration" do metric "Yawns/sec" Timecop.freeze((today - 4).to_time) { Vanity.playground.track! :yawns_sec, 4 } Timecop.freeze((today - 2).to_time) { Vanity.playground.track! :yawns_sec, 2 } @@ -268,7 +267,7 @@ def bounds assert_equal [[today - 4, 4], [today - 3, 0], [today - 2, 2], [today - 1, 0], [today, 1]], boredom end - test "no data" do + it "no data" do metric "Yawns/sec" boredom = Vanity::Metric.data(Vanity.playground.metric(:yawns_sec)) assert_equal 90, boredom.size @@ -276,7 +275,7 @@ def bounds assert_equal [today, 0], boredom.last end - test "using custom values method" do + it "using custom values method" do File.open "tmp/experiments/metrics/hours_in_day.rb", "w" do |f| f.write <<-RUBY metric "Hours in day" do @@ -289,5 +288,4 @@ def values(from, to) data = Vanity::Metric.data(Vanity.playground.metric(:hours_in_day)) assert_equal [24] * 90, data.map(&:last) end - end diff --git a/test/metric/google_analytics_test.rb b/test/metric/google_analytics_test.rb index 3ebafda5..9ab52d15 100644 --- a/test/metric/google_analytics_test.rb +++ b/test/metric/google_analytics_test.rb @@ -1,9 +1,7 @@ -require "test/test_helper" +require "test_helper" - -context "Google Analytics" do - - setup do +describe "Google Analytics" do + before do File.open "tmp/experiments/metrics/ga.rb", "w" do |f| f.write <<-RUBY metric "GA" do @@ -16,7 +14,7 @@ GA_RESULT = Struct.new(:date, :pageviews, :visits) GA_PROFILE = Struct.new(:web_property_id) - test "fail if Garb not available" do + it "fail if Garb not available" do File.open "tmp/experiments/metrics/ga.rb", "w" do |f| f.write <<-RUBY metric "GA" do @@ -25,28 +23,28 @@ end RUBY end - assert_raise LoadError do + assert_raises LoadError do Vanity.playground.metrics end end - test "constructs a report" do + it "constructs a report" do Vanity.playground.metrics assert metric(:ga).report end - test "default to pageviews metric" do + it "default to pageviews metric" do Vanity.playground.metrics assert_equal [:pageviews], metric(:ga).report.metrics.elements end - test "apply data dimension and sort" do + it "apply data dimension and sort" do Vanity.playground.metrics assert_equal [:date], metric(:ga).report.dimensions.elements assert_equal [:date], metric(:ga).report.sort.elements end - test "accept other metrics" do + it "accept other metrics" do File.open "tmp/experiments/metrics/ga.rb", "w" do |f| f.write <<-RUBY metric "GA" do @@ -58,14 +56,14 @@ assert_equal [:visitors], metric(:ga).report.metrics.elements end - test "does not support hooks" do + it "does not support hooks" do Vanity.playground.metrics assert_raises RuntimeError do metric(:ga).hook end end - test "should find matching profile" do + it "should find matching profile" do Vanity.playground.metrics Garb::Profile.expects(:all).returns(Array.new(3) { |i| GA_PROFILE.new("UA#{i + 1}") }) metric(:ga).report.stubs(:send_request_for_body).returns(nil) @@ -74,7 +72,7 @@ assert_equal "UA2", metric(:ga).report.profile.web_property_id end - test "should map results from report" do + it "should map results from report" do Vanity.playground.metrics today = Date.today response = mock(:results=>Array.new(3) { |i| GA_RESULT.new("2010021#{i}", i + 1) }) @@ -84,7 +82,7 @@ assert_equal [1,2,3], metric(:ga).values(Date.parse("2010-02-10"), Date.parse("2010-02-12")) end - test "mapping GA metrics to single value" do + it "mapping GA metrics to single value" do File.open "tmp/experiments/metrics/ga.rb", "w" do |f| f.write <<-RUBY metric "GA" do @@ -100,5 +98,4 @@ metric(:ga).report.stubs(:send_request_for_body).returns(nil) assert_equal [1,4,9], metric(:ga).values(Date.parse("2010-02-10"), Date.parse("2010-02-12")) end - end diff --git a/test/metric/remote_test.rb b/test/metric/remote_test.rb index 61b39a9b..0e4a812f 100644 --- a/test/metric/remote_test.rb +++ b/test/metric/remote_test.rb @@ -1,8 +1,7 @@ -require "test/test_helper" +require "test_helper" - -context "Remote metrics" do - setup do +describe "Remote metrics" do + before do FileUtils.mkpath "tmp/config" File.open "tmp/config/vanity.yml", "w" do |f| f.write <<-RUBY @@ -16,11 +15,11 @@ end end - test "load from configuration file" do + it "loads from configuration file" do assert Vanity.playground.metrics[:sandbox] end - test "create remote metric from configuration file" do + it "creates remote metric from configuration file" do stub_request :post, /vanitydash/ metric(:sandbox).track! assert_requested :post, /api\.vanitydash\.com/ @@ -28,46 +27,46 @@ end -context "Remote send" do - setup do +describe "Remote send" do + before do @metric = Vanity::Metric.new(Vanity.playground, :sandbox) @metric.remote "http://api.vanitydash.com/metrics/sandbox" Vanity.playground.metrics[:sandbox] = @metric stub_request :post, /vanitydash/ end - test "remote send in sequence" do + it "remote send in sequence" do Vanity.playground.track! :sandbox Vanity.playground.track! :sandbox assert_requested(:post, "http://api.vanitydash.com/metrics/sandbox", :times=>2) end - test "remote sends url-encoded data" do + it "remote sends url-encoded data" do Vanity.playground.track! :sandbox, 12 assert_requested(:post, /api/) { |request| request.headers["Content-Type"] == "application/x-www-form-urlencoded" } end - test "remote sends metric identifier" do + it "remote sends metric identifier" do Vanity.playground.track! :sandbox, 12 assert_requested(:post, /api/) { |request| Rack::Utils.parse_query(request.body)["metric"] == "sandbox" } end - test "remote sends RFC 2616 compliant time stamp" do + it "remote sends RFC 2616 compliant time stamp" do Vanity.playground.track! :sandbox, 12 assert_requested(:post, /api/) { |request| Time.httpdate(Rack::Utils.parse_query(request.body)["timestamp"]) } end - test "remote sends array of values" do + it "remote sends array of values" do Vanity.playground.track! :sandbox, [1,2,3] assert_requested(:post, /api/) { |request| Rack::Utils.parse_query(request.body)["values[]"] == %w{1 2 3} } end - test "remote sends default of 1" do + it "remote sends default of 1" do Vanity.playground.track! :sandbox assert_requested(:post, /api/) { |request| Rack::Utils.parse_query(request.body)["values[]"] == "1" } end - test "remote sends current identity" do + it "remote sends current identity" do Vanity.context = Object.new class << Vanity.context def vanity_identity @@ -78,13 +77,13 @@ def vanity_identity assert_requested(:post, /api/) { |request| Rack::Utils.parse_query(request.body)["identity"] == "xkcd" } end - test "remote sends with additional query parameters" do + it "remote sends with additional query parameters" do @metric.remote "http://api.vanitydash.com/metrics/sandbox?ask=receive" Vanity.playground.track! :sandbox, 12 assert_requested(:post, /api/) { |request| Rack::Utils.parse_query(request.body)["ask"] == "receive" } end - test "remote send handles standard error" do + it "remote send handles standard error" do stub_request(:post, /api/).to_raise(StandardError) Vanity.playground.track! :sandbox stub_request(:post, /api/) @@ -92,7 +91,7 @@ def vanity_identity assert_requested(:post, /api/, :times=>2) end - test "remote send handles timeout error" do + it "remote send handles timeout error" do stub_request(:post, /api/).to_timeout Vanity.playground.track! :sandbox stub_request(:post, /api/) @@ -100,7 +99,7 @@ def vanity_identity assert_requested(:post, /api/, :times=>2) end - test "remote does not send when metrics disabled" do + it "remote does not send when metrics disabled" do not_collecting! Vanity.playground.track! :sandbox Vanity.playground.track! :sandbox diff --git a/test/passenger_test.rb b/test/passenger_test.rb index 790e4a97..75353020 100644 --- a/test/passenger_test.rb +++ b/test/passenger_test.rb @@ -1,4 +1,4 @@ -require "test/test_helper" +require "test_helper" # Not supported for rails3 if !defined?(Rails::Railtie) && ActiveRecord::Base.connected? diff --git a/test/playground_test.rb b/test/playground_test.rb index 155a7f51..6d7a4482 100644 --- a/test/playground_test.rb +++ b/test/playground_test.rb @@ -1,4 +1,4 @@ -require "test/test_helper" +require "test_helper" class PlaygroundTest < Test::Unit::TestCase diff --git a/test/test_helper.rb b/test/test_helper.rb index 982f03a6..fe577f83 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,12 +1,11 @@ -GC.disable $LOAD_PATH.delete_if { |path| path[/gems\/vanity-\d/] } $LOAD_PATH.unshift File.expand_path("../lib", File.dirname(__FILE__)) ENV["RACK_ENV"] = "test" ENV["DB"] ||= "redis" -require "test/unit" +require "minitest/unit" +require "minitest/spec" require "tmpdir" -require "mocha" require "action_controller" require "action_controller/test_case" require "action_view/test_case" @@ -32,12 +31,18 @@ require "phusion_passenger/events" end -require "lib/vanity" +require "vanity" require "timecop" + +if defined?(Mocha::VERSION) && Mocha::VERSION < "0.13.0" + require "mocha" +else + require "mocha/mini_test" +end require "webmock/test_unit" -#Do to load order differences in Rails boot and test requires we have to manually -#require these +# Due to load order differences in Rails boot and test requires we have to manually +# require these require 'vanity/frameworks/rails' Vanity::Rails.load! @@ -139,11 +144,20 @@ class Test::Unit::TestCase include VanityTestHelpers end -if defined?(ActiveSupport::TestCase) - class ActiveSupport::TestCase +class MiniTest::Spec + include WebMock::API + include VanityTestHelpers +end + +if defined?(MiniTest::Unit::TestCase) + class MiniTest::Unit::TestCase include WebMock::API include VanityTestHelpers + end +end +if defined?(ActiveSupport::TestCase) + class ActiveSupport::TestCase self.use_instantiated_fixtures = false if respond_to?(:use_instantiated_fixtures) self.use_transactional_fixtures = false if respond_to?(:use_transactional_fixtures) end @@ -175,20 +189,3 @@ def setup_controller_request_and_response VanityMigration.up ActiveRecord::Base.connection_pool.disconnect! end - -# test/spec/mini v3 -# Source: http://gist.github.com/25455 -def context(*args, &block) - return super unless (name = args.first) && block - parent = Class === self ? self : (defined?(ActiveSupport::TestCase) ? ActiveSupport::TestCase : Test::Unit::TestCase) - klass = Class.new(parent) do - def self.test(name, &block) - define_method("test_#{name.gsub(/\W/,'_')}", &block) if block - end - def self.xtest(*args) end - def self.setup(&block) define_method(:setup) { super() ; instance_eval &block } end - def self.teardown(&block) define_method(:teardown) { super() ; instance_eval &block } end - end - parent.const_set name.split(/\W+/).map(&:capitalize).join, klass - klass.class_eval &block -end diff --git a/test/rails_dashboard_test.rb b/test/web/rails/dashboard_test.rb similarity index 98% rename from test/rails_dashboard_test.rb rename to test/web/rails/dashboard_test.rb index b4f5de25..4811e702 100644 --- a/test/rails_dashboard_test.rb +++ b/test/web/rails/dashboard_test.rb @@ -1,4 +1,4 @@ -require "test/test_helper" +require "test_helper" class VanityController < ActionController::Base include Vanity::Rails::Dashboard @@ -8,6 +8,7 @@ class RailsDashboardTest < ActionController::TestCase tests VanityController def setup + super Vanity.playground.collecting = true metric :sugar_high new_ab_test :food do diff --git a/vanity.gemspec b/vanity.gemspec index 1ec93f75..e574c130 100644 --- a/vanity.gemspec +++ b/vanity.gemspec @@ -23,5 +23,6 @@ Gem::Specification.new do |spec| spec.required_ruby_version = ">= 1.8.7" - spec.add_development_dependency "bundler", ">= 1.0.0" + spec.add_development_dependency "bundler", ">= 1.0.0" + spec.add_development_dependency "minitest", ">= 4.2" end