ankit8898/optimizely_config_provider

View on GitHub
lib/optimizely_server_side/helpers/support.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

module OptimizelyServerSide

  module Support

    # Enables for us to wrap experiments
    # Usage:
    # experiment('sign_up_test') do |config|
    #
    #   config.variation_one('variation_one_key') do
    #     # Code related to variation one
    #   end
    #
    #   config.variation_two('variation_two_key') do
    #     # Code related to variation two
    #   end
    #
    #   config.variation_default('variation_default_key', primary: true) do
    #     # We still want to keep our default experience
    #   end
    #
    # end
    def experiment(experiment_key, options = {}, &blk)
      # Merge any other options to user attributes
      OptimizelyServerSide.configuration.user_attributes.merge!(options.stringify_keys)
      variation_key = optimizely_sdk_project_instance(experiment_key, "experiment")
      OptimizelyServerSide::Experiment.new(experiment_key, variation_key).start(&blk)
    end
    alias_method :feature_flip, :experiment

    def optimizely_sdk_project_instance(experiment_key, type)
      case type
      when "experiment"
        get_optimizely_instance.activate(experiment_key, visitor_id, user_attributes)
      when "feature"
        get_optimizely_instance.is_feature_enabled(experiment_key, visitor_id, user_attributes)
      end  
    end

    def feature_test(experiment_key, options = {})
      OptimizelyServerSide.configuration.user_attributes.merge!(options.stringify_keys)
      optimizely_sdk_project_instance(experiment_key, "feature")
    end
    
    [:string, :boolean, :integer, :double].each do |type|
      define_method :"get_feature_variable_#{type}" do |experiment, variable_name |
        method = get_optimizely_instance.method("get_feature_variable_#{type}")
        method.call(experiment, variable_name, visitor_id, user_attributes)
      end
    end

    def visitor_id
      OptimizelyServerSide.configuration.user_attributes['visitor_id']
    end

    def user_attributes
      OptimizelyServerSide.configuration.user_attributes.reject { |k,v| k == 'visitor_id'}
    end

    def get_optimizely_instance
      OptimizelyServerSide::OptimizelySdk
      .project_instance(event_dispatcher: OptimizelyServerSide.configuration.event_dispatcher)
    end

  end
end