message_train 0.1.7 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. checksums.yaml +4 -4
  2. data/.simplecov +8 -0
  3. data/.travis.yml +7 -2
  4. data/Gemfile +3 -0
  5. data/README.rdoc +37 -1
  6. data/Rakefile +5 -6
  7. data/VERSION +1 -1
  8. data/app/assets/javascripts/message_train.js +33 -0
  9. data/app/assets/stylesheets/message_train.scss +26 -0
  10. data/app/controllers/concerns/message_train_support.rb +127 -0
  11. data/app/controllers/message_train/application_controller.rb +1 -60
  12. data/app/controllers/message_train/boxes_controller.rb +0 -4
  13. data/app/controllers/message_train/messages_controller.rb +12 -6
  14. data/app/controllers/message_train/participants_controller.rb +1 -1
  15. data/app/controllers/message_train/unsubscribes_controller.rb +59 -0
  16. data/app/helpers/message_train/application_helper.rb +26 -0
  17. data/app/helpers/message_train/attachments_helper.rb +19 -0
  18. data/app/helpers/message_train/boxes_helper.rb +16 -11
  19. data/app/helpers/message_train/collectives_helper.rb +48 -0
  20. data/app/helpers/message_train/conversations_helper.rb +24 -16
  21. data/app/helpers/message_train/messages_helper.rb +14 -12
  22. data/app/mailers/message_train/application_mailer.rb +8 -0
  23. data/app/mailers/message_train/previews/receipt_mailer_preview.rb +10 -0
  24. data/app/mailers/message_train/receipt_mailer.rb +17 -0
  25. data/app/models/message_train/attachment.rb +28 -10
  26. data/app/models/message_train/box.rb +114 -83
  27. data/app/models/message_train/conversation.rb +48 -39
  28. data/app/models/message_train/ignore.rb +2 -6
  29. data/app/models/message_train/message.rb +40 -24
  30. data/app/models/message_train/receipt.rb +20 -10
  31. data/app/models/message_train/unsubscribe.rb +7 -0
  32. data/app/views/layouts/mailer.html.haml +6 -0
  33. data/app/views/message_train/application/_attachment_fields.html.haml +7 -0
  34. data/app/views/message_train/application/_attachment_link.html.haml +4 -0
  35. data/app/views/message_train/application/_widget.html.haml +6 -0
  36. data/app/views/message_train/boxes/_dropdown_list.html.haml +1 -2
  37. data/app/views/message_train/boxes/_list_item.html.haml +2 -2
  38. data/app/views/message_train/boxes/_widget.html.haml +4 -1
  39. data/app/views/message_train/boxes/show.html.haml +12 -4
  40. data/app/views/message_train/collectives/_dropdown_list.html.haml +6 -0
  41. data/app/views/message_train/collectives/_list_item.html.haml +5 -0
  42. data/app/views/message_train/collectives/_widget.html.haml +7 -0
  43. data/app/views/message_train/conversations/_conversation.html.haml +22 -7
  44. data/app/views/message_train/conversations/_deleted_toggle.html.haml +1 -1
  45. data/app/views/message_train/conversations/_ignored_toggle.html.haml +3 -3
  46. data/app/views/message_train/conversations/_read_toggle.html.haml +3 -3
  47. data/app/views/message_train/conversations/_toggle.html.haml +4 -1
  48. data/app/views/message_train/conversations/_trashed_toggle.html.haml +3 -3
  49. data/app/views/message_train/conversations/show.html.haml +4 -3
  50. data/app/views/message_train/messages/_deleted_toggle.html.haml +1 -1
  51. data/app/views/message_train/messages/_form.html.haml +22 -7
  52. data/app/views/message_train/messages/_message.html.haml +14 -4
  53. data/app/views/message_train/messages/_read_toggle.html.haml +1 -1
  54. data/app/views/message_train/messages/_trashed_toggle.html.haml +1 -1
  55. data/app/views/message_train/messages/edit.html.haml +1 -1
  56. data/app/views/message_train/messages/new.html.haml +4 -1
  57. data/app/views/message_train/participants/_field.html.haml +1 -1
  58. data/app/views/message_train/participants/_prefilled_field.html.haml +4 -0
  59. data/app/views/message_train/receipt_mailer/notification_email.html.haml +13 -0
  60. data/app/views/message_train/unsubscribes/index.html.haml +10 -0
  61. data/config/environment.rb +1 -0
  62. data/config/locales/en.yml +49 -7
  63. data/config/routes.rb +10 -2
  64. data/db/migrate/20150901183458_add_received_through_to_message_train_receipts.rb +6 -0
  65. data/db/migrate/20151004184347_add_unique_index_to_receipts.rb +5 -0
  66. data/db/migrate/20151124000820_create_message_train_unsubscribes.rb +14 -0
  67. data/lib/generators/message_train/install/install_generator.rb +8 -2
  68. data/lib/generators/message_train/install/templates/initializer.rb +5 -1
  69. data/lib/message_train/configuration.rb +11 -1
  70. data/lib/message_train/engine.rb +1 -0
  71. data/lib/message_train/mixin.rb +206 -21
  72. data/message_train.gemspec +66 -13
  73. data/spec/controllers/message_train/boxes_controller_spec.rb +10 -3
  74. data/spec/controllers/message_train/concerns_spec.rb +40 -0
  75. data/spec/controllers/message_train/conversations_controller_spec.rb +3 -3
  76. data/spec/controllers/message_train/messages_controller_spec.rb +60 -27
  77. data/spec/controllers/message_train/participants_controller_spec.rb +41 -6
  78. data/spec/controllers/message_train/unsubscribes_controller_spec.rb +56 -0
  79. data/spec/dummy/app/assets/files/message_train/attachments/{1917-Boys_Race_Above-Wiki.jpg → image-sample.jpg} +0 -0
  80. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  81. data/spec/dummy/app/models/group.rb +16 -1
  82. data/spec/dummy/app/models/role.rb +22 -0
  83. data/spec/dummy/app/models/user.rb +1 -1
  84. data/spec/dummy/app/views/layouts/_top_navigation.html.haml +4 -2
  85. data/spec/dummy/app/views/layouts/application.html.haml +2 -3
  86. data/spec/dummy/app/views/pages/index.html.haml +4 -0
  87. data/spec/dummy/config/application.rb +6 -0
  88. data/spec/dummy/config/environments/development.rb +1 -0
  89. data/spec/dummy/config/environments/test.rb +1 -0
  90. data/spec/dummy/config/initializers/high_voltage.rb +3 -0
  91. data/spec/dummy/config/initializers/message_train.rb +6 -1
  92. data/spec/dummy/config/initializers/paperclip.rb +2 -2
  93. data/spec/dummy/config/routes.rb +2 -2
  94. data/spec/dummy/config/settings.yml +9 -0
  95. data/spec/dummy/db/migrate/{20150724142846_create_message_train_conversations.night_train.rb → 20150901183629_create_message_train_conversations.message_train.rb} +0 -0
  96. data/spec/dummy/db/migrate/{20150724142847_create_message_train_messages.night_train.rb → 20150901183630_create_message_train_messages.message_train.rb} +0 -0
  97. data/spec/dummy/db/migrate/{20150724142848_create_message_train_attachments.night_train.rb → 20150901183631_create_message_train_attachments.message_train.rb} +0 -0
  98. data/spec/dummy/db/migrate/{20150724142849_create_message_train_receipts.night_train.rb → 20150901183632_create_message_train_receipts.message_train.rb} +0 -0
  99. data/spec/dummy/db/migrate/{20150724142850_create_message_train_ignores.night_train.rb → 20150901183633_create_message_train_ignores.message_train.rb} +0 -0
  100. data/spec/dummy/db/migrate/20150901183634_add_received_through_to_message_train_receipts.message_train.rb +7 -0
  101. data/spec/dummy/db/migrate/20151004184519_add_unique_index_to_receipts.message_train.rb +6 -0
  102. data/spec/dummy/db/migrate/20151124001417_create_message_train_unsubscribes.message_train.rb +15 -0
  103. data/spec/dummy/db/schema.rb +24 -7
  104. data/spec/dummy/db/seeds/conversations.seeds.rb +92 -3
  105. data/spec/dummy/db/seeds/groups.seeds.rb +27 -0
  106. data/spec/dummy/db/seeds/test/attachments.seeds.rb +4 -0
  107. data/spec/dummy/db/seeds/unsubscribes.seeds.rb +12 -0
  108. data/spec/dummy/db/seeds/users.seeds.rb +27 -0
  109. data/spec/dummy/db/test.sqlite3 +0 -0
  110. data/spec/factories/group.rb +4 -4
  111. data/spec/factories/message.rb +10 -3
  112. data/spec/features/boxes_spec.rb +160 -33
  113. data/spec/features/conversations_spec.rb +11 -4
  114. data/spec/features/messages_spec.rb +20 -6
  115. data/spec/features/unsubscribes_spec.rb +38 -0
  116. data/spec/helpers/message_train/application_helper_spec.rb +60 -0
  117. data/spec/helpers/message_train/attachment_helper_spec.rb +35 -0
  118. data/spec/helpers/message_train/boxes_helper_spec.rb +11 -5
  119. data/spec/helpers/message_train/collectives_helper_spec.rb +76 -0
  120. data/spec/helpers/message_train/conversations_helper_spec.rb +295 -0
  121. data/spec/helpers/message_train/messages_helper_spec.rb +217 -0
  122. data/spec/models/group_spec.rb +112 -2
  123. data/spec/models/message_train/attachment_spec.rb +44 -1
  124. data/spec/models/message_train/box_spec.rb +306 -51
  125. data/spec/models/message_train/conversation_spec.rb +84 -6
  126. data/spec/models/message_train/ignore_spec.rb +0 -4
  127. data/spec/models/message_train/message_spec.rb +49 -12
  128. data/spec/models/message_train/receipt_spec.rb +44 -8
  129. data/spec/models/message_train/unsubscribe_spec.rb +16 -0
  130. data/spec/models/role_spec.rb +125 -0
  131. data/spec/models/user_spec.rb +155 -26
  132. data/spec/rails_helper.rb +8 -1
  133. data/spec/support/attachments.rb +4 -0
  134. data/spec/support/controller_behaviors.rb +28 -0
  135. data/spec/support/conversations.rb +13 -0
  136. data/spec/support/groups.rb +3 -0
  137. data/spec/support/loaded_site.rb +3 -0
  138. data/spec/support/messages.rb +23 -0
  139. data/spec/support/roles.rb +4 -0
  140. data/spec/support/users.rb +6 -0
  141. data/spec/support/wysihtml5_helper.rb +8 -0
  142. metadata +99 -12
  143. data/spec/dummy/app/assets/files/message_train/attachments/Haie_rci.svg +0 -1714
  144. data/spec/dummy/public/capybara.html +0 -193
@@ -2,23 +2,61 @@ require 'rails_helper'
2
2
 
3
3
  module MessageTrain
4
4
  RSpec.describe Conversation do
5
+ include_context 'loaded site'
6
+
5
7
  describe 'Model' do
6
8
  it { should have_many :messages }
7
9
  it { should have_many :ignores }
8
10
  it { should have_many(:receipts).through(:messages) }
11
+ it { should have_many(:attachments).through(:messages) }
9
12
  end
13
+
10
14
  describe 'Scopes and Methods' do
11
- include_context 'loaded site'
15
+
16
+ describe '.ignored' do
17
+ let(:results) { MessageTrain::Conversation.ignored(first_user) }
18
+ subject { results.first.is_ignored?(first_user) }
19
+ it { should be true }
20
+ end
21
+
22
+ describe '.unignored' do
23
+ let(:results) { MessageTrain::Conversation.unignored(first_user) }
24
+ subject { results.first.is_ignored?(first_user) }
25
+ it { should be false }
26
+ end
27
+
28
+ describe '.with_drafts_by' do
29
+ subject { MessageTrain::Conversation.with_drafts_by(first_user) }
30
+ it { should include draft_conversation }
31
+ end
32
+
33
+ describe '.with_ready_for' do
34
+ subject { MessageTrain::Conversation.with_ready_for(first_user) }
35
+ it { should include unread_conversation }
36
+ end
37
+
38
+ describe '.with_messages_for' do
39
+ subject { MessageTrain::Conversation.with_messages_for(first_user) }
40
+ it { should include unread_conversation }
41
+ end
42
+
43
+ describe '.with_messages_through' do
44
+ subject { MessageTrain::Conversation.with_messages_through(first_group) }
45
+ it { should include group_conversation }
46
+ end
47
+
12
48
  describe '#default_recipients_for' do
