ee/spec/support/matchers/snowplow/tracking_event_verifier.rb (87 lines of code) (raw):

# frozen_string_literal: true module Matchers module Snowplow def self.clean_snowplow_queue return unless Gitlab::Tracking.micro_verification_enabled? # http://localhost:9090/micro/reset Gitlab::HTTP .try_get("#{Gitlab::Tracking::Destinations::SnowplowMicro.new.uri}/micro/reset", allow_local_requests: true) end def have_all_expected_events TrackingEventVerifier.new end class TrackingEventVerifier def matches?(events_key) return true unless Gitlab::Tracking.micro_verification_enabled? load_file_contents(events_key) flush_remaining_events fetch_results process_page_view_events process_structured_events not_found_page_view_events.empty? && not_found_structured_events.empty? end def failure_message suffix_msg = "to be found in tracking results and were not" final_message = '' if not_found_page_view_events.present? final_message = "expected page view events #{not_found_page_view_events.inspect} #{suffix_msg}.\n" end if not_found_structured_events.present? final_message += "expected structured events #{not_found_structured_events.inspect} #{suffix_msg}.\n" end final_message end private attr_reader :page_view_events, :structured_events, :results, :not_found_page_view_events, :not_found_structured_events def load_file_contents(events_key) file_name = "#{events_key}.yml" file_contents = YAML.safe_load( File.read(Rails.root.join('ee/spec/fixtures/snowplow/tracking_verification', file_name)) ) @structured_events = file_contents.fetch('structured_events', []) @page_view_events = file_contents.fetch('page_view_events', []) @not_found_page_view_events = page_view_events.dup @not_found_structured_events = structured_events.dup end def flush_remaining_events # one last non-async flush just in case anything is left in the buffer(though we are set to 1 for buffer_size) ::Gitlab::Tracking.flush end def fetch_results # http://localhost:9090/micro/good # take the above output and verify it vs some predefined json/yml # maybe some validation against all too for brokenness # RestClient.get('http://localhost:9090/micro/good') # parse it against what we expect to see @results = Gitlab::HTTP.try_get( "#{Gitlab::Tracking::Destinations::SnowplowMicro.new.uri}/micro/good", allow_local_requests: true ) end def process_page_view_events page_view_events.each do |page_view_event| verify_page_view_event(page_view_event) end end def verify_page_view_event(page_view_event) results.select { |r, _v| r['eventType'] == 'page_view' }.each do |e| # fuzzy this a bit initially since we have project/group in path /namespace97/project31/-/learn_gitlab if e.dig('event', 'page_urlpath').match?(/#{page_view_event}\z/) @not_found_page_view_events.delete(page_view_event) end end end def process_structured_events structured_events.each do |structured_event| verify_structured_event(structured_event) end end def verify_structured_event(structured_event) results.select { |r, _v| r['eventType'] == 'struct' }.each do |result_event| next unless structured_event_found?(result_event, structured_event) @not_found_structured_events.delete(structured_event) end end def structured_event_found?(result_event, structured_event) found = false %w[category action label property value].each do |field| next unless structured_event[field].present? found = result_event.dig('event', "se_#{field}") == structured_event[field] break unless found end found end end end end