mirror of
https://github.com/System-End/identity-vault.git
synced 2026-04-19 20:55:11 +00:00
165 lines
6 KiB
Ruby
165 lines
6 KiB
Ruby
require "rails_helper"
|
|
|
|
RSpec.describe "doorkeeper/authorizations/new", type: :view do
|
|
let(:address) { build_stubbed(:address, line_1: "123 Main St", city: "Burlington", state: "VT", country: "US") }
|
|
let(:identity) do
|
|
build_stubbed(:identity).tap { |i| allow(i).to receive(:primary_address).and_return(address) }
|
|
end
|
|
let(:program) { build_stubbed(:program, name: "Test App") }
|
|
let(:scopes) { Doorkeeper::OAuth::Scopes.from_string("openid email") }
|
|
let(:pre_auth) do
|
|
double(
|
|
"PreAuth",
|
|
client: double("Client", uid: program.uid, name: program.name),
|
|
scopes: scopes,
|
|
scope: scopes.to_s,
|
|
redirect_uri: "https://example.com/callback",
|
|
state: "abc123",
|
|
response_type: "code",
|
|
response_mode: nil,
|
|
nonce: nil,
|
|
code_challenge: nil,
|
|
code_challenge_method: nil
|
|
)
|
|
end
|
|
|
|
before do
|
|
assign(:pre_auth, pre_auth)
|
|
allow(view).to receive(:current_identity).and_return(identity)
|
|
allow(view).to receive(:session).and_return({ stashed_data: nil })
|
|
allow(Program).to receive(:find_by).and_return(program)
|
|
allow(view).to receive(:oauth_authorization_path).and_return("/oauth/authorize")
|
|
end
|
|
|
|
describe "scope display" do
|
|
it "shows email for email scope" do
|
|
render
|
|
expect(rendered).to include(identity.primary_email)
|
|
end
|
|
|
|
it "shows name for name scope" do
|
|
allow(pre_auth).to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("name"))
|
|
render
|
|
expect(rendered).to include(identity.first_name)
|
|
expect(rendered).to include(identity.last_name)
|
|
end
|
|
|
|
it "shows verification status for verification_status scope" do
|
|
allow(pre_auth).to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("verification_status"))
|
|
render
|
|
expect(rendered).to include(identity.verification_status.humanize)
|
|
expect(rendered).to include("YSWS eligible")
|
|
end
|
|
|
|
it "shows address for address scope" do
|
|
allow(pre_auth).to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("address"))
|
|
render
|
|
expect(rendered).to include("Burlington")
|
|
end
|
|
|
|
it "shows all basic_info fields for basic_info scope" do
|
|
allow(pre_auth).to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("basic_info"))
|
|
render
|
|
expect(rendered).to include(identity.primary_email)
|
|
expect(rendered).to include(identity.first_name)
|
|
expect(rendered).to include(identity.slack_id)
|
|
end
|
|
|
|
it "deduplicates when email and basic_info are both requested" do
|
|
allow(pre_auth).to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("email basic_info"))
|
|
render
|
|
expect(rendered.scan(identity.primary_email).count).to eq(1)
|
|
end
|
|
|
|
it "shows nothing for openid-only scope" do
|
|
allow(pre_auth).to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("openid"))
|
|
render
|
|
expect(rendered).not_to include(identity.primary_email)
|
|
expect(rendered).not_to include(identity.first_name)
|
|
end
|
|
|
|
it "falls back to i18n for unknown scopes" do
|
|
allow(pre_auth).to receive(:scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("some_future_scope"))
|
|
allow(pre_auth).to receive(:scope).and_return("some_future_scope")
|
|
render
|
|
expect(rendered).to include("Some future scope")
|
|
end
|
|
end
|
|
|
|
describe "hq official byline" do
|
|
it "shows default byline for hq_official apps without a custom byline" do
|
|
allow(program).to receive(:hq_official?).and_return(true)
|
|
allow(program).to receive(:byline).and_return(nil)
|
|
render
|
|
expect(rendered).to include("official Hack Club program")
|
|
expect(rendered).to include("Hack Club HQ")
|
|
end
|
|
|
|
it "shows custom byline when set" do
|
|
allow(program).to receive(:hq_official?).and_return(true)
|
|
allow(program).to receive(:byline).and_return("@nora, @msw, @zrl")
|
|
render
|
|
expect(rendered).to include("@nora, @msw, @zrl")
|
|
end
|
|
|
|
it "does not show byline for community apps" do
|
|
allow(program).to receive(:hq_official?).and_return(false)
|
|
allow(program).to receive(:trust_level).and_return("community_untrusted")
|
|
render
|
|
expect(rendered).not_to include("official Hack Club program")
|
|
end
|
|
end
|
|
|
|
describe "permissions display" do
|
|
it "collapses permissions behind details for hq_official apps" do
|
|
allow(program).to receive(:hq_official?).and_return(true)
|
|
allow(program).to receive(:byline).and_return(nil)
|
|
render
|
|
expect(rendered).to include("<details")
|
|
expect(rendered).to include("What data will be shared?")
|
|
end
|
|
|
|
it "shows permissions directly for non-official apps" do
|
|
allow(program).to receive(:hq_official?).and_return(false)
|
|
allow(program).to receive(:trust_level).and_return("community_untrusted")
|
|
render
|
|
expect(rendered).not_to include("<details")
|
|
expect(rendered).to include("oauth-permissions")
|
|
end
|
|
end
|
|
|
|
describe "trust level banners" do
|
|
it "shows warning banner for community_untrusted apps" do
|
|
allow(program).to receive(:trust_level).and_return("community_untrusted")
|
|
render
|
|
expect(rendered).to include("Community Application")
|
|
end
|
|
|
|
it "shows info banner for community_trusted apps" do
|
|
allow(program).to receive(:trust_level).and_return("community_trusted")
|
|
render
|
|
expect(rendered).to include("Community Application")
|
|
expect(rendered).to include("reviewed it")
|
|
end
|
|
|
|
it "shows no banner for hq_official apps" do
|
|
allow(program).to receive(:trust_level).and_return("hq_official")
|
|
render
|
|
expect(rendered).not_to include("Community Application")
|
|
end
|
|
end
|
|
|
|
describe "authorize button" do
|
|
it "has countdown for non-official apps" do
|
|
allow(program).to receive(:hq_official?).and_return(false)
|
|
render
|
|
expect(rendered).to include("countdown: 3")
|
|
end
|
|
|
|
it "has no countdown for official apps" do
|
|
allow(program).to receive(:hq_official?).and_return(true)
|
|
render
|
|
expect(rendered).to include("countdown: 0")
|
|
end
|
|
end
|
|
end
|