Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@neudabei
Created September 6, 2016 10:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save neudabei/1d1333fdea8a26a00539d92ea8e11ad5 to your computer and use it in GitHub Desktop.
Save neudabei/1d1333fdea8a26a00539d92ea8e11ad5 to your computer and use it in GitHub Desktop.
vanity/test/frameworks/rails/action_controller_test.rb
require "test_helper"
class UseVanityControllerTest < ActionController::TestCase
tests UseVanityController
def setup
super
metric :sugar_high
new_ab_test :pie_or_cake do
metrics :sugar_high
alternatives :pie, :cake
default :pie
end
# Class eval this instead of including in the controller to delay
# execution until the request exists in the context of the test
UseVanityController.class_eval do
use_vanity :current_user
end
# Rails 3 configuration for cookies
if ::Rails.respond_to?(:application)
::Rails.application.config.session_options[:domain] = '.foo.bar'
end
end
def teardown
super
end
def test_render_js_for_tests
Vanity.playground.use_js!
get :js
assert_match /script.*v=pie_or_cake=.*script/m, @response.body
end
def test_working_render_js_for_tests
Vanity.playground.use_js!
get :working_js
assert_match /script.*v=pie_or_cake=.*script/m, @response.body
end
def test_broken_render_js_for_tests
Vanity.playground.use_js!
get :broken_js
assert_match /script.*v=pie_or_cake=.*script/m, @response.body
end
def test_render_model_js_for_tests
Vanity.playground.use_js!
get :model_js
assert_match /script.*v=pie_or_cake=.*script/m, @response.body
end
def test_chooses_sets_alternatives_for_rails_tests
experiment(:pie_or_cake).chooses(:pie)
get :index
assert_equal 'pie', @response.body
experiment(:pie_or_cake).chooses(:cake)
get :index
assert_equal 'cake', @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
Vanity.playground.use_js!
@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 + 20 * 365 * 24 * 60 * 60, 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
assert_equal "from_last_time", cookies["vanity_id"]
end
def test_vanity_cookie_uses_configuration
Vanity.configuration.cookie_name = "new_id"
get :index
assert cookies["new_id"] =~ /^[a-f0-9]{32}$/
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 = stub("user", :id=>"user_id")
get :index
assert_equal "user_id", @controller.send(:vanity_identity)
end
def test_vanity_identity_with_null_user_falls_back_to_cookie
@controller.current_user = stub("user", :id=>nil)
get :index
assert cookies["vanity_id"] =~ /^[a-f0-9]{32}$/
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_identity_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
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment