Skip to content

Stub Snowplow before all specs

Based on the discussion at #345488 (closed), one of the ideas worth pursuing is to enable the :snowplow RSpec metadata globally for all specs. The logic of which it's currently at spec/support/stub_snowplow.rb.

File at eae5f187
# frozen_string_literal: true

module StubSnowplow
  def stub_snowplow
    # Using a high buffer size to not cause early flushes
    buffer_size = 100
    # WebMock is set up to allow requests to `localhost`
    host = 'localhost'

    # rubocop:disable RSpec/AnyInstanceOf
    allow_any_instance_of(Gitlab::Tracking::Destinations::Snowplow)
      .to receive(:emitter)
      .and_return(SnowplowTracker::Emitter.new(host, buffer_size: buffer_size))
    # rubocop:enable RSpec/AnyInstanceOf

    stub_application_setting(snowplow_enabled: true)

    allow(SnowplowTracker::SelfDescribingJson).to receive(:new).and_call_original
    allow(Gitlab::Tracking).to receive(:event).and_call_original # rubocop:disable RSpec/ExpectGitlabTracking
  end
end

The related POC MR laid out the actual challenges we'd like to overcome with this issue (quoting from #345488 (comment 743214475)):

We need to figure out a better way to spy on Gitlab::Tracking.event. As of now, it just expects that the function was called. Not if the function was executed properly. Maybe by throwing instead of an early return from the Destination 👀 (thanks to @pskorupa for the suggestion)

We would need a way to opt-out/disable Snowplow. This can be done with stub_application_setting(snowplow_enabled: false). This method doesn't work at the moment because of the current spy

Testing

All specs related to the module StubSnowplow should be passing and make sure QA pipelines run smoothly.

Edited by Carlo Catimbang