13
49
  subject { sent_conversation.default_recipients_for(first_user) }
14
50
  it { should include second_user }
15
51
  it { should_not include first_user }
16
52
  it { should_not include third_user }
17
53
  end
54
+
18
55
  describe '#set_ignored and #is_ignored?' do
19
56
  subject { ignored_conversation.is_ignored?(first_user) }
20
57
  it { should be true }
21
58
  end
59
+
22
60
  describe '#set_unignored' do
23
61
  before do
24
62
  ignored_conversation.set_unignored(first_user)
@@ -26,6 +64,7 @@ module MessageTrain
26
64
  subject { ignored_conversation.is_ignored?(first_user) }
27
65
  it { should be false }
28
66
  end
67
+
29
68
  describe '#mark and #includes_read_for?' do
30
69
  before do
31
70
  unread_conversation.mark(:read, first_user)
@@ -33,15 +72,12 @@ module MessageTrain
33
72
  subject { unread_conversation.includes_read_for?(first_user) }
34
73
  it { should be true }
35
74
  end
75
+
36
76
  describe '#includes_drafts_by?' do
37
77
  subject { draft_conversation.includes_drafts_by?(first_user) }
38
78
  it { should be true }
39
79
  end
40
- describe '.with_drafts_by' do
41
- subject { MessageTrain::Conversation.with_drafts_by(first_user) }
42
- its(:first) { should be_a MessageTrain::Conversation }
43
- its(:count) { should eq 1 }
44
- end
80
+
45
81
  describe 'Dynamic Methods' do
