Flaky Spec Fix:Remove let_it_be Test Prof Helper (#9556)

* Flaky Spec Fix:Remove let_it_be Test Prof Helper

* Spec cleanup and fixes
This commit is contained in:
Molly Struve 2020-07-29 04:31:01 -05:00 committed by GitHub
parent 5a2cae4fbb
commit b40af82b66
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
70 changed files with 213 additions and 211 deletions

View file

@ -2,7 +2,7 @@ require "rails_helper"
RSpec.describe CommentDecorator, type: :decorator do
context "with serialization" do
let_it_be_readonly(:comment) { create(:comment).decorate }
let!(:comment) { create(:comment).decorate }
it "serializes both the decorated object IDs and decorated methods" do
expected_result = { "id" => comment.id, "published_timestamp" => comment.published_timestamp }

View file

@ -1,7 +1,7 @@
require "rails_helper"
RSpec.describe ListingDecorator, type: :decorator do
let_it_be_readonly(:category) { create(:listing_category) }
let(:category) { create(:listing_category) }
let(:decorated_listing) do
build(:listing, listing_category: category).decorate
end

View file

@ -1,10 +1,10 @@
require "rails_helper"
RSpec.describe NotificationDecorator, type: :decorator do
let(:notification) { build(:notification) }
let!(:notification) { build(:notification) }
context "with serialization" do
let_it_be_readonly(:notification) { create(:notification).decorate }
let(:notification) { create(:notification).decorate }
it "serializes both the decorated object IDs and decorated methods" do
expected_result = { "id" => notification.id, "milestone_type" => notification.milestone_type }

View file

@ -2,7 +2,7 @@ require "rails_helper"
RSpec.describe OrganizationDecorator, type: :decorator do
context "with serialization" do
let_it_be_readonly(:organization) { create(:organization).decorate }
let!(:organization) { create(:organization).decorate }
it "serializes both the decorated object IDs and decorated methods" do
expected_result = { "id" => organization.id, "fully_banished?" => organization.fully_banished? }

View file

@ -2,7 +2,7 @@ require "rails_helper"
RSpec.describe SponsorshipDecorator, type: :decorator do
context "with serialization" do
let_it_be_readonly(:sponsorship) { create(:sponsorship).decorate }
let!(:sponsorship) { create(:sponsorship).decorate }
it "serializes both the decorated object IDs and decorated methods" do
expected_result = { "id" => sponsorship.id, "level_background_color" => sponsorship.level_background_color }

View file

@ -1,8 +1,8 @@
require "rails_helper"
RSpec.describe ListingHelper, type: :helper do
let_it_be_readonly(:cat1) { create(:listing_category, cost: 1) }
let_it_be_readonly(:cat2) { create(:listing_category, :cfp, cost: 5) }
let!(:cat1) { create(:listing_category, cost: 1) }
let!(:cat2) { create(:listing_category, :cfp, cost: 5) }
describe "select_options_for_categories" do
it "returns the correct options array" do

View file

@ -1,7 +1,7 @@
require "rails_helper"
describe SocialLinkHelper do
let_it_be_readonly(:user) { create(:user) }
let(:user) { create(:user) }
describe ".user_twitter_link" do
let(:value) { helper.user_twitter_link(user) }

View file

@ -106,10 +106,10 @@ RSpec.describe BadgeRewarder, type: :labor do
describe "::award_contributor_badges_from_github", vcr: true do
let(:user) { create(:user, :with_identity, identities: ["github"]) }
let_it_be_readonly(:badge) { create(:badge, title: "DEV Contributor") }
let(:badge) { create(:badge, title: "DEV Contributor") }
before do
badge
omniauth_mock_github_payload
stub_const("BadgeRewarder::REPOSITORIES", ["rust-lang/rust"])

View file

@ -7,7 +7,7 @@ RSpec.describe Article, type: :model do
article
end
let_it_be(:user) { create(:user) }
let(:user) { create(:user) }
let!(:article) { create(:article, user: user) }
include_examples "#sync_reactions_count", :article

View file

@ -1,7 +1,7 @@
require "rails_helper"
RSpec.describe BadgeAchievement, type: :model do
let_it_be(:achievement) { create(:badge_achievement) }
let(:achievement) { create(:badge_achievement) }
describe "validations" do
describe "builtin validations" do
@ -23,6 +23,7 @@ RSpec.describe BadgeAchievement, type: :model do
end
it "notifies recipients after commit" do
achievement
allow(Notification).to receive(:send_new_badge_achievement_notification)
achievement.run_callbacks(:commit)
expect(Notification).to have_received(:send_new_badge_achievement_notification).with(achievement)

View file

@ -19,7 +19,7 @@ RSpec.describe Badge, type: :model do
end
context "when callbacks are triggered after save" do
let_it_be_changeable(:badge) { create(:badge) }
let!(:badge) { create(:badge) }
describe "cache busting" do
before do

View file

@ -1,7 +1,7 @@
require "rails_helper"
RSpec.describe BufferUpdate, type: :model do
let_it_be(:article) { create(:article) }
let(:article) { create(:article) }
it "creates update" do
described_class.buff!(article.id, "twitter_buffer_text", "CODE", "twitter")

View file

@ -3,7 +3,7 @@ require "rails_helper"
RSpec.describe ChatChannel, type: :model do
let(:chat_channel) { create(:chat_channel) }
let_it_be(:users) { create_list(:user, 2) }
let(:users) { create_list(:user, 2) }
describe "validations" do
describe "builtin validations" do

View file

@ -1,8 +1,8 @@
require "rails_helper"
RSpec.describe Collection, type: :model do
let_it_be(:user) { create(:user) }
let_it_be(:collection) { create(:collection, :with_articles, user: user) }
let(:user) { create(:user) }
let(:collection) { create(:collection, :with_articles, user: user) }
describe "validations" do
it { is_expected.to belong_to(:user) }
@ -15,8 +15,8 @@ RSpec.describe Collection, type: :model do
end
describe ".find_series" do
let_it_be(:other_user) { create(:user) }
let_it_be(:series) { collection }
let!(:other_user) { create(:user) }
let!(:series) { collection }
it "returns an existing series" do
expect do

View file

@ -1,16 +1,16 @@
require "rails_helper"
RSpec.describe Credit, type: :model do
let_it_be(:user) { create(:user) }
let_it_be(:organization) { create(:organization) }
let(:user) { create(:user) }
let(:organization) { create(:organization) }
it { is_expected.to belong_to(:user).optional }
it { is_expected.to belong_to(:organization).optional }
it { is_expected.to belong_to(:purchase).optional }
context "when caching counters" do
let_it_be(:user_credits) { create_list(:credit, 2, user: user) }
let_it_be(:org_credits) { create_list(:credit, 1, organization: organization) }
let(:user_credits) { create_list(:credit, 2, user: user) }
let(:org_credits) { create_list(:credit, 1, organization: organization) }
describe "#credits_count" do
it "counts credits for user" do
@ -49,7 +49,7 @@ RSpec.describe Credit, type: :model do
end
describe "#purchase" do
let_it_be(:credit) { build(:credit) }
let(:credit) { build(:credit) }
it "is valid with a purchase" do
credit.purchase = build(:listing)
@ -77,8 +77,10 @@ RSpec.describe Credit, type: :model do
end
describe "#remove_from" do
let_it_be(:user_credits) { create_list(:credit, 2, user: user) }
let_it_be(:org_credits) { create_list(:credit, 1, organization: organization) }
let(:user_credits) { create_list(:credit, 2, user: user) }
let(:org_credits) { create_list(:credit, 1, organization: organization) }
before { [user_credits, org_credits] }
it "adds the credits to the user" do
expect do

View file

@ -1,9 +1,9 @@
require "rails_helper"
RSpec.describe DisplayAdEvent, type: :model do
let_it_be(:user) { build(:user) }
let_it_be(:organization) { build(:organization) }
let_it_be(:display_ad) { build(:display_ad, organization: organization) }
let(:user) { build(:user) }
let(:organization) { build(:organization) }
let(:display_ad) { build(:display_ad, organization: organization) }
describe "#category" do
it "is valid with a click category" do

View file

@ -1,8 +1,8 @@
require "rails_helper"
RSpec.describe DisplayAd, type: :model do
let_it_be(:organization) { create(:organization) }
let_it_be(:display_ad) { create(:display_ad, organization_id: organization.id) }
let(:organization) { create(:organization) }
let(:display_ad) { create(:display_ad, organization_id: organization.id) }
it { is_expected.to validate_presence_of(:organization_id) }
it { is_expected.to validate_presence_of(:placement_area) }

View file

@ -1,8 +1,8 @@
require "rails_helper"
RSpec.describe Listing, type: :model do
let_it_be(:user) { create(:user) }
let_it_be(:organization) { create(:organization) }
let(:user) { create(:user) }
let(:organization) { create(:organization) }
let(:listing) { create(:listing, user: user) }
# TODO: Remove setting of default parser from a model's callback

View file

@ -39,7 +39,7 @@ RSpec.describe Message, type: :model do
end
context "when callbacks are triggered before validation" do
let_it_be(:article) { create(:article) }
let(:article) { create(:article) }
describe "#message_html" do
it "creates rich link with proper link for article" do

View file

@ -1,10 +1,10 @@
require "rails_helper"
RSpec.describe NotificationSubscription, type: :model do
let_it_be(:user) { create(:user) }
let_it_be(:article) { create(:article, user: user) }
subject { create(:notification_subscription, user: user, notifiable: article) }
let(:user) { create(:user) }
let(:article) { create(:article, user: user) }
it { is_expected.to validate_uniqueness_of(:user_id).scoped_to(%i[notifiable_type notifiable_id]) }
end

View file

@ -62,7 +62,7 @@ RSpec.describe PodcastEpisode, type: :model do
end
describe ".available" do
let_it_be(:podcast) { create(:podcast) }
let(:podcast) { create(:podcast) }
it "is available when reachable and published" do
expect do
@ -85,7 +85,7 @@ RSpec.describe PodcastEpisode, type: :model do
end
context "when callbacks are triggered before validation" do
let_it_be(:podcast_episode) { build(:podcast_episode) }
let(:podcast_episode) { build(:podcast_episode) }
describe "paragraphs cleanup" do
it "removes empty paragraphs" do

View file

@ -1,9 +1,9 @@
require "rails_helper"
RSpec.describe PollOption, type: :model do
let_it_be(:article) { build(:article, featured: true) }
let_it_be(:poll) { build(:poll, article: article) }
let_it_be(:poll_option) { build(:poll_option, poll: poll) }
let(:article) { build(:article, featured: true) }
let(:poll) { build(:poll, article: article) }
let(:poll_option) { build(:poll_option, poll: poll) }
describe "validations" do
it "allows up to 128 markdown characters" do

View file

@ -1,9 +1,9 @@
require "rails_helper"
RSpec.describe PollSkip, type: :model do
let_it_be(:article) { create(:article, featured: true) }
let_it_be(:user) { create(:user) }
let_it_be(:poll) { create(:poll, article: article) }
let(:article) { create(:article, featured: true) }
let(:user) { create(:user) }
let(:poll) { create(:poll, article: article) }
describe "validations" do
context "when checking against poll" do

View file

@ -1,10 +1,10 @@
require "rails_helper"
RSpec.describe Poll, type: :model do
let_it_be(:article) { create(:article, featured: true) }
let(:article) { create(:article, featured: true) }
describe "validations" do
let_it_be(:poll) { build(:poll, article: article) }
let(:poll) { build(:poll, article: article) }
describe "#prompt_markdown" do
it "is valid up to 128 chars" do

View file

@ -1,18 +1,19 @@
require "rails_helper"
RSpec.describe ProfilePin, type: :model do
let_it_be(:user) { create(:user) }
let(:user) { create(:user) }
describe "validations" do
describe "number of pins" do
let_it_be(:articles) { create_list(:article, 4, user: user) }
let_it_be(:pins) do
let(:articles) { create_list(:article, 4, user: user) }
let(:pins) do
articles.each { |article| create(:profile_pin, pinnable: article, profile: user) }
end
let(:fifth_article) { create(:article, user: user) }
let(:sixth_article) { create(:article, user: user) }
before { pins }
it "allows up to five pins per user" do
pin = build(:profile_pin, pinnable: fifth_article, profile: user)
expect(pin).to be_valid
@ -28,7 +29,7 @@ RSpec.describe ProfilePin, type: :model do
end
describe "#profile" do
let_it_be(:article) { create(:article, user: user) }
let(:article) { create(:article, user: user) }
it "ensures pinnable belongs to the same profile" do
pin = build(:profile_pin, pinnable: article, profile: create(:user))

View file

@ -49,7 +49,7 @@ RSpec.describe RatingVote, type: :model do
end
describe "permissions" do
let_it_be(:untrusted_user) { create(:user) }
let(:untrusted_user) { create(:user) }
it "allows untrusted user to leave readinglist_reaction context rating" do
rating = build(:rating_vote, article_id: article.id, user_id: untrusted_user.id, context: "readinglist_reaction")

View file

@ -144,8 +144,8 @@ RSpec.describe Reaction, type: :model do
end
describe "#skip_notification_for?" do
let_it_be(:receiver) { build(:user) }
let_it_be(:reaction) { build(:reaction, reactable: build(:article), user: nil) }
let(:receiver) { build(:user) }
let(:reaction) { build(:reaction, reactable: build(:article), user: nil) }
context "when false" do
it "is false when points are positive" do
@ -202,8 +202,8 @@ RSpec.describe Reaction, type: :model do
context "when callbacks are called after create" do
describe "slack messages" do
let_it_be_changeable(:user) { create(:user, :trusted) }
let_it_be_readonly(:article) { create(:article, user: user) }
let!(:user) { create(:user, :trusted) }
let!(:article) { create(:article, user: user) }
before do
# making sure there are no other enqueued jobs from other tests

View file

@ -598,7 +598,7 @@ RSpec.describe User, type: :model do
end
context "when callbacks are triggered before and after create" do
let_it_be(:user) { create(:user, email: nil) }
let(:user) { create(:user, email: nil) }
describe "#language_settings" do
it "sets correct language_settings by default" do
@ -968,8 +968,8 @@ RSpec.describe User, type: :model do
end
describe "#followed_articles" do
let_it_be(:another_user) { create(:user) }
let_it_be(:articles) { create_list(:article, 2, user: another_user) }
let!(:another_user) { create(:user) }
let!(:articles) { create_list(:article, 2, user: another_user) }
before do
user.follow(another_user)

View file

@ -1,8 +1,8 @@
require "rails_helper"
RSpec.describe Webhook::Event, type: :model do
let_it_be(:article) { create(:article) }
let_it_be(:payload) { Webhook::PayloadAdapter.new(article).hash }
let(:article) { create(:article) }
let(:payload) { Webhook::PayloadAdapter.new(article).hash }
describe "validations" do
it "raises an exception with a unknown event type" do

View file

@ -3,8 +3,8 @@ require "rails_helper"
RSpec.describe ReactionPolicy do
subject { described_class.new(user, reaction) }
let_it_be(:comment) { create(:comment, commentable: create(:article)) }
let_it_be(:reaction) { create(:reaction, reactable: comment) }
let(:comment) { create(:comment, commentable: create(:article)) }
let(:reaction) { create(:reaction, reactable: comment) }
let!(:user) { create(:user) }
context "when user is not signed in" do

View file

@ -3,12 +3,12 @@ require "rails_helper"
RSpec.describe Internal::ModeratorsQuery, type: :query do
subject { described_class.call(options: options) }
let_it_be_readonly(:user) { create(:user, :trusted, name: "Greg") }
let_it_be_readonly(:user2) { create(:user, :trusted, name: "Gregory") }
let_it_be_readonly(:user3) { create(:user, :tag_moderator, name: "Paul", comments_count: 4) }
let_it_be_readonly(:user4) { create(:user, :admin, name: "Susi", comments_count: 10) }
let_it_be_readonly(:user5) { create(:user, :trusted, :admin, name: "Beth") }
let_it_be_readonly(:user6) { create(:user, :admin, name: "Jean", comments_count: 5) }
let!(:user) { create(:user, :trusted, name: "Greg") }
let(:user2) { create(:user, :trusted, name: "Gregory") }
let!(:user3) { create(:user, :tag_moderator, name: "Paul", comments_count: 4) }
let!(:user4) { create(:user, :admin, name: "Susi", comments_count: 10) }
let(:user5) { create(:user, :trusted, :admin, name: "Beth") }
let(:user6) { create(:user, :admin, name: "Jean", comments_count: 5) }
describe ".call" do
context "when no arguments are given" do

View file

@ -3,12 +3,12 @@ require "rails_helper"
RSpec.describe Internal::UsersQuery, type: :query do
subject { described_class.call(options: options) }
let_it_be_readonly(:user) { create(:user, :trusted, name: "Greg") }
let_it_be_readonly(:user2) { create(:user, :trusted, name: "Gregory") }
let_it_be_readonly(:user3) { create(:user, :tag_moderator, name: "Paul") }
let_it_be_readonly(:user4) { create(:user, :admin, name: "Susi") }
let_it_be_readonly(:user5) { create(:user, :trusted, :admin, name: "Beth") }
let_it_be_readonly(:user6) { create(:user, :super_admin, name: "Jean") }
let!(:user) { create(:user, :trusted, name: "Greg") }
let!(:user2) { create(:user, :trusted, name: "Gregory") }
let!(:user3) { create(:user, :tag_moderator, name: "Paul") }
let!(:user4) { create(:user, :admin, name: "Susi") }
let!(:user5) { create(:user, :trusted, :admin, name: "Beth") }
let!(:user6) { create(:user, :super_admin, name: "Jean") }
describe ".call" do
context "when no arguments are given" do

View file

@ -13,9 +13,6 @@ abort("The Rails environment is running in production mode!") if Rails.env.produ
require "pundit/matchers"
require "pundit/rspec"
require "webmock/rspec"
require "test_prof/recipes/rspec/before_all"
require "test_prof/recipes/rspec/let_it_be"
require "test_prof/recipes/rspec/sample"
require "sidekiq/testing"
require "validate_url/rspec_matcher"

View file

@ -1,12 +1,15 @@
require "rails_helper"
RSpec.describe "Api::V0::Articles", type: :request do
let_it_be_readonly(:organization) { create(:organization) } # not used by every spec but lower times overall
let_it_be_readonly(:tag) { create(:tag, name: "discuss") }
let_it_be_changeable(:article) { create(:article, featured: true, tags: "discuss") }
let(:organization) { create(:organization) } # not used by every spec but lower times overall
let(:tag) { create(:tag, name: "discuss") }
let(:article) { create(:article, featured: true, tags: "discuss") }
before { stub_const("FlareTag::FLARE_TAG_IDS_HASH", { "discuss" => tag.id }) }
describe "GET /api/articles" do
before { article }
it "returns CORS headers" do
origin = "http://example.com"
get api_articles_path, headers: { "origin": origin }
@ -425,8 +428,8 @@ RSpec.describe "Api::V0::Articles", type: :request do
end
context "when request is authenticated" do
let_it_be(:user) { create(:user) }
let_it_be(:access_token) { create :doorkeeper_access_token, resource_owner: user, scopes: "public read_articles" }
let(:user) { create(:user) }
let(:access_token) { create :doorkeeper_access_token, resource_owner: user, scopes: "public read_articles" }
it "works with bearer authorization" do
headers = { "authorization" => "Bearer #{access_token.token}", "content-type" => "application/json" }

View file

@ -1,15 +1,15 @@
require "rails_helper"
RSpec.describe "Api::V0::Comments", type: :request do
let_it_be(:article) { create(:article) }
let_it_be(:root_comment) { create(:comment, commentable: article) }
let_it_be_changeable(:child_comment) do
let(:article) { create(:article) }
let!(:root_comment) { create(:comment, commentable: article) }
let!(:child_comment) do
create(:comment, commentable: article, parent: root_comment)
end
let_it_be(:grandchild_comment) do
let!(:grandchild_comment) do
create(:comment, commentable: article, parent: child_comment)
end
let_it_be(:great_grandchild_comment) do
let!(:great_grandchild_comment) do
create(:comment, commentable: article, parent: grandchild_comment)
end

View file

@ -1,10 +1,10 @@
require "rails_helper"
RSpec.describe "Api::V0::Listings", type: :request do
let_it_be_readonly(:cfp_category) do
let(:cfp_category) do
create(:listing_category, :cfp)
end
let_it_be_readonly(:edu_category) do
let(:edu_category) do
create(:listing_category)
end
@ -155,7 +155,7 @@ RSpec.describe "Api::V0::Listings", type: :request do
end
context "when unauthorized" do
let_it_be_readonly(:headers) { { "api-key" => "invalid api key" } }
let(:headers) { { "api-key" => "invalid api key" } }
it "returns a published listing" do
listing.update(published: true)

View file

@ -57,8 +57,8 @@ RSpec.describe "Api::V0::Users", type: :request do
end
context "when request is authenticated" do
let_it_be(:user) { create(:user) }
let_it_be(:access_token) { create(:doorkeeper_access_token, resource_owner: user, scopes: "public") }
let(:user) { create(:user) }
let(:access_token) { create(:doorkeeper_access_token, resource_owner: user, scopes: "public") }
it "returns the correct json representation of the user", :aggregate_failures do
get me_api_users_path, params: { access_token: access_token.token }

View file

@ -1,8 +1,8 @@
require "rails_helper"
RSpec.describe "VideoPlayerShow", type: :request do
let_it_be(:user) { create(:user) }
let_it_be(:video_article) { create(:article, user: user) }
let(:user) { create(:user) }
let(:video_article) { create(:article, user: user) }
describe "GET /:slug (video articles)" do
before do

View file

@ -1,10 +1,11 @@
require "rails_helper"
RSpec.describe "Events", type: :request do
let_it_be(:event) { create(:event, published: true) }
let(:event) { create(:event, published: true) }
describe "GET events" do
it "returns index page" do
event
get "/events"
expect(response.body).to include("#{community_name} EVENTS")
expect(response.body).to include(event.title)

View file

@ -1,10 +1,10 @@
require "rails_helper"
RSpec.describe "/internal/config", type: :request do
let_it_be(:user) { create(:user) }
let_it_be(:admin) { create(:user, :super_admin) }
let_it_be(:admin_plus_config) { create(:user, :super_plus_single_resource_admin, resource: Config) }
let_it_be(:confirmation_message) do
let(:user) { create(:user) }
let(:admin) { create(:user, :super_admin) }
let(:admin_plus_config) { create(:user, :super_plus_single_resource_admin, resource: Config) }
let(:confirmation_message) do
"My username is @#{admin_plus_config.username} and this action is 100% safe and appropriate."
end

View file

@ -1,8 +1,8 @@
require "rails_helper"
RSpec.describe "/internal/listings", type: :request do
let_it_be(:admin) { create(:user, :super_admin) }
let_it_be(:listing) { create(:listing, user_id: admin.id) }
let(:admin) { create(:user, :super_admin) }
let!(:listing) { create(:listing, user_id: admin.id) }
before do
allow(CacheBuster).to receive(:bust_listings)

View file

@ -1,7 +1,7 @@
require "rails_helper"
RSpec.describe "/listings", type: :request do
let_it_be_readonly(:edu_category) do
let(:edu_category) do
create(:listing_category, cost: 1)
end
let(:user) { create(:user) }
@ -147,7 +147,7 @@ RSpec.describe "/listings", type: :request do
create_list(:credit, 25, user: user)
end
let_it_be_readonly(:cfp_category) { create(:listing_category, :cfp) }
let(:cfp_category) { create(:listing_category, :cfp) }
context "when the listing is invalid" do
let(:invalid_params) do

View file

@ -3,10 +3,10 @@ require "rails_helper"
RSpec.describe "NotificationsIndex", type: :request do
include ActionView::Helpers::DateHelper
let_it_be_readonly(:dev_account) { create(:user) }
let_it_be_readonly(:mascot_account) { create(:user) }
let_it_be_changeable(:user) { create(:user) }
let_it_be_changeable(:organization) { create(:organization) }
let(:dev_account) { create(:user) }
let(:mascot_account) { create(:user) }
let(:user) { create(:user) }
let(:organization) { create(:organization) }
before do
allow(User).to receive(:dev_account).and_return(dev_account)

View file

@ -18,8 +18,8 @@ RSpec.describe "Pages", type: :request do
end
context "when json template" do
let_it_be(:json_text) { "{\"foo\": \"bar\"}" }
let_it_be(:page) do
let(:json_text) { "{\"foo\": \"bar\"}" }
let(:page) do
create(:page, title: "sample_data", template: "json", body_json: json_text, body_html: nil, body_markdown: nil)
end
@ -143,7 +143,7 @@ RSpec.describe "Pages", type: :request do
end
describe "GET /checkin" do
let_it_be(:user) { create(:user, username: "codenewbiestaff") }
let(:user) { create(:user, username: "codenewbiestaff") }
it "redirects to the latest CodeNewbie staff thread" do
earlier_staff_thread = create(:article, user: user, tags: "staff")

View file

@ -5,8 +5,8 @@ RSpec.describe "Reactions", type: :request do
let(:article) { create(:article, user: user) }
let(:comment) { create(:comment, commentable: article) }
let_it_be(:max_age) { 1.day.to_i }
let_it_be(:stale_if_error) { 26_400 }
let(:max_age) { 1.day.to_i }
let(:stale_if_error) { 26_400 }
describe "GET /reactions?article_id=:article_id" do
before do
@ -269,7 +269,7 @@ RSpec.describe "Reactions", type: :request do
end
context "when signed in as admin" do
let_it_be(:admin) { create(:user, :admin) }
let(:admin) { create(:user, :admin) }
before do
sign_in admin

View file

@ -129,7 +129,7 @@ RSpec.describe "StoriesIndex", type: :request do
end
context "with campaign hero" do
let_it_be_readonly(:hero_html) do
let!(:hero_html) do
create(
:html_variant,
group: "campaign",

View file

@ -1,9 +1,9 @@
require "rails_helper"
RSpec.describe "StoriesShow", type: :request do
let_it_be(:user) { create(:user) }
let_it_be(:org, reload: true) { create(:organization) }
let_it_be(:article, reload: true) { create(:article, user: user) }
let(:user) { create(:user) }
let(:org) { create(:organization) }
let(:article) { create(:article, user: user) }
describe "GET /:username/:slug (articles)" do
it "renders proper title" do

View file

@ -1,7 +1,7 @@
require "rails_helper"
RSpec.describe "UserShow", type: :request do
let_it_be(:user) { create(:user, :with_all_info, email_public: true) }
let(:user) { create(:user, :with_all_info, email_public: true) }
describe "GET /:slug (user)" do
it "returns a 200 status when navigating to the user's page" do

View file

@ -5,13 +5,13 @@ RSpec.describe Broadcasts::WelcomeNotification::Generator, type: :service do
let!(:welcome_thread) { create(:article, user: mascot_account, published: true, tags: "welcome") }
# welcome_broadcast is explicitly not readonly so that we can test against an inactive broadcast
let_it_be(:welcome_broadcast) { create(:welcome_broadcast) }
let_it_be_readonly(:twitter_connect_broadcast) { create(:twitter_connect_broadcast) }
let_it_be_readonly(:github_connect_broadcast) { create(:github_connect_broadcast) }
let_it_be_readonly(:customize_feed_broadcast) { create(:customize_feed_broadcast) }
let_it_be_readonly(:discuss_and_ask_broadcast) { create(:discuss_and_ask_broadcast) }
let_it_be_readonly(:customize_ux_broadcast) { create(:customize_ux_broadcast) }
let_it_be_readonly(:download_app_broadcast) { create(:download_app_broadcast) }
let!(:welcome_broadcast) { create(:welcome_broadcast) }
let!(:twitter_connect_broadcast) { create(:twitter_connect_broadcast) }
let!(:github_connect_broadcast) { create(:github_connect_broadcast) }
let!(:customize_feed_broadcast) { create(:customize_feed_broadcast) }
let!(:discuss_and_ask_broadcast) { create(:discuss_and_ask_broadcast) }
let!(:customize_ux_broadcast) { create(:customize_ux_broadcast) }
let!(:download_app_broadcast) { create(:download_app_broadcast) }
before do
omniauth_mock_providers_payload
@ -225,8 +225,8 @@ RSpec.describe Broadcasts::WelcomeNotification::Generator, type: :service do
describe "#send_discuss_and_ask_notification" do
let!(:user) { create(:user, :with_identity, identities: %w[twitter github], created_at: 6.days.ago) }
let_it_be_readonly(:ask_question_broadcast) { create(:ask_question_broadcast) }
let_it_be_readonly(:start_discussion_broadcast) { create(:start_discussion_broadcast) }
let!(:ask_question_broadcast) { create(:ask_question_broadcast) }
let!(:start_discussion_broadcast) { create(:start_discussion_broadcast) }
context "with a user who has asked a question" do
it "generates the correct broadcast type and sends the notification to the user" do

View file

@ -1,7 +1,7 @@
require "rails_helper"
RSpec.describe Notifications::Update, type: :service do
let_it_be(:article) { create(:article) }
let(:article) { create(:article) }
context "when updating notifications of an article" do
it "updates all notifications with the same action", :aggregate_failures do
@ -37,8 +37,8 @@ RSpec.describe Notifications::Update, type: :service do
end
context "when updating notifications of an organization article" do
let_it_be(:organization) { create(:organization) }
let_it_be(:article) { create(:article, organization: organization) }
let(:organization) { create(:organization) }
let(:article) { create(:article, organization: organization) }
it "updates all notifications with the same action", :aggregate_failures do
notifications = create_list(:notification, 2, notifiable: article, action: "Published")
@ -73,7 +73,7 @@ RSpec.describe Notifications::Update, type: :service do
end
context "when updating notifications on a comment" do
let_it_be(:comment) { create(:comment, commentable: article) }
let(:comment) { create(:comment, commentable: article) }
it "updates all notifications", :aggregate_failures do
notifications = create_list(:notification, 2, notifiable: comment)
@ -94,7 +94,7 @@ RSpec.describe Notifications::Update, type: :service do
end
context "when updating notifications on a reaction" do
let_it_be(:reaction) { create(:reaction, reactable: article) }
let(:reaction) { create(:reaction, reactable: article) }
it "does not update notifications", :aggregate_failures do
notifications = create_list(:notification, 2, notifiable: reaction)

View file

@ -164,7 +164,7 @@ RSpec.describe Users::Delete, type: :service do
end
context "when cleaning up chat channels" do
let_it_be(:other_user) { create(:user) }
let(:other_user) { create(:user) }
it "deletes the user's private chat channels" do
chat_channel = ChatChannel.create_with_users(users: [user, other_user])

View file

@ -1,19 +0,0 @@
# see <https://test-prof.evilmartians.io/#/let_it_be>
TestProf::LetItBe.configure do |config|
config.register_modifier :readonly do |record, val|
next record unless record.is_a?(::ActiveRecord::Base)
next record unless val
record.tap(&:readonly!)
end
# marks the record as readonly
config.alias_to :let_it_be_readonly, readonly: true
# reloads the record from the DB, with `record.reload`
config.alias_to :let_it_be_changeable, reload: true
# creates a new instance of the same record in memory
config.alias_to :let_it_be_refindable, refind: true
end

View file

@ -1,9 +1,9 @@
require "rails_helper"
RSpec.describe "Views an article", type: :system do
let_it_be(:user) { create(:user) }
let_it_be(:moderator) { create(:user, :trusted) }
let_it_be(:article, reload: true) { create(:article, :with_notification_subscription, user: user) }
let(:user) { create(:user) }
let(:moderator) { create(:user, :trusted) }
let(:article) { create(:article, :with_notification_subscription, user: user) }
let(:timestamp) { "2019-03-04T10:00:00Z" }
before do

View file

@ -1,9 +1,9 @@
require "rails_helper"
RSpec.describe "Editing with an editor", type: :system, js: true do
let_it_be(:template) { file_fixture("article_published.txt").read }
let_it_be(:user) { create(:user) }
let_it_be(:article, reload: true) { create(:article, user: user, body_markdown: template) }
let(:template) { file_fixture("article_published.txt").read }
let(:user) { create(:user) }
let(:article) { create(:article, user: user, body_markdown: template) }
before do
sign_in user

View file

@ -4,7 +4,7 @@ RSpec.describe "Broadcasts tasks", type: :task do
let(:service) { Broadcasts::WelcomeNotification::Generator }
let(:one_week_from_today) { 1.week.since }
let_it_be_readonly(:default_config_date) { SiteConfig.welcome_notifications_live_at }
let(:default_config_date) { SiteConfig.welcome_notifications_live_at }
before do
# Set date to a week from today

View file

@ -5,11 +5,11 @@ require "exifr/jpeg"
describe ArticleImageUploader, type: :uploader do
include CarrierWave::Test::Matchers
let_it_be(:image_jpg) { fixture_file_upload("files/800x600.jpg", "image/jpeg") }
let_it_be(:image_png) { fixture_file_upload("files/800x600.png", "image/png") }
let_it_be(:image_webp) { fixture_file_upload("files/800x600.webp", "image/webp") }
let_it_be(:image_with_gps) { fixture_file_upload("files/image_gps_data.jpg", "image/jpeg") }
let_it_be(:high_frame_count) { fixture_file_upload("files/high_frame_count.gif", "image/gif") }
let(:image_jpg) { fixture_file_upload("files/800x600.jpg", "image/jpeg") }
let(:image_png) { fixture_file_upload("files/800x600.png", "image/png") }
let(:image_webp) { fixture_file_upload("files/800x600.webp", "image/webp") }
let(:image_with_gps) { fixture_file_upload("files/image_gps_data.jpg", "image/jpeg") }
let(:high_frame_count) { fixture_file_upload("files/high_frame_count.gif", "image/gif") }
# we need a new uploader before each test, and since the uploader is not a model
# we can recreate it quickly in memory with `let!`

View file

@ -5,12 +5,12 @@ require "exifr/jpeg"
describe BadgeUploader, type: :uploader do
include CarrierWave::Test::Matchers
let_it_be(:image_jpg) { fixture_file_upload("files/800x600.jpg", "image/jpeg") }
let_it_be(:image_png) { fixture_file_upload("files/800x600.png", "image/png") }
let_it_be(:image_webp) { fixture_file_upload("files/800x600.webp", "image/webp") }
let_it_be(:image_with_gps) { fixture_file_upload("files/image_gps_data.jpg", "image/jpeg") }
let(:image_jpg) { fixture_file_upload("files/800x600.jpg", "image/jpeg") }
let(:image_png) { fixture_file_upload("files/800x600.png", "image/png") }
let(:image_webp) { fixture_file_upload("files/800x600.webp", "image/webp") }
let(:image_with_gps) { fixture_file_upload("files/image_gps_data.jpg", "image/jpeg") }
let_it_be_changeable(:badge) { create(:badge) }
let(:badge) { create(:badge) }
# we need a new uploader before each test, and since the uploader is not a model
# we can recreate it quickly in memory with `let!`

View file

@ -5,12 +5,12 @@ require "exifr/jpeg"
describe CoverImageUploader, type: :uploader do
include CarrierWave::Test::Matchers
let_it_be(:image_jpg) { fixture_file_upload("files/800x600.jpg", "image/jpeg") }
let_it_be(:image_png) { fixture_file_upload("files/800x600.png", "image/png") }
let_it_be(:image_webp) { fixture_file_upload("files/800x600.webp", "image/webp") }
let_it_be(:image_with_gps) { fixture_file_upload("files/image_gps_data.jpg", "image/jpeg") }
let(:image_jpg) { fixture_file_upload("files/800x600.jpg", "image/jpeg") }
let(:image_png) { fixture_file_upload("files/800x600.png", "image/png") }
let(:image_webp) { fixture_file_upload("files/800x600.webp", "image/webp") }
let(:image_with_gps) { fixture_file_upload("files/image_gps_data.jpg", "image/jpeg") }
let_it_be_changeable(:event) { create(:event) }
let(:event) { create(:event) }
# we need a new uploader before each test, and since the uploader is not a model
# we can recreate it quickly in memory with `let!`

View file

@ -5,13 +5,13 @@ require "exifr/jpeg"
describe ProfileImageUploader, type: :uploader do
include CarrierWave::Test::Matchers
let_it_be(:mounted_as) { :profile_image }
let_it_be(:image_jpg) { fixture_file_upload("files/800x600.jpg", "image/jpeg") }
let_it_be(:image_png) { fixture_file_upload("files/800x600.png", "image/png") }
let_it_be(:image_webp) { fixture_file_upload("files/800x600.webp", "image/webp") }
let_it_be(:image_with_gps) { fixture_file_upload("files/image_gps_data.jpg", "image/jpeg") }
let(:mounted_as) { :profile_image }
let(:image_jpg) { fixture_file_upload("files/800x600.jpg", "image/jpeg") }
let(:image_png) { fixture_file_upload("files/800x600.png", "image/png") }
let(:image_webp) { fixture_file_upload("files/800x600.webp", "image/webp") }
let(:image_with_gps) { fixture_file_upload("files/image_gps_data.jpg", "image/jpeg") }
let_it_be_changeable(:user) { create(:user) }
let(:user) { create(:user) }
# we need a new uploader before each test, and since the uploader is not a model
# we can recreate it quickly in memory with `let!`

View file

@ -13,9 +13,11 @@ RSpec.describe Articles::ScoreCalcWorker, type: :worker do
end
context "with article" do
let_it_be(:article) { create(:article) }
let_it_be(:comment) { create(:comment, commentable: article, score: 5) }
let_it_be(:second_comment) { create(:comment, commentable: article, score: 7) }
let(:article) { create(:article) }
let(:comment) { create(:comment, commentable: article, score: 5) }
let(:second_comment) { create(:comment, commentable: article, score: 7) }
before { [comment, second_comment] }
it "updates article scores", :aggregate_failures do
allow(Article).to receive(:find_by).and_return(article)

View file

@ -5,7 +5,7 @@ RSpec.describe Articles::UpdateMainImageBackgroundHexWorker, type: :job do
describe "#perform" do
context "with article" do
let_it_be(:article) { create(:article) }
let(:article) { create(:article) }
it "updates articles main image background hex" do
color_from_image = double

View file

@ -17,7 +17,7 @@ RSpec.describe BadgeAchievements::SendEmailNotificationWorker, type: :worker do
end
context "with badge achievement" do
let_it_be(:badge_achievement) { double }
let(:badge_achievement) { double }
before do
allow(BadgeAchievement).to receive(:find_by).with(id: 1).and_return(badge_achievement)

View file

@ -7,8 +7,8 @@ RSpec.describe Comments::CalculateScoreWorker, type: :worker do
let(:worker) { subject }
context "with comment" do
let_it_be(:article) { create(:article) }
let_it_be(:comment) { create(:comment, commentable: article) }
let(:article) { create(:article) }
let(:comment) { create(:comment, commentable: article) }
before do
allow(BlackBox).to receive(:comment_quality_score).and_return(7)

View file

@ -7,8 +7,8 @@ RSpec.describe Comments::CreateFirstReactionWorker, type: :worker do
let(:worker) { subject }
context "with comment" do
let_it_be(:article) { create(:article) }
let_it_be(:comment) { create(:comment, commentable: article) }
let(:article) { create(:article) }
let(:comment) { create(:comment, commentable: article) }
it "creates a first reaction" do
expect do

View file

@ -16,7 +16,7 @@ RSpec.describe Comments::SendEmailNotificationWorker, type: :worker do
end
context "with comment" do
let_it_be(:comment) { double }
let(:comment) { double }
before do
allow(Comment).to receive(:find_by).with(id: 1).and_return(comment)

View file

@ -2,9 +2,9 @@ require "rails_helper"
require Rails.root.join("app/models/data_update_script.rb")
RSpec.describe DataUpdateWorker, type: :worker do
let_it_be(:test_directory) { Rails.root.join("spec/support/fixtures/data_update_scripts") }
let_it_be(:worker) { described_class.new }
let_it_be(:statuses) { %w[working succeeded] }
let(:test_directory) { Rails.root.join("spec/support/fixtures/data_update_scripts") }
let(:worker) { described_class.new }
let(:statuses) { %w[working succeeded] }
before do
stub_const "DataUpdateScript::DIRECTORY", test_directory

View file

@ -7,9 +7,9 @@ RSpec.describe Follows::CreateChatChannelWorker, type: :worker do
let(:worker) { subject }
context "with follow" do
let_it_be(:user) { create(:user) }
let_it_be(:user2) { create(:user) }
let_it_be(:follow) { create(:follow, follower: user, followable: user2) }
let(:user) { create(:user) }
let(:user2) { create(:user) }
let!(:follow) { create(:follow, follower: user, followable: user2) }
it "creates a chat channel when mutual followers" do
follow2 = create(:follow, follower: user2, followable: user)

View file

@ -6,8 +6,8 @@ RSpec.describe Follows::SendEmailNotificationWorker, type: :worker do
let(:mailer) { double }
let(:message_delivery) { double }
let_it_be(:user) { create(:user) }
let_it_be(:user2) { create(:user) }
let(:user) { create(:user) }
let(:user2) { create(:user) }
describe "#perform" do
before do

View file

@ -1,16 +1,30 @@
require "rails_helper"
RSpec.describe Metrics::RecordDailyUsageWorker, type: :worker do
let(:feedback_message) { create(:feedback_message, :abuse_report) }
let(:reaction) { create(:reaction, category: "vomit", user: user, reactable: first_article) }
let(:user) { create(:user, :trusted) }
let(:third_article) { create(:article, score: 38, nth_published_by_author: 3, comment_score: 2) }
let(:second_article) { create(:article, score: 5, nth_published_by_author: 2, comment_score: 0) }
let(:first_article) { create(:article, score: 15, nth_published_by_author: 1, comment_score: 25) }
let(:third_user) { create(:user, comments_count: 0) }
let(:second_user) { create(:user, comments_count: 2) }
let(:first_user) { create(:user, comments_count: 1) }
before do
feedback_message
reaction
user
third_article
second_article
first_article
third_user
second_user
first_user
end
include_examples "#enqueues_on_correct_queue", "low_priority", 1
let_it_be(:first_user) { create(:user, comments_count: 1) }
let_it_be(:second_user) { create(:user, comments_count: 2) }
let_it_be(:third_user) { create(:user, comments_count: 0) }
let_it_be(:first_article) { create(:article, score: 15, nth_published_by_author: 1, comment_score: 25) }
let_it_be(:second_article) { create(:article, score: 5, nth_published_by_author: 2, comment_score: 0) }
let_it_be(:third_article) { create(:article, score: 38, nth_published_by_author: 3, comment_score: 2) }
let_it_be(:user) { create(:user, :trusted) }
let_it_be(:reaction) { create(:reaction, category: "vomit", user: user, reactable: first_article) }
let_it_be(:feedback_message) { create(:feedback_message, :abuse_report) }
describe "#perform" do
before do
allow(DatadogStatsClient).to receive(:count)

View file

@ -7,7 +7,7 @@ RSpec.describe Users::RecordFieldTestEventWorker, type: :worker do
describe "#perform" do
let(:worker) { subject }
let_it_be(:user) { create(:user) }
let(:user) { create(:user) }
context "with user who is part of field test" do
before do