Commit 0ce67858 authored by jacopo's avatar jacopo

Replaces `tag: true` into `:tag` in the specs

Replaces all the explicit include metadata syntax in the specs (tag:
true) into the implicit one (:tag).
Added a cop to prevent future errors and handle autocorrection.
parent 2ef28db9
---
title: 'Replace `tag: true` into `:tag` in the specs'
merge_request: 14653
author: Jacopo Beschi @jacopo-beschi
type: added
# frozen_string_literal: true
require 'rubocop-rspec'
module RuboCop
module Cop
module RSpec
# Checks for verbose include metadata used in the specs.
#
# @example
# # bad
# describe MyClass, js: true do
# end
#
# # good
# describe MyClass, :js do
# end
class VerboseIncludeMetadata < Cop
MSG = 'Use `%s` instead of `%s`.'
SELECTORS = %i[describe context feature example_group it specify example scenario its].freeze
def_node_matcher :include_metadata, <<-PATTERN
(send {(const nil :RSpec) nil} {#{SELECTORS.map(&:inspect).join(' ')}}
!const
...
(hash $...))
PATTERN
def_node_matcher :invalid_metadata?, <<-PATTERN
(pair
(sym $...)
(true))
PATTERN
def on_send(node)
invalid_metadata_matches(node) do |match|
add_offense(node, :expression, format(MSG, good(match), bad(match)))
end
end
def autocorrect(node)
lambda do |corrector|
invalid_metadata_matches(node) do |match|
corrector.replace(match.loc.expression, good(match))
end
end
end
private
def invalid_metadata_matches(node)
include_metadata(node) do |matches|
matches.select(&method(:invalid_metadata?)).each do |match|
yield match
end
end
end
def bad(match)
"#{metadata_key(match)}: true"
end
def good(match)
":#{metadata_key(match)}"
end
def metadata_key(match)
match.children[0].source
end
end
end
end
end
......@@ -21,3 +21,4 @@ require_relative 'cop/migration/reversible_add_column_with_default'
require_relative 'cop/migration/timestamps'
require_relative 'cop/migration/update_column_in_batches'
require_relative 'cop/rspec/single_line_hook'
require_relative 'cop/rspec/verbose_include_metadata'
......@@ -141,7 +141,7 @@ describe ProjectsController do
end
end
context 'when the storage is not available', broken_storage: true do
context 'when the storage is not available', :broken_storage do
set(:project) { create(:project, :broken_storage) }
before do
......
require 'spec_helper'
describe "Admin::AbuseReports", js: true do
describe "Admin::AbuseReports", :js do
let(:user) { create(:user) }
context 'as an admin' do
......
......@@ -40,7 +40,7 @@ feature 'Admin Broadcast Messages' do
expect(page).not_to have_content 'Migration to new server'
end
scenario 'Live preview a customized broadcast message', js: true do
scenario 'Live preview a customized broadcast message', :js do
fill_in 'broadcast_message_message', with: "Live **Markdown** previews. :tada:"
page.within('.broadcast-message-preview') do
......
require 'rails_helper'
feature 'Admin disables 2FA for a user' do
scenario 'successfully', js: true do
scenario 'successfully', :js do
sign_in(create(:admin))
user = create(:user, :two_factor)
......
......@@ -52,7 +52,7 @@ feature 'Admin Groups' do
expect_selected_visibility(internal)
end
scenario 'when entered in group path, it auto filled the group name', js: true do
scenario 'when entered in group path, it auto filled the group name', :js do
visit admin_groups_path
click_link "New group"
group_path = 'gitlab'
......@@ -81,7 +81,7 @@ feature 'Admin Groups' do
expect_selected_visibility(group.visibility_level)
end
scenario 'edit group path does not change group name', js: true do
scenario 'edit group path does not change group name', :js do
group = create(:group, :private)
visit admin_group_edit_path(group)
......@@ -93,7 +93,7 @@ feature 'Admin Groups' do
end
end
describe 'add user into a group', js: true do
describe 'add user into a group', :js do
shared_context 'adds user into a group' do
it do
visit admin_group_path(group)
......@@ -124,7 +124,7 @@ feature 'Admin Groups' do
group.add_user(:user, Gitlab::Access::OWNER)
end
it 'adds admin a to a group as developer', js: true do
it 'adds admin a to a group as developer', :js do
visit group_group_members_path(group)
page.within '.users-group-form' do
......@@ -141,7 +141,7 @@ feature 'Admin Groups' do
end
end
describe 'admin remove himself from a group', js: true do
describe 'admin remove himself from a group', :js do
it 'removes admin from the group' do
group.add_user(current_user, Gitlab::Access::DEVELOPER)
......
require 'spec_helper'
feature "Admin Health Check", feature: true, broken_storage: true do
feature "Admin Health Check", :feature, :broken_storage do
include StubENV
before do
......
......@@ -74,7 +74,7 @@ describe 'Admin::Hooks', :js do
end
end
describe 'Test', js: true do
describe 'Test', :js do
before do
WebMock.stub_request(:post, @system_hook.url)
visit admin_hooks_path
......
......@@ -30,7 +30,7 @@ RSpec.describe 'admin issues labels' do
end
end
it 'deletes all labels', js: true do
it 'deletes all labels', :js do
page.within '.labels' do
page.all('.btn-remove').each do |remove|
remove.click
......
......@@ -28,7 +28,7 @@ describe "Admin::Projects" do
expect(page).not_to have_content(archived_project.name)
end
it 'renders all projects', js: true do
it 'renders all projects', :js do
find(:css, '#sort-projects-dropdown').click
click_link 'Show archived projects'
......@@ -37,7 +37,7 @@ describe "Admin::Projects" do
expect(page).to have_xpath("//span[@class='label label-warning']", text: 'archived')
end
it 'renders only archived projects', js: true do
it 'renders only archived projects', :js do
find(:css, '#sort-projects-dropdown').click
click_link 'Show archived projects only'
......@@ -74,7 +74,7 @@ describe "Admin::Projects" do
.to receive(:move_uploads_to_new_namespace).and_return(true)
end
it 'transfers project to group web', js: true do
it 'transfers project to group web', :js do
visit admin_project_path(project)
click_button 'Search for Namespace'
......@@ -91,7 +91,7 @@ describe "Admin::Projects" do
project.team << [user, :master]
end
it 'adds admin a to a project as developer', js: true do
it 'adds admin a to a project as developer', :js do
visit project_project_members_path(project)
page.within '.users-project-form' do
......
require 'spec_helper'
describe 'Admin > Users > Impersonation Tokens', js: true do
describe 'Admin > Users > Impersonation Tokens', :js do
let(:admin) { create(:admin) }
let!(:user) { create(:user) }
......
......@@ -288,7 +288,7 @@ describe "Admin::Users" do
end
end
it 'allows group membership to be revoked', js: true do
it 'allows group membership to be revoked', :js do
page.within(first('.group_member')) do
find('.btn-remove').click
end
......@@ -309,7 +309,7 @@ describe "Admin::Users" do
end
end
describe 'remove users secondary email', js: true do
describe 'remove users secondary email', :js do
let!(:secondary_email) do
create :email, email: 'secondary@example.com', user: user
end
......
......@@ -32,7 +32,7 @@ feature 'Admin uses repository checks' do
end
end
scenario 'to clear all repository checks', js: true do
scenario 'to clear all repository checks', :js do
visit admin_application_settings_path
expect(RepositoryCheck::ClearWorker).to receive(:perform_async)
......
......@@ -31,7 +31,7 @@ describe 'Auto deploy' do
expect(page).to have_link('Set up auto deploy')
end
it 'includes OpenShift as an available template', js: true do
it 'includes OpenShift as an available template', :js do
click_link 'Set up auto deploy'
click_button 'Apply a GitLab CI Yaml template'
......@@ -40,7 +40,7 @@ describe 'Auto deploy' do
end
end
it 'creates a merge request using "auto-deploy" branch', js: true do
it 'creates a merge request using "auto-deploy" branch', :js do
click_link 'Set up auto deploy'
click_button 'Apply a GitLab CI Yaml template'
within '.gitlab-ci-yml-selector' do
......
require 'rails_helper'
describe 'Issue Boards', js: true do
describe 'Issue Boards', :js do
include DragTo
let(:group) { create(:group, :nested) }
......
require 'rails_helper'
describe 'Issue Boards shortcut', js: true do
describe 'Issue Boards shortcut', :js do
let(:project) { create(:project) }
before do
......
require 'rails_helper'
describe 'Issue Boards new issue', js: true do
describe 'Issue Boards new issue', :js do
let(:project) { create(:project, :public) }
let(:board) { create(:board, project: project) }
let!(:list) { create(:list, board: board, position: 0) }
......
require 'rails_helper'
describe 'Issue Boards', js: true do
describe 'Issue Boards', :js do
let(:user) { create(:user) }
let(:user2) { create(:user) }
let(:project) { create(:project, :public) }
......
require 'spec_helper'
describe 'CI Lint', js: true do
describe 'CI Lint', :js do
before do
sign_in(create(:user))
end
......
require 'spec_helper'
describe "Container Registry", js: true do
describe "Container Registry", :js do
let(:user) { create(:user) }
let(:project) { create(:project) }
......
require 'spec_helper'
describe 'Copy as GFM', js: true do
describe 'Copy as GFM', :js do
include MarkupHelper
include RepoHelpers
include ActionView::Helpers::JavaScriptHelper
......
require 'spec_helper'
feature 'Cycle Analytics', js: true do
feature 'Cycle Analytics', :js do
let(:user) { create(:user) }
let(:guest) { create(:user) }
let(:project) { create(:project, :repository) }
......
require 'spec_helper'
RSpec.describe 'Dashboard Active Tab', js: true do
RSpec.describe 'Dashboard Active Tab', :js do
before do
sign_in(create(:user))
end
......
require 'spec_helper'
feature 'Tooltips on .timeago dates', js: true do
feature 'Tooltips on .timeago dates', :js do
let(:user) { create(:user) }
let(:project) { create(:project, name: 'test', namespace: user.namespace) }
let(:created_date) { Date.yesterday.to_time }
......
......@@ -5,7 +5,7 @@ RSpec.describe 'Dashboard Group' do
sign_in(create(:user))
end
it 'creates new group', js: true do
it 'creates new group', :js do
visit dashboard_groups_path
find('.btn-new').trigger('click')
new_path = 'Samurai'
......
......@@ -24,7 +24,7 @@ RSpec.describe 'Dashboard Issues' do
expect(page).not_to have_content(other_issue.title)
end
it 'shows checkmark when unassigned is selected for assignee', js: true do
it 'shows checkmark when unassigned is selected for assignee', :js do
find('.js-assignee-search').click
find('li', text: 'Unassigned').click
find('.js-assignee-search').click
......@@ -32,7 +32,7 @@ RSpec.describe 'Dashboard Issues' do
expect(find('li[data-user-id="0"] a.is-active')).to be_visible
end
it 'shows issues when current user is author', js: true do
it 'shows issues when current user is author', :js do
find('#assignee_id', visible: false).set('')
find('.js-author-search', match: :first).click
......@@ -70,7 +70,7 @@ RSpec.describe 'Dashboard Issues' do
end
describe 'new issue dropdown' do
it 'shows projects only with issues feature enabled', js: true do
it 'shows projects only with issues feature enabled', :js do
find('.new-project-item-select-button').trigger('click')
page.within('.select2-results') do
......@@ -79,7 +79,7 @@ RSpec.describe 'Dashboard Issues' do
end
end
it 'shows the new issue page', js: true do
it 'shows the new issue page', :js do
find('.new-project-item-select-button').trigger('click')
wait_for_requests
......
require 'spec_helper'
describe 'Dashboard > label filter', js: true do
describe 'Dashboard > label filter', :js do
let(:user) { create(:user) }
let(:project) { create(:project, name: 'test', namespace: user.namespace) }
let(:project2) { create(:project, name: 'test2', path: 'test2', namespace: user.namespace) }
......
......@@ -24,7 +24,7 @@ feature 'Dashboard Merge Requests' do
visit merge_requests_dashboard_path
end
it 'shows projects only with merge requests feature enabled', js: true do
it 'shows projects only with merge requests feature enabled', :js do
find('.new-project-item-select-button').trigger('click')
page.within('.select2-results') do
......@@ -89,7 +89,7 @@ feature 'Dashboard Merge Requests' do
expect(page).not_to have_content(other_merge_request.title)
end
it 'shows authored merge requests', js: true do
it 'shows authored merge requests', :js do
filter_item_select('Any Assignee', '.js-assignee-search')
filter_item_select(current_user.to_reference, '.js-author-search')
......@@ -101,7 +101,7 @@ feature 'Dashboard Merge Requests' do
expect(page).not_to have_content(other_merge_request.title)
end
it 'shows all merge requests', js: true do
it 'shows all merge requests', :js do
filter_item_select('Any Assignee', '.js-assignee-search')
filter_item_select('Any Author', '.js-author-search')
......
require 'spec_helper'
feature 'Project member activity', js: true do
feature 'Project member activity', :js do
let(:user) { create(:user) }
let(:project) { create(:project, :public, name: 'x', namespace: user.namespace) }
......
......@@ -80,7 +80,7 @@ feature 'Dashboard Projects' do
end
end
describe 'with a pipeline', clean_gitlab_redis_shared_state: true do
describe 'with a pipeline', :clean_gitlab_redis_shared_state do
let(:pipeline) { create(:ci_pipeline, project: project, sha: project.commit.sha) }
before do
......
require 'spec_helper'
feature 'Dashboard > User filters todos', js: true do
feature 'Dashboard > User filters todos', :js do
let(:user_1) { create(:user, username: 'user_1', name: 'user_1') }
let(:user_2) { create(:user, username: 'user_2', name: 'user_2') }
......
......@@ -17,7 +17,7 @@ feature 'Dashboard Todos' do
end
end
context 'User has a todo', js: true do
context 'User has a todo', :js do
before do
create(:todo, :mentioned, user: user, project: project, target: issue, author: author)
sign_in(user)
......@@ -177,7 +177,7 @@ feature 'Dashboard Todos' do
end
end
context 'User has done todos', js: true do
context 'User has done todos', :js do
before do
create(:todo, :mentioned, :done, user: user, project: project, target: issue, author: author)
sign_in(user)
......@@ -249,7 +249,7 @@ feature 'Dashboard Todos' do
expect(page).to have_selector('.gl-pagination .page', count: 2)
end
describe 'mark all as done', js: true do
describe 'mark all as done', :js do
before do
visit dashboard_todos_path
find('.js-todos-mark-all').trigger('click')
......@@ -267,7 +267,7 @@ feature 'Dashboard Todos' do
end
end
describe 'undo mark all as done', js: true do
describe 'undo mark all as done', :js do
before do
visit dashboard_todos_path
end
......
require 'spec_helper'
feature 'Expand and collapse diffs', js: true do
feature 'Expand and collapse diffs', :js do
let(:branch) { 'expand-collapse-diffs' }
let(:project) { create(:project, :repository) }
......
......@@ -49,7 +49,7 @@ describe "GitLab Flavored Markdown" do
end
end
describe "for issues", js: true do
describe "for issues", :js do
before do
@other_issue = create(:issue,
author: user,
......
require 'spec_helper'
feature 'Group variables', js: true do
feature 'Group variables', :js do
let(:user) { create(:user) }
let(:group) { create(:group) }
......
......@@ -11,7 +11,7 @@ feature 'Labels subscription' do
gitlab_sign_in user
end
scenario 'users can subscribe/unsubscribe to group labels', js: true do
scenario 'users can subscribe/unsubscribe to group labels', :js do
visit group_labels_path(group)
expect(page).to have_content('feature')
......
......@@ -85,7 +85,7 @@ feature 'Group' do
end
end
describe 'create a nested group', :nested_groups, js: true do
describe 'create a nested group', :nested_groups, :js do
let(:group) { create(:group, path: 'foo') }
context 'as admin' do
......@@ -142,7 +142,7 @@ feature 'Group' do
expect(page).not_to have_content('secret-group')
end
describe 'group edit', js: true do
describe 'group edit', :js do
let(:group) { create(:group) }
let(:path) { edit_group_path(group) }
let(:new_name) { 'new-name' }
......@@ -207,7 +207,7 @@ feature 'Group' do
end
end
describe 'group page with nested groups', :nested_groups, js: true do
describe 'group page with nested groups', :nested_groups, :js do
let!(:group) { create(:group) }
let!(:nested_group) { create(:group, parent: group) }
let!(:path) { group_path(group) }
......
......@@ -26,7 +26,7 @@ describe 'Projects > Issuables > Default sort order' do
MergeRequest.all
end
context 'in the "merge requests" tab', js: true do
context 'in the "merge requests" tab', :js do
let(:issuable_type) { :merge_request }
it 'is "last created"' do
......@@ -37,7 +37,7 @@ describe 'Projects > Issuables > Default sort order' do
end
end
context 'in the "merge requests / open" tab', js: true do
context 'in the "merge requests / open" tab', :js do
let(:issuable_type) { :merge_request }
it 'is "created date"' do
......@@ -49,7 +49,7 @@ describe 'Projects > Issuables > Default sort order' do
end
end
context 'in the "merge requests / merged" tab', js: true do
context 'in the "merge requests / merged" tab', :js do
let(:issuable_type) { :merged_merge_request }
it 'is "last updated"' do
......@@ -61,7 +61,7 @@ describe 'Projects > Issuables > Default sort order' do
end
end
context 'in the "merge requests / closed" tab', js: true do
context 'in the "merge requests / closed" tab', :js do
let(:issuable_type) { :closed_merge_request }
it 'is "last updated"' do
......@@ -73,7 +73,7 @@ describe 'Projects > Issuables > Default sort order' do
end
end
context 'in the "merge requests / all" tab', js: true do
context 'in the "merge requests / all" tab', :js do
let(:issuable_type) { :merge_request }
it 'is "created date"' do
......@@ -102,7 +102,7 @@ describe 'Projects > Issuables > Default sort order' do
Issue.all
end
context 'in the "issues" tab', js: true do
context 'in the "issues" tab', :js do
let(:issuable_type) { :issue }
it 'is "created date"' do
......@@ -114,7 +114,7 @@ describe 'Projects > Issuables > Default sort order' do
end
end