46
82
  describe '.trashed_for' do
47
83
  subject { MessageTrain::Conversation.with_trashed_for(first_user) }
@@ -72,6 +108,14 @@ module MessageTrain
72
108
  subject { trashed_conversation.includes_trashed_to?(first_user) }
73
109
  it { should be true }
74
110
  end
111
+ describe '#includes_ready_by?' do
112
+ subject { sent_conversation.includes_ready_by?(first_user) }
113
+ it { should be true }
114
+ end
115
+ describe '#includes_ready_to?' do
116
+ subject { unread_conversation.includes_ready_to?(first_user) }
117
+ it { should be true }
118
+ end
75
119
  describe '#includes_read_to?' do
76
120
  subject { read_conversation.includes_read_to?(first_user) }
77
121
  it { should be true }
@@ -92,7 +136,41 @@ module MessageTrain
92
136
  subject { sent_conversation.includes_receipts_for?(first_user) }
93
137
  it { should be true }
94
138
  end
139
+ describe 'responds to :includes_ready_for?' do
140
+ subject { unread_conversation.respond_to? :includes_ready_for? }
141
+ it { should be true }
142
+ end
143
+ describe '.find_by_subject' do
144
+ # Testing super on method_missing
145
+ subject { MessageTrain::Conversation.find_by_subject('Unread Conversation') }
146
+ it { should be_a(MessageTrain::Conversation) }
147
+ end
148
+ describe '#missing_method' do
149
+ # Testing super on method_missing
150
+ it 'raises a NoMethodError' do
151
+ expect {unread_conversation.missing_method}.to raise_error(NoMethodError)
152
+ end
153
+ end
154
+ describe '.with_ready_by' do
155
+ subject { MessageTrain::Conversation.with_ready_by(first_user) }
156
+ it { should include sent_conversation }
157
+ it { should_not include draft_conversation }
158
+ it { should_not include unread_conversation }
159
+ end
160
+ describe '.with_ready_to' do
161
+ subject { MessageTrain::Conversation.with_ready_to(first_user) }
162
+ it { should_not include sent_conversation }
163
+ it { should_not include draft_conversation }
164
+ it { should include unread_conversation }
165
+ end
166
+ describe '.with_messages_by' do
167
+ subject { MessageTrain::Conversation.with_messages_by(first_user) }
168
+ it { should include sent_conversation }
169
+ it { should include draft_conversation }
170
+ it { should_not include unread_conversation }
171
+ end
95
172
  end
