kanbanworkflowstimelinescrumrubyroadmapproject-planningproject-managementopenprojectangularissue-trackerifcgantt-chartganttbug-trackerboardsbcf
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
175 lines
6.1 KiB
175 lines
6.1 KiB
#-- copyright
|
|
# OpenProject is an open source project management software.
|
|
# Copyright (C) 2012-2020 the OpenProject GmbH
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License version 3.
|
|
#
|
|
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
|
|
# Copyright (C) 2006-2017 Jean-Philippe Lang
|
|
# Copyright (C) 2010-2013 the ChiliProject Team
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; either version 2
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
#
|
|
# See docs/COPYRIGHT.rdoc for more details.
|
|
#++
|
|
|
|
require File.expand_path('../../spec_helper', __FILE__)
|
|
|
|
describe OpenProject::GithubIntegration do
|
|
before do
|
|
allow(Setting).to receive(:host_name).and_return('example.net')
|
|
end
|
|
|
|
describe '.extract_work_package_ids' do
|
|
it 'should return an empty array for an empty source' do
|
|
result = OpenProject::GithubIntegration::NotificationHandlers.send(
|
|
:extract_work_package_ids, '')
|
|
expect(result).to eql([])
|
|
end
|
|
|
|
it 'should find a plain work package url' do
|
|
source = "Blabla\nOP#1234\n"
|
|
result = OpenProject::GithubIntegration::NotificationHandlers.send(
|
|
:extract_work_package_ids, source)
|
|
expect(result).to eql([1234])
|
|
end
|
|
|
|
it 'should find a plain work package url' do
|
|
source = 'Blabla\nhttps://example.net/work_packages/234\n'
|
|
result = OpenProject::GithubIntegration::NotificationHandlers.send(
|
|
:extract_work_package_ids, source)
|
|
expect(result).to eql([234])
|
|
end
|
|
|
|
it 'should find a work package url in markdown link syntax' do
|
|
source = 'Blabla\n[WP 234](https://example.net/work_packages/234)\n'
|
|
result = OpenProject::GithubIntegration::NotificationHandlers.send(
|
|
:extract_work_package_ids, source)
|
|
expect(result).to eql([234])
|
|
end
|
|
|
|
it 'should find multiple work package urls' do
|
|
source = "I reference https://example.net/work_packages/434\n and Blabla\n[WP 234](https://example.net/wp/234)\n"
|
|
result = OpenProject::GithubIntegration::NotificationHandlers.send(
|
|
:extract_work_package_ids, source)
|
|
expect(result).to eql([434, 234])
|
|
end
|
|
|
|
it 'should find multiple occurences of a work package only once' do
|
|
source = "I reference https://example.net/work_packages/434\n and Blabla\n[WP 234](https://example.net/work_packages/434)\n"
|
|
result = OpenProject::GithubIntegration::NotificationHandlers.send(
|
|
:extract_work_package_ids, source)
|
|
expect(result).to eql([434])
|
|
end
|
|
end
|
|
|
|
describe '.find_visible_work_packages' do
|
|
let(:user) do
|
|
user = double('A User')
|
|
expect(user).to receive(:allowed_to?) { |permission, project|
|
|
expect(permission).to equal(:add_work_package_notes)
|
|
project == :project_with_permissions
|
|
}.at_least(:once)
|
|
user
|
|
end
|
|
let(:visible_wp) do
|
|
wp = double('Visible Work Package')
|
|
allow(wp).to receive(:project).and_return(:project_with_permissions)
|
|
wp
|
|
end
|
|
let(:invisible_wp) do
|
|
wp = double('Invisible Work Package')
|
|
allow(wp).to receive(:project).and_return(:project_without_permissions)
|
|
wp
|
|
end
|
|
|
|
before do
|
|
allow(WorkPackage).to receive(:includes).and_return(WorkPackage)
|
|
allow(WorkPackage).to receive(:find_by_id) {|id| wps[id]}
|
|
end
|
|
|
|
shared_examples_for 'GithubIntegration.find_visible_work_packages' do
|
|
subject { OpenProject::GithubIntegration::NotificationHandlers.send(
|
|
:find_visible_work_packages, ids, user) }
|
|
it { expect(subject).to eql(expected) }
|
|
end
|
|
|
|
describe 'should find an existing work package' do
|
|
let(:wps) { [visible_wp] }
|
|
let(:ids) { [0] }
|
|
let(:expected) { wps }
|
|
|
|
it_behaves_like 'GithubIntegration.find_visible_work_packages'
|
|
end
|
|
|
|
describe 'should not find a non-existing work package' do
|
|
let(:wps) { [invisible_wp] }
|
|
let(:ids) { [0] }
|
|
let(:expected) { [] }
|
|
|
|
it_behaves_like 'GithubIntegration.find_visible_work_packages'
|
|
end
|
|
|
|
describe 'should find multiple existing work packages' do
|
|
let(:wps) { [visible_wp, visible_wp] }
|
|
let(:ids) { [0, 1] }
|
|
let(:expected) { wps }
|
|
|
|
it_behaves_like 'GithubIntegration.find_visible_work_packages'
|
|
end
|
|
|
|
describe 'should not find work package which the user shall not see' do
|
|
let(:wps) { [visible_wp, invisible_wp, visible_wp, invisible_wp] }
|
|
let(:ids) { [0, 1, 2, 3] }
|
|
let(:expected) { [visible_wp, visible_wp] }
|
|
|
|
it_behaves_like 'GithubIntegration.find_visible_work_packages'
|
|
end
|
|
end
|
|
|
|
describe '.issue_comment' do
|
|
context 'for a non-pull request issue' do
|
|
let(:payload) do
|
|
{ 'action' => 'created',
|
|
'issue' => { 'pull_request' => { 'html_url' => nil } } }
|
|
end
|
|
|
|
before do
|
|
expect(OpenProject::GithubIntegration::NotificationHandlers).not_to receive(
|
|
:comment_on_referenced_work_packages)
|
|
end
|
|
|
|
it 'should do nothing' do
|
|
OpenProject::GithubIntegration::NotificationHandlers.issue_comment(payload)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe '.pull_request' do
|
|
context 'with a synchronize action' do
|
|
let(:payload) { {'action' => 'synchronize'} }
|
|
|
|
before do
|
|
expect(OpenProject::GithubIntegration::NotificationHandlers).not_to receive(
|
|
:comment_on_referenced_work_packages)
|
|
end
|
|
|
|
it 'should do nothing' do
|
|
OpenProject::GithubIntegration::NotificationHandlers.pull_request(payload)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|