summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/github_import/representation/note_spec.rb
blob: 97addcc1c98c595b7cc0205f0a725c3b5f0d3e33 (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
111
112
113
114
115
116
117
118
119
120
121
122
123
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Gitlab::GithubImport::Representation::Note do
  let(:created_at) { Time.new(2017, 1, 1, 12, 00) }
  let(:updated_at) { Time.new(2017, 1, 1, 12, 15) }

  shared_examples 'a Note' do
    it 'returns an instance of Note' do
      expect(note).to be_an_instance_of(described_class)
    end

    context 'the returned Note' do
      it 'includes the noteable ID' do
        expect(note.noteable_id).to eq(42)
      end

      it 'includes the noteable type' do
        expect(note.noteable_type).to eq('Issue')
      end

      it 'includes the author details' do
        expect(note.author)
          .to be_an_instance_of(Gitlab::GithubImport::Representation::User)

        expect(note.author.id).to eq(4)
        expect(note.author.login).to eq('alice')
      end

      it 'includes the note body' do
        expect(note.note).to eq('Hello world')
      end

      it 'includes the created timestamp' do
        expect(note.created_at).to eq(created_at)
      end

      it 'includes the updated timestamp' do
        expect(note.updated_at).to eq(updated_at)
      end

      it 'includes the note ID' do
        expect(note.note_id).to eq(1)
      end
    end
  end

  describe '.from_api_response' do
    let(:response) do
      double(
        :response,
        html_url: 'https://github.com/foo/bar/issues/42',
        user: double(:user, id: 4, login: 'alice'),
        body: 'Hello world',
        created_at: created_at,
        updated_at: updated_at,
        id: 1
      )
    end

    it_behaves_like 'a Note' do
      let(:note) { described_class.from_api_response(response) }
    end

    it 'does not set the user if the response did not include a user' do
      allow(response)
        .to receive(:user)
        .and_return(nil)

      note = described_class.from_api_response(response)

      expect(note.author).to be_nil
    end
  end

  describe '.from_json_hash' do
    it_behaves_like 'a Note' do
      let(:hash) do
        {
          'noteable_id' => 42,
          'noteable_type' => 'Issue',
          'author' => { 'id' => 4, 'login' => 'alice' },
          'note' => 'Hello world',
          'created_at' => created_at.to_s,
          'updated_at' => updated_at.to_s,
          'note_id' => 1
        }
      end

      let(:note) { described_class.from_json_hash(hash) }
    end

    it 'does not convert the author if it was not specified' do
      hash = {
        'noteable_id' => 42,
        'noteable_type' => 'Issue',
        'note' => 'Hello world',
        'created_at' => created_at.to_s,
        'updated_at' => updated_at.to_s,
        'note_id' => 1
      }

      note = described_class.from_json_hash(hash)

      expect(note.author).to be_nil
    end
  end

  describe '#github_identifiers' do
    it 'returns a hash with needed identifiers' do
      github_identifiers = {
        noteable_id: 42,
        noteable_type: 'Issue',
        note_id: 1
      }
      other_attributes = { something_else: '_something_else_' }
      note = described_class.new(github_identifiers.merge(other_attributes))

      expect(note.github_identifiers).to eq(github_identifiers)
    end
  end
end