173
+
96
174
  end
97
175
  end
98
176
  end
@@ -14,10 +14,6 @@ module MessageTrain
14
14
  subject { ignored_conversation.ignores.find_all_by_participant(first_user) }
15
15
  its(:first) { should be_a MessageTrain::Ignore }
16
16
  end
17
- describe '.conversation_ids' do
18
- subject { MessageTrain::Ignore.conversation_ids }
19
- it { should include ignored_conversation.id }
20
- end
21
17
  describe '.conversations' do
22
18
  subject { MessageTrain::Ignore.conversations }
23
19
  it { should include ignored_conversation }
@@ -23,34 +23,55 @@ module MessageTrain
23
23
  its(:draft) { should be true }
24
24
  end
25
25
  context 'generates receipts when present' do
26
- subject { sent_conversation.messages.first }
26
+ subject { sent_message }
27
27
  its(:sender) { should eq first_user }
28
28
  its(:receipts) { should have_exactly(2).items } # i.e. sender and recipient
29
29
  its(:recipients) { should include second_user }
30
30
  its(:draft) { should be false }
31
31
  end
32
+ context 'generates error when recipient_to_save does not exist' do
33
+ let(:message) { first_user.box(:in).send_message(subject: 'Message with missing recipient', recipients_to_save: { 'users' => 'missing-user' }, body: 'Foo.') }
34
+ subject { message.errors.full_messages.to_sentence }
35
+ it { should eq 'Recipient missing-user not found' }
36
+ end
32
37
  end
33
38
  describe 'Scopes and Methods' do
39
+ context '.ready' do
40
+ subject { MessageTrain::Message.ready.conversations }
41
+ it { should include sent_conversation }
42
+ it { should_not include draft_conversation }
43
+ end
34
44
  context '.drafts' do
35
45
  subject { MessageTrain::Message.drafts.first.conversation }
36
46
  it { should eq draft_conversation }
37
47
  end
38
48
  context '.by' do
39
49
  subject { MessageTrain::Message.by(first_user) }
40
- it { should include sent_conversation.messages.first }
41
- it { should include draft_conversation.messages.first }
50
+ it { should include sent_message }
51
+ it { should include draft_message }
42
52
  end
43
53
  context '.drafts_by' do
44
- subject { MessageTrain::Message.drafts_by(first_user).first.conversation }
45
- it { should eq draft_conversation }
54
+ subject { MessageTrain::Message.drafts_by(first_user).first }
55
+ it { should eq draft_message }
56
+ end
57
+ context '.find_by_subject' do
58
+ # Testing super on method_missing
59
+ subject { MessageTrain::Message.find_by_subject('Sent Conversation') }
60
+ it { should eq sent_message }
61
+ end
62
+ describe '#missing_method' do
63
+ # Testing super on method_missing
64
+ it 'raises a NoMethodError' do
65
+ expect {unread_message.missing_method}.to raise_error(NoMethodError)
66
+ end
46
67
  end
47
68
  context '.with_receipts_by' do
