111 lines
3.2 KiB
Ruby
111 lines
3.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
RSpec.describe Gitlab::FogbugzImport::Importer do
|
|
let(:project) { create(:project_empty_repo) }
|
|
let(:fogbugz_project) { { 'ixProject' => project.id, 'sProject' => 'vim' } }
|
|
let(:import_data) { { 'repo' => fogbugz_project } }
|
|
let(:base_url) { 'https://testing.fogbugz.com' }
|
|
let(:token) { 'token' }
|
|
let(:credentials) { { 'fb_session' => { 'uri' => base_url, 'token' => token } } }
|
|
|
|
let(:closed_bug) do
|
|
{
|
|
fOpen: 'false',
|
|
sTitle: 'Closed bug',
|
|
sLatestTextSummary: "",
|
|
dtOpened: Time.now.to_s,
|
|
dtLastUpdated: Time.now.to_s,
|
|
events: { event: [] }
|
|
}.with_indifferent_access
|
|
end
|
|
|
|
let(:opened_bug) do
|
|
{
|
|
fOpen: 'true',
|
|
sTitle: 'Opened bug',
|
|
sLatestTextSummary: "",
|
|
dtOpened: Time.now.to_s,
|
|
dtLastUpdated: Time.now.to_s,
|
|
events: { event: [] }
|
|
}.with_indifferent_access
|
|
end
|
|
|
|
let(:fogbugz_bugs) { [opened_bug, closed_bug] }
|
|
|
|
subject(:importer) { described_class.new(project) }
|
|
|
|
before do
|
|
project.create_import_data(data: import_data, credentials: credentials)
|
|
|
|
stub_fogbugz('listProjects', projects: { project: [fogbugz_project], count: 1 })
|
|
stub_fogbugz('listCategories', categories: { category: [], count: 0 })
|
|
stub_fogbugz('search', cases: { case: fogbugz_bugs, count: fogbugz_bugs.size })
|
|
end
|
|
|
|
it 'imports bugs' do
|
|
expect { subject.execute }.to change { Issue.count }.by(2)
|
|
end
|
|
|
|
it 'imports opened bugs' do
|
|
subject.execute
|
|
|
|
issue = Issue.where(project_id: project.id).find_by_title(opened_bug[:sTitle])
|
|
|
|
expect(issue.state_id).to eq(Issue.available_states[:opened])
|
|
end
|
|
|
|
it 'imports closed bugs' do
|
|
subject.execute
|
|
|
|
issue = Issue.where(project_id: project.id).find_by_title(closed_bug[:sTitle])
|
|
|
|
expect(issue.state_id).to eq(Issue.available_states[:closed])
|
|
end
|
|
|
|
context 'verify url' do
|
|
context 'when host is localhost' do
|
|
let(:base_url) { 'https://localhost:3000' }
|
|
|
|
it 'does not allow localhost requests' do
|
|
expect { subject.execute }
|
|
.to raise_error(
|
|
::Gitlab::HTTP::BlockedUrlError,
|
|
"URL 'https://localhost:3000/api.asp' is blocked: Requests to localhost are not allowed"
|
|
)
|
|
end
|
|
end
|
|
|
|
context 'when host is on local network' do
|
|
let(:base_url) { 'http://192.168.0.1' }
|
|
|
|
it 'does not allow localhost requests' do
|
|
expect { subject.execute }
|
|
.to raise_error(
|
|
::Gitlab::HTTP::BlockedUrlError,
|
|
"URL 'http://192.168.0.1/api.asp' is blocked: Requests to the local network are not allowed"
|
|
)
|
|
end
|
|
end
|
|
|
|
context 'when host is ftp protocol' do
|
|
let(:base_url) { 'ftp://testing' }
|
|
|
|
it 'only accept http and https requests' do
|
|
expect { subject.execute }
|
|
.to raise_error(
|
|
HTTParty::UnsupportedURIScheme,
|
|
"'ftp://testing/api.asp' Must be HTTP, HTTPS or Generic"
|
|
)
|
|
end
|
|
end
|
|
end
|
|
|
|
def stub_fogbugz(command, response)
|
|
stub_request(:post, "#{base_url}/api.asp")
|
|
.with(body: hash_including({ 'cmd' => command, 'token' => token }))
|
|
.to_return(status: 200, body: response.to_xml(root: :response))
|
|
end
|
|
end
|