DEV: Prefabrication (test optimization) (#7414)

* Introduced fab!, a helper that creates database state for a group

It's almost identical to let_it_be, except:

 1. It creates a new object for each test by default,
 2. You can disable it using PREFABRICATION=0
This commit is contained in:
Daniel Waterworth
2019-05-07 03:12:20 +00:00
committed by Sam
parent 329969ea20
commit e219588142
258 changed files with 1402 additions and 1364 deletions

View File

@ -368,7 +368,7 @@ describe Auth::DefaultCurrentUserProvider do
end
describe "#current_user" do
let(:user) { Fabricate(:user) }
fab!(:user) { Fabricate(:user) }
let(:unhashed_token) do
new_provider = provider('/')
@ -605,7 +605,7 @@ describe Auth::DefaultCurrentUserProvider do
end
context "user api" do
let :user do
fab! :user do
Fabricate(:user)
end

View File

@ -49,7 +49,7 @@ describe Auth::FacebookAuthenticator do
end
context 'description_for_user' do
let(:user) { Fabricate(:user) }
fab!(:user) { Fabricate(:user) }
it 'returns empty string if no entry for user' do
expect(authenticator.description_for_user(user)).to eq("")
@ -62,7 +62,7 @@ describe Auth::FacebookAuthenticator do
end
context 'revoke' do
let(:user) { Fabricate(:user) }
fab!(:user) { Fabricate(:user) }
let(:authenticator) { Auth::FacebookAuthenticator.new }
it 'raises exception if no entry for user' do

View File

@ -23,7 +23,7 @@ end
describe Auth::GithubAuthenticator do
let(:authenticator) { described_class.new }
let(:user) { Fabricate(:user) }
fab!(:user) { Fabricate(:user) }
context 'after_authenticate' do
let(:data) do
@ -251,7 +251,7 @@ describe Auth::GithubAuthenticator do
end
context 'revoke' do
let(:user) { Fabricate(:user) }
fab!(:user) { Fabricate(:user) }
let(:authenticator) { Auth::GithubAuthenticator.new }
it 'raises exception if no entry for user' do
@ -271,8 +271,8 @@ describe Auth::GithubAuthenticator do
let(:job_klass) { Jobs::DownloadAvatarFromUrl }
context 'when user has a custom avatar' do
let(:user_avatar) { Fabricate(:user_avatar, custom_upload: Fabricate(:upload)) }
let(:user_with_custom_avatar) { Fabricate(:user, user_avatar: user_avatar) }
fab!(:user_avatar) { Fabricate(:user_avatar, custom_upload: Fabricate(:upload)) }
fab!(:user_with_custom_avatar) { Fabricate(:user, user_avatar: user_avatar) }
it 'does not enqueue a download_avatar_from_url job' do
expect {

View File

@ -116,7 +116,7 @@ describe Auth::GoogleOAuth2Authenticator do
end
context 'revoke' do
let(:user) { Fabricate(:user) }
fab!(:user) { Fabricate(:user) }
let(:authenticator) { Auth::GoogleOAuth2Authenticator.new }
it 'raises exception if no entry for user' do

View File

@ -42,7 +42,7 @@ describe Auth::InstagramAuthenticator do
end
context 'revoke' do
let(:user) { Fabricate(:user) }
fab!(:user) { Fabricate(:user) }
let(:authenticator) { Auth::InstagramAuthenticator.new }
it 'raises exception if no entry for user' do

View File

@ -54,8 +54,8 @@ describe Auth::ManagedAuthenticator do
end
describe 'connecting to another user account' do
let(:user1) { Fabricate(:user) }
let(:user2) { Fabricate(:user) }
fab!(:user1) { Fabricate(:user) }
fab!(:user2) { Fabricate(:user) }
before { UserAssociatedAccount.create!(user: user1, provider_name: 'myauth', provider_uid: "1234") }
it 'works by default' do
@ -138,7 +138,7 @@ describe Auth::ManagedAuthenticator do
end
describe "avatar on update" do
let(:user) { Fabricate(:user) }
fab!(:user) { Fabricate(:user) }
let!(:associated) { UserAssociatedAccount.create!(user: user, provider_name: 'myauth', provider_uid: "1234") }
it "schedules the job upon update correctly" do
@ -159,7 +159,7 @@ describe Auth::ManagedAuthenticator do
end
describe "profile on update" do
let(:user) { Fabricate(:user) }
fab!(:user) { Fabricate(:user) }
let!(:associated) { UserAssociatedAccount.create!(user: user, provider_name: 'myauth', provider_uid: "1234") }
it "updates the user's location and bio, unless already set" do
@ -183,7 +183,7 @@ describe Auth::ManagedAuthenticator do
end
describe "email update" do
let(:user) { Fabricate(:user) }
fab!(:user) { Fabricate(:user) }
let!(:associated) { UserAssociatedAccount.create!(user: user, provider_name: 'myauth', provider_uid: "1234") }
it "updates the user's email if currently invalid" do
@ -212,7 +212,7 @@ describe Auth::ManagedAuthenticator do
end
describe "avatar on create" do
let(:user) { Fabricate(:user) }
fab!(:user) { Fabricate(:user) }
let!(:association) { UserAssociatedAccount.create!(provider_name: 'myauth', provider_uid: "1234") }
it "doesn't schedule with no image" do
@ -229,7 +229,7 @@ describe Auth::ManagedAuthenticator do
end
describe "profile on create" do
let(:user) { Fabricate(:user) }
fab!(:user) { Fabricate(:user) }
let!(:association) { UserAssociatedAccount.create!(provider_name: 'myauth', provider_uid: "1234") }
it "doesn't explode without profile" do
@ -248,7 +248,7 @@ describe Auth::ManagedAuthenticator do
end
describe 'description_for_user' do
let(:user) { Fabricate(:user) }
fab!(:user) { Fabricate(:user) }
it 'returns empty string if no entry for user' do
expect(authenticator.description_for_user(user)).to eq("")
@ -265,7 +265,7 @@ describe Auth::ManagedAuthenticator do
end
describe 'revoke' do
let(:user) { Fabricate(:user) }
fab!(:user) { Fabricate(:user) }
it 'raises exception if no entry for user' do
expect { authenticator.revoke(user) }.to raise_error(Discourse::NotFound)

View File

@ -38,7 +38,7 @@ describe Auth::OpenIdAuthenticator do
end
context 'revoke' do
let(:user) { Fabricate(:user) }
fab!(:user) { Fabricate(:user) }
let(:authenticator) { Auth::OpenIdAuthenticator.new("test", "id", "enable_yahoo_logins", trusted: true) }
it 'raises exception if no entry for user' do

View File

@ -54,7 +54,7 @@ describe Auth::TwitterAuthenticator do
end
context 'revoke' do
let(:user) { Fabricate(:user) }
fab!(:user) { Fabricate(:user) }
let(:authenticator) { Auth::TwitterAuthenticator.new }
it 'raises exception if no entry for user' do