diff options
Diffstat (limited to 'spec/lib/gitlab/analytics/date_filler_spec.rb')
-rw-r--r-- | spec/lib/gitlab/analytics/date_filler_spec.rb | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/spec/lib/gitlab/analytics/date_filler_spec.rb b/spec/lib/gitlab/analytics/date_filler_spec.rb new file mode 100644 index 00000000000..3f547f667f2 --- /dev/null +++ b/spec/lib/gitlab/analytics/date_filler_spec.rb @@ -0,0 +1,136 @@ +# frozen_string_literal: true +require 'fast_spec_helper' + +RSpec.describe Gitlab::Analytics::DateFiller do + let(:default_value) { 0 } + let(:formatter) { Gitlab::Analytics::DateFiller::DEFAULT_DATE_FORMATTER } + + subject(:filler_result) do + described_class.new(data, + from: from, + to: to, + period: period, + default_value: default_value, + date_formatter: formatter).fill.to_a + end + + context 'when unknown period is given' do + it 'raises error' do + input = { 3.days.ago.to_date => 10, Date.today => 5 } + + expect do + described_class.new(input, from: 4.days.ago, to: Date.today, period: :unknown).fill + end.to raise_error(/Unknown period given/) + end + end + + context 'when period=:day' do + let(:from) { Date.new(2021, 5, 25) } + let(:to) { Date.new(2021, 6, 5) } + let(:period) { :day } + + let(:expected_result) do + { + Date.new(2021, 5, 25) => 1, + Date.new(2021, 5, 26) => default_value, + Date.new(2021, 5, 27) => default_value, + Date.new(2021, 5, 28) => default_value, + Date.new(2021, 5, 29) => default_value, + Date.new(2021, 5, 30) => default_value, + Date.new(2021, 5, 31) => default_value, + Date.new(2021, 6, 1) => default_value, + Date.new(2021, 6, 2) => default_value, + Date.new(2021, 6, 3) => 10, + Date.new(2021, 6, 4) => default_value, + Date.new(2021, 6, 5) => default_value + } + end + + let(:data) do + { + Date.new(2021, 6, 3) => 10, # deliberatly not sorted + Date.new(2021, 5, 27) => nil, + Date.new(2021, 5, 25) => 1 + } + end + + it { is_expected.to eq(expected_result.to_a) } + + context 'when a custom default value is given' do + let(:default_value) { 'MISSING' } + + it do + is_expected.to eq(expected_result.to_a) + end + end + + context 'when a custom date formatter is given' do + let(:formatter) { -> (date) { date.to_s } } + + it do + expected_result.transform_keys!(&:to_s) + + is_expected.to eq(expected_result.to_a) + end + end + + context 'when the data contains dates outside of the requested period' do + before do + data[Date.new(2022, 6, 1)] = 5 + end + + it 'raises error' do + expect { filler_result }.to raise_error(/Input contains values which doesn't/) + end + end + end + + context 'when period=:week' do + let(:from) { Date.new(2021, 5, 16) } + let(:to) { Date.new(2021, 6, 7) } + let(:period) { :week } + let(:data) do + { + Date.new(2021, 5, 24) => nil, + Date.new(2021, 6, 7) => 10 + } + end + + let(:expected_result) do + { + Date.new(2021, 5, 10) => 0, + Date.new(2021, 5, 17) => 0, + Date.new(2021, 5, 24) => 0, + Date.new(2021, 5, 31) => 0, + Date.new(2021, 6, 7) => 10 + } + end + + it do + is_expected.to eq(expected_result.to_a) + end + end + + context 'when period=:month' do + let(:from) { Date.new(2021, 5, 1) } + let(:to) { Date.new(2021, 7, 1) } + let(:period) { :month } + let(:data) do + { + Date.new(2021, 5, 1) => 100 + } + end + + let(:expected_result) do + { + Date.new(2021, 5, 1) => 100, + Date.new(2021, 6, 1) => 0, + Date.new(2021, 7, 1) => 0 + } + end + + it do + is_expected.to eq(expected_result.to_a) + end + end +end |