summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/suggestions/suggestion_set_spec.rb
blob: 54d79a9d4baa94f6840584925e30366413fc227e (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
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Gitlab::Suggestions::SuggestionSet do
  def create_suggestion(file_path, new_line, to_content)
    position = Gitlab::Diff::Position.new(old_path: file_path,
                                          new_path: file_path,
                                          old_line: nil,
                                          new_line: new_line,
                                          diff_refs: merge_request.diff_refs)

    diff_note = create(:diff_note_on_merge_request,
                       noteable: merge_request,
                       position: position,
                       project: project)

    create(:suggestion,
           :content_from_repo,
           note: diff_note,
           to_content: to_content)
  end

  let_it_be(:user) { create(:user) }

  let_it_be(:project) { create(:project, :repository) }

  let_it_be(:merge_request) do
    create(:merge_request, source_project: project, target_project: project)
  end

  let_it_be(:suggestion) { create(:suggestion)}

  let_it_be(:suggestion2) do
    create_suggestion('files/ruby/popen.rb', 13, "*** SUGGESTION 2 ***")
  end

  let_it_be(:suggestion3) do
    create_suggestion('files/ruby/regex.rb', 22, "*** SUGGESTION 3 ***")
  end

  let_it_be(:unappliable_suggestion) { create(:suggestion, :unappliable) }

  let(:suggestion_set) { described_class.new([suggestion]) }

  describe '#project' do
    it 'returns the project associated with the suggestions' do
      expected_project = suggestion.project

      expect(suggestion_set.project).to be(expected_project)
    end
  end

  describe '#branch' do
    it 'returns the branch associated with the suggestions' do
      expected_branch = suggestion.branch

      expect(suggestion_set.branch).to be(expected_branch)
    end
  end

  describe '#valid?' do
    it 'returns true if no errors are found' do
      expect(suggestion_set.valid?).to be(true)
    end

    it 'returns false if an error is found' do
      suggestion_set = described_class.new([unappliable_suggestion])

      expect(suggestion_set.valid?).to be(false)
    end
  end

  describe '#error_message' do
    it 'returns an error message if an error is found' do
      suggestion_set = described_class.new([unappliable_suggestion])

      expect(suggestion_set.error_message).to be_a(String)
    end

    it 'returns nil if no errors are found' do
      expect(suggestion_set.error_message).to be(nil)
    end
  end

  describe '#actions' do
    it 'returns an array of hashes with proper key/value pairs' do
      first_action = suggestion_set.actions.first

      file_suggestion = suggestion_set.send(:suggestions_per_file).first

      expect(first_action[:action]).to be('update')
      expect(first_action[:file_path]).to eq(file_suggestion.file_path)
      expect(first_action[:content]).to eq(file_suggestion.new_content)
    end
  end

  describe '#file_paths' do
    it 'returns an array of unique file paths associated with the suggestions' do
      suggestion_set = described_class.new([suggestion, suggestion2, suggestion3])

      expected_paths = %w(files/ruby/popen.rb files/ruby/regex.rb)

      actual_paths = suggestion_set.file_paths

      expect(actual_paths.sort).to eq(expected_paths)
    end
  end
end