# frozen_string_literal: true require 'spec_helper' RSpec.describe Gitlab::Tracking::EventDefinition do let(:attributes) do { description: 'Created issues', category: 'issues', action: 'create', label_description: 'API', property_description: 'The string "issue_id"', value_description: 'ID of the issue', extra_properties: { confidential: false }, product_stage: 'growth', product_section: 'dev', product_group: 'group::product analytics', distribution: %w(ee ce), tier: %w(free premium ultimate) } end let(:path) { File.join('events', 'issues_create.yml') } let(:definition) { described_class.new(path, attributes) } let(:yaml_content) { attributes.deep_stringify_keys.to_yaml } def write_metric(metric, path, content) path = File.join(metric, path) dir = File.dirname(path) FileUtils.mkdir_p(dir) File.write(path, content) end it 'has all definitions valid' do expect { described_class.definitions }.not_to raise_error end describe '#validate' do using RSpec::Parameterized::TableSyntax where(:attribute, :value) do :description | 1 :category | nil :action | nil :label_description | 1 :property_description | 1 :value_description | 1 :extra_properties | 'smth' :product_stage | 1 :product_section | nil :product_group | nil :distributions | %[be eb] :tiers | %[pro] end with_them do before do attributes[attribute] = value end it 'raise exception' do expect(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception).at_least(:once).with(instance_of(Gitlab::Tracking::InvalidEventError)) described_class.new(path, attributes).validate! end end end describe '.definitions' do let(:metric1) { Dir.mktmpdir('metric1') } let(:metric2) { Dir.mktmpdir('metric2') } before do allow(described_class).to receive(:paths).and_return( [ File.join(metric1, '**', '*.yml'), File.join(metric2, '**', '*.yml') ] ) end subject { described_class.definitions } after do FileUtils.rm_rf(metric1) FileUtils.rm_rf(metric2) end it 'has empty list when there are no definition files' do is_expected.to be_empty end it 'has one metric when there is one file' do write_metric(metric1, path, yaml_content) is_expected.to be_one end end end