5416: Disable repository browsing (and skip tests) if git version is suspected unreli...
[arvados.git] / apps / workbench / test / controllers / repositories_controller_test.rb
1 require 'test_helper'
2 require 'helpers/repository_stub_helper'
3 require 'helpers/share_object_helper'
4
5 class RepositoriesControllerTest < ActionController::TestCase
6   include RepositoryStubHelper
7   include ShareObjectHelper
8
9   [
10     :active, #owner
11     :admin,
12   ].each do |user|
13     test "#{user} shares repository with a user and group" do
14       uuid_list = [api_fixture("groups")["future_project_viewing_group"]["uuid"],
15                    api_fixture("users")["future_project_user"]["uuid"]]
16       post(:share_with, {
17              id: api_fixture("repositories")["foo"]["uuid"],
18              uuids: uuid_list,
19              format: "json"},
20            session_for(user))
21       assert_response :success
22       assert_equal(uuid_list, json_response["success"])
23     end
24   end
25
26   test "user with repository read permission cannot add permissions" do
27     share_uuid = api_fixture("users")["project_viewer"]["uuid"]
28     post(:share_with, {
29            id: api_fixture("repositories")["arvados"]["uuid"],
30            uuids: [share_uuid],
31            format: "json"},
32          session_for(:spectator))
33     assert_response 422
34     assert(json_response["errors"].andand.
35              any? { |msg| msg.start_with?("#{share_uuid}: ") },
36            "JSON response missing properly formatted sharing error")
37   end
38
39   test "admin can_manage repository" do
40     assert user_can_manage(:admin, api_fixture("repositories")["foo"])
41   end
42
43   test "owner can_manage repository" do
44     assert user_can_manage(:active, api_fixture("repositories")["foo"])
45   end
46
47   test "viewer cannot manage repository" do
48     refute user_can_manage(:spectator, api_fixture("repositories")["arvados"])
49   end
50
51   [
52     [:active, ['#Sharing', '#Advanced']],
53     [:admin,  ['#Attributes', '#Sharing', '#Advanced']],
54   ].each do |user, expected_panes|
55     test "#{user} sees panes #{expected_panes}" do
56       get :show, {
57         id: api_fixture('repositories')['foo']['uuid']
58       }, session_for(user)
59       assert_response :success
60
61       panes = css_select('[data-toggle=tab]').each do |pane|
62         pane_name = pane.attributes['href']
63         assert_includes expected_panes, pane_name
64       end
65     end
66   end
67
68   ### Browse repository content
69
70   [:active, :spectator].each do |user|
71     test "show tree to #{user}" do
72       skip "git2 is unreliable" if Repository.disable_repository_browsing?
73       reset_api_fixtures_after_test false
74       sha1, _, _ = stub_repo_content
75       get :show_tree, {
76         id: api_fixture('repositories')['foo']['uuid'],
77         commit: sha1,
78       }, session_for(user)
79       assert_response :success
80       assert_select 'tr td a', 'COPYING'
81       assert_select 'tr td', '625 bytes'
82       assert_select 'tr td a', 'apps'
83       assert_select 'tr td a', 'workbench'
84       assert_select 'tr td a', 'Gemfile'
85       assert_select 'tr td', '33.7 KiB'
86     end
87
88     test "show commit to #{user}" do
89       skip "git2 is unreliable" if Repository.disable_repository_browsing?
90       reset_api_fixtures_after_test false
91       sha1, commit, _ = stub_repo_content
92       get :show_commit, {
93         id: api_fixture('repositories')['foo']['uuid'],
94         commit: sha1,
95       }, session_for(user)
96       assert_response :success
97       assert_select 'pre', h(commit)
98     end
99
100     test "show blob to #{user}" do
101       skip "git2 is unreliable" if Repository.disable_repository_browsing?
102       reset_api_fixtures_after_test false
103       sha1, _, filedata = stub_repo_content filename: 'COPYING'
104       get :show_blob, {
105         id: api_fixture('repositories')['foo']['uuid'],
106         commit: sha1,
107         path: 'COPYING',
108       }, session_for(user)
109       assert_response :success
110       assert_select 'pre', h(filedata)
111     end
112   end
113
114   ['', '/'].each do |path|
115     test "show tree with path '#{path}'" do
116       skip "git2 is unreliable" if Repository.disable_repository_browsing?
117       reset_api_fixtures_after_test false
118       sha1, _, _ = stub_repo_content filename: 'COPYING'
119       get :show_tree, {
120         id: api_fixture('repositories')['foo']['uuid'],
121         commit: sha1,
122         path: path,
123       }, session_for(:active)
124       assert_response :success
125       assert_select 'tr td', 'COPYING'
126     end
127   end
128 end