mirror of
https://github.com/discourse/discourse.git
synced 2025-01-20 19:59:44 +08:00
a040f72f96
Previously we were checking truthiness in some places, and `== true` in others. That can lead to some inconsistent UX where the interface says the email is valid, but account creation fails. This commit ensures values are boolean when set, and raises an error for other value types. If this safety check is triggered, it means the specific auth provider needs to be updated to pass booleans.
80 lines
2.3 KiB
Ruby
80 lines
2.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'rails_helper'
|
|
|
|
def github_auth(email_valid)
|
|
{
|
|
email: "user53@discourse.org",
|
|
username: "joedoe546",
|
|
email_valid: email_valid,
|
|
omit_username: nil,
|
|
name: "Joe Doe 546",
|
|
authenticator_name: "github",
|
|
extra_data: {
|
|
provider: "github",
|
|
uid: "100"
|
|
},
|
|
skip_email_validation: false
|
|
}
|
|
end
|
|
|
|
describe UserAuthenticator do
|
|
context "#finish" do
|
|
fab!(:group) { Fabricate(:group, automatic_membership_email_domains: "discourse.org") }
|
|
|
|
before do
|
|
SiteSetting.enable_github_logins = true
|
|
end
|
|
|
|
it "confirms email and adds the user to appropraite groups based on email" do
|
|
user = Fabricate(:user, email: "user53@discourse.org")
|
|
expect(group.usernames).not_to include(user.username)
|
|
|
|
authentication = github_auth(true)
|
|
|
|
UserAuthenticator.new(user, authentication: authentication).finish
|
|
expect(user.email_confirmed?).to be_truthy
|
|
expect(group.usernames).to include(user.username)
|
|
end
|
|
|
|
it "doesn't confirm email if email is invalid" do
|
|
user = Fabricate(:user, email: "user53@discourse.org")
|
|
|
|
authentication = github_auth(false)
|
|
|
|
UserAuthenticator.new(user, authentication: authentication).finish
|
|
expect(user.email_confirmed?).to be_falsey
|
|
expect(group.usernames).not_to include(user.username)
|
|
end
|
|
|
|
it "doesn't confirm email if it was changed" do
|
|
user = Fabricate(:user, email: "changed@discourse.org")
|
|
|
|
authentication = github_auth(true)
|
|
|
|
UserAuthenticator.new(user, authentication: authentication).finish
|
|
expect(user.email_confirmed?).to be_falsey
|
|
expect(group.usernames).not_to include(user.username)
|
|
end
|
|
|
|
it "clears the authentication info from the session" do
|
|
user = Fabricate(:user, email: "user53@discourse.org")
|
|
session = { authentication: github_auth(true) }
|
|
|
|
UserAuthenticator.new(user, session).finish
|
|
expect(user.email_confirmed?).to be_truthy
|
|
|
|
expect(session[:authentication]).to eq(nil)
|
|
end
|
|
|
|
it "raises an error for non-boolean values" do
|
|
user = Fabricate(:user, email: "user53@discourse.org")
|
|
session = { authentication: github_auth('string') }
|
|
|
|
expect do
|
|
UserAuthenticator.new(user, session).finish
|
|
end.to raise_error ArgumentError
|
|
end
|
|
end
|
|
end
|