discuss 0.0.1

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 (151) hide show
  1. checksums.yaml +15 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +153 -0
  4. data/Rakefile +34 -0
  5. data/app/assets/javascripts/discuss/application.js +3 -0
  6. data/app/assets/javascripts/discuss/chosen.jquery.js +1104 -0
  7. data/app/assets/javascripts/discuss/compose.coffee +21 -0
  8. data/app/assets/javascripts/discuss/discuss.chosen.coffee +2 -0
  9. data/app/assets/javascripts/discuss/discuss.coffee +2 -0
  10. data/app/assets/javascripts/discuss/messages.coffee +0 -0
  11. data/app/assets/stylesheets/discuss/application.css +13 -0
  12. data/app/assets/stylesheets/discuss/chosen.css +439 -0
  13. data/app/controllers/discuss/application_controller.rb +11 -0
  14. data/app/controllers/discuss/mailboxes_controller.rb +30 -0
  15. data/app/controllers/discuss/messages_controller.rb +85 -0
  16. data/app/helpers/discuss/application_helper.rb +7 -0
  17. data/app/models/discuss/conversation.rb +29 -0
  18. data/app/models/discuss/mailbox.rb +33 -0
  19. data/app/models/discuss/message.rb +135 -0
  20. data/app/services/discuss/message_sender.rb +33 -0
  21. data/app/views/discuss/mailboxes/show.html.haml +24 -0
  22. data/app/views/discuss/messages/_form.html.haml +18 -0
  23. data/app/views/discuss/messages/edit.html.haml +1 -0
  24. data/app/views/discuss/messages/new.html.haml +1 -0
  25. data/app/views/discuss/messages/show.html.haml +28 -0
  26. data/app/views/discuss/shared/_nav.haml +8 -0
  27. data/config/routes.rb +15 -0
  28. data/db/migrate/20130419055252_setup_discuss.rb +22 -0
  29. data/lib/discuss.rb +4 -0
  30. data/lib/discuss/engine.rb +9 -0
  31. data/lib/discuss/models/discussable.rb +29 -0
  32. data/lib/discuss/version.rb +3 -0
  33. data/lib/generators/discuss/views_generator.rb +8 -0
  34. data/lib/tasks/discuss_tasks.rake +4 -0
  35. data/test/discuss_test.rb +7 -0
  36. data/test/dummy/README.rdoc +28 -0
  37. data/test/dummy/Rakefile +6 -0
  38. data/test/dummy/app/assets/javascripts/application.js +5 -0
  39. data/test/dummy/app/assets/javascripts/chosen.jquery.js +1104 -0
  40. data/test/dummy/app/assets/javascripts/compose.coffee +21 -0
  41. data/test/dummy/app/assets/javascripts/discuss.chosen.coffee +2 -0
  42. data/test/dummy/app/assets/javascripts/discuss.coffee +2 -0
  43. data/test/dummy/app/assets/javascripts/messages.coffee +0 -0
  44. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  45. data/test/dummy/app/assets/stylesheets/chosen.css +439 -0
  46. data/test/dummy/app/assets/stylesheets/discuss.css +41 -0
  47. data/test/dummy/app/controllers/application_controller.rb +5 -0
  48. data/test/dummy/app/helpers/application_helper.rb +2 -0
  49. data/test/dummy/app/models/user.rb +22 -0
  50. data/test/dummy/app/views/layouts/application.html.erb +17 -0
  51. data/test/dummy/bin/bundle +3 -0
  52. data/test/dummy/bin/rails +4 -0
  53. data/test/dummy/bin/rake +4 -0
  54. data/test/dummy/config.ru +4 -0
  55. data/test/dummy/config/application.rb +23 -0
  56. data/test/dummy/config/boot.rb +9 -0
  57. data/test/dummy/config/database.yml +25 -0
  58. data/test/dummy/config/environment.rb +5 -0
  59. data/test/dummy/config/environments/development.rb +27 -0
  60. data/test/dummy/config/environments/production.rb +80 -0
  61. data/test/dummy/config/environments/test.rb +36 -0
  62. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  63. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  64. data/test/dummy/config/initializers/inflections.rb +16 -0
  65. data/test/dummy/config/initializers/mime_types.rb +5 -0
  66. data/test/dummy/config/initializers/secret_token.rb +12 -0
  67. data/test/dummy/config/initializers/session_store.rb +3 -0
  68. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  69. data/test/dummy/config/locales/en.yml +23 -0
  70. data/test/dummy/config/routes.rb +4 -0
  71. data/test/dummy/db/development.sqlite3 +0 -0
  72. data/test/dummy/db/migrate/20130428235128_create_users.rb +11 -0
  73. data/test/dummy/db/schema.rb +24 -0
  74. data/test/dummy/db/test.sqlite3 +0 -0
  75. data/test/dummy/log/development.log +16219 -0
  76. data/test/dummy/log/test.log +191354 -0
  77. data/test/dummy/public/404.html +27 -0
  78. data/test/dummy/public/422.html +26 -0
  79. data/test/dummy/public/500.html +26 -0
  80. data/test/dummy/public/favicon.ico +0 -0
  81. data/test/dummy/tmp/cache/assets/development/sprockets/0a28667732e1be8938cde061b6f996df +0 -0
  82. data/test/dummy/tmp/cache/assets/development/sprockets/0ddd7cc29057a69bd29fde03bf0f4c00 +0 -0
  83. data/test/dummy/tmp/cache/assets/development/sprockets/0de2f69502366965bb7fae2623bc190c +0 -0
  84. data/test/dummy/tmp/cache/assets/development/sprockets/0ee691067e6ec8f03df58bc94badd25d +0 -0
  85. data/test/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  86. data/test/dummy/tmp/cache/assets/development/sprockets/1b77abb6bee52fa8d68ee7e81077ff20 +0 -0
  87. data/test/dummy/tmp/cache/assets/development/sprockets/271bb8f72971af6089be8d1b85788bec +0 -0
  88. data/test/dummy/tmp/cache/assets/development/sprockets/2a499e57eb2664f139ab0e74571faa77 +0 -0
  89. data/test/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  90. data/test/dummy/tmp/cache/assets/development/sprockets/32b6af14546cb11e773fb3799f041132 +0 -0
  91. data/test/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  92. data/test/dummy/tmp/cache/assets/development/sprockets/4728f8b9616c35f685674fbeecaa3c47 +0 -0
  93. data/test/dummy/tmp/cache/assets/development/sprockets/4e9a3e121da30d3a85273a5c283da214 +0 -0
  94. data/test/dummy/tmp/cache/assets/development/sprockets/5620ff4659033b350ea3031ecaeb5127 +0 -0
  95. data/test/dummy/tmp/cache/assets/development/sprockets/596293af7e4dcfa45880435ae753f876 +0 -0
  96. data/test/dummy/tmp/cache/assets/development/sprockets/614995c5e7b1b4f5b12ce060404706cc +0 -0
  97. data/test/dummy/tmp/cache/assets/development/sprockets/6b9e24a8aad25948823e1a93c8be731e +0 -0
  98. data/test/dummy/tmp/cache/assets/development/sprockets/78a00003621b318a297e05cfedb0d1fd +0 -0
  99. data/test/dummy/tmp/cache/assets/development/sprockets/794654d117cd2ec6a9a00e485d9f4485 +0 -0
  100. data/test/dummy/tmp/cache/assets/development/sprockets/79ae3a9f48e9b9e8ef2922c844b1895f +0 -0
  101. data/test/dummy/tmp/cache/assets/development/sprockets/9b5889bea21f2af8068646890752932c +0 -0
  102. data/test/dummy/tmp/cache/assets/development/sprockets/9fd02d20091838d6411df2d23a5364d5 +0 -0
  103. data/test/dummy/tmp/cache/assets/development/sprockets/a02345b542298f25d3f701ee680c44c0 +0 -0
  104. data/test/dummy/tmp/cache/assets/development/sprockets/a80359c0e09ddf510ce63de09a368d4c +0 -0
  105. data/test/dummy/tmp/cache/assets/development/sprockets/ad2a9bfe4169e0a5bc66efd35c83fe38 +0 -0
  106. data/test/dummy/tmp/cache/assets/development/sprockets/b1794788ec8ce362aceaffa31c7381e9 +0 -0
  107. data/test/dummy/tmp/cache/assets/development/sprockets/b284f477944d67f25c0672dba1a2dab4 +0 -0
  108. data/test/dummy/tmp/cache/assets/development/sprockets/b2b1f16cf54d69c151ca7f42fb2f8381 +0 -0
  109. data/test/dummy/tmp/cache/assets/development/sprockets/b4767dfdb540517d26dc8c5365736f53 +0 -0
  110. data/test/dummy/tmp/cache/assets/development/sprockets/bab78b46d2a6282e5df747dd8b6d5abf +0 -0
  111. data/test/dummy/tmp/cache/assets/development/sprockets/c9a09977565da30179ad7fdb9f79ae0d +0 -0
  112. data/test/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  113. data/test/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  114. data/test/dummy/tmp/cache/assets/development/sprockets/d9c8047218dc90a46a6725543638de45 +0 -0
  115. data/test/dummy/tmp/cache/assets/development/sprockets/e5b181eb056bbd6ffad37ed146b0342e +0 -0
  116. data/test/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  117. data/test/dummy/tmp/cache/assets/test/sprockets/0a28667732e1be8938cde061b6f996df +0 -0
  118. data/test/dummy/tmp/cache/assets/test/sprockets/0ddd7cc29057a69bd29fde03bf0f4c00 +0 -0
  119. data/test/dummy/tmp/cache/assets/test/sprockets/0de2f69502366965bb7fae2623bc190c +0 -0
  120. data/test/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  121. data/test/dummy/tmp/cache/assets/test/sprockets/1b77abb6bee52fa8d68ee7e81077ff20 +0 -0
  122. data/test/dummy/tmp/cache/assets/test/sprockets/271bb8f72971af6089be8d1b85788bec +0 -0
  123. data/test/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  124. data/test/dummy/tmp/cache/assets/test/sprockets/32b6af14546cb11e773fb3799f041132 +0 -0
  125. data/test/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  126. data/test/dummy/tmp/cache/assets/test/sprockets/4728f8b9616c35f685674fbeecaa3c47 +0 -0
  127. data/test/dummy/tmp/cache/assets/test/sprockets/5620ff4659033b350ea3031ecaeb5127 +0 -0
  128. data/test/dummy/tmp/cache/assets/test/sprockets/596293af7e4dcfa45880435ae753f876 +0 -0
  129. data/test/dummy/tmp/cache/assets/test/sprockets/78a00003621b318a297e05cfedb0d1fd +0 -0
  130. data/test/dummy/tmp/cache/assets/test/sprockets/794654d117cd2ec6a9a00e485d9f4485 +0 -0
  131. data/test/dummy/tmp/cache/assets/test/sprockets/79ae3a9f48e9b9e8ef2922c844b1895f +0 -0
  132. data/test/dummy/tmp/cache/assets/test/sprockets/9b5889bea21f2af8068646890752932c +0 -0
  133. data/test/dummy/tmp/cache/assets/test/sprockets/9fd02d20091838d6411df2d23a5364d5 +0 -0
  134. data/test/dummy/tmp/cache/assets/test/sprockets/a02345b542298f25d3f701ee680c44c0 +0 -0
  135. data/test/dummy/tmp/cache/assets/test/sprockets/a80359c0e09ddf510ce63de09a368d4c +0 -0
  136. data/test/dummy/tmp/cache/assets/test/sprockets/ad2a9bfe4169e0a5bc66efd35c83fe38 +0 -0
  137. data/test/dummy/tmp/cache/assets/test/sprockets/bab78b46d2a6282e5df747dd8b6d5abf +0 -0
  138. data/test/dummy/tmp/cache/assets/test/sprockets/c9a09977565da30179ad7fdb9f79ae0d +0 -0
  139. data/test/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  140. data/test/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  141. data/test/dummy/tmp/cache/assets/test/sprockets/d9c8047218dc90a46a6725543638de45 +0 -0
  142. data/test/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  143. data/test/features/workflow_test.rb +182 -0
  144. data/test/test_helper.rb +68 -0
  145. data/test/unit/discuss/conversation_test.rb +79 -0
  146. data/test/unit/discuss/mailbox_test.rb +72 -0
  147. data/test/unit/discuss/message_test.rb +73 -0
  148. data/test/unit/discuss/recipient_test.rb +56 -0
  149. data/test/unit/discuss/sender_test.rb +106 -0
  150. data/test/unit/helpers/discuss/messages_helper_test.rb +6 -0
  151. metadata +422 -0
