2 require 'helpers/share_object_helper'
4 class ProjectsControllerTest < ActionController::TestCase
5 include ShareObjectHelper
7 test "invited user is asked to sign user agreements on front page" do
8 get :index, {}, session_for(:inactive)
9 assert_response :redirect
10 assert_match(/^#{Regexp.escape(user_agreements_url)}\b/,
11 @response.redirect_url,
12 "Inactive user was not redirected to user_agreements page")
15 test "uninvited user is asked to wait for activation" do
16 get :index, {}, session_for(:inactive_uninvited)
17 assert_response :redirect
18 assert_match(/^#{Regexp.escape(inactive_users_url)}\b/,
19 @response.redirect_url,
20 "Uninvited user was not redirected to inactive user page")
24 [:project_viewer, false]].each do |which_user, should_show|
25 test "create subproject button #{'not ' unless should_show} shown to #{which_user}" do
26 readonly_project_uuid = api_fixture('groups')['aproject']['uuid']
28 id: readonly_project_uuid
29 }, session_for(which_user)
30 buttons = css_select('[data-method=post]').select do |el|
31 el.attributes['href'].match /project.*owner_uuid.*#{readonly_project_uuid}/
34 assert_not_empty(buttons, "did not offer to create a subproject")
36 assert_empty(buttons.collect(&:to_s),
37 "offered to create a subproject in a non-writable project")
42 test "sharing a project with a user and group" do
43 uuid_list = [api_fixture("groups")["future_project_viewing_group"]["uuid"],
44 api_fixture("users")["future_project_user"]["uuid"]]
46 id: api_fixture("groups")["asubproject"]["uuid"],
50 assert_response :success
51 assert_equal(uuid_list, json_response["success"])
54 test "user with project read permission can't add permissions" do
55 share_uuid = api_fixture("users")["spectator"]["uuid"]
57 id: api_fixture("groups")["aproject"]["uuid"],
60 session_for(:project_viewer))
62 assert(json_response["errors"].andand.
63 any? { |msg| msg.start_with?("#{share_uuid}: ") },
64 "JSON response missing properly formatted sharing error")
67 test "admin can_manage aproject" do
68 assert user_can_manage(:admin, api_fixture("groups")["aproject"])
71 test "owner can_manage aproject" do
72 assert user_can_manage(:active, api_fixture("groups")["aproject"])
75 test "owner can_manage asubproject" do
76 assert user_can_manage(:active, api_fixture("groups")["asubproject"])
79 test "viewer can't manage aproject" do
80 refute user_can_manage(:project_viewer, api_fixture("groups")["aproject"])
83 test "viewer can't manage asubproject" do
84 refute user_can_manage(:project_viewer, api_fixture("groups")["asubproject"])
87 test "subproject_admin can_manage asubproject" do
88 assert user_can_manage(:subproject_admin, api_fixture("groups")["asubproject"])
91 test "detect ownership loop in project breadcrumbs" do
92 # This test has an arbitrary time limit -- otherwise we'd just sit
93 # here forever instead of reporting that the loop was not
94 # detected. The test passes quickly, but fails slowly.
95 Timeout::timeout 10 do
97 { id: api_fixture("groups")["project_owns_itself"]["uuid"] },
100 assert_response :success
103 test "project admin can remove collections from the project" do
104 # Deleting an object that supports 'expires_at' should make it
105 # completely inaccessible to API queries, not simply moved out of the project.
106 coll_key = "collection_to_remove_from_subproject"
107 coll_uuid = api_fixture("collections")[coll_key]["uuid"]
109 { id: api_fixture("groups")["asubproject"]["uuid"],
110 item_uuid: coll_uuid,
112 session_for(:subproject_admin))
113 assert_response :success
114 assert_match(/\b#{coll_uuid}\b/, @response.body,
115 "removed object not named in response")
117 use_token :subproject_admin
118 assert_raise ArvadosApiClient::NotFoundException do
119 Collection.find(coll_uuid)
123 test "project admin can remove items from project other than collections" do
124 # An object which does not have an expired_at field (e.g. Specimen)
125 # should be implicitly moved to the user's Home project when removed.
126 specimen_uuid = api_fixture('specimens', 'in_asubproject')['uuid']
128 { id: api_fixture('groups', 'asubproject')['uuid'],
129 item_uuid: specimen_uuid,
131 session_for(:subproject_admin))
132 assert_response :success
133 assert_match(/\b#{specimen_uuid}\b/, @response.body,
134 "removed object not named in response")
136 use_token :subproject_admin
137 new_specimen = Specimen.find(specimen_uuid)
138 assert_equal api_fixture('users', 'subproject_admin')['uuid'], new_specimen.owner_uuid
141 test 'projects#show tab infinite scroll partial obeys limit' do
142 get_contents_rows(limit: 1, filters: [['uuid','is_a',['arvados#job']]])
143 assert_response :success
144 assert_equal(1, json_response['content'].scan('<tr').count,
145 "Did not get exactly one row")
148 ['', ' asc', ' desc'].each do |direction|
149 test "projects#show tab partial orders correctly by #{direction}" do
150 _test_tab_content_order direction
154 def _test_tab_content_order direction
155 get_contents_rows(limit: 100,
156 order: "created_at#{direction}",
157 filters: [['uuid','is_a',['arvados#job',
158 'arvados#pipelineInstance']]])
159 assert_response :success
160 not_grouped_by_kind = nil
164 json_response['content'].scan /<tr[^>]+>/ do |tr_tag|
166 tr_tag.scan(/\ data-object-created-at=\"(.*?)\"/).each do |t,|
168 correct_operator = / desc$/ =~ direction ? :>= : :<=
169 assert_operator(last_timestamp, correct_operator, t,
170 "Rows are not sorted by created_at#{direction}")
173 found_timestamps += 1
175 assert_equal(1, found_timestamps,
176 "Content row did not have exactly one timestamp")
178 # Confirm that the test for timestamp ordering couldn't have
179 # passed merely because the test fixtures have convenient
180 # timestamps (e.g., there is only one pipeline and one job in
181 # the project being tested, or there are no pipelines at all in
182 # the project being tested):
183 tr_tag.scan /\ data-kind=\"(.*?)\"/ do |kind|
184 if last_kind and last_kind != kind and found_kind[kind]
185 # We saw this kind before, then a different kind, then
186 # this kind again. That means objects are not grouped by
188 not_grouped_by_kind = true
190 found_kind[kind] ||= 0
191 found_kind[kind] += 1
195 assert_equal(true, not_grouped_by_kind,
196 "Could not confirm that results are not grouped by kind")
199 def get_contents_rows params
201 id: api_fixture('users')['active']['uuid'],
202 partial: :contents_rows,
205 encoded_params = Hash[params.map { |k,v|
206 [k, (v.is_a?(Array) || v.is_a?(Hash)) ? v.to_json : v]
208 get :show, encoded_params, session_for(:active)
211 test "visit non-public project as anonymous when anonymous browsing is enabled and expect page not found" do
212 Rails.configuration.anonymous_user_token = api_fixture('api_client_authorizations')['anonymous']['api_token']
213 get(:show, {id: api_fixture('groups')['aproject']['uuid']})
215 assert_includes @response.inspect, 'you are not logged in'
218 test "visit home page as anonymous when anonymous browsing is enabled and expect login" do
219 Rails.configuration.anonymous_user_token = api_fixture('api_client_authorizations')['anonymous']['api_token']
221 assert_response :redirect
222 assert_match /\/users\/welcome/, @response.redirect_url