module Gitlab::Experiment::RSpecMatchers

Public Instance Methods

expect_tracking_on(experiment, negated, event, *event_args) click to toggle source
# File lib/gitlab/experiment/rspec.rb, line 175
def expect_tracking_on(experiment, negated, event, *event_args)
  klass = experiment.instance_of?(Class) ? experiment : experiment.class
  unless klass <= Gitlab::Experiment
    raise(
      ArgumentError,
      "track matcher is limited to experiment instances and classes"
    )
  end

  expectations = proc do |e|
    @experiment = e
    allow(e).to receive(:track).and_call_original

    if negated
      expect(e).not_to receive(:track).with(*[event, *event_args])
    else
      if @expected_variant
        expect(@experiment.variant.name).to eq(@expected_variant), failure_message(:variant, event)
      end

      if @expected_context
        expect(@experiment.context.value).to include(@expected_context), failure_message(:context, event)
      end

      expect(e).to receive(:track).with(*[event, *event_args]).and_call_original
    end
  end

  if experiment.instance_of?(Class) || @on_next_instance
    wrapped_experiment(experiment, nil, true) { |e| expectations.call(e) }
  else
    expectations.call(experiment)
  end
end
failure_message(failure_type, event) click to toggle source
# File lib/gitlab/experiment/rspec.rb, line 210
        def failure_message(failure_type, event)
          case failure_type
          when :variant
            <<~MESSAGE.strip
              expected #{@experiment.inspect} to have tracked #{event.inspect} for variant
                  expected variant: #{@expected_variant}
                    actual variant: #{@experiment.variant.name}
            MESSAGE
          when :context
            <<~MESSAGE.strip
              expected #{@experiment.inspect} to have tracked #{event.inspect} with context
                  expected context: #{@expected_context}
                    actual context: #{@experiment.context.value}
            MESSAGE
          end
        end
message_details() click to toggle source
# File lib/gitlab/experiment/rspec.rb, line 148
def message_details
  message = ''
  message += %( into variant\n    expected variant: #{@expected}) if @expected
  message += %(\n      actual variant: #{@actual}) if @actual
  message
end
require_experiment(experiment, matcher_name, classes: false) click to toggle source
# File lib/gitlab/experiment/rspec.rb, line 84
def require_experiment(experiment, matcher_name, classes: false)
  klass = experiment.instance_of?(Class) ? experiment : experiment.class
  unless klass <= Gitlab::Experiment
    raise(
      ArgumentError,
      "#{matcher_name} matcher is limited to experiment instances#{classes ? ' and classes' : ''}"
    )
  end

  if experiment == klass && !classes
    raise ArgumentError, "#{matcher_name} matcher requires an instance of an experiment"
  end

  experiment != klass
end