# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Gitlab::Client do
  describe 'notes' do
    context 'when wall notes' do
      before do
        stub_get('/projects/3/notes', 'notes')
        @notes = Gitlab.notes(3)
      end

      it 'gets the correct resource' do
        expect(a_get('/projects/3/notes')).to have_been_made
      end

      it 'returns a paginated response of notes' do
        expect(@notes).to be_a Gitlab::PaginatedResponse
        expect(@notes.first.author.name).to eq('John Smith')
      end
    end

    context 'when issue notes' do
      before do
        stub_get('/projects/3/issues/7/notes', 'notes')
        @notes = Gitlab.issue_notes(3, 7)
      end

      it 'gets the correct resource' do
        expect(a_get('/projects/3/issues/7/notes')).to have_been_made
      end

      it 'returns a paginated response of notes' do
        expect(@notes).to be_a Gitlab::PaginatedResponse
        expect(@notes.first.author.name).to eq('John Smith')
      end
    end

    context 'when snippet notes' do
      before do
        stub_get('/projects/3/snippets/7/notes', 'notes')
        @notes = Gitlab.snippet_notes(3, 7)
      end

      it 'gets the correct resource' do
        expect(a_get('/projects/3/snippets/7/notes')).to have_been_made
      end

      it 'returns a paginated response of notes' do
        expect(@notes).to be_a Gitlab::PaginatedResponse
        expect(@notes.first.author.name).to eq('John Smith')
      end
    end

    context 'when merge_request notes' do
      before do
        stub_get('/projects/3/merge_requests/7/notes', 'notes')
        @notes = Gitlab.merge_request_notes(3, 7)
      end

      it 'gets the correct resource' do
        expect(a_get('/projects/3/merge_requests/7/notes')).to have_been_made
      end

      it 'returns a paginated response of notes' do
        expect(@notes).to be_a Gitlab::PaginatedResponse
        expect(@notes.first.author.name).to eq('John Smith')
      end
    end

    context 'when epic notes' do
      before do
        stub_get('/groups/3/epics/7/notes', 'notes')
        @notes = Gitlab.epic_notes(3, 7)
      end

      it 'gets the correct resource' do
        expect(a_get('/groups/3/epics/7/notes')).to have_been_made
      end

      it 'returns a paginated response of notes' do
        expect(@notes).to be_a Gitlab::PaginatedResponse
        expect(@notes.first.author.name).to eq('John Smith')
      end
    end
  end

  describe 'note' do
    context 'when wall note' do
      before do
        stub_get('/projects/3/notes/1201', 'note')
        @note = Gitlab.note(3, 1201)
      end

      it 'gets the correct resource' do
        expect(a_get('/projects/3/notes/1201')).to have_been_made
      end

      it 'returns information about a note' do
        expect(@note.body).to eq('The solution is rather tricky')
        expect(@note.author.name).to eq('John Smith')
      end
    end

    context 'when issue note' do
      before do
        stub_get('/projects/3/issues/7/notes/1201', 'note')
        @note = Gitlab.issue_note(3, 7, 1201)
      end

      it 'gets the correct resource' do
        expect(a_get('/projects/3/issues/7/notes/1201')).to have_been_made
      end

      it 'returns information about a note' do
        expect(@note.body).to eq('The solution is rather tricky')
        expect(@note.author.name).to eq('John Smith')
      end
    end

    context 'when snippet note' do
      before do
        stub_get('/projects/3/snippets/7/notes/1201', 'note')
        @note = Gitlab.snippet_note(3, 7, 1201)
      end

      it 'gets the correct resource' do
        expect(a_get('/projects/3/snippets/7/notes/1201')).to have_been_made
      end

      it 'returns information about a note' do
        expect(@note.body).to eq('The solution is rather tricky')
        expect(@note.author.name).to eq('John Smith')
      end
    end

    context 'when merge request note' do
      before do
        stub_get('/projects/3/merge_requests/7/notes/1201', 'note')
        @note = Gitlab.merge_request_note(3, 7, 1201)
      end

      it 'gets the correct resource' do
        expect(a_get('/projects/3/merge_requests/7/notes/1201')).to have_been_made
      end

      it 'returns information about a note' do
        expect(@note.body).to eq('The solution is rather tricky')
        expect(@note.author.name).to eq('John Smith')
      end
    end
  end

  describe 'create note' do
    context 'when wall note' do
      before do
        stub_post('/projects/3/notes', 'note')
        @note = Gitlab.create_note(3, 'The solution is rather tricky')
      end

      it 'gets the correct resource' do
        expect(a_post('/projects/3/notes')
          .with(body: { body: 'The solution is rather tricky' })).to have_been_made
      end

      it 'returns information about a created note' do
        expect(@note.body).to eq('The solution is rather tricky')
        expect(@note.author.name).to eq('John Smith')
      end
    end

    context 'when issue note' do
      before do
        stub_post('/projects/3/issues/7/notes', 'note')
        @note = Gitlab.create_issue_note(3, 7, 'The solution is rather tricky')
      end

      it 'gets the correct resource' do
        expect(a_post('/projects/3/issues/7/notes')
          .with(body: { body: 'The solution is rather tricky' })).to have_been_made
      end

      it 'returns information about a created note' do
        expect(@note.body).to eq('The solution is rather tricky')
        expect(@note.author.name).to eq('John Smith')
      end
    end

    context 'when snippet note' do
      before do
        stub_post('/projects/3/snippets/7/notes', 'note')
        @note = Gitlab.create_snippet_note(3, 7, 'The solution is rather tricky')
      end

      it 'gets the correct resource' do
        expect(a_post('/projects/3/snippets/7/notes')
          .with(body: { body: 'The solution is rather tricky' })).to have_been_made
      end

      it 'returns information about a created note' do
        expect(@note.body).to eq('The solution is rather tricky')
        expect(@note.author.name).to eq('John Smith')
      end
    end

    context 'when merge_request note' do
      before do
        stub_post('/projects/3/merge_requests/7/notes', 'note')
        @note = Gitlab.create_merge_request_note(3, 7, 'The solution is rather tricky')
      end

      it 'gets the correct resource' do
        expect(a_post('/projects/3/merge_requests/7/notes')
          .with(body: { body: 'The solution is rather tricky' })).to have_been_made
      end

      it 'returns information about a created note' do
        expect(@note.body).to eq('The solution is rather tricky')
        expect(@note.author.name).to eq('John Smith')
      end
    end

    context 'when epic note' do
      before do
        stub_post('/groups/3/epics/7/notes', 'note')
        @note = Gitlab.create_epic_note(3, 7, 'The solution is rather tricky')
      end

      it 'gets the correct resource' do
        expect(a_post('/groups/3/epics/7/notes')
          .with(body: { body: 'The solution is rather tricky' })).to have_been_made
      end

      it 'returns information about a created note' do
        expect(@note.body).to eq('The solution is rather tricky')
        expect(@note.author.name).to eq('John Smith')
      end
    end
  end

  describe 'delete note' do
    context 'when wall note' do
      before do
        stub_delete('/projects/3/notes/1201', 'note')
        @note = Gitlab.delete_note(3, 1201)
      end

      it 'gets the correct resource' do
        expect(a_delete('/projects/3/notes/1201')).to have_been_made
      end

      it 'returns information about a deleted note' do
        expect(@note.id).to eq(1201)
      end
    end

    context 'when issue note' do
      before do
        stub_delete('/projects/3/issues/7/notes/1201', 'note')
        @note = Gitlab.delete_issue_note(3, 7, 1201)
      end

      it 'gets the correct resource' do
        expect(a_delete('/projects/3/issues/7/notes/1201')).to have_been_made
      end

      it 'returns information about a deleted issue note' do
        expect(@note.id).to eq(1201)
      end
    end

    context 'when snippet note' do
      before do
        stub_delete('/projects/3/snippets/7/notes/1201', 'note')
        @note = Gitlab.delete_snippet_note(3, 7, 1201)
      end

      it 'gets the correct resource' do
        expect(a_delete('/projects/3/snippets/7/notes/1201')).to have_been_made
      end

      it 'returns information about a deleted snippet note' do
        expect(@note.id).to eq(1201)
      end
    end

    context 'when merge request note' do
      before do
        stub_delete('/projects/3/merge_requests/7/notes/1201', 'note')
        @note = Gitlab.delete_merge_request_note(3, 7, 1201)
      end

      it 'gets the correct resource' do
        expect(a_delete('/projects/3/merge_requests/7/notes/1201')).to have_been_made
      end

      it 'returns information about a deleted merge request note' do
        expect(@note.id).to eq(1201)
      end
    end
  end

  describe 'modify note' do
    context 'when wall note' do
      before do
        stub_put('/projects/3/notes/1201', 'note')
        @note = Gitlab.edit_note(3, 1201, 'edited wall note content')
      end

      it 'gets the correct resource' do
        expect(a_put('/projects/3/notes/1201')
          .with(body: { body: 'edited wall note content' })).to have_been_made
      end

      it 'returns information about a modified note' do
        expect(@note.id).to eq(1201)
      end
    end

    context 'when issue note' do
      before do
        stub_put('/projects/3/issues/7/notes/1201', 'note')
        @note = Gitlab.edit_issue_note(3, 7, 1201, 'edited issue note content')
      end

      it 'gets the correct resource' do
        expect(a_put('/projects/3/issues/7/notes/1201')
          .with(body: { body: 'edited issue note content' })).to have_been_made
      end

      it 'returns information about a modified issue note' do
        expect(@note.id).to eq(1201)
      end
    end

    context 'when snippet note' do
      before do
        stub_put('/projects/3/snippets/7/notes/1201', 'note')
        @note = Gitlab.edit_snippet_note(3, 7, 1201, 'edited snippet note content')
      end

      it 'gets the correct resource' do
        expect(a_put('/projects/3/snippets/7/notes/1201')
          .with(body: { body: 'edited snippet note content' })).to have_been_made
      end

      it 'returns information about a modified snippet note' do
        expect(@note.id).to eq(1201)
      end
    end

    context 'when merge request note' do
      before do
        stub_put('/projects/3/merge_requests/7/notes/1201', 'note')
        @note = Gitlab.edit_merge_request_note(3, 7, 1201, 'edited merge request note content')
      end

      it 'gets the correct resource' do
        expect(a_put('/projects/3/merge_requests/7/notes/1201')
          .with(body: { body: 'edited merge request note content' })).to have_been_made
      end

      it 'returns information about a modified request note' do
        expect(@note.id).to eq(1201)
      end
    end
  end
end
