OpenProject is the leading open source project management software.
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.
 
 
 
 
 
 
openproject/modules/github_integration/spec/lib/notification_handlers_spec.rb

186 lines
6.1 KiB

#-- copyright
# OpenProject is an open source project management software.
# Copyright (C) 2012-2021 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-2013 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', __dir__)
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 do
OpenProject::GithubIntegration::NotificationHandlers.send(
:find_visible_work_packages, ids, user
)
end
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