diff options
Diffstat (limited to 'spec/requests/api/issues_spec.rb')
-rw-r--r-- | spec/requests/api/issues_spec.rb | 137 |
1 files changed, 80 insertions, 57 deletions
diff --git a/spec/requests/api/issues_spec.rb b/spec/requests/api/issues_spec.rb index 6adccb4ebae..b8038fc85a1 100644 --- a/spec/requests/api/issues_spec.rb +++ b/spec/requests/api/issues_spec.rb @@ -49,28 +49,29 @@ describe API::API, api: true do describe "GET /issues" do context "when unauthenticated" do - it "should return authentication error" do + it "returns authentication error" do get api("/issues") expect(response).to have_http_status(401) end end context "when authenticated" do - it "should return an array of issues" do + it "returns an array of issues" do get api("/issues", user) expect(response).to have_http_status(200) expect(json_response).to be_an Array expect(json_response.first['title']).to eq(issue.title) + expect(json_response.last).to have_key('web_url') end - it "should add pagination headers and keep query params" do + it "adds pagination headers and keep query params" do get api("/issues?state=closed&per_page=3", user) expect(response.headers['Link']).to eq( '<http://www.example.com/api/v3/issues?page=1&per_page=3&private_token=%s&state=closed>; rel="first", <http://www.example.com/api/v3/issues?page=1&per_page=3&private_token=%s&state=closed>; rel="last"' % [user.private_token, user.private_token] ) end - it 'should return an array of closed issues' do + it 'returns an array of closed issues' do get api('/issues?state=closed', user) expect(response).to have_http_status(200) expect(json_response).to be_an Array @@ -78,7 +79,7 @@ describe API::API, api: true do expect(json_response.first['id']).to eq(closed_issue.id) end - it 'should return an array of opened issues' do + it 'returns an array of opened issues' do get api('/issues?state=opened', user) expect(response).to have_http_status(200) expect(json_response).to be_an Array @@ -86,7 +87,7 @@ describe API::API, api: true do expect(json_response.first['id']).to eq(issue.id) end - it 'should return an array of all issues' do + it 'returns an array of all issues' do get api('/issues?state=all', user) expect(response).to have_http_status(200) expect(json_response).to be_an Array @@ -95,7 +96,7 @@ describe API::API, api: true do expect(json_response.second['id']).to eq(closed_issue.id) end - it 'should return an array of labeled issues' do + it 'returns an array of labeled issues' do get api("/issues?labels=#{label.title}", user) expect(response).to have_http_status(200) expect(json_response).to be_an Array @@ -103,7 +104,7 @@ describe API::API, api: true do expect(json_response.first['labels']).to eq([label.title]) end - it 'should return an array of labeled issues when at least one label matches' do + it 'returns an array of labeled issues when at least one label matches' do get api("/issues?labels=#{label.title},foo,bar", user) expect(response).to have_http_status(200) expect(json_response).to be_an Array @@ -111,14 +112,14 @@ describe API::API, api: true do expect(json_response.first['labels']).to eq([label.title]) end - it 'should return an empty array if no issue matches labels' do + it 'returns an empty array if no issue matches labels' do get api('/issues?labels=foo,bar', user) expect(response).to have_http_status(200) expect(json_response).to be_an Array expect(json_response.length).to eq(0) end - it 'should return an array of labeled issues matching given state' do + it 'returns an array of labeled issues matching given state' do get api("/issues?labels=#{label.title}&state=opened", user) expect(response).to have_http_status(200) expect(json_response).to be_an Array @@ -127,7 +128,7 @@ describe API::API, api: true do expect(json_response.first['state']).to eq('opened') end - it 'should return an empty array if no issue matches labels and state filters' do + it 'returns an empty array if no issue matches labels and state filters' do get api("/issues?labels=#{label.title}&state=closed", user) expect(response).to have_http_status(200) expect(json_response).to be_an Array @@ -282,7 +283,7 @@ describe API::API, api: true do let(:base_url) { "/projects/#{project.id}" } let(:title) { milestone.title } - it 'should return project issues without confidential issues for non project members' do + it 'returns project issues without confidential issues for non project members' do get api("#{base_url}/issues", non_member) expect(response).to have_http_status(200) expect(json_response).to be_an Array @@ -290,7 +291,7 @@ describe API::API, api: true do expect(json_response.first['title']).to eq(issue.title) end - it 'should return project issues without confidential issues for project members with guest role' do + it 'returns project issues without confidential issues for project members with guest role' do get api("#{base_url}/issues", guest) expect(response).to have_http_status(200) expect(json_response).to be_an Array @@ -298,7 +299,7 @@ describe API::API, api: true do expect(json_response.first['title']).to eq(issue.title) end - it 'should return project confidential issues for author' do + it 'returns project confidential issues for author' do get api("#{base_url}/issues", author) expect(response).to have_http_status(200) expect(json_response).to be_an Array @@ -306,7 +307,7 @@ describe API::API, api: true do expect(json_response.first['title']).to eq(issue.title) end - it 'should return project confidential issues for assignee' do + it 'returns project confidential issues for assignee' do get api("#{base_url}/issues", assignee) expect(response).to have_http_status(200) expect(json_response).to be_an Array @@ -314,7 +315,7 @@ describe API::API, api: true do expect(json_response.first['title']).to eq(issue.title) end - it 'should return project issues with confidential issues for project members' do + it 'returns project issues with confidential issues for project members' do get api("#{base_url}/issues", user) expect(response).to have_http_status(200) expect(json_response).to be_an Array @@ -322,7 +323,7 @@ describe API::API, api: true do expect(json_response.first['title']).to eq(issue.title) end - it 'should return project confidential issues for admin' do + it 'returns project confidential issues for admin' do get api("#{base_url}/issues", admin) expect(response).to have_http_status(200) expect(json_response).to be_an Array @@ -330,7 +331,7 @@ describe API::API, api: true do expect(json_response.first['title']).to eq(issue.title) end - it 'should return an array of labeled project issues' do + it 'returns an array of labeled project issues' do get api("#{base_url}/issues?labels=#{label.title}", user) expect(response).to have_http_status(200) expect(json_response).to be_an Array @@ -338,7 +339,7 @@ describe API::API, api: true do expect(json_response.first['labels']).to eq([label.title]) end - it 'should return an array of labeled project issues when at least one label matches' do + it 'returns an array of labeled project issues when at least one label matches' do get api("#{base_url}/issues?labels=#{label.title},foo,bar", user) expect(response).to have_http_status(200) expect(json_response).to be_an Array @@ -346,28 +347,28 @@ describe API::API, api: true do expect(json_response.first['labels']).to eq([label.title]) end - it 'should return an empty array if no project issue matches labels' do + it 'returns an empty array if no project issue matches labels' do get api("#{base_url}/issues?labels=foo,bar", user) expect(response).to have_http_status(200) expect(json_response).to be_an Array expect(json_response.length).to eq(0) end - it 'should return an empty array if no issue matches milestone' do + it 'returns an empty array if no issue matches milestone' do get api("#{base_url}/issues?milestone=#{empty_milestone.title}", user) expect(response).to have_http_status(200) expect(json_response).to be_an Array expect(json_response.length).to eq(0) end - it 'should return an empty array if milestone does not exist' do + it 'returns an empty array if milestone does not exist' do get api("#{base_url}/issues?milestone=foo", user) expect(response).to have_http_status(200) expect(json_response).to be_an Array expect(json_response.length).to eq(0) end - it 'should return an array of issues in given milestone' do + it 'returns an array of issues in given milestone' do get api("#{base_url}/issues?milestone=#{title}", user) expect(response).to have_http_status(200) expect(json_response).to be_an Array @@ -376,7 +377,7 @@ describe API::API, api: true do expect(json_response.second['id']).to eq(closed_issue.id) end - it 'should return an array of issues matching state in milestone' do + it 'returns an array of issues matching state in milestone' do get api("#{base_url}/issues?milestone=#{milestone.title}"\ '&state=closed', user) expect(response).to have_http_status(200) @@ -405,7 +406,7 @@ describe API::API, api: true do expect(json_response['author']).to be_a Hash end - it "should return a project issue by id" do + it "returns a project issue by id" do get api("/projects/#{project.id}/issues/#{issue.id}", user) expect(response).to have_http_status(200) @@ -413,7 +414,7 @@ describe API::API, api: true do expect(json_response['iid']).to eq(issue.iid) end - it 'should return a project issue by iid' do + it 'returns a project issue by iid' do get api("/projects/#{project.id}/issues?iid=#{issue.iid}", user) expect(response.status).to eq 200 expect(json_response.first['title']).to eq issue.title @@ -421,44 +422,44 @@ describe API::API, api: true do expect(json_response.first['iid']).to eq issue.iid end - it "should return 404 if issue id not found" do + it "returns 404 if issue id not found" do get api("/projects/#{project.id}/issues/54321", user) expect(response).to have_http_status(404) end context 'confidential issues' do - it "should return 404 for non project members" do + it "returns 404 for non project members" do get api("/projects/#{project.id}/issues/#{confidential_issue.id}", non_member) expect(response).to have_http_status(404) end - it "should return 404 for project members with guest role" do + it "returns 404 for project members with guest role" do get api("/projects/#{project.id}/issues/#{confidential_issue.id}", guest) expect(response).to have_http_status(404) end - it "should return confidential issue for project members" do + it "returns confidential issue for project members" do get api("/projects/#{project.id}/issues/#{confidential_issue.id}", user) expect(response).to have_http_status(200) expect(json_response['title']).to eq(confidential_issue.title) expect(json_response['iid']).to eq(confidential_issue.iid) end - it "should return confidential issue for author" do + it "returns confidential issue for author" do get api("/projects/#{project.id}/issues/#{confidential_issue.id}", author) expect(response).to have_http_status(200) expect(json_response['title']).to eq(confidential_issue.title) expect(json_response['iid']).to eq(confidential_issue.iid) end - it "should return confidential issue for assignee" do + it "returns confidential issue for assignee" do get api("/projects/#{project.id}/issues/#{confidential_issue.id}", assignee) expect(response).to have_http_status(200) expect(json_response['title']).to eq(confidential_issue.title) expect(json_response['iid']).to eq(confidential_issue.iid) end - it "should return confidential issue for admin" do + it "returns confidential issue for admin" do get api("/projects/#{project.id}/issues/#{confidential_issue.id}", admin) expect(response).to have_http_status(200) expect(json_response['title']).to eq(confidential_issue.title) @@ -468,7 +469,7 @@ describe API::API, api: true do end describe "POST /projects/:id/issues" do - it "should create a new project issue" do + it "creates a new project issue" do post api("/projects/#{project.id}/issues", user), title: 'new issue', labels: 'label, label2' expect(response).to have_http_status(201) @@ -477,12 +478,12 @@ describe API::API, api: true do expect(json_response['labels']).to eq(['label', 'label2']) end - it "should return a 400 bad request if title not given" do + it "returns a 400 bad request if title not given" do post api("/projects/#{project.id}/issues", user), labels: 'label, label2' expect(response).to have_http_status(400) end - it 'should allow special label names' do + it 'allows special label names' do post api("/projects/#{project.id}/issues", user), title: 'new issue', labels: 'label, label?, label&foo, ?, &' @@ -494,7 +495,7 @@ describe API::API, api: true do expect(json_response['labels']).to include '&' end - it 'should return 400 if title is too long' do + it 'returns 400 if title is too long' do post api("/projects/#{project.id}/issues", user), title: 'g' * 256 expect(response).to have_http_status(400) @@ -503,6 +504,20 @@ describe API::API, api: true do ]) end + context 'with due date' do + it 'creates a new project issue' do + due_date = 2.weeks.from_now.strftime('%Y-%m-%d') + + post api("/projects/#{project.id}/issues", user), + title: 'new issue', due_date: due_date + + expect(response).to have_http_status(201) + expect(json_response['title']).to eq('new issue') + expect(json_response['description']).to be_nil + expect(json_response['due_date']).to eq(due_date) + end + end + context 'when an admin or owner makes the request' do it 'accepts the creation date to be set' do creation_time = 2.weeks.ago @@ -517,10 +532,8 @@ describe API::API, api: true do describe 'POST /projects/:id/issues with spam filtering' do before do - Grape::Endpoint.before_each do |endpoint| - allow(endpoint).to receive(:check_for_spam?).and_return(true) - allow(endpoint).to receive(:is_spam?).and_return(true) - end + allow_any_instance_of(SpamService).to receive(:check_for_spam?).and_return(true) + allow_any_instance_of(AkismetService).to receive_messages(is_spam?: true) end let(:params) do @@ -531,7 +544,7 @@ describe API::API, api: true do } end - it "should not create a new project issue" do + it "does not create a new project issue" do expect { post api("/projects/#{project.id}/issues", user), params }.not_to change(Issue, :count) expect(response).to have_http_status(400) expect(json_response['message']).to eq({ "error" => "Spam detected" }) @@ -542,12 +555,11 @@ describe API::API, api: true do expect(spam_logs[0].description).to eq('content here') expect(spam_logs[0].user).to eq(user) expect(spam_logs[0].noteable_type).to eq('Issue') - expect(spam_logs[0].project_id).to eq(project.id) end end describe "PUT /projects/:id/issues/:issue_id to update only title" do - it "should update a project issue" do + it "updates a project issue" do put api("/projects/#{project.id}/issues/#{issue.id}", user), title: 'updated title' expect(response).to have_http_status(200) @@ -555,13 +567,13 @@ describe API::API, api: true do expect(json_response['title']).to eq('updated title') end - it "should return 404 error if issue id not found" do + it "returns 404 error if issue id not found" do put api("/projects/#{project.id}/issues/44444", user), title: 'updated title' expect(response).to have_http_status(404) end - it 'should allow special label names' do + it 'allows special label names' do put api("/projects/#{project.id}/issues/#{issue.id}", user), title: 'updated title', labels: 'label, label?, label&foo, ?, &' @@ -575,33 +587,33 @@ describe API::API, api: true do end context 'confidential issues' do - it "should return 403 for non project members" do + it "returns 403 for non project members" do put api("/projects/#{project.id}/issues/#{confidential_issue.id}", non_member), title: 'updated title' expect(response).to have_http_status(403) end - it "should return 403 for project members with guest role" do + it "returns 403 for project members with guest role" do put api("/projects/#{project.id}/issues/#{confidential_issue.id}", guest), title: 'updated title' expect(response).to have_http_status(403) end - it "should update a confidential issue for project members" do + it "updates a confidential issue for project members" do put api("/projects/#{project.id}/issues/#{confidential_issue.id}", user), title: 'updated title' expect(response).to have_http_status(200) expect(json_response['title']).to eq('updated title') end - it "should update a confidential issue for author" do + it "updates a confidential issue for author" do put api("/projects/#{project.id}/issues/#{confidential_issue.id}", author), title: 'updated title' expect(response).to have_http_status(200) expect(json_response['title']).to eq('updated title') end - it "should update a confidential issue for admin" do + it "updates a confidential issue for admin" do put api("/projects/#{project.id}/issues/#{confidential_issue.id}", admin), title: 'updated title' expect(response).to have_http_status(200) @@ -614,21 +626,21 @@ describe API::API, api: true do let!(:label) { create(:label, title: 'dummy', project: project) } let!(:label_link) { create(:label_link, label: label, target: issue) } - it 'should not update labels if not present' do + it 'does not update labels if not present' do put api("/projects/#{project.id}/issues/#{issue.id}", user), title: 'updated title' expect(response).to have_http_status(200) expect(json_response['labels']).to eq([label.title]) end - it 'should remove all labels' do + it 'removes all labels' do put api("/projects/#{project.id}/issues/#{issue.id}", user), labels: '' expect(response).to have_http_status(200) expect(json_response['labels']).to eq([]) end - it 'should update labels' do + it 'updates labels' do put api("/projects/#{project.id}/issues/#{issue.id}", user), labels: 'foo,bar' expect(response).to have_http_status(200) @@ -636,7 +648,7 @@ describe API::API, api: true do expect(json_response['labels']).to include 'bar' end - it 'should allow special label names' do + it 'allows special label names' do put api("/projects/#{project.id}/issues/#{issue.id}", user), labels: 'label:foo, label-bar,label_bar,label/bar,label?bar,label&bar,?,&' expect(response.status).to eq(200) @@ -650,7 +662,7 @@ describe API::API, api: true do expect(json_response['labels']).to include '&' end - it 'should return 400 if title is too long' do + it 'returns 400 if title is too long' do put api("/projects/#{project.id}/issues/#{issue.id}", user), title: 'g' * 256 expect(response).to have_http_status(400) @@ -661,7 +673,7 @@ describe API::API, api: true do end describe "PUT /projects/:id/issues/:issue_id to update state and label" do - it "should update a project issue" do + it "updates a project issue" do put api("/projects/#{project.id}/issues/#{issue.id}", user), labels: 'label2', state_event: "close" expect(response).to have_http_status(200) @@ -683,6 +695,17 @@ describe API::API, api: true do end end + describe 'PUT /projects/:id/issues/:issue_id to update due date' do + it 'creates a new project issue' do + due_date = 2.weeks.from_now.strftime('%Y-%m-%d') + + put api("/projects/#{project.id}/issues/#{issue.id}", user), due_date: due_date + + expect(response).to have_http_status(200) + expect(json_response['due_date']).to eq(due_date) + end + end + describe "DELETE /projects/:id/issues/:issue_id" do it "rejects a non member from deleting an issue" do delete api("/projects/#{project.id}/issues/#{issue.id}", non_member) |