require 'rails_helper' # In the ghetto ... getting the spec to run in autospec # thing is we need to load up all auth really early pre-fork # it means that the require is not going to get a new copy Auth.send(:remove_const, :GithubAuthenticator) load 'auth/github_authenticator.rb' describe Auth::GithubAuthenticator do context 'after_authenticate' do it 'can authenticate and create a user record for already existing users' do user = Fabricate(:user) hash = { extra: { all_emails: [{ email: user.email, primary: true, verified: true, }] }, info: { email: user.email, email_verified: true, nickname: user.username, name: user.name, }, uid: "100" } authenticator = Auth::GithubAuthenticator.new result = authenticator.after_authenticate(hash) expect(result.user.id).to eq(user.id) expect(result.username).to eq(user.username) expect(result.name).to eq(user.name) expect(result.email).to eq(user.email) expect(result.email_valid).to eq(true) end it 'will not authenticate for already existing users with an unverified email' do user = Fabricate(:user) hash = { extra: { all_emails: [{ email: user.email, primary: true, verified: false, }] }, info: { email: user.email, email_verified: false, nickname: user.username, name: user.name, }, uid: "100" } authenticator = Auth::GithubAuthenticator.new result = authenticator.after_authenticate(hash) expect(result.user).to eq(nil) expect(result.username).to eq(user.username) expect(result.name).to eq(user.name) expect(result.email).to eq(user.email) expect(result.email_valid).to eq(false) end it 'can create a proper result for non existing users' do hash = { extra: { all_emails: [{ email: "person@example.com", primary: true, verified: true, }] }, info: { email: "person@example.com", email_verified: true, nickname: "person", name: "Person Lastname", }, uid: "100" } authenticator = Auth::GithubAuthenticator.new result = authenticator.after_authenticate(hash) expect(result.user).to eq(nil) expect(result.username).to eq(hash[:info][:nickname]) expect(result.name).to eq(hash[:info][:name]) expect(result.email).to eq(hash[:info][:email]) expect(result.email_valid).to eq(hash[:info][:email_verified]) end it 'will skip blacklisted domains for non existing users' do hash = { extra: { all_emails: [{ email: "not_allowed@blacklist.com", primary: true, verified: true, }, { email: "allowed@whitelist.com", primary: false, verified: true, }] }, info: { email: "not_allowed@blacklist.com", email_verified: true, nickname: "person", name: "Person Lastname", }, uid: "100" } authenticator = Auth::GithubAuthenticator.new SiteSetting.email_domains_blacklist = "blacklist.com" result = authenticator.after_authenticate(hash) expect(result.user).to eq(nil) expect(result.username).to eq(hash[:info][:nickname]) expect(result.name).to eq(hash[:info][:name]) expect(result.email).to eq("allowed@whitelist.com") expect(result.email_valid).to eq(true) end it 'will find whitelisted domains for non existing users' do hash = { extra: { all_emails: [{ email: "person@example.com", primary: true, verified: true, }, { email: "not_allowed@blacklist.com", primary: true, verified: true, }, { email: "allowed@whitelist.com", primary: false, verified: true, }] }, info: { email: "person@example.com", email_verified: true, nickname: "person", name: "Person Lastname", }, uid: "100" } authenticator = Auth::GithubAuthenticator.new SiteSetting.email_domains_whitelist = "whitelist.com" result = authenticator.after_authenticate(hash) expect(result.user).to eq(nil) expect(result.username).to eq(hash[:info][:nickname]) expect(result.name).to eq(hash[:info][:name]) expect(result.email).to eq("allowed@whitelist.com") expect(result.email_valid).to eq(true) end end end