summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/fogbugz_import/importer_spec.rb
blob: a42468097257132c9b21ee0a2af65bd09c7287c0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# 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 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 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