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/scripts/pipeline/average_reports_spec.rb')
-rw-r--r--spec/scripts/pipeline/average_reports_spec.rb140
1 files changed, 140 insertions, 0 deletions
diff --git a/spec/scripts/pipeline/average_reports_spec.rb b/spec/scripts/pipeline/average_reports_spec.rb
new file mode 100644
index 00000000000..2eee8d34fd5
--- /dev/null
+++ b/spec/scripts/pipeline/average_reports_spec.rb
@@ -0,0 +1,140 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+require 'tempfile'
+require 'json'
+require_relative '../../../scripts/pipeline/average_reports'
+
+RSpec.describe AverageReports, feature_category: :tooling do
+ let(:initial_report) do
+ {
+ 'spec/frontend/fixtures/analytics.rb' => 1,
+ 'spec/frontend/fixtures/runner_instructions.rb' => 0.8074841039997409,
+ 'ee/spec/frontend/fixtures/analytics/value_streams_test_stage.rb' => 50.35115972699987,
+ 'ee/spec/frontend/fixtures/merge_requests.rb' => 19.16644390500005,
+ 'old' => 123
+ }
+ end
+
+ let(:new_report) do
+ {
+ 'spec/frontend/fixtures/analytics.rb' => 2,
+ 'spec/frontend/fixtures/runner_instructions.rb' => 0,
+ 'ee/spec/frontend/fixtures/analytics/value_streams_test_stage.rb' => 0,
+ 'ee/spec/frontend/fixtures/merge_requests.rb' => 0,
+ 'new' => 234
+ }
+ end
+
+ let(:new_report_2) do
+ {
+ 'spec/frontend/fixtures/analytics.rb' => 3,
+ 'new' => 468
+ }
+ end
+
+ let(:initial_report_file) do
+ Tempfile.new('temp_initial_report.json').tap do |f|
+ # rubocop:disable Gitlab/Json
+ f.write(JSON.dump(initial_report))
+ # rubocop:enable Gitlab/Json
+ f.close
+ end
+ end
+
+ let(:new_report_file_1) do |_f|
+ Tempfile.new('temp_new_report1.json').tap do |f|
+ # rubocop:disable Gitlab/Json
+ f.write(JSON.dump(new_report))
+ # rubocop:enable Gitlab/Json
+ f.close
+ end
+ end
+
+ let(:new_report_file_2) do |_f|
+ Tempfile.new('temp_new_report2.json').tap do |f|
+ # rubocop:disable Gitlab/Json
+ f.write(JSON.dump(new_report_2))
+ # rubocop:enable Gitlab/Json
+ f.close
+ end
+ end
+
+ before do
+ allow(subject).to receive(:puts)
+ end
+
+ after do
+ initial_report_file.unlink
+ new_report_file_1.unlink
+ new_report_file_2.unlink
+ end
+
+ describe 'execute' do
+ context 'with 1 new report' do
+ subject do
+ described_class.new(
+ initial_report_file: initial_report_file.path,
+ new_report_files: [new_report_file_1.path]
+ )
+ end
+
+ it 'returns average durations' do
+ results = subject.execute
+
+ expect(results['spec/frontend/fixtures/analytics.rb']).to be_within(0.01).of(1.5)
+ expect(results['spec/frontend/fixtures/runner_instructions.rb']).to be_within(0.01).of(0.4)
+ expect(results['ee/spec/frontend/fixtures/analytics/value_streams_test_stage.rb']).to be_within(0.01).of(25.17)
+ expect(results['ee/spec/frontend/fixtures/merge_requests.rb']).to be_within(0.01).of(9.58)
+ expect(results['new']).to be_within(0.01).of(234)
+
+ # excludes entry missing from the new report
+ expect(results['old']).to be_nil
+ end
+ end
+
+ context 'with 2 new reports' do
+ subject do
+ described_class.new(
+ initial_report_file: initial_report_file.path,
+ new_report_files: [new_report_file_1.path, new_report_file_2.path]
+ )
+ end
+
+ it 'returns average durations' do
+ results = subject.execute
+
+ expect(subject).to have_received(:puts).with("Updating #{initial_report_file.path} with 2 new reports...")
+ expect(subject).to have_received(:puts).with("Updated 5 data points from #{new_report_file_1.path}")
+ expect(subject).to have_received(:puts).with("Updated 2 data points from #{new_report_file_2.path}")
+
+ expect(results['spec/frontend/fixtures/analytics.rb']).to be_within(0.01).of(2)
+ expect(results['new']).to be_within(0.01).of(351)
+
+ # retains entry present in one of the new reports
+ expect(results['spec/frontend/fixtures/runner_instructions.rb']).to be_within(0.01).of(0.4)
+ expect(results['ee/spec/frontend/fixtures/analytics/value_streams_test_stage.rb']).to be_within(0.01).of(25.17)
+ expect(results['ee/spec/frontend/fixtures/merge_requests.rb']).to be_within(0.01).of(9.58)
+
+ # excludes entry missing from both of the new reports
+ expect(results['old']).to be_nil
+ end
+ end
+
+ context 'when some of the new report files do not exist' do
+ subject do
+ described_class.new(
+ initial_report_file: initial_report_file.path,
+ new_report_files: [new_report_file_1.path, 'file_does_not_exist.json']
+ )
+ end
+
+ it 'ignores the nil file and only process 1 new report' do
+ subject.execute
+
+ expect(subject).to have_received(:puts).with("Updating #{initial_report_file.path} with 1 new reports...")
+ expect(subject).to have_received(:puts).with("Updated 5 data points from #{new_report_file_1.path}")
+ end
+ end
+ end
+end