48
- subject { MessageTrain::Message.with_receipts_by(first_user).last.conversation }
49
- it { should eq sent_conversation }
69
+ subject { MessageTrain::Message.with_receipts_by(first_user).last }
70
+ it { should eq sent_message }
50
71
  end
51
72
  context '.with_receipts_to' do
52
- subject { MessageTrain::Message.with_receipts_to(first_user).last.conversation }
53
- it { should eq unread_conversation }
73
+ subject { MessageTrain::Message.with_receipts_to(first_user).last }
74
+ it { should eq unread_message }
54
75
  end
55
76
  context '.with_trashed_to and #is_trashed_to?' do
56
77
  subject { trashed_conversation.messages.with_trashed_to(first_user).first.is_trashed_to?(first_user) }
@@ -68,16 +89,32 @@ module MessageTrain
68
89
  before do
69
90
  read_conversation.messages.mark(:trash, first_user)
70
91
  end
71
- subject { read_conversation.messages.first.is_trashed_to?(first_user) }
92
+ subject { read_message.is_trashed_to?(first_user) }
72
93
  it { should be true }
73
94
  end
74
95
  context '#mark' do
75
96
  before do
76
- read_conversation.messages.first.mark(:unread, first_user)
97
+ read_message.mark(:unread, first_user)
77
98
  end
78
- subject { read_conversation.messages.first.is_read_to?(first_user) }
99
+ subject { read_message.is_read_to?(first_user) }
79
100
  it { should be false }
80
101
  end
102
+ context '#recipients' do
103
+ subject { unread_message.recipients.first }
104
+ it { should eq first_user }
105
+ end
106
+ context '.conversation_ids' do
107
+ subject { unread_conversation.messages.conversation_ids }
108
+ its(:first) { should eq unread_conversation.id }
109
+ end
110
+ context '.conversations' do
111
+ subject { unread_conversation.messages.conversations }
112
+ its(:first) { should eq unread_conversation }
113
+ end
114
+ describe 'responds to :is_message_by?' do
115
+ subject { unread_message.respond_to? :is_message_by? }
116
+ it { should be true }
117
+ end
81
118
  end
82
119
  end
83
120
  end
@@ -2,16 +2,19 @@ require 'rails_helper'
2
2
 
3
3
  module MessageTrain
4
4
  RSpec.describe Receipt do
5
+ include_context 'loaded site'
6
+
5
7
  describe 'Model' do
6
8
  # Relationships
7
9
  it { should belong_to :message }
8
10
  it { should belong_to :recipient }
11
+ it { should belong_to :received_through }
9
12
  # Validations
10
13
  it { should validate_presence_of :message }
11
14
  it { should validate_presence_of :recipient }
12
15
  end
16
+
13
17
  describe 'Scopes and Methods' do
14
- include_context 'loaded site'
15
18
  describe '.sender_receipt' do
16
19
  subject { MessageTrain::Receipt.sender_receipt.first }
17
20
  its(:sender) { should be true }
@@ -28,6 +31,11 @@ module MessageTrain
28
31
  it { should include trashed_conversation }
29
32
  it { should include read_conversation }
30
33
  end
34
+ describe '.find_by_recipient' do
35
+ # Testing super on method_missing
36
+ subject { MessageTrain::Receipt.find_by_recipient_type('User') }
37
+ it { should be_a(MessageTrain::Receipt) }
38
+ end
31
39
  describe '.receipts_to' do
32
40
  subject { MessageTrain::Receipt.receipts_to(first_user) }
33
41
  its(:first) { should be_a MessageTrain::Receipt }
@@ -35,7 +43,7 @@ module MessageTrain
35
43
  end
36
44
  describe '.trashed_to' do
37
45
  subject { MessageTrain::Receipt.trashed_to(first_user).first.message.conversation }
38
- its(:subject) { should eq 'Trashed Conversation' }
46
+ its(:subject) { should eq 'Membered Group Trashed Conversation' }
39
47
  end
40
48
  describe '.untrashed_to' do
