Rethink Rails testing for internal events
Problem
Our shared example for internal events can be hard to understand and does not cover all use-cases. Specific problems:
- add redis-based & product analytics assertions to
spec/support/shared_examples/controllers/internal_event_tracking_examples.rb
- ensure support for
internal_event_tracking_examples.rb
from controllers, feature specs, models, services, sidekiq jobs, migrations, grape entities
Desired Outcome
Rails testing for internal events should be:
- straightforward to implement
- communicate clearly what is being tested
- cover all cases where Gitlab is being used
Outputs should include:
- updated documentation & examples in internal events generator
- several migrated tests using the new approach (2-3)
Potential Solution
We'll add custom matchers for events/metrics that allow for composable assertions:
RSpec.describe 'Composable assertions for events & metrics' do
it 'increments internal events metrics for compliance dashboard' do
expect { Gitlab::InternalEvents.track_event('g_compliance_dashboard', user: user, namespace: group) }
.to trigger_internal_event('g_compliance_dashboard').with(user: user, namespace: group).times(1)
.and increment_usage_metric('redis_hll_counters.compliance.g_compliance_dashboard_monthly').by(1)
.and not_trigger_internal_event('web_ide_viewed')
end
it 'increments database-backed issue creation metrics' do
expect { Issues::CreateService.new(container: project, current_user: user) }
.to increment_usage_metric('usage_activity_by_stage.plan.issues')
.and increment_usage_metric('usage_activity_by_stage_monthly.plan.issues')
end
end
How to verify
Further actions needed
Edited by Sarah Yasonik