summaryrefslogtreecommitdiff
path: root/spec/observers/note_observer_spec.rb
blob: 8ad42c21d2c2242b73272d042dc47c796cbf3d5d (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
124
125
126
127
128
129
130
131
132
require 'spec_helper'

describe NoteObserver do
  subject { NoteObserver.instance }

  let(:team_without_author) { (1..2).map { |n| double :user, id: n } }

  describe '#after_create' do
    let(:note) { double :note }

    it 'is called after a note is created' do
      subject.should_receive :after_create

      Note.observers.enable :note_observer do
        create(:note)
      end
    end

    it 'sends out notifications' do
      subject.should_receive(:send_notify_mails).with(note)

      subject.after_create(note)
    end
  end

  describe "#send_notify_mails" do
    let(:note) { double :note, notify: false, notify_author: false }

    it 'notifies team of new note when flagged to notify' do
      note.stub(:notify).and_return(true)
      subject.should_receive(:notify_team).with(note)

      subject.after_create(note)
    end

    it 'does not notify team of new note when not flagged to notify' do
      subject.should_not_receive(:notify_team).with(note)

      subject.after_create(note)
    end

    it 'notifies the author of a commit when flagged to notify the author' do
      note.stub(:notify_author).and_return(true)
      note.stub(:noteable).and_return(double(author_email: 'test@test.com'))
      note.stub(:id).and_return(42)
      author = double :user, id: 1, email: 'test@test.com'
      note.stub(:commit_author).and_return(author)
      Notify.should_receive(:note_commit_email)

      subject.after_create(note)
    end

    it 'does not notify the author of a commit when not flagged to notify the author' do
      notify.should_not_receive(:note_commit_email)

      subject.after_create(note)
    end

    it 'does nothing if no notify flags are set' do
      subject.after_create(note).should be_nil
    end
  end

  describe '#notify_team' do
    let(:note) { double :note, id: 1 }

    before :each do
      subject.stub(:team_without_note_author).with(note).and_return(team_without_author)
    end

    context 'notifies team of a new note on' do
      it 'a commit' do
        note.stub(:noteable_type).and_return('Commit')
        notify.should_receive(:note_commit_email).twice

        subject.send(:notify_team, note)
      end

      it 'an issue' do
        note.stub(:noteable_type).and_return('Issue')
        notify.should_receive(:note_issue_email).twice

        subject.send(:notify_team, note)
      end

      it 'a wiki page' do
        note.stub(:noteable_type).and_return('Wiki')
        notify.should_receive(:note_wiki_email).twice

        subject.send(:notify_team, note)
      end

      it 'a merge request' do
        note.stub(:noteable_type).and_return('MergeRequest')
        notify.should_receive(:note_merge_request_email).twice

        subject.send(:notify_team, note)
      end

      it 'a wall' do
        # Note: wall posts have #noteable_type of nil
        note.stub(:noteable_type).and_return(nil)
        notify.should_receive(:note_wall_email).twice

        subject.send(:notify_team, note)
      end
    end

    it 'does nothing for a new note on a snippet' do
      note.stub(:noteable_type).and_return('Snippet')

      subject.send(:notify_team, note).should be_nil
    end
  end


  describe '#team_without_note_author' do
    let(:author) { double :user, id: 4 }

    let(:users) { team_without_author + [author] }
    let(:project)  { double :project, users: users }
    let(:note) { double :note, project: project, author: author }

    it 'returns the projects user without the note author included' do
      subject.send(:team_without_note_author, note).should == team_without_author
    end
  end

  def notify
    Notify
  end
end