diff options
Diffstat (limited to 'spec/lib/gitlab/usage/metrics/instrumentations/database_metric_spec.rb')
-rw-r--r-- | spec/lib/gitlab/usage/metrics/instrumentations/database_metric_spec.rb | 63 |
1 files changed, 41 insertions, 22 deletions
diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/database_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/database_metric_spec.rb index f73155642d6..f1ecc8c8ab5 100644 --- a/spec/lib/gitlab/usage/metrics/instrumentations/database_metric_spec.rb +++ b/spec/lib/gitlab/usage/metrics/instrumentations/database_metric_spec.rb @@ -3,12 +3,14 @@ require 'spec_helper' RSpec.describe Gitlab::Usage::Metrics::Instrumentations::DatabaseMetric do + let(:database_metric_class) { Class.new(described_class) } + subject do - described_class.tap do |metric_class| + database_metric_class.tap do |metric_class| metric_class.relation { Issue } metric_class.operation :count - metric_class.start { metric_class.relation.minimum(:id) } - metric_class.finish { metric_class.relation.maximum(:id) } + metric_class.start { Issue.minimum(:id) } + metric_class.finish { Issue.maximum(:id) } end.new(time_frame: 'all') end @@ -38,11 +40,11 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::DatabaseMetric do context 'with metric options specified with custom batch_size' do subject do - described_class.tap do |metric_class| + database_metric_class.tap do |metric_class| metric_class.relation { Issue } metric_class.operation :count - metric_class.start { metric_class.relation.minimum(:id) } - metric_class.finish { metric_class.relation.maximum(:id) } + metric_class.start { Issue.minimum(:id) } + metric_class.finish { Issue.maximum(:id) } metric_class.metric_options { { batch_size: 12345 } } end.new(time_frame: 'all') end @@ -60,7 +62,7 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::DatabaseMetric do context 'with start and finish not called' do subject do - described_class.tap do |metric_class| + database_metric_class.tap do |metric_class| metric_class.relation { Issue } metric_class.operation :count end.new(time_frame: 'all') @@ -73,7 +75,7 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::DatabaseMetric do context 'with availability defined' do subject do - described_class.tap do |metric_class| + database_metric_class.tap do |metric_class| metric_class.relation { Issue } metric_class.operation :count metric_class.available? { false } @@ -87,7 +89,7 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::DatabaseMetric do context 'with availability not defined' do subject do - Class.new(described_class) do + database_metric_class do relation { Issue } operation :count end.new(time_frame: 'all') @@ -100,11 +102,11 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::DatabaseMetric do context 'with cache_start_and_finish_as called' do subject do - described_class.tap do |metric_class| + database_metric_class.tap do |metric_class| metric_class.relation { Issue } metric_class.operation :count - metric_class.start { metric_class.relation.minimum(:id) } - metric_class.finish { metric_class.relation.maximum(:id) } + metric_class.start { Issue.minimum(:id) } + metric_class.finish { Issue.maximum(:id) } metric_class.cache_start_and_finish_as :special_issue_count end.new(time_frame: 'all') end @@ -123,11 +125,11 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::DatabaseMetric do context 'with estimate_batch_distinct_count' do subject do - described_class.tap do |metric_class| + database_metric_class.tap do |metric_class| metric_class.relation { Issue } metric_class.operation(:estimate_batch_distinct_count) - metric_class.start { metric_class.relation.minimum(:id) } - metric_class.finish { metric_class.relation.maximum(:id) } + metric_class.start { Issue.minimum(:id) } + metric_class.finish { Issue.maximum(:id) } end.new(time_frame: 'all') end @@ -139,13 +141,13 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::DatabaseMetric do let(:buckets) { double('Buckets').as_null_object } subject do - described_class.tap do |metric_class| + database_metric_class.tap do |metric_class| metric_class.relation { Issue } metric_class.operation(:estimate_batch_distinct_count) do |result| result.foo end - metric_class.start { metric_class.relation.minimum(:id) } - metric_class.finish { metric_class.relation.maximum(:id) } + metric_class.start { Issue.minimum(:id) } + metric_class.finish { Issue.maximum(:id) } end.new(time_frame: 'all') end @@ -163,7 +165,7 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::DatabaseMetric do context 'with custom timestamp column' do subject do - described_class.tap do |metric_class| + database_metric_class.tap do |metric_class| metric_class.relation { Issue } metric_class.operation :count metric_class.timestamp_column :last_edited_at @@ -171,6 +173,7 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::DatabaseMetric do end it 'calculates a correct result' do + create(:issue, last_edited_at: 40.days.ago) create(:issue, last_edited_at: 5.days.ago) expect(subject.value).to eq(1) @@ -179,24 +182,40 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::DatabaseMetric do context 'with default timestamp column' do subject do - described_class.tap do |metric_class| + database_metric_class.tap do |metric_class| metric_class.relation { Issue } metric_class.operation :count end.new(time_frame: '28d') end it 'calculates a correct result' do - create(:issue, last_edited_at: 5.days.ago) + create(:issue, created_at: 40.days.ago) create(:issue, created_at: 5.days.ago) expect(subject.value).to eq(1) end end + + context 'with additional parameters passed via options' do + subject do + database_metric_class.tap do |metric_class| + metric_class.relation ->(options) { Issue.where(confidential: options[:confidential]) } + metric_class.operation :count + end.new(time_frame: '28d', options: { confidential: true }) + end + + it 'calculates a correct result' do + create(:issue, created_at: 5.days.ago, confidential: true) + create(:issue, created_at: 5.days.ago, confidential: false) + + expect(subject.value).to eq(1) + end + end end context 'with unimplemented operation method used' do subject do - described_class.tap do |metric_class| + database_metric_class.tap do |metric_class| metric_class.relation { Issue } metric_class.operation :invalid_operation end.new(time_frame: 'all') |