gitlab-ce/spec/rubocop/cop/experiments_test_coverage_s...

196 lines
5.6 KiB
Ruby

# frozen_string_literal: true
require 'rubocop_spec_helper'
require_relative '../../../rubocop/cop/experiments_test_coverage'
require_relative '../../support/helpers/file_read_helpers'
RSpec.describe RuboCop::Cop::ExperimentsTestCoverage, feature_category: :acquisition do
include FileReadHelpers
let(:class_offense) { described_class::CLASS_OFFENSE }
let(:block_offense) { described_class::BLOCK_OFFENSE }
before do
allow_next_instance_of(Parser::Source::Buffer) do |node_buffer|
allow(node_buffer).to receive(:name).and_return(file_path)
end
stub_file_read(test_file_path, content: tests_code)
end
describe '#on_class' do
let(:file_path) { 'app/experiments/experiment_name_experiment.rb' }
let(:test_file_path) { 'spec/experiments/experiment_name_experiment_spec.rb' }
context 'when there are no tests' do
let(:tests_code) { '' }
it 'registers an offense' do
expect_offense(<<~RUBY)
class ExperimentName < ApplicationExperiment
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{class_offense}
end
RUBY
end
end
context 'when there is no stub_experiments' do
let(:tests_code) { "candidate third" }
it 'registers an offense' do
expect_offense(<<~RUBY)
class ExperimentName < ApplicationExperiment
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{class_offense}
candidate
variant(:third) { 'third option' }
end
RUBY
end
end
context 'when variant test is missing' do
let(:tests_code) { "\nstub_experiments(experiment_name: :candidate)" }
it 'registers an offense' do
expect_offense(<<~RUBY)
class ExperimentName < ApplicationExperiment
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{class_offense}
candidate
variant(:third) { 'third option' }
end
RUBY
end
end
context 'when stub_experiments is commented out' do
let(:tests_code) do
"\n# stub_experiments(experiment_name: :candidate, experiment_name: :third)"
end
it 'registers an offense' do
expect_offense(<<~RUBY)
class ExperimentName < ApplicationExperiment
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{class_offense}
candidate
variant(:third) { 'third option' }
end
RUBY
end
end
context 'when all tests are present' do
let(:tests_code) do
"#\nstub_experiments(experiment_name: :candidate, experiment_name: :third)"
end
it 'does not register an offense' do
expect_no_offenses(<<~RUBY)
class ExperimentName < ApplicationExperiment
candidate
variant(:third) { 'third option' }
end
RUBY
end
end
end
describe '#on_block' do
let(:file_path) { 'app/controllers/test_controller.rb' }
let(:test_file_path) { 'spec/requests/test_controller_spec.rb' }
context 'when there are no tests' do
let(:tests_code) { '' }
it 'registers an offense' do
expect_offense(<<~RUBY)
experiment(:experiment_name) do |e|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{block_offense}
end
RUBY
end
end
context 'when there is no stub_experiments' do
let(:tests_code) { "candidate third" }
it 'registers an offense' do
expect_offense(<<~RUBY)
experiment(:experiment_name) do |e|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{block_offense}
e.candidate { 'candidate' }
e.variant(:third) { 'third option' }
e.run
end
RUBY
end
end
context 'when variant test is missing' do
let(:tests_code) { "\nstub_experiments(experiment_name: :candidate)" }
it 'registers an offense' do
expect_offense(<<~RUBY)
experiment(:experiment_name) do |e|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{block_offense}
e.candidate { 'candidate' }
e.variant(:third) { 'third option' }
e.run
end
RUBY
end
end
context 'when stub_experiments is commented out' do
let(:tests_code) do
"\n# stub_experiments(experiment_name: :candidate, experiment_name: :third)"
end
it 'registers an offense' do
expect_offense(<<~RUBY)
experiment(:experiment_name) do |e|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{block_offense}
e.candidate { 'candidate' }
e.variant(:third) { 'third option' }
e.run
end
RUBY
end
end
context 'when all tests are present' do
shared_examples 'covered experiment block' do
it 'does not register an offense' do
expect_no_offenses(<<~RUBY)
experiment(:experiment_name) do |e|
e.candidate { 'candidate' }
e.variant(:third) { 'third option' }
e.run
end
RUBY
end
end
let(:tests_code) do
"#\nstub_experiments(experiment_name: :candidate, experiment_name: :third)"
end
it_behaves_like 'covered experiment block'
context 'when /lib/api folder' do
let(:file_path) { '/lib/api/tests.rb' }
let(:test_file_path) { '/spec/requests/api/tests_spec.rb' }
it_behaves_like 'covered experiment block'
end
context 'when *.haml file' do
let(:file_path) { 'app/view/show_test.html.haml' }
let(:test_file_path) { 'spec/view/show_test.html.haml_spec.rb' }
it_behaves_like 'covered experiment block'
end
end
end
end