summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRémy Coutable <remy@rymai.me>2018-04-06 18:30:59 +0200
committerRémy Coutable <remy@rymai.me>2018-04-10 15:38:40 +0200
commit5bef32195b3d4a0062564af4dc5c0a6e56b10faf (patch)
treeb48428181940d3621e03f3fae61711cb4d9b7643
parent9d220da84117220317ccff1421a394185fefe859 (diff)
downloadgitlab-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.rb25
-rw-r--r--lib/rspec_flaky/flaky_examples_collection.rb2
-rw-r--r--spec/lib/rspec_flaky/examples_pruner_spec.rb33
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