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 @@ |
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 @@ |
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 @@ |
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 @@ |
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 @@ |
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 @@ |
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 @@ |
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 @@ |
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 @@ |
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 @@ |
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 @@ |
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 @@ |
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 | 49 | \ No newline at end of file | ... | ... |
... | ... | @@ -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 @@ |
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 @@ |
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 @@ |
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 @@ |
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 @@ |
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 | -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 | -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 | -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 | -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 | -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 | -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 | -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 | -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 | -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 | -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 | -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 | -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 | 0 | \ No newline at end of file |
spec/requests/projects_deploy_keys_spec.rb
... | ... | @@ -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 | -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 | -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 | -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 | -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 | -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 |