@@ -0,0 +1,79 @@
1
+ require 'test_helper'
2
+
3
+ module Discuss
4
+ class ConversationTest < MiniTest::Spec
5
+ before do
6
+ @message = @sender.messages.create(body: 'lorem ipsum', recipients: [@recipient])
7
+ @message.send!
8
+ @received = Message.last
9
+ @received.reply! body: 'awesome'
10
+ end
11
+
12
+ # [e] just sanity checking before any other tests
13
+ it 'has total of 4 messages' do
14
+ assert_equal 4, Message.count
15
+ end
16
+
17
+ context 'sender?' do
18
+ before { @conversation = Conversation.new(@message) }
19
+
20
+ it 'has a root' do
21
+ assert_equal @message, @conversation.root
22
+ end
23
+
24
+ it 'can find all conversation-related messages' do
25
+ assert_equal 4, @conversation.all.count
26
+ end
27
+
28
+ it 'find messages the user owns' do
29
+ assert_equal 2, @conversation.for_user.count
30
+ end
31
+
32
+ it 'places messages in the correct mailbox' do
33
+ @mb = Mailbox.new(@sender)
34
+ assert_includes @mb.inbox, Message.last
35
+ assert_includes @mb.outbox, @message
36
+ end
37
+
38
+ context 'when not message owner' do
39
+ before { @recipient_conversation = Conversation.new(@message, @recipient) }
40
+
41
+ it 'still find the correct messages' do
42
+ refute_equal @recipient_conversation.for_user, @conversation.for_user
43
+ end
44
+
45
+ it 'trashes the conversation' do
46
+ @recipient_conversation.trash_conversation!
47
+ @recipient_conversation.for_user.each do |m|
48
+ assert m.trashed?
49
+ end
50
+ @conversation.for_user.each do |m|
51
+ refute m.trashed?
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ context 'recipient?' do
58
+ before { @conversation = Conversation.new(@received) }
59
+
60
+ it 'has a root' do
61
+ assert_equal @message, @conversation.root
62
+ end
63
+
64
+ it 'can find all conversation-related messages' do
65
+ assert_equal 4, @conversation.all.count
66
+ end
67
+
68
+ it 'find messages the user owns' do
69
+ assert_equal 2, @conversation.for_user.count
70
+ end
71
+
72
+ it 'places messages in the correct mailbox' do
73
+ @mb = Mailbox.new(@recipient)
74
+ assert_includes @mb.inbox, @received
75
+ refute_includes @mb.outbox, Message.last
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,72 @@
1
+ require 'test_helper'
2
+
3
+ module Discuss
4
+ class MailboxTest < MiniTest::Spec
5
+ before do
6
+ @draft = @sender.messages.create(body: 'lorem ipsum', recipients: [@recipient])
7
+ @message = @sender.messages.create(body: 'lorem ipsum', recipients: [@recipient])
8
+ @message.send!
9
+ end
10
+
11
+ context 'sender?' do
12
+ before { @mailbox = Mailbox.new(@sender) }
13
+
14
+ it 'inbox' do
15
+ assert_equal 0, @mailbox.inbox.count
16
+ end
17
+
18
+ it 'outbox' do
19
+ assert_equal 1, @mailbox.outbox.count
20
+ end
21
+
22
+ it 'drafts' do
23
+ assert_equal 1, @mailbox.drafts.count
24
+ end
25
+
26
+ it 'trash' do
27
+ @message.trash!
28
+ assert_equal 0, @mailbox.outbox.count
29
+ assert_equal 1, @mailbox.trash.count
30
+ end
31
+
32
+ it 'can empty_trash!' do
33
+ @draft.trash!
34
+ assert_equal 0, @mailbox.drafts.count
35
+ assert_equal 1, @mailbox.trash.count
36
+
37
+ @mailbox.empty_trash!
38
+ assert_equal 0, @mailbox.trash.count
39
+ end
40
+ end
41
+
42
+ context 'recipient?' do
43
+ before { @mailbox = Mailbox.new(@recipient) }
44
+
45
+ it 'inbox' do
46
+ assert_equal 1, @mailbox.inbox.count
47
+ end
48
+
49
+ it 'outbox' do
50
+ assert_equal 0, @mailbox.outbox.count
51
+ end
52
+
53
+ it 'drafts' do
54
+ assert_equal 0, @mailbox.drafts.count
55
+ end
56
+
57
+ it 'trash' do
58
+ message = @mailbox.inbox.first
59
+ message.trash!
60
+ assert_equal 0, @mailbox.inbox.count
61
+ assert_equal 1, @mailbox.trash.count
62
+ end
63
+
64
+ it 'can empty_trash' do
65
+ message = @mailbox.inbox.first
66
+ message.trash!
67
+ @mailbox.empty_trash!
68
+ assert_equal 0, @mailbox.trash.count
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,73 @@
1
+ require 'test_helper'
2
+
3
+ module Discuss
4
+ class MessageTest < MiniTest::Spec
5
+ it 'must be valid' do
6
+ message = Message.new()
7
+ refute message.valid?
8
+ assert_equal 2, message.errors.count
9
+ end
10
+
11
+ context 'with users' do
12
+ it 'should have a user' do
13
+ message = @sender.messages.new
14
+ refute_nil message.user
15
+ end
16
+
17
+ context 'when sent' do
18
+ before do
19
+ @message = @sender.messages.create(body: 'lorem', recipients: [@recipient])
20
+ @message.send!
21
+ refute @message.editable?
22
+ end
23
+
24
+ it 'cannot be edited once sent' do
25
+ assert_raises(ActiveRecord::RecordInvalid) { @message.update!(body: 'abc') }
26
+ end
27
+
28
+ it 'cannot go back to being a draft once sent' do
29
+ assert_raises(ActiveRecord::RecordInvalid) { @message.update!(sent_at: nil) }
30
+ end
31
+
32
+ context 'when received' do
33
+ before { @received_by_recipient = Mailbox.new(@recipient).inbox.first }
34
+
35
+ it 'cannot be edited' do
36
+ assert_raises(ActiveRecord::RecordInvalid) { @received_by_recipient.update!(subject: 'new subject') }
37
+ end
38
+
39
+ context 'conversation' do
40
+ before do
41
+ @received_by_recipient.reply!(body: 'awesome')
42
+ @reply_received_by_sender = Mailbox.new(@sender).inbox.first
43
+ @reply_received_by_sender.reply!(body: 'duly noted!')
44
+ end
45
+
46
+ it 'has correct recipients size' do
47
+ assert_equal 5, @message.descendants.count
48
+ assert_equal 1, @message.recipients.count
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ end
55
+
56
+ context 'message held by multiple threads' do
57
+ require 'thread'
58
+
59
+ it 'can only be sent once' do
60
+ @message = @sender.messages.create(body: 'lorem', recipients: [@recipient])
61
+
62
+ t1 = Thread.new { @message.send! }
63
+ t2 = Thread.new { @message.send! }
64
+
65
+ t1.join
66
+ t2.join
67
+
68
+ assert_equal 1, @message.children.count
69
+ end
70
+
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,56 @@
1
+ require 'test_helper'
2
+
3
+ module Discuss
4
+ class RecipientTest < MiniTest::Spec
5
+ before do
6
+ @message = @sender.messages.create(body: 'lorem ipsum', recipients: [@recipient])
7
+ @message.send!
8
+ @received = Mailbox.new(@recipient).inbox.first
9
+ end
10
+
11
+ it 'cannot reply if no parent' do
12
+ assert_equal 2, Message.count
13
+ refute @message.parent
14
+ @message.reply! body: 'awesome'
15
+ assert_equal 2, Message.count
16
+ end
17
+
18
+ it 'does not deliver if no :body' do
19
+ assert_raises(ActiveRecord::RecordInvalid) { @received.reply! }
20
+ end
21
+
22
+ it 'has a parent message' do
23
+ assert_equal @message, @received.parent
24
+ end
25
+
26
+ context 'when replying' do
27
+ before do
28
+ @text = 'awesome'
29
+ @received.reply! body: @text
30
+ end
31
+
32
+ it 'reply to sender' do
33
+ assert_equal 4, Message.count
34
+ end
35
+
36
+ it 'is delivered to @sender' do
37
+ @inbox = Mailbox.new(@sender).inbox
38
+ assert_equal 1, @inbox.count
39
+ assert_equal @text, @inbox.last.body
40
+ end
41
+
42
+ it "has the reply in the @recipient's outbox" do
43
+ @outbox = Mailbox.new(@recipient).outbox
44
+ assert_equal 1, @outbox.count
45
+ assert_equal @text, @outbox.last.body
46
+ end
47
+
48
+ it 'has ancestry tree' do
49
+ last_message = Message.last
50
+ assert_equal 3, last_message.ancestors.count
51
+ assert_equal @message, last_message.root
52
+ # ap Message.all.collect &:ancestry
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,106 @@
1
+ require 'test_helper'
2
+
3
+ module Discuss
4
+ describe 'sender' do
5
+ context 'when draft' do
6
+ context 'without recipients' do
7
+ before do
8
+ @message = @sender.messages.create(body: 'lorem ipsum')
9
+ end
10
+
11
+ it 'saved message as draft when no recipients' do
12
+ assert @message.unsent?
13
+ end
14
+
15
+ it 'does not deliver' do
16
+ @message.send!
17
+ assert @message.unsent?
18
+ assert @message.is_childless?
19
+ end
20
+ end
21
+
22
+ context 'with recipients' do
23
+ before { @message = @sender.messages.create(body: 'lorem ipsum', recipients: [@recipient, @lisa]) }
24
+
25
+ it 'defaults to draft' do
26
+ assert @message.unsent?
27
+ end
28
+
29
+ it 'should not deliver the message' do
30
+ assert_equal 1, Message.count
31
+ end
32
+
33
+ it 'when trashed, should not be included in the #drafts scope' do
34
+ @message.trash!
35
+ assert_includes Message.trash(@sender), @message
36
+ refute_includes Message.drafts(@sender), @message
37
+ end
38
+ end
39
+ end
40
+
41
+ context 'when sending' do
42
+ before do
43
+ @message = @sender.messages.create(body: 'lorem ipsum', recipients: [@recipient, @lisa])
44
+ @message.send!
45
+ end
46
+
47
+ it 'sends a message by calling #send!' do
48
+ assert @message.sent?
49
+ end
50
+
51
+ it 'can have multiple recipients' do
52
+ assert_equal 2, @message.children.count
53
+ end
54
+
55
+ it 'sets sent_at but not received_at' do
56
+ assert @message.sent?
57
+ refute @message.received?
58
+ end
59
+
60
+ it 'is included in the #sent scope' do
61
+ assert_includes Message.outbox(@sender), @message
62
+ end
63
+
64
+ it 'when trashed, should not be included in the #outbox scope' do
65
+ @message.trash!
66
+ assert_includes Message.trash(@sender), @message
67
+ refute_includes Message.outbox(@sender), @message
68
+ end
69
+ end
70
+
71
+ context 'when trashed' do
72
+ it 'still appears in the recipient inbox' do
73
+ message = @sender.messages.create(body: 'lorem ipsum', recipients: [@recipient, @lisa])
74
+ message.send!
75
+ message.trash!
76
+ end
77
+ end
78
+
79
+ context 'when deleted' do
80
+ before do
81
+ @message = @sender.messages.create(body: 'lorem ipsum', recipients: [@recipient, @lisa])
82
+ @message.send!
83
+
84
+ assert_equal 1, Message.inbox(@recipient).count
85
+ @received_message = Message.inbox(@recipient).last
86
+
87
+ @message.delete!
88
+ end
89
+
90
+ it 'can be deleted' do
91
+ assert @message.deleted?
92
+ end
93
+
94
+ it 'is not included in the #trash scope' do
95
+ refute_includes Message.trash(@sender), @message
96
+ end
97
+
98
+ it 'still appears in the recipient inbox' do
99
+ assert_includes Message.inbox(@recipient), @received_message
100
+ end
101
+ end
102
+
103
+ end
104
+ end
105
+
106
+
@@ -0,0 +1,6 @@
1
+ require 'test_helper'
2
+
3
+ module Discuss
4
+ class MessagesHelperTest < ActionView::TestCase
5
+ end
6
+ end
metadata ADDED
@@ -0,0 +1,422 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: discuss
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Elle Meredith
8
+ - Garrett Heinlen
9
+ - Nick Sutterer
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2013-05-15 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rails
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 4.0.0.rc1
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ version: 4.0.0.rc1
29
+ - !ruby/object:Gem::Dependency
30
+ name: ancestry
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ~>
34
+ - !ruby/object:Gem::Version
35
+ version: 2.0.0.rc1
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ~>
41
+ - !ruby/object:Gem::Version
42
+ version: 2.0.0.rc1
43
+ - !ruby/object:Gem::Dependency
44
+ name: haml
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ~>
48
+ - !ruby/object:Gem::Version
49
+ version: '4.0'
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ~>
55
+ - !ruby/object:Gem::Version
56
+ version: '4.0'
57
+ - !ruby/object:Gem::Dependency
58
+ name: simple_form
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ~>
62
+ - !ruby/object:Gem::Version
63
+ version: '1.4'
64
+ type: :runtime
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ~>
69
+ - !ruby/object:Gem::Version
70
+ version: '1.4'
71
+ - !ruby/object:Gem::Dependency
72
+ name: capybara
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ! '>='
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ - !ruby/object:Gem::Dependency
86
+ name: debugger
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ! '>='
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ type: :development
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ - !ruby/object:Gem::Dependency
100
+ name: sqlite3
101
+ requirement: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ! '>='
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ type: :development
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ! '>='
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ - !ruby/object:Gem::Dependency
114
+ name: minitest-reporters
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ! '>='
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ type: :development
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ! '>='
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ description: Messaging engine
128
+ email:
129
+ - elle.meredith@blake.com.au
130
+ executables: []
131
+ extensions: []
132
+ extra_rdoc_files: []
133
+ files:
134
+ - app/assets/javascripts/discuss/application.js
135
+ - app/assets/javascripts/discuss/chosen.jquery.js
136
+ - app/assets/javascripts/discuss/compose.coffee
137
+ - app/assets/javascripts/discuss/discuss.chosen.coffee
138
+ - app/assets/javascripts/discuss/discuss.coffee
139
+ - app/assets/javascripts/discuss/messages.coffee
140
+ - app/assets/stylesheets/discuss/application.css
141
+ - app/assets/stylesheets/discuss/chosen.css
142
+ - app/controllers/discuss/application_controller.rb
143
+ - app/controllers/discuss/mailboxes_controller.rb
144
+ - app/controllers/discuss/messages_controller.rb
145
+ - app/helpers/discuss/application_helper.rb
146
+ - app/models/discuss/conversation.rb
147
+ - app/models/discuss/mailbox.rb
148
+ - app/models/discuss/message.rb
149
+ - app/services/discuss/message_sender.rb
150
+ - app/views/discuss/mailboxes/show.html.haml
151
+ - app/views/discuss/messages/_form.html.haml
152
+ - app/views/discuss/messages/edit.html.haml
153
+ - app/views/discuss/messages/new.html.haml
154
+ - app/views/discuss/messages/show.html.haml
155
+ - app/views/discuss/shared/_nav.haml
156
+ - config/routes.rb
157
+ - db/migrate/20130419055252_setup_discuss.rb
158
+ - lib/discuss/engine.rb
159
+ - lib/discuss/models/discussable.rb
160
+ - lib/discuss/version.rb
161
+ - lib/discuss.rb
162
+ - lib/generators/discuss/views_generator.rb
163
+ - lib/tasks/discuss_tasks.rake
164
+ - MIT-LICENSE
165
+ - Rakefile
166
+ - README.md
167
+ - test/discuss_test.rb
168
+ - test/dummy/app/assets/javascripts/application.js
169
+ - test/dummy/app/assets/javascripts/chosen.jquery.js
170
+ - test/dummy/app/assets/javascripts/compose.coffee
171
+ - test/dummy/app/assets/javascripts/discuss.chosen.coffee
172
+ - test/dummy/app/assets/javascripts/discuss.coffee
173
+ - test/dummy/app/assets/javascripts/messages.coffee
174
+ - test/dummy/app/assets/stylesheets/application.css
175
+ - test/dummy/app/assets/stylesheets/chosen.css
176
+ - test/dummy/app/assets/stylesheets/discuss.css
177
+ - test/dummy/app/controllers/application_controller.rb
178
+ - test/dummy/app/helpers/application_helper.rb
179
+ - test/dummy/app/models/user.rb
180
+ - test/dummy/app/views/layouts/application.html.erb
181
+ - test/dummy/bin/bundle
182
+ - test/dummy/bin/rails
183
+ - test/dummy/bin/rake
184
+ - test/dummy/config/application.rb
185
+ - test/dummy/config/boot.rb
186
+ - test/dummy/config/database.yml
187
+ - test/dummy/config/environment.rb
188
+ - test/dummy/config/environments/development.rb
189
+ - test/dummy/config/environments/production.rb
190
+ - test/dummy/config/environments/test.rb
191
+ - test/dummy/config/initializers/backtrace_silencers.rb
192
+ - test/dummy/config/initializers/filter_parameter_logging.rb
193
+ - test/dummy/config/initializers/inflections.rb
194
+ - test/dummy/config/initializers/mime_types.rb
195
+ - test/dummy/config/initializers/secret_token.rb
196
+ - test/dummy/config/initializers/session_store.rb
197
+ - test/dummy/config/initializers/wrap_parameters.rb
198
+ - test/dummy/config/locales/en.yml
199
+ - test/dummy/config/routes.rb
200
+ - test/dummy/config.ru
201
+ - test/dummy/db/development.sqlite3
202
+ - test/dummy/db/migrate/20130428235128_create_users.rb
203
+ - test/dummy/db/schema.rb
204
+ - test/dummy/db/test.sqlite3
205
+ - test/dummy/log/development.log
206
+ - test/dummy/log/test.log
207
+ - test/dummy/public/404.html
208
+ - test/dummy/public/422.html
209
+ - test/dummy/public/500.html
210
+ - test/dummy/public/favicon.ico
211
+ - test/dummy/Rakefile
212
+ - test/dummy/README.rdoc
213
+ - test/dummy/tmp/cache/assets/development/sprockets/0a28667732e1be8938cde061b6f996df
214
+ - test/dummy/tmp/cache/assets/development/sprockets/0ddd7cc29057a69bd29fde03bf0f4c00
215
+ - test/dummy/tmp/cache/assets/development/sprockets/0de2f69502366965bb7fae2623bc190c
216
+ - test/dummy/tmp/cache/assets/development/sprockets/0ee691067e6ec8f03df58bc94badd25d
217
+ - test/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705
218
+ - test/dummy/tmp/cache/assets/development/sprockets/1b77abb6bee52fa8d68ee7e81077ff20
219
+ - test/dummy/tmp/cache/assets/development/sprockets/271bb8f72971af6089be8d1b85788bec
220
+ - test/dummy/tmp/cache/assets/development/sprockets/2a499e57eb2664f139ab0e74571faa77
221
+ - test/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af
222
+ - test/dummy/tmp/cache/assets/development/sprockets/32b6af14546cb11e773fb3799f041132
223
+ - test/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953
224
+ - test/dummy/tmp/cache/assets/development/sprockets/4728f8b9616c35f685674fbeecaa3c47
225
+ - test/dummy/tmp/cache/assets/development/sprockets/4e9a3e121da30d3a85273a5c283da214
226
+ - test/dummy/tmp/cache/assets/development/sprockets/5620ff4659033b350ea3031ecaeb5127
227
+ - test/dummy/tmp/cache/assets/development/sprockets/596293af7e4dcfa45880435ae753f876
228
+ - test/dummy/tmp/cache/assets/development/sprockets/614995c5e7b1b4f5b12ce060404706cc
229
+ - test/dummy/tmp/cache/assets/development/sprockets/6b9e24a8aad25948823e1a93c8be731e
230
+ - test/dummy/tmp/cache/assets/development/sprockets/78a00003621b318a297e05cfedb0d1fd
231
+ - test/dummy/tmp/cache/assets/development/sprockets/794654d117cd2ec6a9a00e485d9f4485
232
+ - test/dummy/tmp/cache/assets/development/sprockets/79ae3a9f48e9b9e8ef2922c844b1895f
233
+ - test/dummy/tmp/cache/assets/development/sprockets/9b5889bea21f2af8068646890752932c
234
+ - test/dummy/tmp/cache/assets/development/sprockets/9fd02d20091838d6411df2d23a5364d5
235
+ - test/dummy/tmp/cache/assets/development/sprockets/a02345b542298f25d3f701ee680c44c0
236
+ - test/dummy/tmp/cache/assets/development/sprockets/a80359c0e09ddf510ce63de09a368d4c
237
+ - test/dummy/tmp/cache/assets/development/sprockets/ad2a9bfe4169e0a5bc66efd35c83fe38
238
+ - test/dummy/tmp/cache/assets/development/sprockets/b1794788ec8ce362aceaffa31c7381e9
239
+ - test/dummy/tmp/cache/assets/development/sprockets/b284f477944d67f25c0672dba1a2dab4
240
+ - test/dummy/tmp/cache/assets/development/sprockets/b2b1f16cf54d69c151ca7f42fb2f8381
241
+ - test/dummy/tmp/cache/assets/development/sprockets/b4767dfdb540517d26dc8c5365736f53
242
+ - test/dummy/tmp/cache/assets/development/sprockets/bab78b46d2a6282e5df747dd8b6d5abf
243
+ - test/dummy/tmp/cache/assets/development/sprockets/c9a09977565da30179ad7fdb9f79ae0d
244
+ - test/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994
245
+ - test/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6
246
+ - test/dummy/tmp/cache/assets/development/sprockets/d9c8047218dc90a46a6725543638de45
247
+ - test/dummy/tmp/cache/assets/development/sprockets/e5b181eb056bbd6ffad37ed146b0342e
248
+ - test/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655
249
+ - test/dummy/tmp/cache/assets/test/sprockets/0a28667732e1be8938cde061b6f996df
250
+ - test/dummy/tmp/cache/assets/test/sprockets/0ddd7cc29057a69bd29fde03bf0f4c00
251
+ - test/dummy/tmp/cache/assets/test/sprockets/0de2f69502366965bb7fae2623bc190c
252
+ - test/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705
253
+ - test/dummy/tmp/cache/assets/test/sprockets/1b77abb6bee52fa8d68ee7e81077ff20
254
+ - test/dummy/tmp/cache/assets/test/sprockets/271bb8f72971af6089be8d1b85788bec
255
+ - test/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af
256
+ - test/dummy/tmp/cache/assets/test/sprockets/32b6af14546cb11e773fb3799f041132
257
+ - test/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953
258
+ - test/dummy/tmp/cache/assets/test/sprockets/4728f8b9616c35f685674fbeecaa3c47
259
+ - test/dummy/tmp/cache/assets/test/sprockets/5620ff4659033b350ea3031ecaeb5127
260
+ - test/dummy/tmp/cache/assets/test/sprockets/596293af7e4dcfa45880435ae753f876
261
+ - test/dummy/tmp/cache/assets/test/sprockets/78a00003621b318a297e05cfedb0d1fd
262
+ - test/dummy/tmp/cache/assets/test/sprockets/794654d117cd2ec6a9a00e485d9f4485
263
+ - test/dummy/tmp/cache/assets/test/sprockets/79ae3a9f48e9b9e8ef2922c844b1895f
264
+ - test/dummy/tmp/cache/assets/test/sprockets/9b5889bea21f2af8068646890752932c
265
+ - test/dummy/tmp/cache/assets/test/sprockets/9fd02d20091838d6411df2d23a5364d5
266
+ - test/dummy/tmp/cache/assets/test/sprockets/a02345b542298f25d3f701ee680c44c0
267
+ - test/dummy/tmp/cache/assets/test/sprockets/a80359c0e09ddf510ce63de09a368d4c
268
+ - test/dummy/tmp/cache/assets/test/sprockets/ad2a9bfe4169e0a5bc66efd35c83fe38
269
+ - test/dummy/tmp/cache/assets/test/sprockets/bab78b46d2a6282e5df747dd8b6d5abf
270
+ - test/dummy/tmp/cache/assets/test/sprockets/c9a09977565da30179ad7fdb9f79ae0d
271
+ - test/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994
272
+ - test/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6
273
+ - test/dummy/tmp/cache/assets/test/sprockets/d9c8047218dc90a46a6725543638de45
274
+ - test/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655
275
+ - test/features/workflow_test.rb
276
+ - test/test_helper.rb
277
+ - test/unit/discuss/conversation_test.rb
278
+ - test/unit/discuss/mailbox_test.rb
279
+ - test/unit/discuss/message_test.rb
280
+ - test/unit/discuss/recipient_test.rb
281
+ - test/unit/discuss/sender_test.rb
282
+ - test/unit/helpers/discuss/messages_helper_test.rb
283
+ homepage: http://labs.blake.com.au
284
+ licenses: []
285
+ metadata: {}
286
+ post_install_message:
287
+ rdoc_options: []
288
+ require_paths:
289
+ - lib
290
+ required_ruby_version: !ruby/object:Gem::Requirement
291
+ requirements:
292
+ - - ! '>='
293
+ - !ruby/object:Gem::Version
294
+ version: '0'
295
+ required_rubygems_version: !ruby/object:Gem::Requirement
296
+ requirements:
297
+ - - ! '>='
298
+ - !ruby/object:Gem::Version
299
+ version: '0'
300
+ requirements: []
301
+ rubyforge_project:
302
+ rubygems_version: 2.0.3
303
+ signing_key:
304
+ specification_version: 4
305
+ summary: Messaging engine
306
+ test_files:
307
+ - test/discuss_test.rb
308
+ - test/dummy/app/assets/javascripts/application.js
309
+ - test/dummy/app/assets/javascripts/chosen.jquery.js
310
+ - test/dummy/app/assets/javascripts/compose.coffee
311
+ - test/dummy/app/assets/javascripts/discuss.chosen.coffee
312
+ - test/dummy/app/assets/javascripts/discuss.coffee
313
+ - test/dummy/app/assets/javascripts/messages.coffee
314
+ - test/dummy/app/assets/stylesheets/application.css
315
+ - test/dummy/app/assets/stylesheets/chosen.css
316
+ - test/dummy/app/assets/stylesheets/discuss.css
317
+ - test/dummy/app/controllers/application_controller.rb
318
+ - test/dummy/app/helpers/application_helper.rb
319
+ - test/dummy/app/models/user.rb
320
+ - test/dummy/app/views/layouts/application.html.erb
321
+ - test/dummy/bin/bundle
322
+ - test/dummy/bin/rails
323
+ - test/dummy/bin/rake
324
+ - test/dummy/config/application.rb
325
+ - test/dummy/config/boot.rb
326
+ - test/dummy/config/database.yml
327
+ - test/dummy/config/environment.rb
328
+ - test/dummy/config/environments/development.rb
329
+ - test/dummy/config/environments/production.rb
330
+ - test/dummy/config/environments/test.rb
331
+ - test/dummy/config/initializers/backtrace_silencers.rb
332
+ - test/dummy/config/initializers/filter_parameter_logging.rb
333
+ - test/dummy/config/initializers/inflections.rb
334
+ - test/dummy/config/initializers/mime_types.rb
335
+ - test/dummy/config/initializers/secret_token.rb
336
+ - test/dummy/config/initializers/session_store.rb
337
+ - test/dummy/config/initializers/wrap_parameters.rb
338
+ - test/dummy/config/locales/en.yml
339
+ - test/dummy/config/routes.rb
340
+ - test/dummy/config.ru
341
+ - test/dummy/db/development.sqlite3
342
+ - test/dummy/db/migrate/20130428235128_create_users.rb
343
+ - test/dummy/db/schema.rb
344
+ - test/dummy/db/test.sqlite3
345
+ - test/dummy/log/development.log
346
+ - test/dummy/log/test.log
347
+ - test/dummy/public/404.html
348
+ - test/dummy/public/422.html
349
+ - test/dummy/public/500.html
350
+ - test/dummy/public/favicon.ico
351
+ - test/dummy/Rakefile
352
+ - test/dummy/README.rdoc
353
+ - test/dummy/tmp/cache/assets/development/sprockets/0a28667732e1be8938cde061b6f996df
354
+ - test/dummy/tmp/cache/assets/development/sprockets/0ddd7cc29057a69bd29fde03bf0f4c00
355
+ - test/dummy/tmp/cache/assets/development/sprockets/0de2f69502366965bb7fae2623bc190c
356
+ - test/dummy/tmp/cache/assets/development/sprockets/0ee691067e6ec8f03df58bc94badd25d
357
+ - test/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705
358
+ - test/dummy/tmp/cache/assets/development/sprockets/1b77abb6bee52fa8d68ee7e81077ff20
359
+ - test/dummy/tmp/cache/assets/development/sprockets/271bb8f72971af6089be8d1b85788bec
360
+ - test/dummy/tmp/cache/assets/development/sprockets/2a499e57eb2664f139ab0e74571faa77
361
+ - test/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af
362
+ - test/dummy/tmp/cache/assets/development/sprockets/32b6af14546cb11e773fb3799f041132
363
+ - test/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953
364
+ - test/dummy/tmp/cache/assets/development/sprockets/4728f8b9616c35f685674fbeecaa3c47
365
+ - test/dummy/tmp/cache/assets/development/sprockets/4e9a3e121da30d3a85273a5c283da214
366
+ - test/dummy/tmp/cache/assets/development/sprockets/5620ff4659033b350ea3031ecaeb5127
367
+ - test/dummy/tmp/cache/assets/development/sprockets/596293af7e4dcfa45880435ae753f876
368
+ - test/dummy/tmp/cache/assets/development/sprockets/614995c5e7b1b4f5b12ce060404706cc
369
+ - test/dummy/tmp/cache/assets/development/sprockets/6b9e24a8aad25948823e1a93c8be731e
370
+ - test/dummy/tmp/cache/assets/development/sprockets/78a00003621b318a297e05cfedb0d1fd
371
+ - test/dummy/tmp/cache/assets/development/sprockets/794654d117cd2ec6a9a00e485d9f4485
372
+ - test/dummy/tmp/cache/assets/development/sprockets/79ae3a9f48e9b9e8ef2922c844b1895f
373
+ - test/dummy/tmp/cache/assets/development/sprockets/9b5889bea21f2af8068646890752932c
374
+ - test/dummy/tmp/cache/assets/development/sprockets/9fd02d20091838d6411df2d23a5364d5
375
+ - test/dummy/tmp/cache/assets/development/sprockets/a02345b542298f25d3f701ee680c44c0
376
+ - test/dummy/tmp/cache/assets/development/sprockets/a80359c0e09ddf510ce63de09a368d4c
377
+ - test/dummy/tmp/cache/assets/development/sprockets/ad2a9bfe4169e0a5bc66efd35c83fe38
378
+ - test/dummy/tmp/cache/assets/development/sprockets/b1794788ec8ce362aceaffa31c7381e9
379
+ - test/dummy/tmp/cache/assets/development/sprockets/b284f477944d67f25c0672dba1a2dab4
380
+ - test/dummy/tmp/cache/assets/development/sprockets/b2b1f16cf54d69c151ca7f42fb2f8381
381
+ - test/dummy/tmp/cache/assets/development/sprockets/b4767dfdb540517d26dc8c5365736f53
382
+ - test/dummy/tmp/cache/assets/development/sprockets/bab78b46d2a6282e5df747dd8b6d5abf
383
+ - test/dummy/tmp/cache/assets/development/sprockets/c9a09977565da30179ad7fdb9f79ae0d
384
+ - test/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994
385
+ - test/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6
386
+ - test/dummy/tmp/cache/assets/development/sprockets/d9c8047218dc90a46a6725543638de45
387
+ - test/dummy/tmp/cache/assets/development/sprockets/e5b181eb056bbd6ffad37ed146b0342e
388
+ - test/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655
389
+ - test/dummy/tmp/cache/assets/test/sprockets/0a28667732e1be8938cde061b6f996df
390
+ - test/dummy/tmp/cache/assets/test/sprockets/0ddd7cc29057a69bd29fde03bf0f4c00
391
+ - test/dummy/tmp/cache/assets/test/sprockets/0de2f69502366965bb7fae2623bc190c
392
+ - test/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705
393
+ - test/dummy/tmp/cache/assets/test/sprockets/1b77abb6bee52fa8d68ee7e81077ff20
394
+ - test/dummy/tmp/cache/assets/test/sprockets/271bb8f72971af6089be8d1b85788bec
395
+ - test/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af
396
+ - test/dummy/tmp/cache/assets/test/sprockets/32b6af14546cb11e773fb3799f041132
397
+ - test/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953
398
+ - test/dummy/tmp/cache/assets/test/sprockets/4728f8b9616c35f685674fbeecaa3c47
399
+ - test/dummy/tmp/cache/assets/test/sprockets/5620ff4659033b350ea3031ecaeb5127
400
+ - test/dummy/tmp/cache/assets/test/sprockets/596293af7e4dcfa45880435ae753f876
401
+ - test/dummy/tmp/cache/assets/test/sprockets/78a00003621b318a297e05cfedb0d1fd
402
+ - test/dummy/tmp/cache/assets/test/sprockets/794654d117cd2ec6a9a00e485d9f4485
403
+ - test/dummy/tmp/cache/assets/test/sprockets/79ae3a9f48e9b9e8ef2922c844b1895f
404
+ - test/dummy/tmp/cache/assets/test/sprockets/9b5889bea21f2af8068646890752932c
405
+ - test/dummy/tmp/cache/assets/test/sprockets/9fd02d20091838d6411df2d23a5364d5
406
+ - test/dummy/tmp/cache/assets/test/sprockets/a02345b542298f25d3f701ee680c44c0
407
+ - test/dummy/tmp/cache/assets/test/sprockets/a80359c0e09ddf510ce63de09a368d4c
408
+ - test/dummy/tmp/cache/assets/test/sprockets/ad2a9bfe4169e0a5bc66efd35c83fe38
409
+ - test/dummy/tmp/cache/assets/test/sprockets/bab78b46d2a6282e5df747dd8b6d5abf
410
+ - test/dummy/tmp/cache/assets/test/sprockets/c9a09977565da30179ad7fdb9f79ae0d
411
+ - test/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994
412
+ - test/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6
413
+ - test/dummy/tmp/cache/assets/test/sprockets/d9c8047218dc90a46a6725543638de45
414
+ - test/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655
415
+ - test/features/workflow_test.rb
416
+ - test/test_helper.rb
417
+ - test/unit/discuss/conversation_test.rb
418
+ - test/unit/discuss/mailbox_test.rb
419
+ - test/unit/discuss/message_test.rb
420
+ - test/unit/discuss/recipient_test.rb
421
+ - test/unit/discuss/sender_test.rb
422
+ - test/unit/helpers/discuss/messages_helper_test.rb