41
49
  subject { MessageTrain::Receipt.untrashed_to(first_user).first }
@@ -43,11 +51,11 @@ module MessageTrain
43
51
  end
44
52
  describe '.read_to' do
45
53
  subject { MessageTrain::Receipt.read_to(first_user).first.message.conversation }
46
- its(:subject) { should eq 'Read Conversation' }
54
+ its(:subject) { should eq 'Membered Group Read Conversation' }
47
55
  end
48
56
  describe '.deleted_to' do
49
57
  subject { MessageTrain::Receipt.deleted_to(first_user).first.message.conversation }
50
- its(:subject) { should eq 'Deleted Conversation' }
58
+ its(:subject) { should eq 'Membered Group Deleted Conversation' }
51
59
  end
52
60
  describe '.undeleted_to' do
53
61
  subject { MessageTrain::Receipt.undeleted_to(first_user).first }
@@ -55,19 +63,47 @@ module MessageTrain
55
63
  end
56
64
  describe '.message_ids' do
57
65
  subject { MessageTrain::Receipt.receipts_by(first_user).message_ids }
58
- it { should include sent_conversation.messages.first.id }
66
+ it { should include sent_message.id }
59
67
  end
60
68
  describe '.messages' do
61
69
  subject { MessageTrain::Receipt.receipts_by(first_user).messages }
62
- it { should include sent_conversation.messages.first }
70
+ it { should include sent_message }
63
71
  end
64
72
  describe '#mark' do
65
73
  before do
66
- unread_conversation.messages.first.receipts.for(first_user).first.mark(:read)
74
+ unread_message.receipts.for(first_user).first.mark(:read)
67
75
  end
68
- subject { unread_conversation.messages.first.is_read_to?(first_user) }
76
+ subject { unread_message.is_read_to?(first_user) }
69
77
  it { should be true }
70
78
  end
79
+ describe '.message_ids' do
80
+ subject { first_user.receipts.message_ids }
81
+ it { should include unread_message.id }
82
+ it { should include sent_message.id }
83
+ it { should include read_message.id }
84
+ it { should include draft_message.id }
85
+ end
86
+ describe '.messages' do
87
+ subject { first_user.receipts.messages }
88
+ it { should include unread_message }
89
+ it { should include sent_message }
90
+ it { should include read_message }
91
+ it { should include draft_message }
92
+ end
93
+ describe '.conversation_ids' do
94
+ subject { first_user.receipts.conversation_ids }
95
+ it { should include unread_conversation.id }
96
+ it { should include sent_conversation.id }
97
+ it { should include read_conversation.id }
98
+ it { should include draft_conversation.id }
99
+ end
100
+ describe '.conversations' do
101
+ subject { first_user.receipts.conversations }
102
+ it { should include unread_conversation }
103
+ it { should include sent_conversation }
104
+ it { should include read_conversation }
105
+ it { should include draft_conversation }
106
+ end
71
107
  end
72
108
  end
73
109
  end
