Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models/analytics/cycle_analytics/stage_spec.rb')
-rw-r--r--spec/models/analytics/cycle_analytics/stage_spec.rb135
1 files changed, 135 insertions, 0 deletions
diff --git a/spec/models/analytics/cycle_analytics/stage_spec.rb b/spec/models/analytics/cycle_analytics/stage_spec.rb
new file mode 100644
index 00000000000..57748f8942e
--- /dev/null
+++ b/spec/models/analytics/cycle_analytics/stage_spec.rb
@@ -0,0 +1,135 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Analytics::CycleAnalytics::Stage, feature_category: :value_stream_management do
+ describe 'uniqueness validation on name' do
+ subject { build(:cycle_analytics_stage) }
+
+ it { is_expected.to validate_uniqueness_of(:name).scoped_to([:group_id, :group_value_stream_id]) }
+ end
+
+ describe 'associations' do
+ it { is_expected.to belong_to(:namespace).required }
+ it { is_expected.to belong_to(:value_stream) }
+ end
+
+ it_behaves_like 'value stream analytics namespace models' do
+ let(:factory_name) { :cycle_analytics_stage }
+ end
+
+ it_behaves_like 'value stream analytics stage' do
+ let(:factory) { :cycle_analytics_stage }
+ let(:parent) { create(:group) }
+ let(:parent_name) { :namespace }
+ end
+
+ describe '.distinct_stages_within_hierarchy' do
+ let_it_be(:group) { create(:group) }
+ let_it_be(:sub_group) { create(:group, parent: group) }
+ let_it_be(:project) { create(:project, group: sub_group).reload }
+
+ before do
+ # event identifiers are the same
+ create(:cycle_analytics_stage, name: 'Stage A1', namespace: group,
+ start_event_identifier: :merge_request_created, end_event_identifier: :merge_request_merged)
+ create(:cycle_analytics_stage, name: 'Stage A2', namespace: sub_group,
+ start_event_identifier: :merge_request_created, end_event_identifier: :merge_request_merged)
+ create(:cycle_analytics_stage, name: 'Stage A3', namespace: sub_group,
+ start_event_identifier: :merge_request_created, end_event_identifier: :merge_request_merged)
+ create(:cycle_analytics_stage, name: 'Stage A4', project: project,
+ start_event_identifier: :merge_request_created, end_event_identifier: :merge_request_merged)
+
+ create(:cycle_analytics_stage,
+ name: 'Stage B1',
+ namespace: group,
+ start_event_identifier: :merge_request_last_build_started,
+ end_event_identifier: :merge_request_last_build_finished)
+
+ create(:cycle_analytics_stage, name: 'Stage C1', project: project,
+ start_event_identifier: :issue_created, end_event_identifier: :issue_deployed_to_production)
+ create(:cycle_analytics_stage, name: 'Stage C2', project: project,
+ start_event_identifier: :issue_created, end_event_identifier: :issue_deployed_to_production)
+ end
+
+ it 'returns distinct stages by the event identifiers' do
+ stages = described_class.distinct_stages_within_hierarchy(group).to_a
+
+ expected_event_pairs = [
+ %w[merge_request_created merge_request_merged],
+ %w[merge_request_last_build_started merge_request_last_build_finished],
+ %w[issue_created issue_deployed_to_production]
+ ].sort
+
+ current_event_pairs = stages.map do |stage|
+ [stage.start_event_identifier, stage.end_event_identifier]
+ end.sort
+
+ expect(current_event_pairs).to eq(expected_event_pairs)
+ end
+ end
+
+ describe 'events tracking' do
+ let(:category) { described_class.to_s }
+ let(:label) { described_class.table_name }
+ let(:namespace) { create(:group) }
+ let(:action) { "database_event_#{property}" }
+ let(:value_stream) { create(:cycle_analytics_value_stream) }
+ let(:feature_flag_name) { :product_intelligence_database_event_tracking }
+ let(:stage) { described_class.create!(stage_params) }
+ let(:stage_params) do
+ {
+ namespace: namespace,
+ name: 'st1',
+ start_event_identifier: :merge_request_created,
+ end_event_identifier: :merge_request_merged,
+ group_value_stream_id: value_stream.id
+ }
+ end
+
+ let(:record_tracked_attributes) do
+ {
+ "id" => stage.id,
+ "created_at" => stage.created_at,
+ "updated_at" => stage.updated_at,
+ "relative_position" => stage.relative_position,
+ "start_event_identifier" => stage.start_event_identifier,
+ "end_event_identifier" => stage.end_event_identifier,
+ "group_id" => stage.group_id,
+ "start_event_label_id" => stage.start_event_label_id,
+ "end_event_label_id" => stage.end_event_label_id,
+ "hidden" => stage.hidden,
+ "custom" => stage.custom,
+ "name" => stage.name,
+ "group_value_stream_id" => stage.group_value_stream_id
+ }
+ end
+
+ describe '#create' do
+ it_behaves_like 'Snowplow event tracking' do
+ let(:property) { 'create' }
+ let(:extra) { record_tracked_attributes }
+
+ subject(:new_group_stage) { stage }
+ end
+ end
+
+ describe '#update', :freeze_time do
+ it_behaves_like 'Snowplow event tracking' do
+ subject(:create_group_stage) { stage.update!(name: 'st 2') }
+
+ let(:extra) { record_tracked_attributes.merge('name' => 'st 2') }
+ let(:property) { 'update' }
+ end
+ end
+
+ describe '#destroy' do
+ it_behaves_like 'Snowplow event tracking' do
+ subject(:delete_stage_group) { stage.destroy! }
+
+ let(:extra) { record_tracked_attributes }
+ let(:property) { 'destroy' }
+ end
+ end
+ end
+end