diff options
author | Rémy Coutable <remy@rymai.me> | 2018-04-06 18:30:59 +0200 |
---|---|---|
committer | Rémy Coutable <remy@rymai.me> | 2018-04-10 15:38:40 +0200 |
commit | 5bef32195b3d4a0062564af4dc5c0a6e56b10faf (patch) | |
tree | b48428181940d3621e03f3fae61711cb4d9b7643 | |
parent | 9d220da84117220317ccff1421a394185fefe859 (diff) | |
download | gitlab-ce-5bef32195b3d4a0062564af4dc5c0a6e56b10faf.tar.gz |
Introduce RspecFlaky::ExamplesPruner to prune old flaky examples
Signed-off-by: Rémy Coutable <remy@rymai.me>
-rw-r--r-- | lib/rspec_flaky/examples_pruner.rb | 25 | ||||
-rw-r--r-- | lib/rspec_flaky/flaky_examples_collection.rb | 2 | ||||
-rw-r--r-- | spec/lib/rspec_flaky/examples_pruner_spec.rb | 33 |
3 files changed, 60 insertions, 0 deletions
diff --git a/lib/rspec_flaky/examples_pruner.rb b/lib/rspec_flaky/examples_pruner.rb new file mode 100644 index 00000000000..de6cf30d8ee --- /dev/null +++ b/lib/rspec_flaky/examples_pruner.rb @@ -0,0 +1,25 @@ +require 'json' + +module RspecFlaky + class ExamplesPruner + # - flaky_examples: contains flaky examples + attr_reader :flaky_examples + + def initialize(collection) + unless collection.is_a?(RspecFlaky::FlakyExamplesCollection) + raise ArgumentError, "`collection` must be a RspecFlaky::FlakyExamplesCollection, #{collection.class} given!" + end + + @flaky_examples = collection + end + + def prune_examples_older_than(date) + updated_hash = flaky_examples.dup + .delete_if do |uid, hash| + hash[:last_flaky_at] && Time.parse(hash[:last_flaky_at]).to_i < date.to_i + end + + RspecFlaky::FlakyExamplesCollection.new(updated_hash) + end + end +end diff --git a/lib/rspec_flaky/flaky_examples_collection.rb b/lib/rspec_flaky/flaky_examples_collection.rb index 973c95b0212..27a2845fb50 100644 --- a/lib/rspec_flaky/flaky_examples_collection.rb +++ b/lib/rspec_flaky/flaky_examples_collection.rb @@ -1,5 +1,7 @@ require 'json' +require_relative 'flaky_example' + module RspecFlaky class FlakyExamplesCollection < SimpleDelegator def self.from_json(json) diff --git a/spec/lib/rspec_flaky/examples_pruner_spec.rb b/spec/lib/rspec_flaky/examples_pruner_spec.rb new file mode 100644 index 00000000000..40a086e92cb --- /dev/null +++ b/spec/lib/rspec_flaky/examples_pruner_spec.rb @@ -0,0 +1,33 @@ +require 'spec_helper' + +describe RspecFlaky::ExamplesPruner, :aggregate_failures do + let(:collection_hash) do + { + a: { example_id: 'spec/foo/bar_spec.rb:2' }, + b: { example_id: 'spec/foo/baz_spec.rb:3', first_flaky_at: Time.utc(2000, 1, 1).to_s, last_flaky_at: Time.utc(2000, 2, 1).to_s } + } + end + + describe '#initialize' do + it 'accepts a collection' do + expect { described_class.new(RspecFlaky::FlakyExamplesCollection.new(collection_hash)) }.not_to raise_error + end + + it 'does not accept anything else' do + expect { described_class.new([1, 2, 3]) }.to raise_error(ArgumentError, "`collection` must be a RspecFlaky::FlakyExamplesCollection, Array given!") + end + end + + describe '#prune_examples_older_than' do + it 'returns a new collection without the examples older than 3 months' do + collection = RspecFlaky::FlakyExamplesCollection.new(collection_hash) + + new_report = collection.to_report.dup.tap { |r| r.delete(:b) } + new_collection = described_class.new(collection).prune_examples_older_than(3.months.ago) + + expect(new_collection).to be_a(RspecFlaky::FlakyExamplesCollection) + expect(new_collection.to_report).to eq(new_report) + expect(collection).to have_key(:b) + end + end +end |