@@ -0,0 +1,16 @@
1
+ require 'rails_helper'
2
+
3
+ module MessageTrain
4
+ RSpec.describe Unsubscribe do
5
+ include_context 'loaded site'
6
+
7
+ describe 'Model' do
8
+ # Relationships
9
+ it { should belong_to :recipient }
10
+ it { should belong_to :from }
11
+ # Validations
12
+ it { should validate_presence_of :recipient }
13
+ it { should validate_presence_of :from }
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,125 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe Role do
4
+ describe 'Model' do
5
+ # MessageTrain Gem
6
+ it { should have_many(:receipts) }
7
+ end
8
+
9
+ describe 'Scopes and Methods from Message Train' do
10
+ include_context 'loaded site'
11
+
12
+ describe '#slug_part' do
13
+ subject { superadmin_role.slug_part }
14
+ it { should eq 'superadmin' }
15
+ end
16
+
17
+ describe '#path_part' do
18
+ subject { superadmin_role.path_part }
19
+ it { should eq 'roles:superadmin' }
20
+ end
21
+
22
+ describe '#valid_senders' do
23
+ subject { superadmin_role.valid_senders }
24
+ it { should include superadmin_user }
25
+ it { should_not include admin_user }
26
+ end
27
+
28
+ describe '#allows_sending_by?' do
29
+ context 'when user is a superadmin' do
30
+ subject { admin_role.allows_sending_by?(superadmin_user) }
31
+ it { should be true }
32
+ end
33
+ context 'when user is not an owner' do
34
+ subject { admin_role.allows_sending_by?(admin_user) }
35
+ it { should be false }
36
+ end
37
+ end
38
+
39
+ describe '#valid_recipients' do
40
+ subject { admin_role.valid_recipients }
41
+ it { should_not include first_user }
42
+ it { should include admin_user }
43
+ end
44
+
45
+ describe '#allows_receiving_by?' do
46
+ context 'when user is a member' do
47
+ subject { admin_role.allows_receiving_by?(admin_user) }
48
+ it { should be true }
49
+ end
50
+ context 'when user is not a member' do
51
+ subject { admin_role.allows_receiving_by?(first_user) }
52
+ it { should be false }
53
+ end
54
+ end
55
+
56
+ describe '#self_collection' do
57
+ subject { admin_role.self_collection }
58
+ it { should be_a ActiveRecord::Relation }
59
+ it { should eq [admin_role] }
60
+ end
61
+
62
+ describe '#conversations' do
63
+ subject { admin_role.conversations(:in, admin_user) }
64
+ its(:first) { should be_a MessageTrain::Conversation }
65
+ its(:count) { should eq 1 }
66
+ end
67
+
68
+ describe '#boxes_for_participant' do
69
+ context 'when participant is a valid sender' do
70
+ subject { admin_role.boxes_for_participant(superadmin_user).collect { |x| x.division } }
71
+ it { should_not include :in }
72
+ it { should include :sent }
73
+ it { should include :drafts }
74
+ it { should include :all }
75
+ it { should include :trash }
76
+ it { should_not include :ignored }
77
+ end
78
+ context 'when participant is a valid recipient' do
79
+ subject { admin_role.boxes_for_participant(admin_user).collect { |x| x.division } }
80
+ it { should include :in }
81
+ it { should_not include :sent }
82
+ it { should_not include :drafts }
83
+ it { should include :all }
84
+ it { should include :trash }
85
+ it { should include :ignored }
86
+ end
87
+ end
88
+
89
+ describe '#all_conversations' do
90
+ context 'when participant is a valid sender' do
91
+ subject { admin_role.all_conversations(superadmin_user) }
92
+ its(:first) { should be_a MessageTrain::Conversation }
93
+ it { should_not include unread_conversation }
94
+ it { should include role_conversation }
95
+ it { should_not include role_draft } # Because received_through not set on sender receipts
96
+ end
97
+ context 'when participant is a valid recipient' do
98
+ subject { admin_role.all_conversations(admin_user) }
99
+ its(:first) { should be_a MessageTrain::Conversation }
100
+ it { should_not include unread_conversation }
101
+ it { should include role_conversation }
102
+ it { should_not include role_draft }
103
+ end
104
+ end
105
+
106
+ describe '#all_messages' do
107
+ context 'when participant is a valid sender' do
108
+ subject { admin_role.all_messages(superadmin_user) }
109
+ its(:first) { should be_a MessageTrain::Message }
110
+ it { should_not include unread_message }
111
+ it { should include role_message }
112
+ it { should_not include role_draft_message } # Because received_through not set on sender receipts
113
+ end
114
+ context 'when participant is a valid recipient' do
115
+ subject { admin_role.all_messages(admin_user) }
116
+ its(:first) { should be_a MessageTrain::Message }
117
+ it { should_not include unread_message }
118
+ it { should include role_message }
119
+ it { should_not include role_draft_message }
120
+ end
121
+ end
122
+
123
+ end
124
+
125
+ end