1 # Copyright (C) The Arvados Authors. All rights reserved.
3 # SPDX-License-Identifier: AGPL-3.0
5 require 'integration_helper'
8 class LinkAccountTest < ActionDispatch::IntegrationTest
13 def start_sso_stub token
14 port = available_port('sso_stub')
16 s = WEBrick::HTTPServer.new(
18 :BindAddress => 'localhost',
19 :Logger => WEBrick::Log.new('/dev/null', WEBrick::BasicLog::DEBUG),
20 :AccessLog => [nil,nil]
23 s.mount_proc("/login"){|req, res|
24 res.set_redirect(WEBrick::HTTPStatus::TemporaryRedirect, req.query["return_to"] + "&api_token=#{token}")
28 s.mount_proc("/logout"){|req, res|
29 res.set_redirect(WEBrick::HTTPStatus::TemporaryRedirect, req.query["return_to"])
36 "http://localhost:#{port}/"
39 test "Add another login to this account" do
40 visit page_with_token('active_trustedclient')
41 stub = start_sso_stub(api_fixture('api_client_authorizations')['project_viewer_trustedclient']['api_token'])
42 Rails.configuration.arvados_login_base = stub + "login"
44 find("#notifications-menu").click
45 assert_text "active-user@arvados.local"
47 find("a", text: "Link account").click
48 find("button", text: "Add another login to this account").click
50 find("#notifications-menu").click
51 assert_text "project-viewer@arvados.local"
53 find("button", text: "Link accounts").click
55 find("#notifications-menu").click
56 assert_text "active-user@arvados.local"
59 test "Use this login to access another account" do
60 visit page_with_token('project_viewer_trustedclient')
61 stub = start_sso_stub(api_fixture('api_client_authorizations')['active_trustedclient']['api_token'])
62 Rails.configuration.arvados_login_base = stub + "login"
64 find("#notifications-menu").click
65 assert_text "project-viewer@arvados.local"
67 find("a", text: "Link account").click
68 find("button", text: "Use this login to access another account").click
70 find("#notifications-menu").click
71 assert_text "active-user@arvados.local"
73 find("button", text: "Link accounts").click
75 find("#notifications-menu").click
76 assert_text "active-user@arvados.local"
79 test "Link login of inactive user to this account" do
80 visit page_with_token('active_trustedclient')
81 stub = start_sso_stub(api_fixture('api_client_authorizations')['inactive_uninvited_trustedclient']['api_token'])
82 Rails.configuration.arvados_login_base = stub + "login"
84 find("#notifications-menu").click
85 assert_text "active-user@arvados.local"
87 find("a", text: "Link account").click
88 find("button", text: "Add another login to this account").click
90 find("#notifications-menu").click
91 assert_text "inactive-uninvited-user@arvados.local"
93 find("button", text: "Link accounts").click
95 find("#notifications-menu").click
96 assert_text "active-user@arvados.local"
99 test "Cannot link to inactive user" do
100 visit page_with_token('active_trustedclient')
101 stub = start_sso_stub(api_fixture('api_client_authorizations')['inactive_uninvited_trustedclient']['api_token'])
102 Rails.configuration.arvados_login_base = stub + "login"
104 find("#notifications-menu").click
105 assert_text "active-user@arvados.local"
107 find("a", text: "Link account").click
108 find("button", text: "Use this login to access another account").click
110 find("#notifications-menu").click
111 assert_text "inactive-uninvited-user@arvados.local"
113 assert_text "Cannot link active-user@arvados.local"
115 assert find("#link-account-submit")['disabled']
117 find("button", text: "Cancel").click
119 find("#notifications-menu").click
120 assert_text "active-user@arvados.local"
123 test "Inactive user can link to active account" do
124 visit page_with_token('inactive_uninvited_trustedclient')
125 stub = start_sso_stub(api_fixture('api_client_authorizations')['active_trustedclient']['api_token'])
126 Rails.configuration.arvados_login_base = stub + "login"
128 find("#notifications-menu").click
129 assert_text "inactive-uninvited-user@arvados.local"
131 assert_text "Already have an account with a different login?"
133 find("a", text: "Link this login to your existing account").click
135 assert_no_text "Add another login to this account"
137 find("button", text: "Use this login to access another account").click
139 find("#notifications-menu").click
140 assert_text "active-user@arvados.local"
142 find("button", text: "Link accounts").click
144 find("#notifications-menu").click
145 assert_text "active-user@arvados.local"
148 test "Admin cannot link to non-admin" do
149 visit page_with_token('admin_trustedclient')
150 stub = start_sso_stub(api_fixture('api_client_authorizations')['active_trustedclient']['api_token'])
151 Rails.configuration.arvados_login_base = stub + "login"
153 find("#notifications-menu").click
154 assert_text "admin@arvados.local"
156 find("a", text: "Link account").click
157 find("button", text: "Use this login to access another account").click
159 find("#notifications-menu").click
160 assert_text "active-user@arvados.local"
162 assert_text "Cannot link admin account admin@arvados.local"
164 assert find("#link-account-submit")['disabled']
166 find("button", text: "Cancel").click
168 find("#notifications-menu").click
169 assert_text "admin@arvados.local"