Commit 03f6a28ec0dab308070e83ec422f12fa289aad9f
1 parent
9f722427
Exists in
master
and in
4 other branches
move capybara scenarios to spec/features
Showing
36 changed files
with
1575 additions
and
1573 deletions
Show diff stats
@@ -0,0 +1,51 @@ | @@ -0,0 +1,51 @@ | ||
1 | +require 'spec_helper' | ||
2 | + | ||
3 | +describe "Admin::Hooks" do | ||
4 | + before do | ||
5 | + @project = create(:project) | ||
6 | + login_as :admin | ||
7 | + | ||
8 | + @system_hook = create(:system_hook) | ||
9 | + | ||
10 | + end | ||
11 | + | ||
12 | + describe "GET /admin/hooks" do | ||
13 | + it "should be ok" do | ||
14 | + visit admin_root_path | ||
15 | + within ".main_menu" do | ||
16 | + click_on "Hooks" | ||
17 | + end | ||
18 | + current_path.should == admin_hooks_path | ||
19 | + end | ||
20 | + | ||
21 | + it "should have hooks list" do | ||
22 | + visit admin_hooks_path | ||
23 | + page.should have_content(@system_hook.url) | ||
24 | + end | ||
25 | + end | ||
26 | + | ||
27 | + describe "New Hook" do | ||
28 | + before do | ||
29 | + @url = Faker::Internet.uri("http") | ||
30 | + visit admin_hooks_path | ||
31 | + fill_in "hook_url", with: @url | ||
32 | + expect { click_button "Add System Hook" }.to change(SystemHook, :count).by(1) | ||
33 | + end | ||
34 | + | ||
35 | + it "should open new hook popup" do | ||
36 | + page.current_path.should == admin_hooks_path | ||
37 | + page.should have_content(@url) | ||
38 | + end | ||
39 | + end | ||
40 | + | ||
41 | + describe "Test" do | ||
42 | + before do | ||
43 | + WebMock.stub_request(:post, @system_hook.url) | ||
44 | + visit admin_hooks_path | ||
45 | + click_link "Test Hook" | ||
46 | + end | ||
47 | + | ||
48 | + it { page.current_path.should == admin_hooks_path } | ||
49 | + end | ||
50 | + | ||
51 | +end |
@@ -0,0 +1,76 @@ | @@ -0,0 +1,76 @@ | ||
1 | +require 'spec_helper' | ||
2 | + | ||
3 | +describe "Admin::Projects" do | ||
4 | + before do | ||
5 | + @project = create(:project) | ||
6 | + login_as :admin | ||
7 | + end | ||
8 | + | ||
9 | + describe "GET /admin/projects" do | ||
10 | + before do | ||
11 | + visit admin_projects_path | ||
12 | + end | ||
13 | + | ||
14 | + it "should be ok" do | ||
15 | + current_path.should == admin_projects_path | ||
16 | + end | ||
17 | + | ||
18 | + it "should have projects list" do | ||
19 | + page.should have_content(@project.name) | ||
20 | + end | ||
21 | + end | ||
22 | + | ||
23 | + describe "GET /admin/projects/:id" do | ||
24 | + before do | ||
25 | + visit admin_projects_path | ||
26 | + click_link "#{@project.name}" | ||
27 | + end | ||
28 | + | ||
29 | + it "should have project info" do | ||
30 | + page.should have_content(@project.path) | ||
31 | + page.should have_content(@project.name) | ||
32 | + end | ||
33 | + end | ||
34 | + | ||
35 | + describe "GET /admin/projects/:id/edit" do | ||
36 | + before do | ||
37 | + visit admin_projects_path | ||
38 | + click_link "edit_project_#{@project.id}" | ||
39 | + end | ||
40 | + | ||
41 | + it "should have project edit page" do | ||
42 | + page.should have_content("Edit project") | ||
43 | + page.should have_button("Save Project") | ||
44 | + end | ||
45 | + | ||
46 | + describe "Update project" do | ||
47 | + before do | ||
48 | + fill_in "project_name", with: "Big Bang" | ||
49 | + click_button "Save Project" | ||
50 | + @project.reload | ||
51 | + end | ||
52 | + | ||
53 | + it "should show page with new data" do | ||
54 | + page.should have_content("Big Bang") | ||
55 | + end | ||
56 | + | ||
57 | + it "should change project entry" do | ||
58 | + @project.name.should == "Big Bang" | ||
59 | + end | ||
60 | + end | ||
61 | + end | ||
62 | + | ||
63 | + describe "Add new team member" do | ||
64 | + before do | ||
65 | + @new_user = create(:user) | ||
66 | + visit admin_project_path(@project) | ||
67 | + end | ||
68 | + | ||
69 | + it "should create new user" do | ||
70 | + select @new_user.name, from: "user_ids" | ||
71 | + expect { click_button "Add" }.to change { UsersProject.count }.by(1) | ||
72 | + page.should have_content @new_user.name | ||
73 | + current_path.should == admin_project_path(@project) | ||
74 | + end | ||
75 | + end | ||
76 | +end |
@@ -0,0 +1,135 @@ | @@ -0,0 +1,135 @@ | ||
1 | +require 'spec_helper' | ||
2 | + | ||
3 | +describe "Admin::Users" do | ||
4 | + before { login_as :admin } | ||
5 | + | ||
6 | + describe "GET /admin/users" do | ||
7 | + before do | ||
8 | + visit admin_users_path | ||
9 | + end | ||
10 | + | ||
11 | + it "should be ok" do | ||
12 | + current_path.should == admin_users_path | ||
13 | + end | ||
14 | + | ||
15 | + it "should have users list" do | ||
16 | + page.should have_content(@user.email) | ||
17 | + page.should have_content(@user.name) | ||
18 | + end | ||
19 | + end | ||
20 | + | ||
21 | + describe "GET /admin/users/new" do | ||
22 | + before do | ||
23 | + @password = "123ABC" | ||
24 | + visit new_admin_user_path | ||
25 | + fill_in "user_name", with: "Big Bang" | ||
26 | + fill_in "user_username", with: "bang" | ||
27 | + fill_in "user_email", with: "bigbang@mail.com" | ||
28 | + fill_in "user_password", with: @password | ||
29 | + fill_in "user_password_confirmation", with: @password | ||
30 | + end | ||
31 | + | ||
32 | + it "should create new user" do | ||
33 | + expect { click_button "Save" }.to change {User.count}.by(1) | ||
34 | + end | ||
35 | + | ||
36 | + it "should create user with valid data" do | ||
37 | + click_button "Save" | ||
38 | + user = User.last | ||
39 | + user.name.should == "Big Bang" | ||
40 | + user.email.should == "bigbang@mail.com" | ||
41 | + end | ||
42 | + | ||
43 | + it "should call send mail" do | ||
44 | + Notify.should_receive(:new_user_email) | ||
45 | + | ||
46 | + User.observers.enable :user_observer do | ||
47 | + click_button "Save" | ||
48 | + end | ||
49 | + end | ||
50 | + | ||
51 | + it "should send valid email to user with email & password" do | ||
52 | + Gitlab.config.gitlab.stub(:signup_enabled).and_return(false) | ||
53 | + User.observers.enable :user_observer do | ||
54 | + click_button "Save" | ||
55 | + user = User.last | ||
56 | + email = ActionMailer::Base.deliveries.last | ||
57 | + email.subject.should have_content("Account was created") | ||
58 | + email.body.should have_content(user.email) | ||
59 | + email.body.should have_content(@password) | ||
60 | + end | ||
61 | + end | ||
62 | + | ||
63 | + it "should send valid email to user with email without password when signup is enabled" do | ||
64 | + Gitlab.config.gitlab.stub(:signup_enabled).and_return(true) | ||
65 | + User.observers.enable :user_observer do | ||
66 | + click_button "Save" | ||
67 | + user = User.last | ||
68 | + email = ActionMailer::Base.deliveries.last | ||
69 | + email.subject.should have_content("Account was created") | ||
70 | + email.body.should have_content(user.email) | ||
71 | + email.body.should_not have_content(@password) | ||
72 | + end | ||
73 | + end | ||
74 | + end | ||
75 | + | ||
76 | + describe "GET /admin/users/:id" do | ||
77 | + before do | ||
78 | + visit admin_users_path | ||
79 | + click_link "#{@user.name}" | ||
80 | + end | ||
81 | + | ||
82 | + it "should have user info" do | ||
83 | + page.should have_content(@user.email) | ||
84 | + page.should have_content(@user.name) | ||
85 | + page.should have_content(@user.projects_limit) | ||
86 | + end | ||
87 | + end | ||
88 | + | ||
89 | + describe "GET /admin/users/:id/edit" do | ||
90 | + before do | ||
91 | + @simple_user = create(:user) | ||
92 | + visit admin_users_path | ||
93 | + click_link "edit_user_#{@simple_user.id}" | ||
94 | + end | ||
95 | + | ||
96 | + it "should have user edit page" do | ||
97 | + page.should have_content("Name") | ||
98 | + page.should have_content("Password") | ||
99 | + end | ||
100 | + | ||
101 | + describe "Update user" do | ||
102 | + before do | ||
103 | + fill_in "user_name", with: "Big Bang" | ||
104 | + fill_in "user_email", with: "bigbang@mail.com" | ||
105 | + check "user_admin" | ||
106 | + click_button "Save" | ||
107 | + end | ||
108 | + | ||
109 | + it "should show page with new data" do | ||
110 | + page.should have_content("bigbang@mail.com") | ||
111 | + page.should have_content("Big Bang") | ||
112 | + end | ||
113 | + | ||
114 | + it "should change user entry" do | ||
115 | + @simple_user.reload | ||
116 | + @simple_user.name.should == "Big Bang" | ||
117 | + @simple_user.is_admin?.should be_true | ||
118 | + end | ||
119 | + end | ||
120 | + end | ||
121 | + | ||
122 | + describe "Add new project" do | ||
123 | + before do | ||
124 | + @new_project = create(:project) | ||
125 | + visit admin_user_path(@user) | ||
126 | + end | ||
127 | + | ||
128 | + it "should create new user" do | ||
129 | + select @new_project.name, from: "project_ids" | ||
130 | + expect { click_button "Add" }.to change { UsersProject.count }.by(1) | ||
131 | + page.should have_content @new_project.name | ||
132 | + current_path.should == admin_user_path(@user) | ||
133 | + end | ||
134 | + end | ||
135 | +end |
@@ -0,0 +1,27 @@ | @@ -0,0 +1,27 @@ | ||
1 | +require 'spec_helper' | ||
2 | + | ||
3 | +describe "Admin::Projects" do | ||
4 | + describe "GET /admin/projects" do | ||
5 | + subject { admin_projects_path } | ||
6 | + | ||
7 | + it { should be_allowed_for :admin } | ||
8 | + it { should be_denied_for :user } | ||
9 | + it { should be_denied_for :visitor } | ||
10 | + end | ||
11 | + | ||
12 | + describe "GET /admin/users" do | ||
13 | + subject { admin_users_path } | ||
14 | + | ||
15 | + it { should be_allowed_for :admin } | ||
16 | + it { should be_denied_for :user } | ||
17 | + it { should be_denied_for :visitor } | ||
18 | + end | ||
19 | + | ||
20 | + describe "GET /admin/hooks" do | ||
21 | + subject { admin_hooks_path } | ||
22 | + | ||
23 | + it { should be_allowed_for :admin } | ||
24 | + it { should be_denied_for :user } | ||
25 | + it { should be_denied_for :visitor } | ||
26 | + end | ||
27 | +end |
@@ -0,0 +1,24 @@ | @@ -0,0 +1,24 @@ | ||
1 | +require 'spec_helper' | ||
2 | + | ||
3 | +describe "Dashboard Issues Feed" do | ||
4 | + describe "GET /issues" do | ||
5 | + let!(:user) { create(:user) } | ||
6 | + let!(:project1) { create(:project) } | ||
7 | + let!(:project2) { create(:project) } | ||
8 | + let!(:issue1) { create(:issue, author: user, assignee: user, project: project1) } | ||
9 | + let!(:issue2) { create(:issue, author: user, assignee: user, project: project2) } | ||
10 | + | ||
11 | + describe "atom feed" do | ||
12 | + it "should render atom feed via private token" do | ||
13 | + visit issues_dashboard_path(:atom, private_token: user.private_token) | ||
14 | + | ||
15 | + page.response_headers['Content-Type'].should have_content("application/atom+xml") | ||
16 | + page.body.should have_selector("title", text: "#{user.name} issues") | ||
17 | + page.body.should have_selector("author email", text: issue1.author_email) | ||
18 | + page.body.should have_selector("entry summary", text: issue1.title) | ||
19 | + page.body.should have_selector("author email", text: issue2.author_email) | ||
20 | + page.body.should have_selector("entry summary", text: issue2.title) | ||
21 | + end | ||
22 | + end | ||
23 | + end | ||
24 | +end |
@@ -0,0 +1,14 @@ | @@ -0,0 +1,14 @@ | ||
1 | +require 'spec_helper' | ||
2 | + | ||
3 | +describe "Dashboard Feed" do | ||
4 | + describe "GET /" do | ||
5 | + let!(:user) { create(:user) } | ||
6 | + | ||
7 | + context "projects atom feed via private token" do | ||
8 | + it "should render projects atom feed" do | ||
9 | + visit dashboard_path(:atom, private_token: user.private_token) | ||
10 | + page.body.should have_selector("feed title") | ||
11 | + end | ||
12 | + end | ||
13 | + end | ||
14 | +end |
@@ -0,0 +1,34 @@ | @@ -0,0 +1,34 @@ | ||
1 | +require 'spec_helper' | ||
2 | + | ||
3 | +describe "Issues Feed" do | ||
4 | + describe "GET /issues" do | ||
5 | + let!(:user) { create(:user) } | ||
6 | + let!(:project) { create(:project, namespace: user.namespace) } | ||
7 | + let!(:issue) { create(:issue, author: user, project: project) } | ||
8 | + | ||
9 | + before { project.team << [user, :developer] } | ||
10 | + | ||
11 | + context "when authenticated" do | ||
12 | + it "should render atom feed" do | ||
13 | + login_with user | ||
14 | + visit project_issues_path(project, :atom) | ||
15 | + | ||
16 | + page.response_headers['Content-Type'].should have_content("application/atom+xml") | ||
17 | + page.body.should have_selector("title", text: "#{project.name} issues") | ||
18 | + page.body.should have_selector("author email", text: issue.author_email) | ||
19 | + page.body.should have_selector("entry summary", text: issue.title) | ||
20 | + end | ||
21 | + end | ||
22 | + | ||
23 | + context "when authenticated via private token" do | ||
24 | + it "should render atom feed" do | ||
25 | + visit project_issues_path(project, :atom, private_token: user.private_token) | ||
26 | + | ||
27 | + page.response_headers['Content-Type'].should have_content("application/atom+xml") | ||
28 | + page.body.should have_selector("title", text: "#{project.name} issues") | ||
29 | + page.body.should have_selector("author email", text: issue.author_email) | ||
30 | + page.body.should have_selector("entry summary", text: issue.title) | ||
31 | + end | ||
32 | + end | ||
33 | + end | ||
34 | +end |
@@ -0,0 +1,223 @@ | @@ -0,0 +1,223 @@ | ||
1 | +require 'spec_helper' | ||
2 | + | ||
3 | +describe "Gitlab Flavored Markdown" do | ||
4 | + let(:project) { create(:project) } | ||
5 | + let(:issue) { create(:issue, project: project) } | ||
6 | + let(:merge_request) { create(:merge_request, project: project) } | ||
7 | + let(:fred) do | ||
8 | + u = create(:user, name: "fred") | ||
9 | + project.team << [u, :master] | ||
10 | + u | ||
11 | + end | ||
12 | + | ||
13 | + before do | ||
14 | + # add test branch | ||
15 | + @branch_name = "gfm-test" | ||
16 | + r = project.repo | ||
17 | + i = r.index | ||
18 | + # add test file | ||
19 | + @test_file = "gfm_test_file" | ||
20 | + i.add(@test_file, "foo\nbar\n") | ||
21 | + # add commit with gfm | ||
22 | + i.commit("fix ##{issue.id}\n\nask @#{fred.username} for details", head: @branch_name) | ||
23 | + | ||
24 | + # add test tag | ||
25 | + @tag_name = "gfm-test-tag" | ||
26 | + r.git.native(:tag, {}, @tag_name, commit.id) | ||
27 | + end | ||
28 | + | ||
29 | + after do | ||
30 | + # delete test branch and tag | ||
31 | + project.repo.git.native(:branch, {D: true}, @branch_name) | ||
32 | + project.repo.git.native(:tag, {d: true}, @tag_name) | ||
33 | + project.repo.gc_auto | ||
34 | + end | ||
35 | + | ||
36 | + let(:commit) { project.repository.commits(@branch_name).first } | ||
37 | + | ||
38 | + before do | ||
39 | + login_as :user | ||
40 | + project.team << [@user, :developer] | ||
41 | + end | ||
42 | + | ||
43 | + describe "for commits" do | ||
44 | + it "should render title in commits#index" do | ||
45 | + visit project_commits_path(project, @branch_name, limit: 1) | ||
46 | + | ||
47 | + page.should have_link("##{issue.id}") | ||
48 | + end | ||
49 | + | ||
50 | + it "should render title in commits#show" do | ||
51 | + visit project_commit_path(project, commit) | ||
52 | + | ||
53 | + page.should have_link("##{issue.id}") | ||
54 | + end | ||
55 | + | ||
56 | + it "should render description in commits#show" do | ||
57 | + visit project_commit_path(project, commit) | ||
58 | + | ||
59 | + page.should have_link("@#{fred.username}") | ||
60 | + end | ||
61 | + | ||
62 | + it "should render title in refs#tree", js: true do | ||
63 | + visit project_tree_path(project, @branch_name) | ||
64 | + | ||
65 | + within(".tree_commit") do | ||
66 | + page.should have_link("##{issue.id}") | ||
67 | + end | ||
68 | + end | ||
69 | + | ||
70 | + # @wip | ||
71 | + #it "should render title in refs#blame" do | ||
72 | + #visit project_blame_path(project, File.join(@branch_name, @test_file)) | ||
73 | + | ||
74 | + #within(".blame_commit") do | ||
75 | + #page.should have_link("##{issue.id}") | ||
76 | + #end | ||
77 | + #end | ||
78 | + | ||
79 | + it "should render title in repositories#branches" do | ||
80 | + visit branches_project_repository_path(project) | ||
81 | + | ||
82 | + page.should have_link("##{issue.id}") | ||
83 | + end | ||
84 | + end | ||
85 | + | ||
86 | + describe "for issues" do | ||
87 | + before do | ||
88 | + @other_issue = create(:issue, | ||
89 | + author: @user, | ||
90 | + assignee: @user, | ||
91 | + project: project) | ||
92 | + @issue = create(:issue, | ||
93 | + author: @user, | ||
94 | + assignee: @user, | ||
95 | + project: project, | ||
96 | + title: "fix ##{@other_issue.id}", | ||
97 | + description: "ask @#{fred.username} for details") | ||
98 | + end | ||
99 | + | ||
100 | + it "should render subject in issues#index" do | ||
101 | + visit project_issues_path(project) | ||
102 | + | ||
103 | + page.should have_link("##{@other_issue.id}") | ||
104 | + end | ||
105 | + | ||
106 | + it "should render subject in issues#show" do | ||
107 | + visit project_issue_path(project, @issue) | ||
108 | + | ||
109 | + page.should have_link("##{@other_issue.id}") | ||
110 | + end | ||
111 | + | ||
112 | + it "should render details in issues#show" do | ||
113 | + visit project_issue_path(project, @issue) | ||
114 | + | ||
115 | + page.should have_link("@#{fred.username}") | ||
116 | + end | ||
117 | + end | ||
118 | + | ||
119 | + | ||
120 | + describe "for merge requests" do | ||
121 | + before do | ||
122 | + @merge_request = create(:merge_request, | ||
123 | + project: project, | ||
124 | + title: "fix ##{issue.id}") | ||
125 | + end | ||
126 | + | ||
127 | + it "should render title in merge_requests#index" do | ||
128 | + visit project_merge_requests_path(project) | ||
129 | + | ||
130 | + page.should have_link("##{issue.id}") | ||
131 | + end | ||
132 | + | ||
133 | + it "should render title in merge_requests#show" do | ||
134 | + visit project_merge_request_path(project, @merge_request) | ||
135 | + | ||
136 | + page.should have_link("##{issue.id}") | ||
137 | + end | ||
138 | + end | ||
139 | + | ||
140 | + | ||
141 | + describe "for milestones" do | ||
142 | + before do | ||
143 | + @milestone = create(:milestone, | ||
144 | + project: project, | ||
145 | + title: "fix ##{issue.id}", | ||
146 | + description: "ask @#{fred.username} for details") | ||
147 | + end | ||
148 | + | ||
149 | + it "should render title in milestones#index" do | ||
150 | + visit project_milestones_path(project) | ||
151 | + | ||
152 | + page.should have_link("##{issue.id}") | ||
153 | + end | ||
154 | + | ||
155 | + it "should render title in milestones#show" do | ||
156 | + visit project_milestone_path(project, @milestone) | ||
157 | + | ||
158 | + page.should have_link("##{issue.id}") | ||
159 | + end | ||
160 | + | ||
161 | + it "should render description in milestones#show" do | ||
162 | + visit project_milestone_path(project, @milestone) | ||
163 | + | ||
164 | + page.should have_link("@#{fred.username}") | ||
165 | + end | ||
166 | + end | ||
167 | + | ||
168 | + | ||
169 | + describe "for notes" do | ||
170 | + it "should render in commits#show", js: true do | ||
171 | + visit project_commit_path(project, commit) | ||
172 | + fill_in "note_note", with: "see ##{issue.id}" | ||
173 | + click_button "Add Comment" | ||
174 | + | ||
175 | + page.should have_link("##{issue.id}") | ||
176 | + end | ||
177 | + | ||
178 | + it "should render in issue#show", js: true do | ||
179 | + visit project_issue_path(project, issue) | ||
180 | + fill_in "note_note", with: "see ##{issue.id}" | ||
181 | + click_button "Add Comment" | ||
182 | + | ||
183 | + page.should have_link("##{issue.id}") | ||
184 | + end | ||
185 | + | ||
186 | + it "should render in merge_request#show", js: true do | ||
187 | + visit project_merge_request_path(project, merge_request) | ||
188 | + fill_in "note_note", with: "see ##{issue.id}" | ||
189 | + click_button "Add Comment" | ||
190 | + | ||
191 | + page.should have_link("##{issue.id}") | ||
192 | + end | ||
193 | + | ||
194 | + it "should render in projects#wall", js: true do | ||
195 | + visit wall_project_path(project) | ||
196 | + fill_in "note_note", with: "see ##{issue.id}" | ||
197 | + click_button "Add Comment" | ||
198 | + | ||
199 | + page.should have_link("##{issue.id}") | ||
200 | + end | ||
201 | + end | ||
202 | + | ||
203 | + | ||
204 | + describe "for wikis" do | ||
205 | + before do | ||
206 | + visit project_wiki_path(project, :index) | ||
207 | + fill_in "Title", with: "Circumvent ##{issue.id}" | ||
208 | + fill_in "Content", with: "# Other pages\n\n* [Foo](foo)\n* [Bar](bar)\n\nAlso look at ##{issue.id} :-)" | ||
209 | + click_on "Save" | ||
210 | + end | ||
211 | + | ||
212 | + it "should NOT render title in wikis#show" do | ||
213 | + within(".content h3") do # page title | ||
214 | + page.should have_content("Circumvent ##{issue.id}") | ||
215 | + page.should_not have_link("##{issue.id}") | ||
216 | + end | ||
217 | + end | ||
218 | + | ||
219 | + it "should render content in wikis#show" do | ||
220 | + page.should have_link("##{issue.id}") | ||
221 | + end | ||
222 | + end | ||
223 | +end |
@@ -0,0 +1,132 @@ | @@ -0,0 +1,132 @@ | ||
1 | +require 'spec_helper' | ||
2 | + | ||
3 | +describe "Issues" do | ||
4 | + let(:project) { create(:project) } | ||
5 | + | ||
6 | + before do | ||
7 | + login_as :user | ||
8 | + user2 = create(:user) | ||
9 | + | ||
10 | + project.team << [[@user, user2], :developer] | ||
11 | + end | ||
12 | + | ||
13 | + describe "Edit issue" do | ||
14 | + let!(:issue) do | ||
15 | + create(:issue, | ||
16 | + author: @user, | ||
17 | + assignee: @user, | ||
18 | + project: project) | ||
19 | + end | ||
20 | + | ||
21 | + before do | ||
22 | + visit project_issues_path(project) | ||
23 | + click_link "Edit" | ||
24 | + end | ||
25 | + | ||
26 | + it "should open new issue popup" do | ||
27 | + page.should have_content("Issue ##{issue.id}") | ||
28 | + end | ||
29 | + | ||
30 | + describe "fill in" do | ||
31 | + before do | ||
32 | + fill_in "issue_title", with: "bug 345" | ||
33 | + fill_in "issue_description", with: "bug description" | ||
34 | + end | ||
35 | + | ||
36 | + it { expect { click_button "Save changes" }.to_not change {Issue.count} } | ||
37 | + | ||
38 | + it "should update issue fields" do | ||
39 | + click_button "Save changes" | ||
40 | + | ||
41 | + page.should have_content @user.name | ||
42 | + page.should have_content "bug 345" | ||
43 | + page.should have_content project.name | ||
44 | + end | ||
45 | + end | ||
46 | + end | ||
47 | + | ||
48 | + describe "Search issue", js: true do | ||
49 | + before do | ||
50 | + ['foobar', 'foobar2', 'gitlab'].each do |title| | ||
51 | + create(:issue, | ||
52 | + author: @user, | ||
53 | + assignee: @user, | ||
54 | + project: project, | ||
55 | + title: title) | ||
56 | + end | ||
57 | + end | ||
58 | + | ||
59 | + it "should be able to search on different statuses" do | ||
60 | + issue = Issue.first # with title 'foobar' | ||
61 | + issue.close | ||
62 | + | ||
63 | + visit project_issues_path(project) | ||
64 | + click_link 'Closed' | ||
65 | + fill_in 'issue_search', with: 'foobar' | ||
66 | + | ||
67 | + page.should have_content 'foobar' | ||
68 | + page.should_not have_content 'foobar2' | ||
69 | + page.should_not have_content 'gitlab' | ||
70 | + end | ||
71 | + | ||
72 | + it "should search for term and return the correct results" do | ||
73 | + visit project_issues_path(project) | ||
74 | + fill_in 'issue_search', with: 'foobar' | ||
75 | + | ||
76 | + page.should have_content 'foobar' | ||
77 | + page.should have_content 'foobar2' | ||
78 | + page.should_not have_content 'gitlab' | ||
79 | + end | ||
80 | + end | ||
81 | + | ||
82 | + describe "Filter issue" do | ||
83 | + before do | ||
84 | + ['foobar', 'barbaz', 'gitlab'].each do |title| | ||
85 | + create(:issue, | ||
86 | + author: @user, | ||
87 | + assignee: @user, | ||
88 | + project: project, | ||
89 | + title: title) | ||
90 | + end | ||
91 | + | ||
92 | + @issue = Issue.first # with title 'foobar' | ||
93 | + @issue.milestone = create(:milestone, project: project) | ||
94 | + @issue.assignee = nil | ||
95 | + @issue.save | ||
96 | + end | ||
97 | + | ||
98 | + let(:issue) { @issue } | ||
99 | + | ||
100 | + it "should allow filtering by issues with no specified milestone" do | ||
101 | + visit project_issues_path(project, milestone_id: '0') | ||
102 | + | ||
103 | + page.should_not have_content 'foobar' | ||
104 | + page.should have_content 'barbaz' | ||
105 | + page.should have_content 'gitlab' | ||
106 | + end | ||
107 | + | ||
108 | + it "should allow filtering by a specified milestone" do | ||
109 | + visit project_issues_path(project, milestone_id: issue.milestone.id) | ||
110 | + | ||
111 | + page.should have_content 'foobar' | ||
112 | + page.should_not have_content 'barbaz' | ||
113 | + page.should_not have_content 'gitlab' | ||
114 | + end | ||
115 | + | ||
116 | + it "should allow filtering by issues with no specified assignee" do | ||
117 | + visit project_issues_path(project, assignee_id: '0') | ||
118 | + | ||
119 | + page.should have_content 'foobar' | ||
120 | + page.should_not have_content 'barbaz' | ||
121 | + page.should_not have_content 'gitlab' | ||
122 | + end | ||
123 | + | ||
124 | + it "should allow filtering by a specified assignee" do | ||
125 | + visit project_issues_path(project, assignee_id: @user.id) | ||
126 | + | ||
127 | + page.should_not have_content 'foobar' | ||
128 | + page.should have_content 'barbaz' | ||
129 | + page.should have_content 'gitlab' | ||
130 | + end | ||
131 | + end | ||
132 | +end |
@@ -0,0 +1,234 @@ | @@ -0,0 +1,234 @@ | ||
1 | +require 'spec_helper' | ||
2 | + | ||
3 | +describe "On a merge request", js: true do | ||
4 | + let!(:project) { create(:project) } | ||
5 | + let!(:merge_request) { create(:merge_request, project: project) } | ||
6 | + | ||
7 | + before do | ||
8 | + login_as :user | ||
9 | + project.team << [@user, :master] | ||
10 | + | ||
11 | + visit project_merge_request_path(project, merge_request) | ||
12 | + end | ||
13 | + | ||
14 | + subject { page } | ||
15 | + | ||
16 | + describe "the note form" do | ||
17 | + # main target form creation | ||
18 | + it { should have_css(".js-main-target-form", visible: true, count: 1) } | ||
19 | + | ||
20 | + # button initalization | ||
21 | + it { within(".js-main-target-form") { should have_button("Add Comment") } } | ||
22 | + it { within(".js-main-target-form") { should_not have_link("Cancel") } } | ||
23 | + | ||
24 | + # notifiactions | ||
25 | + it { within(".js-main-target-form") { should have_checked_field("Notify team via email") } } | ||
26 | + it { within(".js-main-target-form") { should_not have_checked_field("Notify commit author") } } | ||
27 | + it { within(".js-main-target-form") { should_not have_unchecked_field("Notify commit author") } } | ||
28 | + | ||
29 | + describe "without text" do | ||
30 | + it { within(".js-main-target-form") { should have_css(".js-note-preview-button", visible: false) } } | ||
31 | + end | ||
32 | + | ||
33 | + describe "with text" do | ||
34 | + before do | ||
35 | + within(".js-main-target-form") do | ||
36 | + fill_in "note[note]", with: "This is awesome" | ||
37 | + end | ||
38 | + end | ||
39 | + | ||
40 | + it { within(".js-main-target-form") { should_not have_css(".js-comment-button[disabled]") } } | ||
41 | + | ||
42 | + it { within(".js-main-target-form") { should have_css(".js-note-preview-button", visible: true) } } | ||
43 | + end | ||
44 | + | ||
45 | + describe "with preview" do | ||
46 | + before do | ||
47 | + within(".js-main-target-form") do | ||
48 | + fill_in "note[note]", with: "This is awesome" | ||
49 | + find(".js-note-preview-button").trigger("click") | ||
50 | + end | ||
51 | + end | ||
52 | + | ||
53 | + it { within(".js-main-target-form") { should have_css(".js-note-preview", text: "This is awesome", visible: true) } } | ||
54 | + | ||
55 | + it { within(".js-main-target-form") { should have_css(".js-note-preview-button", visible: false) } } | ||
56 | + it { within(".js-main-target-form") { should have_css(".js-note-edit-button", visible: true) } } | ||
57 | + end | ||
58 | + end | ||
59 | + | ||
60 | + describe "when posting a note" do | ||
61 | + before do | ||
62 | + within(".js-main-target-form") do | ||
63 | + fill_in "note[note]", with: "This is awsome!" | ||
64 | + find(".js-note-preview-button").trigger("click") | ||
65 | + click_button "Add Comment" | ||
66 | + end | ||
67 | + end | ||
68 | + | ||
69 | + # note added | ||
70 | + it { within(".js-main-target-form") { should have_content("This is awsome!") } } | ||
71 | + | ||
72 | + # reset form | ||
73 | + it { within(".js-main-target-form") { should have_no_field("note[note]", with: "This is awesome!") } } | ||
74 | + | ||
75 | + # return from preview | ||
76 | + it { within(".js-main-target-form") { should have_css(".js-note-preview", visible: false) } } | ||
77 | + it { within(".js-main-target-form") { should have_css(".js-note-text", visible: true) } } | ||
78 | + | ||
79 | + | ||
80 | + it "should be removable" do | ||
81 | + find(".js-note-delete").trigger("click") | ||
82 | + | ||
83 | + should_not have_css(".note") | ||
84 | + end | ||
85 | + end | ||
86 | +end | ||
87 | + | ||
88 | + | ||
89 | + | ||
90 | +describe "On a merge request diff", js: true, focus: true do | ||
91 | + let!(:project) { create(:project) } | ||
92 | + let!(:merge_request) { create(:merge_request_with_diffs, project: project) } | ||
93 | + | ||
94 | + before do | ||
95 | + login_as :user | ||
96 | + project.team << [@user, :master] | ||
97 | + | ||
98 | + visit diffs_project_merge_request_path(project, merge_request) | ||
99 | + | ||
100 | + within '.diffs-tab' do | ||
101 | + click_link("Diff") | ||
102 | + end | ||
103 | + end | ||
104 | + | ||
105 | + subject { page } | ||
106 | + | ||
107 | + describe "when adding a note" do | ||
108 | + before do | ||
109 | + find("#4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185.line_holder .js-add-diff-note-button").trigger("click") | ||
110 | + end | ||
111 | + | ||
112 | + describe "the notes holder" do | ||
113 | + it { should have_css("#4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185.line_holder + .js-temp-notes-holder") } | ||
114 | + | ||
115 | + it { within(".js-temp-notes-holder") { should have_css(".new_note") } } | ||
116 | + end | ||
117 | + | ||
118 | + describe "the note form" do | ||
119 | + # set up hidden fields correctly | ||
120 | + it { within(".js-temp-notes-holder") { find("#note_noteable_type").value.should == "MergeRequest" } } | ||
121 | + it { within(".js-temp-notes-holder") { find("#note_noteable_id").value.should == merge_request.id.to_s } } | ||
122 | + it { within(".js-temp-notes-holder") { find("#note_commit_id").value.should == "" } } | ||
123 | + it { within(".js-temp-notes-holder") { find("#note_line_code").value.should == "4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185" } } | ||
124 | + | ||
125 | + # buttons | ||
126 | + it { should have_button("Add Comment") } | ||
127 | + it { should have_css(".js-close-discussion-note-form", text: "Cancel") } | ||
128 | + | ||
129 | + # notification options | ||
130 | + it { should have_checked_field("Notify team via email") } | ||
131 | + | ||
132 | + it "shouldn't add a second form for same row" do | ||
133 | + find("#4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185.line_holder .js-add-diff-note-button").trigger("click") | ||
134 | + | ||
135 | + should have_css("#4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185.line_holder + .js-temp-notes-holder form", count: 1) | ||
136 | + end | ||
137 | + | ||
138 | + it "should be removed when canceled" do | ||
139 | + find(".js-close-discussion-note-form").trigger("click") | ||
140 | + | ||
141 | + should have_no_css(".js-temp-notes-holder") | ||
142 | + end | ||
143 | + end | ||
144 | + end | ||
145 | + | ||
146 | + describe "with muliple note forms" do | ||
147 | + before do | ||
148 | + find("#4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185.line_holder .js-add-diff-note-button").trigger("click") | ||
149 | + find("#342e16cbbd482ac2047dc679b2749d248cc1428f_18_17.line_holder .js-add-diff-note-button").trigger("click") | ||
150 | + end | ||
151 | + | ||
152 | + # has two line forms | ||
153 | + it { should have_css(".js-temp-notes-holder", count: 2) } | ||
154 | + | ||
155 | + describe "previewing them separately" do | ||
156 | + before do | ||
157 | + # add two separate texts and trigger previews on both | ||
158 | + within("#4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185.line_holder + .js-temp-notes-holder") do | ||
159 | + fill_in "note[note]", with: "One comment on line 185" | ||
160 | + find(".js-note-preview-button").trigger("click") | ||
161 | + end | ||
162 | + within("#342e16cbbd482ac2047dc679b2749d248cc1428f_18_17.line_holder + .js-temp-notes-holder") do | ||
163 | + fill_in "note[note]", with: "Another comment on line 17" | ||
164 | + find(".js-note-preview-button").trigger("click") | ||
165 | + end | ||
166 | + end | ||
167 | + | ||
168 | + # check if previews were rendered separately | ||
169 | + it { within("#4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185.line_holder + .js-temp-notes-holder") { should have_css(".js-note-preview", text: "One comment on line 185") } } | ||
170 | + it { within("#342e16cbbd482ac2047dc679b2749d248cc1428f_18_17.line_holder + .js-temp-notes-holder") { should have_css(".js-note-preview", text: "Another comment on line 17") } } | ||
171 | + end | ||
172 | + | ||
173 | + describe "posting a note" do | ||
174 | + before do | ||
175 | + within("#342e16cbbd482ac2047dc679b2749d248cc1428f_18_17.line_holder + .js-temp-notes-holder") do | ||
176 | + fill_in "note[note]", with: "Another comment on line 17" | ||
177 | + click_button("Add Comment") | ||
178 | + end | ||
179 | + end | ||
180 | + | ||
181 | + # removed form after submit | ||
182 | + it { should have_no_css("#342e16cbbd482ac2047dc679b2749d248cc1428f_18_17.line_holder + .js-temp-notes-holder") } | ||
183 | + | ||
184 | + # added discussion | ||
185 | + it { should have_content("Another comment on line 17") } | ||
186 | + it { should have_css("#342e16cbbd482ac2047dc679b2749d248cc1428f_18_17.line_holder + .notes_holder") } | ||
187 | + it { should have_css("#342e16cbbd482ac2047dc679b2749d248cc1428f_18_17.line_holder + .notes_holder .note", count: 1) } | ||
188 | + it { should have_link("Reply") } | ||
189 | + | ||
190 | + it "should remove last note of a discussion" do | ||
191 | + within("#342e16cbbd482ac2047dc679b2749d248cc1428f_18_17.line_holder + .notes_holder") do | ||
192 | + find(".js-note-delete").trigger("click") | ||
193 | + end | ||
194 | + | ||
195 | + # removed whole discussion | ||
196 | + should_not have_css(".note_holder") | ||
197 | + should have_css("#342e16cbbd482ac2047dc679b2749d248cc1428f_18_17.line_holder + #342e16cbbd482ac2047dc679b2749d248cc1428f_18_18.line_holder") | ||
198 | + end | ||
199 | + end | ||
200 | + end | ||
201 | + | ||
202 | + describe "when replying to a note" do | ||
203 | + before do | ||
204 | + # create first note | ||
205 | + find("#4735dfc552ad7bf15ca468adc3cad9d05b624490_184_184.line_holder .js-add-diff-note-button").trigger("click") | ||
206 | + within("#4735dfc552ad7bf15ca468adc3cad9d05b624490_184_184.line_holder + .js-temp-notes-holder") do | ||
207 | + fill_in "note[note]", with: "One comment on line 184" | ||
208 | + click_button("Add Comment") | ||
209 | + end | ||
210 | + # create second note | ||
211 | + within("#4735dfc552ad7bf15ca468adc3cad9d05b624490_184_184.line_holder + .notes_holder") do | ||
212 | + find(".js-discussion-reply-button").trigger("click") | ||
213 | + fill_in "note[note]", with: "An additional comment in reply" | ||
214 | + click_button("Add Comment") | ||
215 | + end | ||
216 | + end | ||
217 | + | ||
218 | + # inserted note | ||
219 | + it { should have_content("An additional comment in reply") } | ||
220 | + it { within("#4735dfc552ad7bf15ca468adc3cad9d05b624490_184_184.line_holder + .notes_holder") { should have_css(".note", count: 2) } } | ||
221 | + | ||
222 | + # removed form after reply | ||
223 | + it { within("#4735dfc552ad7bf15ca468adc3cad9d05b624490_184_184.line_holder + .notes_holder") { should have_no_css("form") } } | ||
224 | + it { within("#4735dfc552ad7bf15ca468adc3cad9d05b624490_184_184.line_holder + .notes_holder") { should have_link("Reply") } } | ||
225 | + end | ||
226 | +end | ||
227 | + | ||
228 | + | ||
229 | + | ||
230 | +describe "On merge request discussion", js: true do | ||
231 | + describe "with merge request diff note" | ||
232 | + describe "with commit note" | ||
233 | + describe "with commit diff note" | ||
234 | +end |
@@ -0,0 +1,85 @@ | @@ -0,0 +1,85 @@ | ||
1 | +require 'spec_helper' | ||
2 | + | ||
3 | +describe "On the project wall", js: true do | ||
4 | + let!(:project) { create(:project) } | ||
5 | + let!(:commit) { project.repository.commit("bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a") } | ||
6 | + | ||
7 | + before do | ||
8 | + login_as :user | ||
9 | + project.team << [@user, :master] | ||
10 | + visit wall_project_path(project) | ||
11 | + end | ||
12 | + | ||
13 | + subject { page } | ||
14 | + | ||
15 | + describe "the note form" do | ||
16 | + # main target form creation | ||
17 | + it { should have_css(".js-main-target-form", visible: true, count: 1) } | ||
18 | + | ||
19 | + # button initalization | ||
20 | + it { within(".js-main-target-form") { should have_button("Add Comment") } } | ||
21 | + it { within(".js-main-target-form") { should_not have_link("Cancel") } } | ||
22 | + | ||
23 | + # notifiactions | ||
24 | + it { within(".js-main-target-form") { should have_checked_field("Notify team via email") } } | ||
25 | + it { within(".js-main-target-form") { should_not have_checked_field("Notify commit author") } } | ||
26 | + it { within(".js-main-target-form") { should_not have_unchecked_field("Notify commit author") } } | ||
27 | + | ||
28 | + describe "without text" do | ||
29 | + it { within(".js-main-target-form") { should have_css(".js-note-preview-button", visible: false) } } | ||
30 | + end | ||
31 | + | ||
32 | + describe "with text" do | ||
33 | + before do | ||
34 | + within(".js-main-target-form") do | ||
35 | + fill_in "note[note]", with: "This is awesome" | ||
36 | + end | ||
37 | + end | ||
38 | + | ||
39 | + it { within(".js-main-target-form") { should_not have_css(".js-comment-button[disabled]") } } | ||
40 | + | ||
41 | + it { within(".js-main-target-form") { should have_css(".js-note-preview-button", visible: true) } } | ||
42 | + end | ||
43 | + | ||
44 | + describe "with preview" do | ||
45 | + before do | ||
46 | + within(".js-main-target-form") do | ||
47 | + fill_in "note[note]", with: "This is awesome" | ||
48 | + find(".js-note-preview-button").trigger("click") | ||
49 | + end | ||
50 | + end | ||
51 | + | ||
52 | + it { within(".js-main-target-form") { should have_css(".js-note-preview", text: "This is awesome", visible: true) } } | ||
53 | + | ||
54 | + it { within(".js-main-target-form") { should have_css(".js-note-preview-button", visible: false) } } | ||
55 | + it { within(".js-main-target-form") { should have_css(".js-note-edit-button", visible: true) } } | ||
56 | + end | ||
57 | + end | ||
58 | + | ||
59 | + describe "when posting a note" do | ||
60 | + before do | ||
61 | + within(".js-main-target-form") do | ||
62 | + fill_in "note[note]", with: "This is awsome!" | ||
63 | + find(".js-note-preview-button").trigger("click") | ||
64 | + click_button "Add Comment" | ||
65 | + end | ||
66 | + end | ||
67 | + | ||
68 | + # note added | ||
69 | + it { within(".js-main-target-form") { should have_content("This is awsome!") } } | ||
70 | + | ||
71 | + # reset form | ||
72 | + it { within(".js-main-target-form") { should have_no_field("note[note]", with: "This is awesome!") } } | ||
73 | + | ||
74 | + # return from preview | ||
75 | + it { within(".js-main-target-form") { should have_css(".js-note-preview", visible: false) } } | ||
76 | + it { within(".js-main-target-form") { should have_css(".js-note-text", visible: true) } } | ||
77 | + | ||
78 | + | ||
79 | + it "should be removable" do | ||
80 | + find(".js-note-delete").trigger("click") | ||
81 | + | ||
82 | + should_not have_css(".note") | ||
83 | + end | ||
84 | + end | ||
85 | +end |
@@ -0,0 +1,48 @@ | @@ -0,0 +1,48 @@ | ||
1 | +require 'spec_helper' | ||
2 | + | ||
3 | +describe "Profile account page" do | ||
4 | + let(:user) { create(:user) } | ||
5 | + | ||
6 | + before do | ||
7 | + login_as :user | ||
8 | + end | ||
9 | + | ||
10 | + describe "when signup is enabled" do | ||
11 | + before do | ||
12 | + Gitlab.config.gitlab.stub(:signup_enabled).and_return(true) | ||
13 | + visit account_profile_path | ||
14 | + end | ||
15 | + it { page.should have_content("Remove account") } | ||
16 | + | ||
17 | + it "should delete the account", js: true do | ||
18 | + expect { click_link "Delete account" }.to change {User.count}.by(-1) | ||
19 | + current_path.should == new_user_session_path | ||
20 | + end | ||
21 | + end | ||
22 | + | ||
23 | + describe "when signup is enabled and user has a project" do | ||
24 | + before do | ||
25 | + Gitlab.config.gitlab.stub(:signup_enabled).and_return(true) | ||
26 | + @project = create(:project, namespace: @user.namespace) | ||
27 | + @project.team << [@user, :master] | ||
28 | + visit account_profile_path | ||
29 | + end | ||
30 | + it { page.should have_content("Remove account") } | ||
31 | + | ||
32 | + it "should not allow user to delete the account" do | ||
33 | + expect { click_link "Delete account" }.not_to change {User.count}.by(-1) | ||
34 | + end | ||
35 | + end | ||
36 | + | ||
37 | + describe "when signup is disabled" do | ||
38 | + before do | ||
39 | + Gitlab.config.gitlab.stub(:signup_enabled).and_return(false) | ||
40 | + visit account_profile_path | ||
41 | + end | ||
42 | + | ||
43 | + it "should not have option to remove account" do | ||
44 | + page.should_not have_content("Remove account") | ||
45 | + current_path.should == account_profile_path | ||
46 | + end | ||
47 | + end | ||
48 | +end | ||
0 | \ No newline at end of file | 49 | \ No newline at end of file |
@@ -0,0 +1,67 @@ | @@ -0,0 +1,67 @@ | ||
1 | +require 'spec_helper' | ||
2 | + | ||
3 | +describe "Projects", "DeployKeys" do | ||
4 | + let(:project) { create(:project) } | ||
5 | + | ||
6 | + before do | ||
7 | + login_as :user | ||
8 | + project.team << [@user, :master] | ||
9 | + end | ||
10 | + | ||
11 | + describe "GET /keys" do | ||
12 | + before do | ||
13 | + @key = create(:key, project: project) | ||
14 | + visit project_deploy_keys_path(project) | ||
15 | + end | ||
16 | + | ||
17 | + subject { page } | ||
18 | + | ||
19 | + it { should have_content(@key.title) } | ||
20 | + | ||
21 | + describe "Destroy" do | ||
22 | + before { visit project_deploy_key_path(project, @key) } | ||
23 | + | ||
24 | + it "should remove entry" do | ||
25 | + expect { | ||
26 | + click_link "Remove" | ||
27 | + }.to change { project.deploy_keys.count }.by(-1) | ||
28 | + end | ||
29 | + end | ||
30 | + end | ||
31 | + | ||
32 | + describe "New key" do | ||
33 | + before do | ||
34 | + visit project_deploy_keys_path(project) | ||
35 | + click_link "New Deploy Key" | ||
36 | + end | ||
37 | + | ||
38 | + it "should open new key popup" do | ||
39 | + page.should have_content("New Deploy key") | ||
40 | + end | ||
41 | + | ||
42 | + describe "fill in" do | ||
43 | + before do | ||
44 | + fill_in "key_title", with: "laptop" | ||
45 | + fill_in "key_key", with: "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAzrEJUIR6Y03TCE9rIJ+GqTBvgb8t1jI9h5UBzCLuK4VawOmkLornPqLDrGbm6tcwM/wBrrLvVOqi2HwmkKEIecVO0a64A4rIYScVsXIniHRS6w5twyn1MD3sIbN+socBDcaldECQa2u1dI3tnNVcs8wi77fiRe7RSxePsJceGoheRQgC8AZ510UdIlO+9rjIHUdVN7LLyz512auAfYsgx1OfablkQ/XJcdEwDNgi9imI6nAXhmoKUm1IPLT2yKajTIC64AjLOnE0YyCh6+7RFMpiMyu1qiOCpdjYwTgBRiciNRZCH8xIedyCoAmiUgkUT40XYHwLuwiPJICpkAzp7Q== user@laptop" | ||
46 | + end | ||
47 | + | ||
48 | + it { expect { click_button "Save" }.to change {Key.count}.by(1) } | ||
49 | + | ||
50 | + it "should add new key to table" do | ||
51 | + click_button "Save" | ||
52 | + | ||
53 | + page.should have_content "laptop" | ||
54 | + end | ||
55 | + end | ||
56 | + end | ||
57 | + | ||
58 | + describe "Show page" do | ||
59 | + before do | ||
60 | + @key = create(:key, project: project) | ||
61 | + visit project_deploy_key_path(project, @key) | ||
62 | + end | ||
63 | + | ||
64 | + it { page.should have_content @key.title } | ||
65 | + it { page.should have_content @key.key[0..10] } | ||
66 | + end | ||
67 | +end |
@@ -0,0 +1,17 @@ | @@ -0,0 +1,17 @@ | ||
1 | +require 'spec_helper' | ||
2 | + | ||
3 | +describe "Projects" do | ||
4 | + before { login_as :user } | ||
5 | + | ||
6 | + describe "DELETE /projects/:id" do | ||
7 | + before do | ||
8 | + @project = create(:project, namespace: @user.namespace) | ||
9 | + @project.team << [@user, :master] | ||
10 | + visit edit_project_path(@project) | ||
11 | + end | ||
12 | + | ||
13 | + it "should be correct path" do | ||
14 | + expect { click_link "Remove" }.to change {Project.count}.by(-1) | ||
15 | + end | ||
16 | + end | ||
17 | +end |
@@ -0,0 +1,17 @@ | @@ -0,0 +1,17 @@ | ||
1 | +require 'spec_helper' | ||
2 | + | ||
3 | +describe "Search" do | ||
4 | + before do | ||
5 | + login_as :user | ||
6 | + @project = create(:project) | ||
7 | + @project.team << [@user, :reporter] | ||
8 | + visit search_path | ||
9 | + fill_in "search", with: @project.name[0..3] | ||
10 | + click_button "Search" | ||
11 | + end | ||
12 | + | ||
13 | + it "should show project in search results" do | ||
14 | + page.should have_content @project.name | ||
15 | + end | ||
16 | +end | ||
17 | + |
@@ -0,0 +1,49 @@ | @@ -0,0 +1,49 @@ | ||
1 | +require 'spec_helper' | ||
2 | + | ||
3 | +describe "Users Security" do | ||
4 | + describe "Project" do | ||
5 | + before do | ||
6 | + @u1 = create(:user) | ||
7 | + end | ||
8 | + | ||
9 | + describe "GET /login" do | ||
10 | + it { new_user_session_path.should_not be_404_for :visitor } | ||
11 | + end | ||
12 | + | ||
13 | + describe "GET /keys" do | ||
14 | + subject { keys_path } | ||
15 | + | ||
16 | + it { should be_allowed_for @u1 } | ||
17 | + it { should be_allowed_for :admin } | ||
18 | + it { should be_allowed_for :user } | ||
19 | + it { should be_denied_for :visitor } | ||
20 | + end | ||
21 | + | ||
22 | + describe "GET /profile" do | ||
23 | + subject { profile_path } | ||
24 | + | ||
25 | + it { should be_allowed_for @u1 } | ||
26 | + it { should be_allowed_for :admin } | ||
27 | + it { should be_allowed_for :user } | ||
28 | + it { should be_denied_for :visitor } | ||
29 | + end | ||
30 | + | ||
31 | + describe "GET /profile/account" do | ||
32 | + subject { account_profile_path } | ||
33 | + | ||
34 | + it { should be_allowed_for @u1 } | ||
35 | + it { should be_allowed_for :admin } | ||
36 | + it { should be_allowed_for :user } | ||
37 | + it { should be_denied_for :visitor } | ||
38 | + end | ||
39 | + | ||
40 | + describe "GET /profile/design" do | ||
41 | + subject { design_profile_path } | ||
42 | + | ||
43 | + it { should be_allowed_for @u1 } | ||
44 | + it { should be_allowed_for :admin } | ||
45 | + it { should be_allowed_for :user } | ||
46 | + it { should be_denied_for :visitor } | ||
47 | + end | ||
48 | + end | ||
49 | +end |
@@ -0,0 +1,243 @@ | @@ -0,0 +1,243 @@ | ||
1 | +require 'spec_helper' | ||
2 | + | ||
3 | +describe "Application access" do | ||
4 | + describe "GET /" do | ||
5 | + it { root_path.should be_allowed_for :admin } | ||
6 | + it { root_path.should be_allowed_for :user } | ||
7 | + it { root_path.should be_denied_for :visitor } | ||
8 | + end | ||
9 | + | ||
10 | + describe "GET /projects/new" do | ||
11 | + it { new_project_path.should be_allowed_for :admin } | ||
12 | + it { new_project_path.should be_allowed_for :user } | ||
13 | + it { new_project_path.should be_denied_for :visitor } | ||
14 | + end | ||
15 | + | ||
16 | + describe "Project" do | ||
17 | + let(:project) { create(:project) } | ||
18 | + | ||
19 | + let(:master) { create(:user) } | ||
20 | + let(:guest) { create(:user) } | ||
21 | + let(:reporter) { create(:user) } | ||
22 | + | ||
23 | + before do | ||
24 | + # full access | ||
25 | + project.team << [master, :master] | ||
26 | + | ||
27 | + # readonly | ||
28 | + project.team << [reporter, :reporter] | ||
29 | + end | ||
30 | + | ||
31 | + describe "GET /project_code" do | ||
32 | + subject { project_path(project) } | ||
33 | + | ||
34 | + it { should be_allowed_for master } | ||
35 | + it { should be_allowed_for reporter } | ||
36 | + it { should be_denied_for :admin } | ||
37 | + it { should be_denied_for guest } | ||
38 | + it { should be_denied_for :user } | ||
39 | + it { should be_denied_for :visitor } | ||
40 | + end | ||
41 | + | ||
42 | + describe "GET /project_code/tree/master" do | ||
43 | + subject { project_tree_path(project, project.repository.root_ref) } | ||
44 | + | ||
45 | + it { should be_allowed_for master } | ||
46 | + it { should be_allowed_for reporter } | ||
47 | + it { should be_denied_for :admin } | ||
48 | + it { should be_denied_for guest } | ||
49 | + it { should be_denied_for :user } | ||
50 | + it { should be_denied_for :visitor } | ||
51 | + end | ||
52 | + | ||
53 | + describe "GET /project_code/commits/master" do | ||
54 | + subject { project_commits_path(project, project.repository.root_ref, limit: 1) } | ||
55 | + | ||
56 | + it { should be_allowed_for master } | ||
57 | + it { should be_allowed_for reporter } | ||
58 | + it { should be_denied_for :admin } | ||
59 | + it { should be_denied_for guest } | ||
60 | + it { should be_denied_for :user } | ||
61 | + it { should be_denied_for :visitor } | ||
62 | + end | ||
63 | + | ||
64 | + describe "GET /project_code/commit/:sha" do | ||
65 | + subject { project_commit_path(project, project.repository.commit) } | ||
66 | + | ||
67 | + it { should be_allowed_for master } | ||
68 | + it { should be_allowed_for reporter } | ||
69 | + it { should be_denied_for :admin } | ||
70 | + it { should be_denied_for guest } | ||
71 | + it { should be_denied_for :user } | ||
72 | + it { should be_denied_for :visitor } | ||
73 | + end | ||
74 | + | ||
75 | + describe "GET /project_code/compare" do | ||
76 | + subject { project_compare_index_path(project) } | ||
77 | + | ||
78 | + it { should be_allowed_for master } | ||
79 | + it { should be_allowed_for reporter } | ||
80 | + it { should be_denied_for :admin } | ||
81 | + it { should be_denied_for guest } | ||
82 | + it { should be_denied_for :user } | ||
83 | + it { should be_denied_for :visitor } | ||
84 | + end | ||
85 | + | ||
86 | + describe "GET /project_code/team" do | ||
87 | + subject { project_team_index_path(project) } | ||
88 | + | ||
89 | + it { should be_allowed_for master } | ||
90 | + it { should be_allowed_for reporter } | ||
91 | + it { should be_denied_for :admin } | ||
92 | + it { should be_denied_for guest } | ||
93 | + it { should be_denied_for :user } | ||
94 | + it { should be_denied_for :visitor } | ||
95 | + end | ||
96 | + | ||
97 | + describe "GET /project_code/wall" do | ||
98 | + subject { wall_project_path(project) } | ||
99 | + | ||
100 | + it { should be_allowed_for master } | ||
101 | + it { should be_allowed_for reporter } | ||
102 | + it { should be_denied_for :admin } | ||
103 | + it { should be_denied_for guest } | ||
104 | + it { should be_denied_for :user } | ||
105 | + it { should be_denied_for :visitor } | ||
106 | + end | ||
107 | + | ||
108 | + describe "GET /project_code/blob" do | ||
109 | + before do | ||
110 | + commit = project.repository.commit | ||
111 | + path = commit.tree.contents.select { |i| i.is_a?(Grit::Blob)}.first.name | ||
112 | + @blob_path = project_blob_path(project, File.join(commit.id, path)) | ||
113 | + end | ||
114 | + | ||
115 | + it { @blob_path.should be_allowed_for master } | ||
116 | + it { @blob_path.should be_allowed_for reporter } | ||
117 | + it { @blob_path.should be_denied_for :admin } | ||
118 | + it { @blob_path.should be_denied_for guest } | ||
119 | + it { @blob_path.should be_denied_for :user } | ||
120 | + it { @blob_path.should be_denied_for :visitor } | ||
121 | + end | ||
122 | + | ||
123 | + describe "GET /project_code/edit" do | ||
124 | + subject { edit_project_path(project) } | ||
125 | + | ||
126 | + it { should be_allowed_for master } | ||
127 | + it { should be_denied_for reporter } | ||
128 | + it { should be_denied_for :admin } | ||
129 | + it { should be_denied_for guest } | ||
130 | + it { should be_denied_for :user } | ||
131 | + it { should be_denied_for :visitor } | ||
132 | + end | ||
133 | + | ||
134 | + describe "GET /project_code/deploy_keys" do | ||
135 | + subject { project_deploy_keys_path(project) } | ||
136 | + | ||
137 | + it { should be_allowed_for master } | ||
138 | + it { should be_denied_for reporter } | ||
139 | + it { should be_denied_for :admin } | ||
140 | + it { should be_denied_for guest } | ||
141 | + it { should be_denied_for :user } | ||
142 | + it { should be_denied_for :visitor } | ||
143 | + end | ||
144 | + | ||
145 | + describe "GET /project_code/issues" do | ||
146 | + subject { project_issues_path(project) } | ||
147 | + | ||
148 | + it { should be_allowed_for master } | ||
149 | + it { should be_allowed_for reporter } | ||
150 | + it { should be_denied_for :admin } | ||
151 | + it { should be_denied_for guest } | ||
152 | + it { should be_denied_for :user } | ||
153 | + it { should be_denied_for :visitor } | ||
154 | + end | ||
155 | + | ||
156 | + describe "GET /project_code/snippets" do | ||
157 | + subject { project_snippets_path(project) } | ||
158 | + | ||
159 | + it { should be_allowed_for master } | ||
160 | + it { should be_allowed_for reporter } | ||
161 | + it { should be_denied_for :admin } | ||
162 | + it { should be_denied_for guest } | ||
163 | + it { should be_denied_for :user } | ||
164 | + it { should be_denied_for :visitor } | ||
165 | + end | ||
166 | + | ||
167 | + describe "GET /project_code/merge_requests" do | ||
168 | + subject { project_merge_requests_path(project) } | ||
169 | + | ||
170 | + it { should be_allowed_for master } | ||
171 | + it { should be_allowed_for reporter } | ||
172 | + it { should be_denied_for :admin } | ||
173 | + it { should be_denied_for guest } | ||
174 | + it { should be_denied_for :user } | ||
175 | + it { should be_denied_for :visitor } | ||
176 | + end | ||
177 | + | ||
178 | + describe "GET /project_code/repository" do | ||
179 | + subject { project_repository_path(project) } | ||
180 | + | ||
181 | + it { should be_allowed_for master } | ||
182 | + it { should be_allowed_for reporter } | ||
183 | + it { should be_denied_for :admin } | ||
184 | + it { should be_denied_for guest } | ||
185 | + it { should be_denied_for :user } | ||
186 | + it { should be_denied_for :visitor } | ||
187 | + end | ||
188 | + | ||
189 | + describe "GET /project_code/repository/branches" do | ||
190 | + subject { branches_project_repository_path(project) } | ||
191 | + | ||
192 | + before do | ||
193 | + # Speed increase | ||
194 | + Project.any_instance.stub(:branches).and_return([]) | ||
195 | + end | ||
196 | + | ||
197 | + it { should be_allowed_for master } | ||
198 | + it { should be_allowed_for reporter } | ||
199 | + it { should be_denied_for :admin } | ||
200 | + it { should be_denied_for guest } | ||
201 | + it { should be_denied_for :user } | ||
202 | + it { should be_denied_for :visitor } | ||
203 | + end | ||
204 | + | ||
205 | + describe "GET /project_code/repository/tags" do | ||
206 | + subject { tags_project_repository_path(project) } | ||
207 | + | ||
208 | + before do | ||
209 | + # Speed increase | ||
210 | + Project.any_instance.stub(:tags).and_return([]) | ||
211 | + end | ||
212 | + | ||
213 | + it { should be_allowed_for master } | ||
214 | + it { should be_allowed_for reporter } | ||
215 | + it { should be_denied_for :admin } | ||
216 | + it { should be_denied_for guest } | ||
217 | + it { should be_denied_for :user } | ||
218 | + it { should be_denied_for :visitor } | ||
219 | + end | ||
220 | + | ||
221 | + describe "GET /project_code/hooks" do | ||
222 | + subject { project_hooks_path(project) } | ||
223 | + | ||
224 | + it { should be_allowed_for master } | ||
225 | + it { should be_allowed_for reporter } | ||
226 | + it { should be_denied_for :admin } | ||
227 | + it { should be_denied_for guest } | ||
228 | + it { should be_denied_for :user } | ||
229 | + it { should be_denied_for :visitor } | ||
230 | + end | ||
231 | + | ||
232 | + describe "GET /project_code/files" do | ||
233 | + subject { files_project_path(project) } | ||
234 | + | ||
235 | + it { should be_allowed_for master } | ||
236 | + it { should be_allowed_for reporter } | ||
237 | + it { should be_denied_for :admin } | ||
238 | + it { should be_denied_for guest } | ||
239 | + it { should be_denied_for :user } | ||
240 | + it { should be_denied_for :visitor } | ||
241 | + end | ||
242 | + end | ||
243 | +end |
@@ -0,0 +1,99 @@ | @@ -0,0 +1,99 @@ | ||
1 | +require 'spec_helper' | ||
2 | + | ||
3 | +describe "Snippets" do | ||
4 | + let(:project) { create(:project) } | ||
5 | + | ||
6 | + before do | ||
7 | + login_as :user | ||
8 | + project.team << [@user, :developer] | ||
9 | + end | ||
10 | + | ||
11 | + describe "GET /snippets" do | ||
12 | + before do | ||
13 | + @snippet = create(:snippet, | ||
14 | + author: @user, | ||
15 | + project: project) | ||
16 | + | ||
17 | + visit project_snippets_path(project) | ||
18 | + end | ||
19 | + | ||
20 | + subject { page } | ||
21 | + | ||
22 | + it { should have_content(@snippet.title[0..10]) } | ||
23 | + it { should have_content(@snippet.project.name) } | ||
24 | + | ||
25 | + describe "Destroy" do | ||
26 | + before do | ||
27 | + # admin access to remove snippet | ||
28 | + @user.users_projects.destroy_all | ||
29 | + project.team << [@user, :master] | ||
30 | + visit edit_project_snippet_path(project, @snippet) | ||
31 | + end | ||
32 | + | ||
33 | + it "should remove entry" do | ||
34 | + expect { | ||
35 | + click_link "destroy_snippet_#{@snippet.id}" | ||
36 | + }.to change { Snippet.count }.by(-1) | ||
37 | + end | ||
38 | + end | ||
39 | + end | ||
40 | + | ||
41 | + describe "New snippet" do | ||
42 | + before do | ||
43 | + visit project_snippets_path(project) | ||
44 | + click_link "New Snippet" | ||
45 | + end | ||
46 | + | ||
47 | + it "should open new snippet popup" do | ||
48 | + page.current_path.should == new_project_snippet_path(project) | ||
49 | + end | ||
50 | + | ||
51 | + describe "fill in", js: true do | ||
52 | + before do | ||
53 | + fill_in "snippet_title", with: "login function" | ||
54 | + fill_in "snippet_file_name", with: "test.rb" | ||
55 | + page.execute_script("editor.insert('def login; end');") | ||
56 | + end | ||
57 | + | ||
58 | + it { expect { click_button "Save" }.to change {Snippet.count}.by(1) } | ||
59 | + | ||
60 | + it "should add new snippet to table" do | ||
61 | + click_button "Save" | ||
62 | + page.current_path.should == project_snippet_path(project, Snippet.last) | ||
63 | + page.should have_content "login function" | ||
64 | + page.should have_content "test.rb" | ||
65 | + end | ||
66 | + end | ||
67 | + end | ||
68 | + | ||
69 | + describe "Edit snippet" do | ||
70 | + before do | ||
71 | + @snippet = create(:snippet, | ||
72 | + author: @user, | ||
73 | + project: project) | ||
74 | + visit project_snippet_path(project, @snippet) | ||
75 | + click_link "Edit" | ||
76 | + end | ||
77 | + | ||
78 | + it "should open edit page" do | ||
79 | + page.current_path.should == edit_project_snippet_path(project, @snippet) | ||
80 | + end | ||
81 | + | ||
82 | + describe "fill in" do | ||
83 | + before do | ||
84 | + fill_in "snippet_title", with: "login function" | ||
85 | + fill_in "snippet_file_name", with: "test.rb" | ||
86 | + end | ||
87 | + | ||
88 | + it { expect { click_button "Save" }.to_not change {Snippet.count} } | ||
89 | + | ||
90 | + it "should update snippet fields" do | ||
91 | + click_button "Save" | ||
92 | + | ||
93 | + page.current_path.should == project_snippet_path(project, @snippet) | ||
94 | + page.should have_content "login function" | ||
95 | + page.should have_content "test.rb" | ||
96 | + end | ||
97 | + end | ||
98 | + end | ||
99 | +end |
spec/requests/admin/admin_hooks_spec.rb
@@ -1,51 +0,0 @@ | @@ -1,51 +0,0 @@ | ||
1 | -require 'spec_helper' | ||
2 | - | ||
3 | -describe "Admin::Hooks" do | ||
4 | - before do | ||
5 | - @project = create(:project) | ||
6 | - login_as :admin | ||
7 | - | ||
8 | - @system_hook = create(:system_hook) | ||
9 | - | ||
10 | - end | ||
11 | - | ||
12 | - describe "GET /admin/hooks" do | ||
13 | - it "should be ok" do | ||
14 | - visit admin_root_path | ||
15 | - within ".main_menu" do | ||
16 | - click_on "Hooks" | ||
17 | - end | ||
18 | - current_path.should == admin_hooks_path | ||
19 | - end | ||
20 | - | ||
21 | - it "should have hooks list" do | ||
22 | - visit admin_hooks_path | ||
23 | - page.should have_content(@system_hook.url) | ||
24 | - end | ||
25 | - end | ||
26 | - | ||
27 | - describe "New Hook" do | ||
28 | - before do | ||
29 | - @url = Faker::Internet.uri("http") | ||
30 | - visit admin_hooks_path | ||
31 | - fill_in "hook_url", with: @url | ||
32 | - expect { click_button "Add System Hook" }.to change(SystemHook, :count).by(1) | ||
33 | - end | ||
34 | - | ||
35 | - it "should open new hook popup" do | ||
36 | - page.current_path.should == admin_hooks_path | ||
37 | - page.should have_content(@url) | ||
38 | - end | ||
39 | - end | ||
40 | - | ||
41 | - describe "Test" do | ||
42 | - before do | ||
43 | - WebMock.stub_request(:post, @system_hook.url) | ||
44 | - visit admin_hooks_path | ||
45 | - click_link "Test Hook" | ||
46 | - end | ||
47 | - | ||
48 | - it { page.current_path.should == admin_hooks_path } | ||
49 | - end | ||
50 | - | ||
51 | -end |
spec/requests/admin/admin_projects_spec.rb
@@ -1,76 +0,0 @@ | @@ -1,76 +0,0 @@ | ||
1 | -require 'spec_helper' | ||
2 | - | ||
3 | -describe "Admin::Projects" do | ||
4 | - before do | ||
5 | - @project = create(:project) | ||
6 | - login_as :admin | ||
7 | - end | ||
8 | - | ||
9 | - describe "GET /admin/projects" do | ||
10 | - before do | ||
11 | - visit admin_projects_path | ||
12 | - end | ||
13 | - | ||
14 | - it "should be ok" do | ||
15 | - current_path.should == admin_projects_path | ||
16 | - end | ||
17 | - | ||
18 | - it "should have projects list" do | ||
19 | - page.should have_content(@project.name) | ||
20 | - end | ||
21 | - end | ||
22 | - | ||
23 | - describe "GET /admin/projects/:id" do | ||
24 | - before do | ||
25 | - visit admin_projects_path | ||
26 | - click_link "#{@project.name}" | ||
27 | - end | ||
28 | - | ||
29 | - it "should have project info" do | ||
30 | - page.should have_content(@project.path) | ||
31 | - page.should have_content(@project.name) | ||
32 | - end | ||
33 | - end | ||
34 | - | ||
35 | - describe "GET /admin/projects/:id/edit" do | ||
36 | - before do | ||
37 | - visit admin_projects_path | ||
38 | - click_link "edit_project_#{@project.id}" | ||
39 | - end | ||
40 | - | ||
41 | - it "should have project edit page" do | ||
42 | - page.should have_content("Edit project") | ||
43 | - page.should have_button("Save Project") | ||
44 | - end | ||
45 | - | ||
46 | - describe "Update project" do | ||
47 | - before do | ||
48 | - fill_in "project_name", with: "Big Bang" | ||
49 | - click_button "Save Project" | ||
50 | - @project.reload | ||
51 | - end | ||
52 | - | ||
53 | - it "should show page with new data" do | ||
54 | - page.should have_content("Big Bang") | ||
55 | - end | ||
56 | - | ||
57 | - it "should change project entry" do | ||
58 | - @project.name.should == "Big Bang" | ||
59 | - end | ||
60 | - end | ||
61 | - end | ||
62 | - | ||
63 | - describe "Add new team member" do | ||
64 | - before do | ||
65 | - @new_user = create(:user) | ||
66 | - visit admin_project_path(@project) | ||
67 | - end | ||
68 | - | ||
69 | - it "should create new user" do | ||
70 | - select @new_user.name, from: "user_ids" | ||
71 | - expect { click_button "Add" }.to change { UsersProject.count }.by(1) | ||
72 | - page.should have_content @new_user.name | ||
73 | - current_path.should == admin_project_path(@project) | ||
74 | - end | ||
75 | - end | ||
76 | -end |
spec/requests/admin/admin_users_spec.rb
@@ -1,135 +0,0 @@ | @@ -1,135 +0,0 @@ | ||
1 | -require 'spec_helper' | ||
2 | - | ||
3 | -describe "Admin::Users" do | ||
4 | - before { login_as :admin } | ||
5 | - | ||
6 | - describe "GET /admin/users" do | ||
7 | - before do | ||
8 | - visit admin_users_path | ||
9 | - end | ||
10 | - | ||
11 | - it "should be ok" do | ||
12 | - current_path.should == admin_users_path | ||
13 | - end | ||
14 | - | ||
15 | - it "should have users list" do | ||
16 | - page.should have_content(@user.email) | ||
17 | - page.should have_content(@user.name) | ||
18 | - end | ||
19 | - end | ||
20 | - | ||
21 | - describe "GET /admin/users/new" do | ||
22 | - before do | ||
23 | - @password = "123ABC" | ||
24 | - visit new_admin_user_path | ||
25 | - fill_in "user_name", with: "Big Bang" | ||
26 | - fill_in "user_username", with: "bang" | ||
27 | - fill_in "user_email", with: "bigbang@mail.com" | ||
28 | - fill_in "user_password", with: @password | ||
29 | - fill_in "user_password_confirmation", with: @password | ||
30 | - end | ||
31 | - | ||
32 | - it "should create new user" do | ||
33 | - expect { click_button "Save" }.to change {User.count}.by(1) | ||
34 | - end | ||
35 | - | ||
36 | - it "should create user with valid data" do | ||
37 | - click_button "Save" | ||
38 | - user = User.last | ||
39 | - user.name.should == "Big Bang" | ||
40 | - user.email.should == "bigbang@mail.com" | ||
41 | - end | ||
42 | - | ||
43 | - it "should call send mail" do | ||
44 | - Notify.should_receive(:new_user_email) | ||
45 | - | ||
46 | - User.observers.enable :user_observer do | ||
47 | - click_button "Save" | ||
48 | - end | ||
49 | - end | ||
50 | - | ||
51 | - it "should send valid email to user with email & password" do | ||
52 | - Gitlab.config.gitlab.stub(:signup_enabled).and_return(false) | ||
53 | - User.observers.enable :user_observer do | ||
54 | - click_button "Save" | ||
55 | - user = User.last | ||
56 | - email = ActionMailer::Base.deliveries.last | ||
57 | - email.subject.should have_content("Account was created") | ||
58 | - email.body.should have_content(user.email) | ||
59 | - email.body.should have_content(@password) | ||
60 | - end | ||
61 | - end | ||
62 | - | ||
63 | - it "should send valid email to user with email without password when signup is enabled" do | ||
64 | - Gitlab.config.gitlab.stub(:signup_enabled).and_return(true) | ||
65 | - User.observers.enable :user_observer do | ||
66 | - click_button "Save" | ||
67 | - user = User.last | ||
68 | - email = ActionMailer::Base.deliveries.last | ||
69 | - email.subject.should have_content("Account was created") | ||
70 | - email.body.should have_content(user.email) | ||
71 | - email.body.should_not have_content(@password) | ||
72 | - end | ||
73 | - end | ||
74 | - end | ||
75 | - | ||
76 | - describe "GET /admin/users/:id" do | ||
77 | - before do | ||
78 | - visit admin_users_path | ||
79 | - click_link "#{@user.name}" | ||
80 | - end | ||
81 | - | ||
82 | - it "should have user info" do | ||
83 | - page.should have_content(@user.email) | ||
84 | - page.should have_content(@user.name) | ||
85 | - page.should have_content(@user.projects_limit) | ||
86 | - end | ||
87 | - end | ||
88 | - | ||
89 | - describe "GET /admin/users/:id/edit" do | ||
90 | - before do | ||
91 | - @simple_user = create(:user) | ||
92 | - visit admin_users_path | ||
93 | - click_link "edit_user_#{@simple_user.id}" | ||
94 | - end | ||
95 | - | ||
96 | - it "should have user edit page" do | ||
97 | - page.should have_content("Name") | ||
98 | - page.should have_content("Password") | ||
99 | - end | ||
100 | - | ||
101 | - describe "Update user" do | ||
102 | - before do | ||
103 | - fill_in "user_name", with: "Big Bang" | ||
104 | - fill_in "user_email", with: "bigbang@mail.com" | ||
105 | - check "user_admin" | ||
106 | - click_button "Save" | ||
107 | - end | ||
108 | - | ||
109 | - it "should show page with new data" do | ||
110 | - page.should have_content("bigbang@mail.com") | ||
111 | - page.should have_content("Big Bang") | ||
112 | - end | ||
113 | - | ||
114 | - it "should change user entry" do | ||
115 | - @simple_user.reload | ||
116 | - @simple_user.name.should == "Big Bang" | ||
117 | - @simple_user.is_admin?.should be_true | ||
118 | - end | ||
119 | - end | ||
120 | - end | ||
121 | - | ||
122 | - describe "Add new project" do | ||
123 | - before do | ||
124 | - @new_project = create(:project) | ||
125 | - visit admin_user_path(@user) | ||
126 | - end | ||
127 | - | ||
128 | - it "should create new user" do | ||
129 | - select @new_project.name, from: "project_ids" | ||
130 | - expect { click_button "Add" }.to change { UsersProject.count }.by(1) | ||
131 | - page.should have_content @new_project.name | ||
132 | - current_path.should == admin_user_path(@user) | ||
133 | - end | ||
134 | - end | ||
135 | -end |
spec/requests/admin/security_spec.rb
@@ -1,27 +0,0 @@ | @@ -1,27 +0,0 @@ | ||
1 | -require 'spec_helper' | ||
2 | - | ||
3 | -describe "Admin::Projects" do | ||
4 | - describe "GET /admin/projects" do | ||
5 | - subject { admin_projects_path } | ||
6 | - | ||
7 | - it { should be_allowed_for :admin } | ||
8 | - it { should be_denied_for :user } | ||
9 | - it { should be_denied_for :visitor } | ||
10 | - end | ||
11 | - | ||
12 | - describe "GET /admin/users" do | ||
13 | - subject { admin_users_path } | ||
14 | - | ||
15 | - it { should be_allowed_for :admin } | ||
16 | - it { should be_denied_for :user } | ||
17 | - it { should be_denied_for :visitor } | ||
18 | - end | ||
19 | - | ||
20 | - describe "GET /admin/hooks" do | ||
21 | - subject { admin_hooks_path } | ||
22 | - | ||
23 | - it { should be_allowed_for :admin } | ||
24 | - it { should be_denied_for :user } | ||
25 | - it { should be_denied_for :visitor } | ||
26 | - end | ||
27 | -end |
spec/requests/atom/dashboard_issues_spec.rb
@@ -1,24 +0,0 @@ | @@ -1,24 +0,0 @@ | ||
1 | -require 'spec_helper' | ||
2 | - | ||
3 | -describe "Dashboard Issues Feed" do | ||
4 | - describe "GET /issues" do | ||
5 | - let!(:user) { create(:user) } | ||
6 | - let!(:project1) { create(:project) } | ||
7 | - let!(:project2) { create(:project) } | ||
8 | - let!(:issue1) { create(:issue, author: user, assignee: user, project: project1) } | ||
9 | - let!(:issue2) { create(:issue, author: user, assignee: user, project: project2) } | ||
10 | - | ||
11 | - describe "atom feed" do | ||
12 | - it "should render atom feed via private token" do | ||
13 | - visit issues_dashboard_path(:atom, private_token: user.private_token) | ||
14 | - | ||
15 | - page.response_headers['Content-Type'].should have_content("application/atom+xml") | ||
16 | - page.body.should have_selector("title", text: "#{user.name} issues") | ||
17 | - page.body.should have_selector("author email", text: issue1.author_email) | ||
18 | - page.body.should have_selector("entry summary", text: issue1.title) | ||
19 | - page.body.should have_selector("author email", text: issue2.author_email) | ||
20 | - page.body.should have_selector("entry summary", text: issue2.title) | ||
21 | - end | ||
22 | - end | ||
23 | - end | ||
24 | -end |
spec/requests/atom/dashboard_spec.rb
@@ -1,14 +0,0 @@ | @@ -1,14 +0,0 @@ | ||
1 | -require 'spec_helper' | ||
2 | - | ||
3 | -describe "Dashboard Feed" do | ||
4 | - describe "GET /" do | ||
5 | - let!(:user) { create(:user) } | ||
6 | - | ||
7 | - context "projects atom feed via private token" do | ||
8 | - it "should render projects atom feed" do | ||
9 | - visit dashboard_path(:atom, private_token: user.private_token) | ||
10 | - page.body.should have_selector("feed title") | ||
11 | - end | ||
12 | - end | ||
13 | - end | ||
14 | -end |
spec/requests/atom/issues_spec.rb
@@ -1,34 +0,0 @@ | @@ -1,34 +0,0 @@ | ||
1 | -require 'spec_helper' | ||
2 | - | ||
3 | -describe "Issues Feed" do | ||
4 | - describe "GET /issues" do | ||
5 | - let!(:user) { create(:user) } | ||
6 | - let!(:project) { create(:project, namespace: user.namespace) } | ||
7 | - let!(:issue) { create(:issue, author: user, project: project) } | ||
8 | - | ||
9 | - before { project.team << [user, :developer] } | ||
10 | - | ||
11 | - context "when authenticated" do | ||
12 | - it "should render atom feed" do | ||
13 | - login_with user | ||
14 | - visit project_issues_path(project, :atom) | ||
15 | - | ||
16 | - page.response_headers['Content-Type'].should have_content("application/atom+xml") | ||
17 | - page.body.should have_selector("title", text: "#{project.name} issues") | ||
18 | - page.body.should have_selector("author email", text: issue.author_email) | ||
19 | - page.body.should have_selector("entry summary", text: issue.title) | ||
20 | - end | ||
21 | - end | ||
22 | - | ||
23 | - context "when authenticated via private token" do | ||
24 | - it "should render atom feed" do | ||
25 | - visit project_issues_path(project, :atom, private_token: user.private_token) | ||
26 | - | ||
27 | - page.response_headers['Content-Type'].should have_content("application/atom+xml") | ||
28 | - page.body.should have_selector("title", text: "#{project.name} issues") | ||
29 | - page.body.should have_selector("author email", text: issue.author_email) | ||
30 | - page.body.should have_selector("entry summary", text: issue.title) | ||
31 | - end | ||
32 | - end | ||
33 | - end | ||
34 | -end |
spec/requests/gitlab_flavored_markdown_spec.rb
@@ -1,223 +0,0 @@ | @@ -1,223 +0,0 @@ | ||
1 | -require 'spec_helper' | ||
2 | - | ||
3 | -describe "Gitlab Flavored Markdown" do | ||
4 | - let(:project) { create(:project) } | ||
5 | - let(:issue) { create(:issue, project: project) } | ||
6 | - let(:merge_request) { create(:merge_request, project: project) } | ||
7 | - let(:fred) do | ||
8 | - u = create(:user, name: "fred") | ||
9 | - project.team << [u, :master] | ||
10 | - u | ||
11 | - end | ||
12 | - | ||
13 | - before do | ||
14 | - # add test branch | ||
15 | - @branch_name = "gfm-test" | ||
16 | - r = project.repo | ||
17 | - i = r.index | ||
18 | - # add test file | ||
19 | - @test_file = "gfm_test_file" | ||
20 | - i.add(@test_file, "foo\nbar\n") | ||
21 | - # add commit with gfm | ||
22 | - i.commit("fix ##{issue.id}\n\nask @#{fred.username} for details", head: @branch_name) | ||
23 | - | ||
24 | - # add test tag | ||
25 | - @tag_name = "gfm-test-tag" | ||
26 | - r.git.native(:tag, {}, @tag_name, commit.id) | ||
27 | - end | ||
28 | - | ||
29 | - after do | ||
30 | - # delete test branch and tag | ||
31 | - project.repo.git.native(:branch, {D: true}, @branch_name) | ||
32 | - project.repo.git.native(:tag, {d: true}, @tag_name) | ||
33 | - project.repo.gc_auto | ||
34 | - end | ||
35 | - | ||
36 | - let(:commit) { project.repository.commits(@branch_name).first } | ||
37 | - | ||
38 | - before do | ||
39 | - login_as :user | ||
40 | - project.team << [@user, :developer] | ||
41 | - end | ||
42 | - | ||
43 | - describe "for commits" do | ||
44 | - it "should render title in commits#index" do | ||
45 | - visit project_commits_path(project, @branch_name, limit: 1) | ||
46 | - | ||
47 | - page.should have_link("##{issue.id}") | ||
48 | - end | ||
49 | - | ||
50 | - it "should render title in commits#show" do | ||
51 | - visit project_commit_path(project, commit) | ||
52 | - | ||
53 | - page.should have_link("##{issue.id}") | ||
54 | - end | ||
55 | - | ||
56 | - it "should render description in commits#show" do | ||
57 | - visit project_commit_path(project, commit) | ||
58 | - | ||
59 | - page.should have_link("@#{fred.username}") | ||
60 | - end | ||
61 | - | ||
62 | - it "should render title in refs#tree", js: true do | ||
63 | - visit project_tree_path(project, @branch_name) | ||
64 | - | ||
65 | - within(".tree_commit") do | ||
66 | - page.should have_link("##{issue.id}") | ||
67 | - end | ||
68 | - end | ||
69 | - | ||
70 | - # @wip | ||
71 | - #it "should render title in refs#blame" do | ||
72 | - #visit project_blame_path(project, File.join(@branch_name, @test_file)) | ||
73 | - | ||
74 | - #within(".blame_commit") do | ||
75 | - #page.should have_link("##{issue.id}") | ||
76 | - #end | ||
77 | - #end | ||
78 | - | ||
79 | - it "should render title in repositories#branches" do | ||
80 | - visit branches_project_repository_path(project) | ||
81 | - | ||
82 | - page.should have_link("##{issue.id}") | ||
83 | - end | ||
84 | - end | ||
85 | - | ||
86 | - describe "for issues" do | ||
87 | - before do | ||
88 | - @other_issue = create(:issue, | ||
89 | - author: @user, | ||
90 | - assignee: @user, | ||
91 | - project: project) | ||
92 | - @issue = create(:issue, | ||
93 | - author: @user, | ||
94 | - assignee: @user, | ||
95 | - project: project, | ||
96 | - title: "fix ##{@other_issue.id}", | ||
97 | - description: "ask @#{fred.username} for details") | ||
98 | - end | ||
99 | - | ||
100 | - it "should render subject in issues#index" do | ||
101 | - visit project_issues_path(project) | ||
102 | - | ||
103 | - page.should have_link("##{@other_issue.id}") | ||
104 | - end | ||
105 | - | ||
106 | - it "should render subject in issues#show" do | ||
107 | - visit project_issue_path(project, @issue) | ||
108 | - | ||
109 | - page.should have_link("##{@other_issue.id}") | ||
110 | - end | ||
111 | - | ||
112 | - it "should render details in issues#show" do | ||
113 | - visit project_issue_path(project, @issue) | ||
114 | - | ||
115 | - page.should have_link("@#{fred.username}") | ||
116 | - end | ||
117 | - end | ||
118 | - | ||
119 | - | ||
120 | - describe "for merge requests" do | ||
121 | - before do | ||
122 | - @merge_request = create(:merge_request, | ||
123 | - project: project, | ||
124 | - title: "fix ##{issue.id}") | ||
125 | - end | ||
126 | - | ||
127 | - it "should render title in merge_requests#index" do | ||
128 | - visit project_merge_requests_path(project) | ||
129 | - | ||
130 | - page.should have_link("##{issue.id}") | ||
131 | - end | ||
132 | - | ||
133 | - it "should render title in merge_requests#show" do | ||
134 | - visit project_merge_request_path(project, @merge_request) | ||
135 | - | ||
136 | - page.should have_link("##{issue.id}") | ||
137 | - end | ||
138 | - end | ||
139 | - | ||
140 | - | ||
141 | - describe "for milestones" do | ||
142 | - before do | ||
143 | - @milestone = create(:milestone, | ||
144 | - project: project, | ||
145 | - title: "fix ##{issue.id}", | ||
146 | - description: "ask @#{fred.username} for details") | ||
147 | - end | ||
148 | - | ||
149 | - it "should render title in milestones#index" do | ||
150 | - visit project_milestones_path(project) | ||
151 | - | ||
152 | - page.should have_link("##{issue.id}") | ||
153 | - end | ||
154 | - | ||
155 | - it "should render title in milestones#show" do | ||
156 | - visit project_milestone_path(project, @milestone) | ||
157 | - | ||
158 | - page.should have_link("##{issue.id}") | ||
159 | - end | ||
160 | - | ||
161 | - it "should render description in milestones#show" do | ||
162 | - visit project_milestone_path(project, @milestone) | ||
163 | - | ||
164 | - page.should have_link("@#{fred.username}") | ||
165 | - end | ||
166 | - end | ||
167 | - | ||
168 | - | ||
169 | - describe "for notes" do | ||
170 | - it "should render in commits#show", js: true do | ||
171 | - visit project_commit_path(project, commit) | ||
172 | - fill_in "note_note", with: "see ##{issue.id}" | ||
173 | - click_button "Add Comment" | ||
174 | - | ||
175 | - page.should have_link("##{issue.id}") | ||
176 | - end | ||
177 | - | ||
178 | - it "should render in issue#show", js: true do | ||
179 | - visit project_issue_path(project, issue) | ||
180 | - fill_in "note_note", with: "see ##{issue.id}" | ||
181 | - click_button "Add Comment" | ||
182 | - | ||
183 | - page.should have_link("##{issue.id}") | ||
184 | - end | ||
185 | - | ||
186 | - it "should render in merge_request#show", js: true do | ||
187 | - visit project_merge_request_path(project, merge_request) | ||
188 | - fill_in "note_note", with: "see ##{issue.id}" | ||
189 | - click_button "Add Comment" | ||
190 | - | ||
191 | - page.should have_link("##{issue.id}") | ||
192 | - end | ||
193 | - | ||
194 | - it "should render in projects#wall", js: true do | ||
195 | - visit wall_project_path(project) | ||
196 | - fill_in "note_note", with: "see ##{issue.id}" | ||
197 | - click_button "Add Comment" | ||
198 | - | ||
199 | - page.should have_link("##{issue.id}") | ||
200 | - end | ||
201 | - end | ||
202 | - | ||
203 | - | ||
204 | - describe "for wikis" do | ||
205 | - before do | ||
206 | - visit project_wiki_path(project, :index) | ||
207 | - fill_in "Title", with: "Circumvent ##{issue.id}" | ||
208 | - fill_in "Content", with: "# Other pages\n\n* [Foo](foo)\n* [Bar](bar)\n\nAlso look at ##{issue.id} :-)" | ||
209 | - click_on "Save" | ||
210 | - end | ||
211 | - | ||
212 | - it "should NOT render title in wikis#show" do | ||
213 | - within(".content h3") do # page title | ||
214 | - page.should have_content("Circumvent ##{issue.id}") | ||
215 | - page.should_not have_link("##{issue.id}") | ||
216 | - end | ||
217 | - end | ||
218 | - | ||
219 | - it "should render content in wikis#show" do | ||
220 | - page.should have_link("##{issue.id}") | ||
221 | - end | ||
222 | - end | ||
223 | -end |
spec/requests/issues_spec.rb
@@ -1,132 +0,0 @@ | @@ -1,132 +0,0 @@ | ||
1 | -require 'spec_helper' | ||
2 | - | ||
3 | -describe "Issues" do | ||
4 | - let(:project) { create(:project) } | ||
5 | - | ||
6 | - before do | ||
7 | - login_as :user | ||
8 | - user2 = create(:user) | ||
9 | - | ||
10 | - project.team << [[@user, user2], :developer] | ||
11 | - end | ||
12 | - | ||
13 | - describe "Edit issue" do | ||
14 | - let!(:issue) do | ||
15 | - create(:issue, | ||
16 | - author: @user, | ||
17 | - assignee: @user, | ||
18 | - project: project) | ||
19 | - end | ||
20 | - | ||
21 | - before do | ||
22 | - visit project_issues_path(project) | ||
23 | - click_link "Edit" | ||
24 | - end | ||
25 | - | ||
26 | - it "should open new issue popup" do | ||
27 | - page.should have_content("Issue ##{issue.id}") | ||
28 | - end | ||
29 | - | ||
30 | - describe "fill in" do | ||
31 | - before do | ||
32 | - fill_in "issue_title", with: "bug 345" | ||
33 | - fill_in "issue_description", with: "bug description" | ||
34 | - end | ||
35 | - | ||
36 | - it { expect { click_button "Save changes" }.to_not change {Issue.count} } | ||
37 | - | ||
38 | - it "should update issue fields" do | ||
39 | - click_button "Save changes" | ||
40 | - | ||
41 | - page.should have_content @user.name | ||
42 | - page.should have_content "bug 345" | ||
43 | - page.should have_content project.name | ||
44 | - end | ||
45 | - end | ||
46 | - end | ||
47 | - | ||
48 | - describe "Search issue", js: true do | ||
49 | - before do | ||
50 | - ['foobar', 'foobar2', 'gitlab'].each do |title| | ||
51 | - create(:issue, | ||
52 | - author: @user, | ||
53 | - assignee: @user, | ||
54 | - project: project, | ||
55 | - title: title) | ||
56 | - end | ||
57 | - end | ||
58 | - | ||
59 | - it "should be able to search on different statuses" do | ||
60 | - issue = Issue.first # with title 'foobar' | ||
61 | - issue.close | ||
62 | - | ||
63 | - visit project_issues_path(project) | ||
64 | - click_link 'Closed' | ||
65 | - fill_in 'issue_search', with: 'foobar' | ||
66 | - | ||
67 | - page.should have_content 'foobar' | ||
68 | - page.should_not have_content 'foobar2' | ||
69 | - page.should_not have_content 'gitlab' | ||
70 | - end | ||
71 | - | ||
72 | - it "should search for term and return the correct results" do | ||
73 | - visit project_issues_path(project) | ||
74 | - fill_in 'issue_search', with: 'foobar' | ||
75 | - | ||
76 | - page.should have_content 'foobar' | ||
77 | - page.should have_content 'foobar2' | ||
78 | - page.should_not have_content 'gitlab' | ||
79 | - end | ||
80 | - end | ||
81 | - | ||
82 | - describe "Filter issue" do | ||
83 | - before do | ||
84 | - ['foobar', 'barbaz', 'gitlab'].each do |title| | ||
85 | - create(:issue, | ||
86 | - author: @user, | ||
87 | - assignee: @user, | ||
88 | - project: project, | ||
89 | - title: title) | ||
90 | - end | ||
91 | - | ||
92 | - @issue = Issue.first # with title 'foobar' | ||
93 | - @issue.milestone = create(:milestone, project: project) | ||
94 | - @issue.assignee = nil | ||
95 | - @issue.save | ||
96 | - end | ||
97 | - | ||
98 | - let(:issue) { @issue } | ||
99 | - | ||
100 | - it "should allow filtering by issues with no specified milestone" do | ||
101 | - visit project_issues_path(project, milestone_id: '0') | ||
102 | - | ||
103 | - page.should_not have_content 'foobar' | ||
104 | - page.should have_content 'barbaz' | ||
105 | - page.should have_content 'gitlab' | ||
106 | - end | ||
107 | - | ||
108 | - it "should allow filtering by a specified milestone" do | ||
109 | - visit project_issues_path(project, milestone_id: issue.milestone.id) | ||
110 | - | ||
111 | - page.should have_content 'foobar' | ||
112 | - page.should_not have_content 'barbaz' | ||
113 | - page.should_not have_content 'gitlab' | ||
114 | - end | ||
115 | - | ||
116 | - it "should allow filtering by issues with no specified assignee" do | ||
117 | - visit project_issues_path(project, assignee_id: '0') | ||
118 | - | ||
119 | - page.should have_content 'foobar' | ||
120 | - page.should_not have_content 'barbaz' | ||
121 | - page.should_not have_content 'gitlab' | ||
122 | - end | ||
123 | - | ||
124 | - it "should allow filtering by a specified assignee" do | ||
125 | - visit project_issues_path(project, assignee_id: @user.id) | ||
126 | - | ||
127 | - page.should_not have_content 'foobar' | ||
128 | - page.should have_content 'barbaz' | ||
129 | - page.should have_content 'gitlab' | ||
130 | - end | ||
131 | - end | ||
132 | -end |
spec/requests/notes_on_merge_requests_spec.rb
@@ -1,232 +0,0 @@ | @@ -1,232 +0,0 @@ | ||
1 | -require 'spec_helper' | ||
2 | - | ||
3 | -describe "On a merge request", js: true do | ||
4 | - let!(:project) { create(:project) } | ||
5 | - let!(:merge_request) { create(:merge_request, project: project) } | ||
6 | - | ||
7 | - before do | ||
8 | - login_as :user | ||
9 | - project.team << [@user, :master] | ||
10 | - | ||
11 | - visit project_merge_request_path(project, merge_request) | ||
12 | - end | ||
13 | - | ||
14 | - subject { page } | ||
15 | - | ||
16 | - describe "the note form" do | ||
17 | - # main target form creation | ||
18 | - it { should have_css(".js-main-target-form", visible: true, count: 1) } | ||
19 | - | ||
20 | - # button initalization | ||
21 | - it { within(".js-main-target-form") { should have_button("Add Comment") } } | ||
22 | - it { within(".js-main-target-form") { should_not have_link("Cancel") } } | ||
23 | - | ||
24 | - # notifiactions | ||
25 | - it { within(".js-main-target-form") { should have_checked_field("Notify team via email") } } | ||
26 | - it { within(".js-main-target-form") { should_not have_checked_field("Notify commit author") } } | ||
27 | - it { within(".js-main-target-form") { should_not have_unchecked_field("Notify commit author") } } | ||
28 | - | ||
29 | - describe "without text" do | ||
30 | - it { within(".js-main-target-form") { should have_css(".js-note-preview-button", visible: false) } } | ||
31 | - end | ||
32 | - | ||
33 | - describe "with text" do | ||
34 | - before do | ||
35 | - within(".js-main-target-form") do | ||
36 | - fill_in "note[note]", with: "This is awesome" | ||
37 | - end | ||
38 | - end | ||
39 | - | ||
40 | - it { within(".js-main-target-form") { should_not have_css(".js-comment-button[disabled]") } } | ||
41 | - | ||
42 | - it { within(".js-main-target-form") { should have_css(".js-note-preview-button", visible: true) } } | ||
43 | - end | ||
44 | - | ||
45 | - describe "with preview" do | ||
46 | - before do | ||
47 | - within(".js-main-target-form") do | ||
48 | - fill_in "note[note]", with: "This is awesome" | ||
49 | - find(".js-note-preview-button").trigger("click") | ||
50 | - end | ||
51 | - end | ||
52 | - | ||
53 | - it { within(".js-main-target-form") { should have_css(".js-note-preview", text: "This is awesome", visible: true) } } | ||
54 | - | ||
55 | - it { within(".js-main-target-form") { should have_css(".js-note-preview-button", visible: false) } } | ||
56 | - it { within(".js-main-target-form") { should have_css(".js-note-edit-button", visible: true) } } | ||
57 | - end | ||
58 | - end | ||
59 | - | ||
60 | - describe "when posting a note" do | ||
61 | - before do | ||
62 | - within(".js-main-target-form") do | ||
63 | - fill_in "note[note]", with: "This is awsome!" | ||
64 | - find(".js-note-preview-button").trigger("click") | ||
65 | - click_button "Add Comment" | ||
66 | - end | ||
67 | - end | ||
68 | - | ||
69 | - # note added | ||
70 | - it { within(".js-main-target-form") { should have_content("This is awsome!") } } | ||
71 | - | ||
72 | - # reset form | ||
73 | - it { within(".js-main-target-form") { should have_no_field("note[note]", with: "This is awesome!") } } | ||
74 | - | ||
75 | - # return from preview | ||
76 | - it { within(".js-main-target-form") { should have_css(".js-note-preview", visible: false) } } | ||
77 | - it { within(".js-main-target-form") { should have_css(".js-note-text", visible: true) } } | ||
78 | - | ||
79 | - | ||
80 | - it "should be removable" do | ||
81 | - find(".js-note-delete").trigger("click") | ||
82 | - | ||
83 | - should_not have_css(".note") | ||
84 | - end | ||
85 | - end | ||
86 | -end | ||
87 | - | ||
88 | - | ||
89 | - | ||
90 | -describe "On a merge request diff", js: true, focus: true do | ||
91 | - let!(:project) { create(:project) } | ||
92 | - let!(:merge_request) { create(:merge_request_with_diffs, project: project) } | ||
93 | - | ||
94 | - before do | ||
95 | - login_as :user | ||
96 | - project.team << [@user, :master] | ||
97 | - | ||
98 | - visit diffs_project_merge_request_path(project, merge_request) | ||
99 | - | ||
100 | - click_link("Diff") | ||
101 | - end | ||
102 | - | ||
103 | - subject { page } | ||
104 | - | ||
105 | - describe "when adding a note" do | ||
106 | - before do | ||
107 | - find("#4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185.line_holder .js-add-diff-note-button").trigger("click") | ||
108 | - end | ||
109 | - | ||
110 | - describe "the notes holder" do | ||
111 | - it { should have_css("#4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185.line_holder + .js-temp-notes-holder") } | ||
112 | - | ||
113 | - it { within(".js-temp-notes-holder") { should have_css(".new_note") } } | ||
114 | - end | ||
115 | - | ||
116 | - describe "the note form" do | ||
117 | - # set up hidden fields correctly | ||
118 | - it { within(".js-temp-notes-holder") { find("#note_noteable_type").value.should == "MergeRequest" } } | ||
119 | - it { within(".js-temp-notes-holder") { find("#note_noteable_id").value.should == merge_request.id.to_s } } | ||
120 | - it { within(".js-temp-notes-holder") { find("#note_commit_id").value.should == "" } } | ||
121 | - it { within(".js-temp-notes-holder") { find("#note_line_code").value.should == "4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185" } } | ||
122 | - | ||
123 | - # buttons | ||
124 | - it { should have_button("Add Comment") } | ||
125 | - it { should have_css(".js-close-discussion-note-form", text: "Cancel") } | ||
126 | - | ||
127 | - # notification options | ||
128 | - it { should have_checked_field("Notify team via email") } | ||
129 | - | ||
130 | - it "shouldn't add a second form for same row" do | ||
131 | - find("#4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185.line_holder .js-add-diff-note-button").trigger("click") | ||
132 | - | ||
133 | - should have_css("#4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185.line_holder + .js-temp-notes-holder form", count: 1) | ||
134 | - end | ||
135 | - | ||
136 | - it "should be removed when canceled" do | ||
137 | - find(".js-close-discussion-note-form").trigger("click") | ||
138 | - | ||
139 | - should have_no_css(".js-temp-notes-holder") | ||
140 | - end | ||
141 | - end | ||
142 | - end | ||
143 | - | ||
144 | - describe "with muliple note forms" do | ||
145 | - before do | ||
146 | - find("#4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185.line_holder .js-add-diff-note-button").trigger("click") | ||
147 | - find("#342e16cbbd482ac2047dc679b2749d248cc1428f_18_17.line_holder .js-add-diff-note-button").trigger("click") | ||
148 | - end | ||
149 | - | ||
150 | - # has two line forms | ||
151 | - it { should have_css(".js-temp-notes-holder", count: 2) } | ||
152 | - | ||
153 | - describe "previewing them separately" do | ||
154 | - before do | ||
155 | - # add two separate texts and trigger previews on both | ||
156 | - within("#4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185.line_holder + .js-temp-notes-holder") do | ||
157 | - fill_in "note[note]", with: "One comment on line 185" | ||
158 | - find(".js-note-preview-button").trigger("click") | ||
159 | - end | ||
160 | - within("#342e16cbbd482ac2047dc679b2749d248cc1428f_18_17.line_holder + .js-temp-notes-holder") do | ||
161 | - fill_in "note[note]", with: "Another comment on line 17" | ||
162 | - find(".js-note-preview-button").trigger("click") | ||
163 | - end | ||
164 | - end | ||
165 | - | ||
166 | - # check if previews were rendered separately | ||
167 | - it { within("#4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185.line_holder + .js-temp-notes-holder") { should have_css(".js-note-preview", text: "One comment on line 185") } } | ||
168 | - it { within("#342e16cbbd482ac2047dc679b2749d248cc1428f_18_17.line_holder + .js-temp-notes-holder") { should have_css(".js-note-preview", text: "Another comment on line 17") } } | ||
169 | - end | ||
170 | - | ||
171 | - describe "posting a note" do | ||
172 | - before do | ||
173 | - within("#342e16cbbd482ac2047dc679b2749d248cc1428f_18_17.line_holder + .js-temp-notes-holder") do | ||
174 | - fill_in "note[note]", with: "Another comment on line 17" | ||
175 | - click_button("Add Comment") | ||
176 | - end | ||
177 | - end | ||
178 | - | ||
179 | - # removed form after submit | ||
180 | - it { should have_no_css("#342e16cbbd482ac2047dc679b2749d248cc1428f_18_17.line_holder + .js-temp-notes-holder") } | ||
181 | - | ||
182 | - # added discussion | ||
183 | - it { should have_content("Another comment on line 17") } | ||
184 | - it { should have_css("#342e16cbbd482ac2047dc679b2749d248cc1428f_18_17.line_holder + .notes_holder") } | ||
185 | - it { should have_css("#342e16cbbd482ac2047dc679b2749d248cc1428f_18_17.line_holder + .notes_holder .note", count: 1) } | ||
186 | - it { should have_link("Reply") } | ||
187 | - | ||
188 | - it "should remove last note of a discussion" do | ||
189 | - within("#342e16cbbd482ac2047dc679b2749d248cc1428f_18_17.line_holder + .notes_holder") do | ||
190 | - find(".js-note-delete").trigger("click") | ||
191 | - end | ||
192 | - | ||
193 | - # removed whole discussion | ||
194 | - should_not have_css(".note_holder") | ||
195 | - should have_css("#342e16cbbd482ac2047dc679b2749d248cc1428f_18_17.line_holder + #342e16cbbd482ac2047dc679b2749d248cc1428f_18_18.line_holder") | ||
196 | - end | ||
197 | - end | ||
198 | - end | ||
199 | - | ||
200 | - describe "when replying to a note" do | ||
201 | - before do | ||
202 | - # create first note | ||
203 | - find("#4735dfc552ad7bf15ca468adc3cad9d05b624490_184_184.line_holder .js-add-diff-note-button").trigger("click") | ||
204 | - within("#4735dfc552ad7bf15ca468adc3cad9d05b624490_184_184.line_holder + .js-temp-notes-holder") do | ||
205 | - fill_in "note[note]", with: "One comment on line 184" | ||
206 | - click_button("Add Comment") | ||
207 | - end | ||
208 | - # create second note | ||
209 | - within("#4735dfc552ad7bf15ca468adc3cad9d05b624490_184_184.line_holder + .notes_holder") do | ||
210 | - find(".js-discussion-reply-button").trigger("click") | ||
211 | - fill_in "note[note]", with: "An additional comment in reply" | ||
212 | - click_button("Add Comment") | ||
213 | - end | ||
214 | - end | ||
215 | - | ||
216 | - # inserted note | ||
217 | - it { should have_content("An additional comment in reply") } | ||
218 | - it { within("#4735dfc552ad7bf15ca468adc3cad9d05b624490_184_184.line_holder + .notes_holder") { should have_css(".note", count: 2) } } | ||
219 | - | ||
220 | - # removed form after reply | ||
221 | - it { within("#4735dfc552ad7bf15ca468adc3cad9d05b624490_184_184.line_holder + .notes_holder") { should have_no_css("form") } } | ||
222 | - it { within("#4735dfc552ad7bf15ca468adc3cad9d05b624490_184_184.line_holder + .notes_holder") { should have_link("Reply") } } | ||
223 | - end | ||
224 | -end | ||
225 | - | ||
226 | - | ||
227 | - | ||
228 | -describe "On merge request discussion", js: true do | ||
229 | - describe "with merge request diff note" | ||
230 | - describe "with commit note" | ||
231 | - describe "with commit diff note" | ||
232 | -end |
spec/requests/notes_on_wall_spec.rb
@@ -1,85 +0,0 @@ | @@ -1,85 +0,0 @@ | ||
1 | -require 'spec_helper' | ||
2 | - | ||
3 | -describe "On the project wall", js: true do | ||
4 | - let!(:project) { create(:project) } | ||
5 | - let!(:commit) { project.repository.commit("bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a") } | ||
6 | - | ||
7 | - before do | ||
8 | - login_as :user | ||
9 | - project.team << [@user, :master] | ||
10 | - visit wall_project_path(project) | ||
11 | - end | ||
12 | - | ||
13 | - subject { page } | ||
14 | - | ||
15 | - describe "the note form" do | ||
16 | - # main target form creation | ||
17 | - it { should have_css(".js-main-target-form", visible: true, count: 1) } | ||
18 | - | ||
19 | - # button initalization | ||
20 | - it { within(".js-main-target-form") { should have_button("Add Comment") } } | ||
21 | - it { within(".js-main-target-form") { should_not have_link("Cancel") } } | ||
22 | - | ||
23 | - # notifiactions | ||
24 | - it { within(".js-main-target-form") { should have_checked_field("Notify team via email") } } | ||
25 | - it { within(".js-main-target-form") { should_not have_checked_field("Notify commit author") } } | ||
26 | - it { within(".js-main-target-form") { should_not have_unchecked_field("Notify commit author") } } | ||
27 | - | ||
28 | - describe "without text" do | ||
29 | - it { within(".js-main-target-form") { should have_css(".js-note-preview-button", visible: false) } } | ||
30 | - end | ||
31 | - | ||
32 | - describe "with text" do | ||
33 | - before do | ||
34 | - within(".js-main-target-form") do | ||
35 | - fill_in "note[note]", with: "This is awesome" | ||
36 | - end | ||
37 | - end | ||
38 | - | ||
39 | - it { within(".js-main-target-form") { should_not have_css(".js-comment-button[disabled]") } } | ||
40 | - | ||
41 | - it { within(".js-main-target-form") { should have_css(".js-note-preview-button", visible: true) } } | ||
42 | - end | ||
43 | - | ||
44 | - describe "with preview" do | ||
45 | - before do | ||
46 | - within(".js-main-target-form") do | ||
47 | - fill_in "note[note]", with: "This is awesome" | ||
48 | - find(".js-note-preview-button").trigger("click") | ||
49 | - end | ||
50 | - end | ||
51 | - | ||
52 | - it { within(".js-main-target-form") { should have_css(".js-note-preview", text: "This is awesome", visible: true) } } | ||
53 | - | ||
54 | - it { within(".js-main-target-form") { should have_css(".js-note-preview-button", visible: false) } } | ||
55 | - it { within(".js-main-target-form") { should have_css(".js-note-edit-button", visible: true) } } | ||
56 | - end | ||
57 | - end | ||
58 | - | ||
59 | - describe "when posting a note" do | ||
60 | - before do | ||
61 | - within(".js-main-target-form") do | ||
62 | - fill_in "note[note]", with: "This is awsome!" | ||
63 | - find(".js-note-preview-button").trigger("click") | ||
64 | - click_button "Add Comment" | ||
65 | - end | ||
66 | - end | ||
67 | - | ||
68 | - # note added | ||
69 | - it { within(".js-main-target-form") { should have_content("This is awsome!") } } | ||
70 | - | ||
71 | - # reset form | ||
72 | - it { within(".js-main-target-form") { should have_no_field("note[note]", with: "This is awesome!") } } | ||
73 | - | ||
74 | - # return from preview | ||
75 | - it { within(".js-main-target-form") { should have_css(".js-note-preview", visible: false) } } | ||
76 | - it { within(".js-main-target-form") { should have_css(".js-note-text", visible: true) } } | ||
77 | - | ||
78 | - | ||
79 | - it "should be removable" do | ||
80 | - find(".js-note-delete").trigger("click") | ||
81 | - | ||
82 | - should_not have_css(".note") | ||
83 | - end | ||
84 | - end | ||
85 | -end |
spec/requests/profile_spec.rb
@@ -1,48 +0,0 @@ | @@ -1,48 +0,0 @@ | ||
1 | -require 'spec_helper' | ||
2 | - | ||
3 | -describe "Profile account page" do | ||
4 | - let(:user) { create(:user) } | ||
5 | - | ||
6 | - before do | ||
7 | - login_as :user | ||
8 | - end | ||
9 | - | ||
10 | - describe "when signup is enabled" do | ||
11 | - before do | ||
12 | - Gitlab.config.gitlab.stub(:signup_enabled).and_return(true) | ||
13 | - visit account_profile_path | ||
14 | - end | ||
15 | - it { page.should have_content("Remove account") } | ||
16 | - | ||
17 | - it "should delete the account", js: true do | ||
18 | - expect { click_link "Delete account" }.to change {User.count}.by(-1) | ||
19 | - current_path.should == new_user_session_path | ||
20 | - end | ||
21 | - end | ||
22 | - | ||
23 | - describe "when signup is enabled and user has a project" do | ||
24 | - before do | ||
25 | - Gitlab.config.gitlab.stub(:signup_enabled).and_return(true) | ||
26 | - @project = create(:project, namespace: @user.namespace) | ||
27 | - @project.team << [@user, :master] | ||
28 | - visit account_profile_path | ||
29 | - end | ||
30 | - it { page.should have_content("Remove account") } | ||
31 | - | ||
32 | - it "should not allow user to delete the account" do | ||
33 | - expect { click_link "Delete account" }.not_to change {User.count}.by(-1) | ||
34 | - end | ||
35 | - end | ||
36 | - | ||
37 | - describe "when signup is disabled" do | ||
38 | - before do | ||
39 | - Gitlab.config.gitlab.stub(:signup_enabled).and_return(false) | ||
40 | - visit account_profile_path | ||
41 | - end | ||
42 | - | ||
43 | - it "should not have option to remove account" do | ||
44 | - page.should_not have_content("Remove account") | ||
45 | - current_path.should == account_profile_path | ||
46 | - end | ||
47 | - end | ||
48 | -end | ||
49 | \ No newline at end of file | 0 | \ No newline at end of file |
spec/requests/projects_deploy_keys_spec.rb
@@ -1,67 +0,0 @@ | @@ -1,67 +0,0 @@ | ||
1 | -require 'spec_helper' | ||
2 | - | ||
3 | -describe "Projects", "DeployKeys" do | ||
4 | - let(:project) { create(:project) } | ||
5 | - | ||
6 | - before do | ||
7 | - login_as :user | ||
8 | - project.team << [@user, :master] | ||
9 | - end | ||
10 | - | ||
11 | - describe "GET /keys" do | ||
12 | - before do | ||
13 | - @key = create(:key, project: project) | ||
14 | - visit project_deploy_keys_path(project) | ||
15 | - end | ||
16 | - | ||
17 | - subject { page } | ||
18 | - | ||
19 | - it { should have_content(@key.title) } | ||
20 | - | ||
21 | - describe "Destroy" do | ||
22 | - before { visit project_deploy_key_path(project, @key) } | ||
23 | - | ||
24 | - it "should remove entry" do | ||
25 | - expect { | ||
26 | - click_link "Remove" | ||
27 | - }.to change { project.deploy_keys.count }.by(-1) | ||
28 | - end | ||
29 | - end | ||
30 | - end | ||
31 | - | ||
32 | - describe "New key" do | ||
33 | - before do | ||
34 | - visit project_deploy_keys_path(project) | ||
35 | - click_link "New Deploy Key" | ||
36 | - end | ||
37 | - | ||
38 | - it "should open new key popup" do | ||
39 | - page.should have_content("New Deploy key") | ||
40 | - end | ||
41 | - | ||
42 | - describe "fill in" do | ||
43 | - before do | ||
44 | - fill_in "key_title", with: "laptop" | ||
45 | - fill_in "key_key", with: "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAzrEJUIR6Y03TCE9rIJ+GqTBvgb8t1jI9h5UBzCLuK4VawOmkLornPqLDrGbm6tcwM/wBrrLvVOqi2HwmkKEIecVO0a64A4rIYScVsXIniHRS6w5twyn1MD3sIbN+socBDcaldECQa2u1dI3tnNVcs8wi77fiRe7RSxePsJceGoheRQgC8AZ510UdIlO+9rjIHUdVN7LLyz512auAfYsgx1OfablkQ/XJcdEwDNgi9imI6nAXhmoKUm1IPLT2yKajTIC64AjLOnE0YyCh6+7RFMpiMyu1qiOCpdjYwTgBRiciNRZCH8xIedyCoAmiUgkUT40XYHwLuwiPJICpkAzp7Q== user@laptop" | ||
46 | - end | ||
47 | - | ||
48 | - it { expect { click_button "Save" }.to change {Key.count}.by(1) } | ||
49 | - | ||
50 | - it "should add new key to table" do | ||
51 | - click_button "Save" | ||
52 | - | ||
53 | - page.should have_content "laptop" | ||
54 | - end | ||
55 | - end | ||
56 | - end | ||
57 | - | ||
58 | - describe "Show page" do | ||
59 | - before do | ||
60 | - @key = create(:key, project: project) | ||
61 | - visit project_deploy_key_path(project, @key) | ||
62 | - end | ||
63 | - | ||
64 | - it { page.should have_content @key.title } | ||
65 | - it { page.should have_content @key.key[0..10] } | ||
66 | - end | ||
67 | -end |
spec/requests/projects_spec.rb
@@ -1,17 +0,0 @@ | @@ -1,17 +0,0 @@ | ||
1 | -require 'spec_helper' | ||
2 | - | ||
3 | -describe "Projects" do | ||
4 | - before { login_as :user } | ||
5 | - | ||
6 | - describe "DELETE /projects/:id" do | ||
7 | - before do | ||
8 | - @project = create(:project, namespace: @user.namespace) | ||
9 | - @project.team << [@user, :master] | ||
10 | - visit edit_project_path(@project) | ||
11 | - end | ||
12 | - | ||
13 | - it "should be correct path" do | ||
14 | - expect { click_link "Remove" }.to change {Project.count}.by(-1) | ||
15 | - end | ||
16 | - end | ||
17 | -end |
spec/requests/search_spec.rb
@@ -1,17 +0,0 @@ | @@ -1,17 +0,0 @@ | ||
1 | -require 'spec_helper' | ||
2 | - | ||
3 | -describe "Search" do | ||
4 | - before do | ||
5 | - login_as :user | ||
6 | - @project = create(:project) | ||
7 | - @project.team << [@user, :reporter] | ||
8 | - visit search_path | ||
9 | - fill_in "search", with: @project.name[0..3] | ||
10 | - click_button "Search" | ||
11 | - end | ||
12 | - | ||
13 | - it "should show project in search results" do | ||
14 | - page.should have_content @project.name | ||
15 | - end | ||
16 | -end | ||
17 | - |
spec/requests/security/profile_access_spec.rb
@@ -1,49 +0,0 @@ | @@ -1,49 +0,0 @@ | ||
1 | -require 'spec_helper' | ||
2 | - | ||
3 | -describe "Users Security" do | ||
4 | - describe "Project" do | ||
5 | - before do | ||
6 | - @u1 = create(:user) | ||
7 | - end | ||
8 | - | ||
9 | - describe "GET /login" do | ||
10 | - it { new_user_session_path.should_not be_404_for :visitor } | ||
11 | - end | ||
12 | - | ||
13 | - describe "GET /keys" do | ||
14 | - subject { keys_path } | ||
15 | - | ||
16 | - it { should be_allowed_for @u1 } | ||
17 | - it { should be_allowed_for :admin } | ||
18 | - it { should be_allowed_for :user } | ||
19 | - it { should be_denied_for :visitor } | ||
20 | - end | ||
21 | - | ||
22 | - describe "GET /profile" do | ||
23 | - subject { profile_path } | ||
24 | - | ||
25 | - it { should be_allowed_for @u1 } | ||
26 | - it { should be_allowed_for :admin } | ||
27 | - it { should be_allowed_for :user } | ||
28 | - it { should be_denied_for :visitor } | ||
29 | - end | ||
30 | - | ||
31 | - describe "GET /profile/account" do | ||
32 | - subject { account_profile_path } | ||
33 | - | ||
34 | - it { should be_allowed_for @u1 } | ||
35 | - it { should be_allowed_for :admin } | ||
36 | - it { should be_allowed_for :user } | ||
37 | - it { should be_denied_for :visitor } | ||
38 | - end | ||
39 | - | ||
40 | - describe "GET /profile/design" do | ||
41 | - subject { design_profile_path } | ||
42 | - | ||
43 | - it { should be_allowed_for @u1 } | ||
44 | - it { should be_allowed_for :admin } | ||
45 | - it { should be_allowed_for :user } | ||
46 | - it { should be_denied_for :visitor } | ||
47 | - end | ||
48 | - end | ||
49 | -end |
spec/requests/security/project_access_spec.rb
@@ -1,243 +0,0 @@ | @@ -1,243 +0,0 @@ | ||
1 | -require 'spec_helper' | ||
2 | - | ||
3 | -describe "Application access" do | ||
4 | - describe "GET /" do | ||
5 | - it { root_path.should be_allowed_for :admin } | ||
6 | - it { root_path.should be_allowed_for :user } | ||
7 | - it { root_path.should be_denied_for :visitor } | ||
8 | - end | ||
9 | - | ||
10 | - describe "GET /projects/new" do | ||
11 | - it { new_project_path.should be_allowed_for :admin } | ||
12 | - it { new_project_path.should be_allowed_for :user } | ||
13 | - it { new_project_path.should be_denied_for :visitor } | ||
14 | - end | ||
15 | - | ||
16 | - describe "Project" do | ||
17 | - let(:project) { create(:project) } | ||
18 | - | ||
19 | - let(:master) { create(:user) } | ||
20 | - let(:guest) { create(:user) } | ||
21 | - let(:reporter) { create(:user) } | ||
22 | - | ||
23 | - before do | ||
24 | - # full access | ||
25 | - project.team << [master, :master] | ||
26 | - | ||
27 | - # readonly | ||
28 | - project.team << [reporter, :reporter] | ||
29 | - end | ||
30 | - | ||
31 | - describe "GET /project_code" do | ||
32 | - subject { project_path(project) } | ||
33 | - | ||
34 | - it { should be_allowed_for master } | ||
35 | - it { should be_allowed_for reporter } | ||
36 | - it { should be_denied_for :admin } | ||
37 | - it { should be_denied_for guest } | ||
38 | - it { should be_denied_for :user } | ||
39 | - it { should be_denied_for :visitor } | ||
40 | - end | ||
41 | - | ||
42 | - describe "GET /project_code/tree/master" do | ||
43 | - subject { project_tree_path(project, project.repository.root_ref) } | ||
44 | - | ||
45 | - it { should be_allowed_for master } | ||
46 | - it { should be_allowed_for reporter } | ||
47 | - it { should be_denied_for :admin } | ||
48 | - it { should be_denied_for guest } | ||
49 | - it { should be_denied_for :user } | ||
50 | - it { should be_denied_for :visitor } | ||
51 | - end | ||
52 | - | ||
53 | - describe "GET /project_code/commits/master" do | ||
54 | - subject { project_commits_path(project, project.repository.root_ref, limit: 1) } | ||
55 | - | ||
56 | - it { should be_allowed_for master } | ||
57 | - it { should be_allowed_for reporter } | ||
58 | - it { should be_denied_for :admin } | ||
59 | - it { should be_denied_for guest } | ||
60 | - it { should be_denied_for :user } | ||
61 | - it { should be_denied_for :visitor } | ||
62 | - end | ||
63 | - | ||
64 | - describe "GET /project_code/commit/:sha" do | ||
65 | - subject { project_commit_path(project, project.repository.commit) } | ||
66 | - | ||
67 | - it { should be_allowed_for master } | ||
68 | - it { should be_allowed_for reporter } | ||
69 | - it { should be_denied_for :admin } | ||
70 | - it { should be_denied_for guest } | ||
71 | - it { should be_denied_for :user } | ||
72 | - it { should be_denied_for :visitor } | ||
73 | - end | ||
74 | - | ||
75 | - describe "GET /project_code/compare" do | ||
76 | - subject { project_compare_index_path(project) } | ||
77 | - | ||
78 | - it { should be_allowed_for master } | ||
79 | - it { should be_allowed_for reporter } | ||
80 | - it { should be_denied_for :admin } | ||
81 | - it { should be_denied_for guest } | ||
82 | - it { should be_denied_for :user } | ||
83 | - it { should be_denied_for :visitor } | ||
84 | - end | ||
85 | - | ||
86 | - describe "GET /project_code/team" do | ||
87 | - subject { project_team_index_path(project) } | ||
88 | - | ||
89 | - it { should be_allowed_for master } | ||
90 | - it { should be_allowed_for reporter } | ||
91 | - it { should be_denied_for :admin } | ||
92 | - it { should be_denied_for guest } | ||
93 | - it { should be_denied_for :user } | ||
94 | - it { should be_denied_for :visitor } | ||
95 | - end | ||
96 | - | ||
97 | - describe "GET /project_code/wall" do | ||
98 | - subject { wall_project_path(project) } | ||
99 | - | ||
100 | - it { should be_allowed_for master } | ||
101 | - it { should be_allowed_for reporter } | ||
102 | - it { should be_denied_for :admin } | ||
103 | - it { should be_denied_for guest } | ||
104 | - it { should be_denied_for :user } | ||
105 | - it { should be_denied_for :visitor } | ||
106 | - end | ||
107 | - | ||
108 | - describe "GET /project_code/blob" do | ||
109 | - before do | ||
110 | - commit = project.repository.commit | ||
111 | - path = commit.tree.contents.select { |i| i.is_a?(Grit::Blob)}.first.name | ||
112 | - @blob_path = project_blob_path(project, File.join(commit.id, path)) | ||
113 | - end | ||
114 | - | ||
115 | - it { @blob_path.should be_allowed_for master } | ||
116 | - it { @blob_path.should be_allowed_for reporter } | ||
117 | - it { @blob_path.should be_denied_for :admin } | ||
118 | - it { @blob_path.should be_denied_for guest } | ||
119 | - it { @blob_path.should be_denied_for :user } | ||
120 | - it { @blob_path.should be_denied_for :visitor } | ||
121 | - end | ||
122 | - | ||
123 | - describe "GET /project_code/edit" do | ||
124 | - subject { edit_project_path(project) } | ||
125 | - | ||
126 | - it { should be_allowed_for master } | ||
127 | - it { should be_denied_for reporter } | ||
128 | - it { should be_denied_for :admin } | ||
129 | - it { should be_denied_for guest } | ||
130 | - it { should be_denied_for :user } | ||
131 | - it { should be_denied_for :visitor } | ||
132 | - end | ||
133 | - | ||
134 | - describe "GET /project_code/deploy_keys" do | ||
135 | - subject { project_deploy_keys_path(project) } | ||
136 | - | ||
137 | - it { should be_allowed_for master } | ||
138 | - it { should be_denied_for reporter } | ||
139 | - it { should be_denied_for :admin } | ||
140 | - it { should be_denied_for guest } | ||
141 | - it { should be_denied_for :user } | ||
142 | - it { should be_denied_for :visitor } | ||
143 | - end | ||
144 | - | ||
145 | - describe "GET /project_code/issues" do | ||
146 | - subject { project_issues_path(project) } | ||
147 | - | ||
148 | - it { should be_allowed_for master } | ||
149 | - it { should be_allowed_for reporter } | ||
150 | - it { should be_denied_for :admin } | ||
151 | - it { should be_denied_for guest } | ||
152 | - it { should be_denied_for :user } | ||
153 | - it { should be_denied_for :visitor } | ||
154 | - end | ||
155 | - | ||
156 | - describe "GET /project_code/snippets" do | ||
157 | - subject { project_snippets_path(project) } | ||
158 | - | ||
159 | - it { should be_allowed_for master } | ||
160 | - it { should be_allowed_for reporter } | ||
161 | - it { should be_denied_for :admin } | ||
162 | - it { should be_denied_for guest } | ||
163 | - it { should be_denied_for :user } | ||
164 | - it { should be_denied_for :visitor } | ||
165 | - end | ||
166 | - | ||
167 | - describe "GET /project_code/merge_requests" do | ||
168 | - subject { project_merge_requests_path(project) } | ||
169 | - | ||
170 | - it { should be_allowed_for master } | ||
171 | - it { should be_allowed_for reporter } | ||
172 | - it { should be_denied_for :admin } | ||
173 | - it { should be_denied_for guest } | ||
174 | - it { should be_denied_for :user } | ||
175 | - it { should be_denied_for :visitor } | ||
176 | - end | ||
177 | - | ||
178 | - describe "GET /project_code/repository" do | ||
179 | - subject { project_repository_path(project) } | ||
180 | - | ||
181 | - it { should be_allowed_for master } | ||
182 | - it { should be_allowed_for reporter } | ||
183 | - it { should be_denied_for :admin } | ||
184 | - it { should be_denied_for guest } | ||
185 | - it { should be_denied_for :user } | ||
186 | - it { should be_denied_for :visitor } | ||
187 | - end | ||
188 | - | ||
189 | - describe "GET /project_code/repository/branches" do | ||
190 | - subject { branches_project_repository_path(project) } | ||
191 | - | ||
192 | - before do | ||
193 | - # Speed increase | ||
194 | - Project.any_instance.stub(:branches).and_return([]) | ||
195 | - end | ||
196 | - | ||
197 | - it { should be_allowed_for master } | ||
198 | - it { should be_allowed_for reporter } | ||
199 | - it { should be_denied_for :admin } | ||
200 | - it { should be_denied_for guest } | ||
201 | - it { should be_denied_for :user } | ||
202 | - it { should be_denied_for :visitor } | ||
203 | - end | ||
204 | - | ||
205 | - describe "GET /project_code/repository/tags" do | ||
206 | - subject { tags_project_repository_path(project) } | ||
207 | - | ||
208 | - before do | ||
209 | - # Speed increase | ||
210 | - Project.any_instance.stub(:tags).and_return([]) | ||
211 | - end | ||
212 | - | ||
213 | - it { should be_allowed_for master } | ||
214 | - it { should be_allowed_for reporter } | ||
215 | - it { should be_denied_for :admin } | ||
216 | - it { should be_denied_for guest } | ||
217 | - it { should be_denied_for :user } | ||
218 | - it { should be_denied_for :visitor } | ||
219 | - end | ||
220 | - | ||
221 | - describe "GET /project_code/hooks" do | ||
222 | - subject { project_hooks_path(project) } | ||
223 | - | ||
224 | - it { should be_allowed_for master } | ||
225 | - it { should be_allowed_for reporter } | ||
226 | - it { should be_denied_for :admin } | ||
227 | - it { should be_denied_for guest } | ||
228 | - it { should be_denied_for :user } | ||
229 | - it { should be_denied_for :visitor } | ||
230 | - end | ||
231 | - | ||
232 | - describe "GET /project_code/files" do | ||
233 | - subject { files_project_path(project) } | ||
234 | - | ||
235 | - it { should be_allowed_for master } | ||
236 | - it { should be_allowed_for reporter } | ||
237 | - it { should be_denied_for :admin } | ||
238 | - it { should be_denied_for guest } | ||
239 | - it { should be_denied_for :user } | ||
240 | - it { should be_denied_for :visitor } | ||
241 | - end | ||
242 | - end | ||
243 | -end |
spec/requests/snippets_spec.rb
@@ -1,99 +0,0 @@ | @@ -1,99 +0,0 @@ | ||
1 | -require 'spec_helper' | ||
2 | - | ||
3 | -describe "Snippets" do | ||
4 | - let(:project) { create(:project) } | ||
5 | - | ||
6 | - before do | ||
7 | - login_as :user | ||
8 | - project.team << [@user, :developer] | ||
9 | - end | ||
10 | - | ||
11 | - describe "GET /snippets" do | ||
12 | - before do | ||
13 | - @snippet = create(:snippet, | ||
14 | - author: @user, | ||
15 | - project: project) | ||
16 | - | ||
17 | - visit project_snippets_path(project) | ||
18 | - end | ||
19 | - | ||
20 | - subject { page } | ||
21 | - | ||
22 | - it { should have_content(@snippet.title[0..10]) } | ||
23 | - it { should have_content(@snippet.project.name) } | ||
24 | - | ||
25 | - describe "Destroy" do | ||
26 | - before do | ||
27 | - # admin access to remove snippet | ||
28 | - @user.users_projects.destroy_all | ||
29 | - project.team << [@user, :master] | ||
30 | - visit edit_project_snippet_path(project, @snippet) | ||
31 | - end | ||
32 | - | ||
33 | - it "should remove entry" do | ||
34 | - expect { | ||
35 | - click_link "destroy_snippet_#{@snippet.id}" | ||
36 | - }.to change { Snippet.count }.by(-1) | ||
37 | - end | ||
38 | - end | ||
39 | - end | ||
40 | - | ||
41 | - describe "New snippet" do | ||
42 | - before do | ||
43 | - visit project_snippets_path(project) | ||
44 | - click_link "New Snippet" | ||
45 | - end | ||
46 | - | ||
47 | - it "should open new snippet popup" do | ||
48 | - page.current_path.should == new_project_snippet_path(project) | ||
49 | - end | ||
50 | - | ||
51 | - describe "fill in", js: true do | ||
52 | - before do | ||
53 | - fill_in "snippet_title", with: "login function" | ||
54 | - fill_in "snippet_file_name", with: "test.rb" | ||
55 | - page.execute_script("editor.insert('def login; end');") | ||
56 | - end | ||
57 | - | ||
58 | - it { expect { click_button "Save" }.to change {Snippet.count}.by(1) } | ||
59 | - | ||
60 | - it "should add new snippet to table" do | ||
61 | - click_button "Save" | ||
62 | - page.current_path.should == project_snippet_path(project, Snippet.last) | ||
63 | - page.should have_content "login function" | ||
64 | - page.should have_content "test.rb" | ||
65 | - end | ||
66 | - end | ||
67 | - end | ||
68 | - | ||
69 | - describe "Edit snippet" do | ||
70 | - before do | ||
71 | - @snippet = create(:snippet, | ||
72 | - author: @user, | ||
73 | - project: project) | ||
74 | - visit project_snippet_path(project, @snippet) | ||
75 | - click_link "Edit" | ||
76 | - end | ||
77 | - | ||
78 | - it "should open edit page" do | ||
79 | - page.current_path.should == edit_project_snippet_path(project, @snippet) | ||
80 | - end | ||
81 | - | ||
82 | - describe "fill in" do | ||
83 | - before do | ||
84 | - fill_in "snippet_title", with: "login function" | ||
85 | - fill_in "snippet_file_name", with: "test.rb" | ||
86 | - end | ||
87 | - | ||
88 | - it { expect { click_button "Save" }.to_not change {Snippet.count} } | ||
89 | - | ||
90 | - it "should update snippet fields" do | ||
91 | - click_button "Save" | ||
92 | - | ||
93 | - page.current_path.should == project_snippet_path(project, @snippet) | ||
94 | - page.should have_content "login function" | ||
95 | - page.should have_content "test.rb" | ||
96 | - end | ||
97 | - end | ||
98 | - end | ||
99 | -end |