gmail 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +27 -27
  4. data/.rspec +1 -1
  5. data/.rubocop.yml +53 -13
  6. data/.rubocop_todo.yml +299 -239
  7. data/.travis.yml +19 -19
  8. data/CHANGELOG.md +152 -145
  9. data/Gemfile +5 -3
  10. data/LICENSE +21 -21
  11. data/README.md +380 -355
  12. data/Rakefile +44 -46
  13. data/gmail.gemspec +32 -34
  14. data/lib/gmail.rb +72 -78
  15. data/lib/gmail/client.rb +35 -34
  16. data/lib/gmail/client/base.rb +244 -229
  17. data/lib/gmail/client/plain.rb +24 -24
  18. data/lib/gmail/client/xoauth.rb +67 -68
  19. data/lib/gmail/client/xoauth2.rb +39 -39
  20. data/lib/gmail/imap_extensions.rb +156 -159
  21. data/lib/gmail/labels.rb +80 -79
  22. data/lib/gmail/mailbox.rb +178 -175
  23. data/lib/gmail/message.rb +212 -207
  24. data/lib/gmail/version.rb +3 -3
  25. data/spec/account.yml.example +1 -1
  26. data/spec/account.yml.obfus +2 -2
  27. data/spec/gmail/client/base_spec.rb +5 -5
  28. data/spec/gmail/client/plain_spec.rb +169 -169
  29. data/spec/gmail/client/xoauth2_spec.rb +186 -186
  30. data/spec/gmail/client/xoauth_spec.rb +5 -5
  31. data/spec/gmail/client_spec.rb +5 -5
  32. data/spec/gmail/imap_extensions_spec.rb +47 -47
  33. data/spec/gmail/labels_spec.rb +27 -27
  34. data/spec/gmail/mailbox_spec.rb +84 -84
  35. data/spec/gmail/message_spec.rb +181 -181
  36. data/spec/gmail_spec.rb +40 -39
  37. data/spec/recordings/gmail/_new_connects_with_client_and_give_it_context_when_block_given.yml +61 -28
  38. data/spec/recordings/gmail/_new_connects_with_gmail_service_and_return_valid_connection_object.yml +43 -28
  39. data/spec/recordings/gmail/_new_does_not_raise_error_when_couldn_t_connect_with_given_account.yml +21 -13
  40. data/spec/recordings/gmail/_new_raises_error_when_couldn_t_connect_with_given_account.yml +21 -13
  41. data/spec/recordings/gmail_client_plain/instance/delivers_inline_composed_email.yml +61 -42
  42. data/spec/recordings/gmail_client_plain/instance/does_not_log_in_when_given_gmail_account_is_invalid.yml +21 -13
  43. data/spec/recordings/gmail_client_plain/instance/does_not_raise_error_even_though_gmail_account_is_invalid.yml +21 -13
  44. data/spec/recordings/gmail_client_plain/instance/labels/checks_if_there_is_given_label_defined.yml +409 -196
  45. data/spec/recordings/gmail_client_plain/instance/labels/creates_given_label.yml +280 -151
  46. data/spec/recordings/gmail_client_plain/instance/labels/removes_existing_label.yml +271 -146
  47. data/spec/recordings/gmail_client_plain/instance/labels/returns_list_of_all_available_labels.yml +227 -113
  48. data/spec/recordings/gmail_client_plain/instance/properly_logs_in_to_valid_gmail_account.yml +61 -42
  49. data/spec/recordings/gmail_client_plain/instance/properly_logs_out_from_gmail.yml +61 -42
  50. data/spec/recordings/gmail_client_plain/instance/properly_switches_to_given_mailbox.yml +164 -109
  51. data/spec/recordings/gmail_client_plain/instance/properly_switches_to_given_mailbox_using_block_style.yml +164 -109
  52. data/spec/recordings/gmail_client_plain/instance/raises_error_when_given_gmail_account_is_invalid_and_errors_enabled.yml +21 -13
  53. data/spec/recordings/gmail_client_xo_auth2/instance/does_not_log_in_when_given_gmail_account_is_invalid.yml +24 -13
  54. data/spec/recordings/gmail_client_xo_auth2/instance/labels/checks_if_there_is_given_label_defined.yml +39 -27
  55. data/spec/recordings/gmail_client_xo_auth2/instance/labels/creates_given_label.yml +52 -39
  56. data/spec/recordings/gmail_client_xo_auth2/instance/labels/removes_existing_label.yml +52 -39
  57. data/spec/recordings/gmail_client_xo_auth2/instance/labels/returns_list_of_all_available_labels.yml +39 -27
  58. data/spec/recordings/gmail_client_xo_auth2/instance/properly_logs_in_to_valid_gmail_account.yml +26 -15
  59. data/spec/recordings/gmail_client_xo_auth2/instance/properly_logs_out_from_gmail.yml +26 -15
  60. data/spec/recordings/gmail_client_xo_auth2/instance/properly_switches_to_given_mailbox.yml +63 -40
  61. data/spec/recordings/gmail_client_xo_auth2/instance/properly_switches_to_given_mailbox_using_block_style.yml +63 -40
  62. data/spec/recordings/gmail_client_xo_auth2/instance/raises_error_when_given_gmail_account_is_invalid_and_errors_enabled.yml +24 -13
  63. data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/all/localizes_into_the_appropriate_label.yml +229 -116
  64. data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/and_the_mailbox_does_not_exist/returns_the_mailbox_name_as_a_string.yml +229 -110
  65. data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/drafts/localizes_into_the_appropriate_label.yml +229 -116
  66. data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/flagged/localizes_into_the_appropriate_label.yml +229 -116
  67. data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/important/localizes_into_the_appropriate_label.yml +229 -116
  68. data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/inbox/localizes_into_the_appropriate_label.yml +61 -42
  69. data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/junk/localizes_into_the_appropriate_label.yml +229 -116
  70. data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/sent/localizes_into_the_appropriate_label.yml +229 -116
  71. data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/trash/localizes_into_the_appropriate_label.yml +229 -116
  72. data/spec/recordings/gmail_mailbox/instance/counts_all_emails.yml +595 -277
  73. data/spec/recordings/gmail_mailbox/instance/finds_messages.yml +1049 -586
  74. data/spec/recordings/gmail_mailbox/instance/waits_once.yml +191 -136
  75. data/spec/recordings/gmail_mailbox/instance/waits_repeatedly.yml +217 -141
  76. data/spec/recordings/gmail_mailbox/instance/waits_with_29-minute_re-issue.yml +188 -136
  77. data/spec/recordings/gmail_mailbox/instance/waits_with_an_unblocked_connection.yml +644 -207
  78. data/spec/recordings/gmail_mailbox/on_initialize/sets_client_and_name.yml +61 -42
  79. data/spec/recordings/gmail_mailbox/on_initialize/works_in_inbox_by_default.yml +61 -42
  80. data/spec/recordings/gmail_message/initialize/sets_prefetch_attrs.yml +1068 -578
  81. data/spec/recordings/gmail_message/initialize/sets_uid_and_mailbox.yml +1068 -580
  82. data/spec/recordings/gmail_message/instance_methods/deletes_itself.yml +1084 -637
  83. data/spec/recordings/gmail_message/instance_methods/marks_itself_read.yml +1137 -682
  84. data/spec/recordings/gmail_message/instance_methods/marks_itself_unread.yml +1153 -686
  85. data/spec/recordings/gmail_message/instance_methods/moves_from_one_tag_to_other.yml +1447 -862
  86. data/spec/recordings/gmail_message/instance_methods/removes_a_given_label.yml +1288 -776
  87. data/spec/recordings/gmail_message/instance_methods/removes_a_given_label_with_old_method.yml +1288 -776
  88. data/spec/recordings/gmail_message/instance_methods/sets_given_label.yml +1165 -690
  89. data/spec/recordings/gmail_message/instance_methods/sets_given_label_with_old_method.yml +1157 -691
  90. data/spec/spec_helper.rb +56 -53
  91. data/spec/support/imap_mock.rb +181 -181
  92. data/spec/support/obfuscation.rb +49 -52
  93. metadata +21 -90
  94. data/spec/recordings/gmail_client_plain/instance/_connection_automatically_logs_in_to_gmail_account_when_it_s_called.yml +0 -42
@@ -1,27 +1,27 @@
1
- require 'spec_helper'
2
-
3
- describe Gmail::Labels do
4
- context '#localize' do
5
- context 'when given the XLIST flag ' do
6
- [:Inbox, :All, :Drafts, :Sent, :Trash, :Important, :Junk, :Flagged].each do |flag|
7
- context flag do
8
- it 'localizes into the appropriate label' do
9
- localized = ""
10
- mock_client { |client| localized = client.labels.localize(flag) }
11
- expect(localized).to be_a_kind_of(String)
12
- expect(localized).to match(/\[Gmail|Google Mail\]|Inbox/i)
13
- end
14
- end
15
- end
16
-
17
- context 'and the mailbox does not exist' do
18
- it 'returns the mailbox name as a string' do
19
- localized = ""
20
- mock_client { |client| localized = client.labels.localize(:All) }
21
- expect(localized).to be_a_kind_of(String)
22
- expect(localized).to eq 'All'
23
- end
24
- end
25
- end
26
- end
27
- end
1
+ require 'spec_helper'
2
+
3
+ describe Gmail::Labels do
4
+ context '#localize' do
5
+ context 'when given the XLIST flag ' do
6
+ [:Inbox, :All, :Drafts, :Sent, :Trash, :Important, :Junk, :Flagged].each do |flag|
7
+ context flag do
8
+ it 'localizes into the appropriate label' do
9
+ localized = ""
10
+ mock_client { |client| localized = client.labels.localize(flag) }
11
+ expect(localized).to be_a_kind_of(String)
12
+ expect(localized).to match(/\[Gmail|Google Mail\]|Inbox/i)
13
+ end
14
+ end
15
+ end
16
+
17
+ context 'and the mailbox does not exist' do
18
+ it 'returns the mailbox name as a string' do
19
+ localized = ""
20
+ mock_client { |client| localized = client.labels.localize(:All) }
21
+ expect(localized).to be_a_kind_of(String)
22
+ expect(localized).to eq '[Gmail]/All Mail'
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,84 +1,84 @@
1
- require 'spec_helper'
2
-
3
- describe Gmail::Mailbox do
4
- subject { Gmail::Mailbox }
5
-
6
- context "on initialize" do
7
- it "sets client and name" do
8
- within_gmail do |gmail|
9
- mailbox = subject.new(gmail, "TEST")
10
- expect(mailbox.instance_variable_get("@gmail")).to eq(gmail)
11
- expect(mailbox.name).to eq("TEST")
12
- end
13
- end
14
-
15
- it "works in INBOX by default" do
16
- within_gmail do |gmail|
17
- mailbox = subject.new(@gmail)
18
- expect(mailbox.name).to eq("INBOX")
19
- end
20
- end
21
- end
22
-
23
- context "instance" do
24
- it "counts all emails" do
25
- mock_mailbox do |mailbox|
26
- expect(mailbox.count).to be > 0
27
- end
28
- end
29
-
30
- it "finds messages" do
31
- mock_mailbox do |mailbox|
32
- message = mailbox.emails.first
33
- mailbox.emails(:all, :from => message.from.first.name) == message.from.first.name
34
- end
35
- end
36
-
37
- it "waits once" do
38
- mock_mailbox do |mailbox|
39
- response = nil
40
- mailbox.wait_once { |r| response = r }
41
- expect(response).to be_kind_of(Net::IMAP::UntaggedResponse)
42
- expect(response.name).to eq("EXISTS")
43
- end
44
- end
45
-
46
- it "waits with an unblocked connection" do
47
- mock_mailbox do |mailbox|
48
- mailbox.wait_once do |r|
49
- expect(mailbox.count).to be > 0
50
- end
51
- end
52
- end
53
-
54
- it "waits repeatedly" do
55
- responses = []
56
- mock_mailbox do |mailbox|
57
- mailbox.wait do |r|
58
- responses << r
59
- break if responses.size == 2
60
- end
61
- end
62
-
63
- expect(responses.size).to eq(2)
64
- end
65
-
66
- it "waits with 29-minute re-issue" do
67
- client = mock_client
68
- expect(client.conn).to receive(:idle).and_call_original.at_least(:twice)
69
-
70
- mailbox = client.inbox
71
- mailbox.wait_once(idle_timeout: 0.001)
72
- end
73
-
74
- it "performs full text search of message bodies" do
75
- skip "This can wait..."
76
- # mock_mailbox do |mailbox|
77
- # message = mailbox.emails.first
78
- # body = message.parts.blank? ? message.body.decoded : message.parts[0].body.decoded
79
- # emails = mailbox.emails(:search => body.split(' ').first)
80
- # emails.size.should > 0
81
- # end
82
- end
83
- end
84
- end
1
+ require 'spec_helper'
2
+
3
+ describe Gmail::Mailbox do
4
+ subject { Gmail::Mailbox }
5
+
6
+ context "on initialize" do
7
+ it "sets client and name" do
8
+ within_gmail do |gmail|
9
+ mailbox = subject.new(gmail, "TEST")
10
+ expect(mailbox.instance_variable_get("@gmail")).to eq(gmail)
11
+ expect(mailbox.name).to eq("TEST")
12
+ end
13
+ end
14
+
15
+ it "works in INBOX by default" do
16
+ within_gmail do |gmail|
17
+ mailbox = subject.new(@gmail)
18
+ expect(mailbox.name).to eq("INBOX")
19
+ end
20
+ end
21
+ end
22
+
23
+ context "instance" do
24
+ it "counts all emails" do
25
+ mock_mailbox do |mailbox|
26
+ expect(mailbox.count).to be > 0
27
+ end
28
+ end
29
+
30
+ it "finds messages" do
31
+ mock_mailbox do |mailbox|
32
+ message = mailbox.emails.first
33
+ mailbox.emails(:all, :from => message.from.first.name) == message.from.first.name
34
+ end
35
+ end
36
+
37
+ it "waits once" do
38
+ mock_mailbox do |mailbox|
39
+ response = nil
40
+ mailbox.wait_once { |r| response = r }
41
+ expect(response).to be_kind_of(Net::IMAP::UntaggedResponse)
42
+ expect(response.name).to eq("EXISTS")
43
+ end
44
+ end
45
+
46
+ it "waits with an unblocked connection" do
47
+ mock_mailbox do |mailbox|
48
+ mailbox.wait_once do |r|
49
+ expect(mailbox.count).to be > 0
50
+ end
51
+ end
52
+ end
53
+
54
+ it "waits repeatedly" do
55
+ responses = []
56
+ mock_mailbox do |mailbox|
57
+ mailbox.wait do |r|
58
+ responses << r
59
+ break if responses.size == 2
60
+ end
61
+ end
62
+
63
+ expect(responses.size).to eq(2)
64
+ end
65
+
66
+ it "waits with 29-minute re-issue" do
67
+ client = mock_client
68
+ expect(client.conn).to receive(:idle).and_call_original.at_least(:twice)
69
+
70
+ mailbox = client.inbox
71
+ mailbox.wait_once(:idle_timeout => 0.001)
72
+ end
73
+
74
+ it "performs full text search of message bodies" do
75
+ skip "This can wait..."
76
+ # mock_mailbox do |mailbox|
77
+ # message = mailbox.emails.first
78
+ # body = message.parts.blank? ? message.body.decoded : message.parts[0].body.decoded
79
+ # emails = mailbox.emails(:search => body.split(' ').first)
80
+ # emails.size.should > 0
81
+ # end
82
+ end
83
+ end
84
+ end
@@ -1,181 +1,181 @@
1
- require 'spec_helper'
2
-
3
- describe Gmail::Message do
4
- describe "initialize" do
5
- let(:client) { mock_client }
6
- let(:mailbox) { client.mailbox(:all) }
7
-
8
- subject do
9
- mailbox.emails.first
10
- end
11
-
12
- it "sets uid and mailbox" do
13
- expect(subject.instance_variable_get(:@mailbox)).to be_a Gmail::Mailbox
14
- expect(subject.instance_variable_get(:@gmail)).to be_a Gmail::Client::Base
15
- expect(subject.instance_variable_get(:@uid)).to be_a Integer
16
- subject.labels
17
- end
18
-
19
- it "sets PREFETCH_ATTRS" do
20
- expect(subject.uid).to be_a Integer
21
- expect(subject.msg_id).to be_a Integer
22
- expect(subject.thr_id).to be_a Integer
23
- expect(subject.envelope).to be_a Net::IMAP::Envelope
24
- expect(subject.message).to be_a Mail::Message
25
- expect(subject.flags).to be_a Array
26
- expect(subject.labels).to be_a Array
27
- end
28
- end
29
-
30
- describe "mocks" do
31
- subject { Gmail::Message.new(double(:mailbox, :name => 'INBOX'), nil) }
32
- before { allow_any_instance_of(Gmail::Message).to receive(:fetch).and_return('foo') }
33
-
34
- describe "#mark" do
35
- it "marks itself as read" do
36
- expect(subject).to receive(:read!).with(no_args).once
37
- subject.mark(:read)
38
- end
39
-
40
- it "marks itself as unread" do
41
- expect(subject).to receive(:unread!).with(no_args).once
42
- subject.mark(:unread)
43
- end
44
-
45
- it "marks itself as deleted" do
46
- expect(subject).to receive(:delete!).with(no_args).once
47
- subject.mark(:deleted)
48
- end
49
-
50
- it "marks itself as spam" do
51
- expect(subject).to receive(:spam!).with(no_args).once
52
- subject.mark(:spam)
53
- end
54
-
55
- it "marks itself with a flag" do
56
- expect(subject).to receive(:flag).with(:my_flag).once
57
- subject.mark(:my_flag)
58
- end
59
- end
60
-
61
- describe "#read!" do
62
- it "flags itself as :Seen" do
63
- expect(subject).to receive(:flag).with(:Seen).once
64
- subject.read!
65
- end
66
- end
67
-
68
- describe "#unread!" do
69
- it "unflags :Seen from itself" do
70
- expect(subject).to receive(:unflag).with(:Seen).once
71
- subject.unread!
72
- end
73
- end
74
-
75
- describe "#star!" do
76
- it "flags itself as '[Gmail]/Starred'" do
77
- expect(subject).to receive(:flag).with(:Flagged).once
78
- subject.star!
79
- end
80
- end
81
-
82
- describe "#unstar!" do
83
- it "unflags '[Gmail]/Starred' from itself" do
84
- expect(subject).to receive(:unflag).with(:Flagged).once
85
- subject.unstar!
86
- end
87
- end
88
-
89
- describe "#spam!" do
90
- it "moves itself to the spam folder" do
91
- expect(subject).to receive(:add_label).with("\\Spam").once
92
- subject.spam!
93
- end
94
- end
95
-
96
- describe "#archive!" do
97
- it "removes itself from the inbox" do
98
- expect(subject).to receive(:remove_label).with("\\Inbox").once
99
- subject.archive!
100
- end
101
- end
102
- end
103
-
104
- describe "instance methods" do
105
- let(:client) { mock_client }
106
- let(:message) { client.mailbox(:all).emails(:unread, :from => TEST_ACCOUNT[0].to_s, :subject => "Hello world!").last }
107
-
108
- after { client.logout if client.logged_in? }
109
-
110
- it "sets given label" do
111
- message.add_label 'Awesome'
112
- message.add_label 'Great'
113
-
114
- expect(message.labels).to include("Awesome")
115
- expect(message.labels).to include("Great")
116
- expect(message.labels).to include("\\Inbox")
117
- end
118
-
119
- it "removes a given label" do
120
- message.add_label 'Awesome'
121
- message.add_label 'Great'
122
-
123
- message.remove_label 'Awesome'
124
- expect(message.labels).not_to include("Awesome")
125
- expect(message.labels).to include("Great")
126
- expect(message.labels).to include("\\Inbox")
127
- expect(message.flags).not_to include(:Seen)
128
- end
129
-
130
- it "sets given label with old method" do
131
- message.label! 'Awesome'
132
- message.label! 'Great'
133
- expect(message.labels).to include("Great")
134
- expect(message.labels).to include("Awesome")
135
- expect(message.labels).to include("\\Inbox")
136
- end
137
-
138
- it "removes a given label with old method" do
139
- message.add_label 'Awesome'
140
- message.add_label 'Great'
141
-
142
- message.remove_label! 'Awesome'
143
- expect(message.labels).not_to include("Awesome")
144
- expect(message.labels).to include("Great")
145
- expect(message.labels).to include("\\Inbox")
146
- expect(message.flags).not_to include(:Seen)
147
- end
148
-
149
- it "moves from one tag to other" do
150
- message.add_label 'Awesome'
151
- message.remove_label 'Great'
152
-
153
- message.move_to('Great', 'Awesome')
154
- expect(message.labels).to include("Great")
155
- expect(message.labels).not_to include("Awesome")
156
- expect(message.labels).to include("\\Inbox")
157
- end
158
-
159
- it "marks itself read" do
160
- message.mark(:unread)
161
-
162
- message.mark(:read)
163
- expect(message.flags).to include(:Seen)
164
- end
165
-
166
- it "marks itself unread" do
167
- message.mark(:read)
168
-
169
- message.mark(:unread)
170
- expect(message.flags).not_to include(:Seen)
171
- end
172
-
173
- it "deletes itself" do
174
- trash_count = client.mailbox(:trash).emails.count
175
-
176
- message.delete!
177
-
178
- expect(client.mailbox(:trash).emails.count).to eq(trash_count + 1)
179
- end
180
- end
181
- end
1
+ require 'spec_helper'
2
+
3
+ describe Gmail::Message do
4
+ describe "initialize" do
5
+ let(:client) { mock_client }
6
+ let(:mailbox) { client.mailbox(:all) }
7
+
8
+ subject do
9
+ mailbox.emails.first
10
+ end
11
+
12
+ it "sets uid and mailbox" do
13
+ expect(subject.instance_variable_get(:@mailbox)).to be_a Gmail::Mailbox
14
+ expect(subject.instance_variable_get(:@gmail)).to be_a Gmail::Client::Base
15
+ expect(subject.instance_variable_get(:@uid)).to be_a Integer
16
+ subject.labels
17
+ end
18
+
19
+ it "sets PREFETCH_ATTRS" do
20
+ expect(subject.uid).to be_a Integer
21
+ expect(subject.msg_id).to be_a Integer
22
+ expect(subject.thr_id).to be_a Integer
23
+ expect(subject.envelope).to be_a Net::IMAP::Envelope
24
+ expect(subject.message).to be_a Mail::Message
25
+ expect(subject.flags).to be_a Array
26
+ expect(subject.labels).to be_a Array
27
+ end
28
+ end
29
+
30
+ describe "mocks" do
31
+ subject { Gmail::Message.new(double(:mailbox, :name => 'INBOX'), nil) }
32
+ before { allow_any_instance_of(Gmail::Message).to receive(:fetch).and_return('foo') }
33
+
34
+ describe "#mark" do
35
+ it "marks itself as read" do
36
+ expect(subject).to receive(:read!).with(no_args).once
37
+ subject.mark(:read)
38
+ end
39
+
40
+ it "marks itself as unread" do
41
+ expect(subject).to receive(:unread!).with(no_args).once
42
+ subject.mark(:unread)
43
+ end
44
+
45
+ it "marks itself as deleted" do
46
+ expect(subject).to receive(:delete!).with(no_args).once
47
+ subject.mark(:deleted)
48
+ end
49
+
50
+ it "marks itself as spam" do
51
+ expect(subject).to receive(:spam!).with(no_args).once
52
+ subject.mark(:spam)
53
+ end
54
+
55
+ it "marks itself with a flag" do
56
+ expect(subject).to receive(:flag).with(:my_flag).once
57
+ subject.mark(:my_flag)
58
+ end
59
+ end
60
+
61
+ describe "#read!" do
62
+ it "flags itself as :Seen" do
63
+ expect(subject).to receive(:flag).with(:Seen).once
64
+ subject.read!
65
+ end
66
+ end
67
+
68
+ describe "#unread!" do
69
+ it "unflags :Seen from itself" do
70
+ expect(subject).to receive(:unflag).with(:Seen).once
71
+ subject.unread!
72
+ end
73
+ end
74
+
75
+ describe "#star!" do
76
+ it "flags itself as '[Gmail]/Starred'" do
77
+ expect(subject).to receive(:flag).with(:Flagged).once
78
+ subject.star!
79
+ end
80
+ end
81
+
82
+ describe "#unstar!" do
83
+ it "unflags '[Gmail]/Starred' from itself" do
84
+ expect(subject).to receive(:unflag).with(:Flagged).once
85
+ subject.unstar!
86
+ end
87
+ end
88
+
89
+ describe "#spam!" do
90
+ it "moves itself to the spam folder" do
91
+ expect(subject).to receive(:add_label).with("\\Spam").once
92
+ subject.spam!
93
+ end
94
+ end
95
+
96
+ describe "#archive!" do
97
+ it "removes itself from the inbox" do
98
+ expect(subject).to receive(:remove_label).with("\\Inbox").once
99
+ subject.archive!
100
+ end
101
+ end
102
+ end
103
+
104
+ describe "instance methods" do
105
+ let(:client) { mock_client }
106
+ let(:message) { client.mailbox(:all).emails(:unread, :from => TEST_ACCOUNT[0].to_s, :subject => "Hello world!").last }
107
+
108
+ after { client.logout if client.logged_in? }
109
+
110
+ it "sets given label" do
111
+ message.add_label 'Awesome'
112
+ message.add_label 'Great'
113
+
114
+ expect(message.labels).to include("Awesome")
115
+ expect(message.labels).to include("Great")
116
+ expect(message.labels).to include(:Inbox)
117
+ end
118
+
119
+ it "removes a given label" do
120
+ message.add_label 'Awesome'
121
+ message.add_label 'Great'
122
+
123
+ message.remove_label 'Awesome'
124
+ expect(message.labels).not_to include("Awesome")
125
+ expect(message.labels).to include("Great")
126
+ expect(message.labels).to include(:Inbox)
127
+ expect(message.flags).not_to include(:Seen)
128
+ end
129
+
130
+ it "sets given label with old method" do
131
+ message.label! 'Awesome'
132
+ message.label! 'Great'
133
+ expect(message.labels).to include("Great")
134
+ expect(message.labels).to include("Awesome")
135
+ expect(message.labels).to include(:Inbox)
136
+ end
137
+
138
+ it "removes a given label with old method" do
139
+ message.add_label 'Awesome'
140
+ message.add_label 'Great'
141
+
142
+ message.remove_label! 'Awesome'
143
+ expect(message.labels).not_to include("Awesome")
144
+ expect(message.labels).to include("Great")
145
+ expect(message.labels).to include(:Inbox)
146
+ expect(message.flags).not_to include(:Seen)
147
+ end
148
+
149
+ it "moves from one tag to other" do
150
+ message.add_label 'Awesome'
151
+ message.remove_label 'Great'
152
+
153
+ message.move_to('Great', 'Awesome')
154
+ expect(message.labels).to include("Great")
155
+ expect(message.labels).not_to include("Awesome")
156
+ expect(message.labels).to include(:Inbox)
157
+ end
158
+
159
+ it "marks itself read" do
160
+ message.mark(:unread)
161
+
162
+ message.mark(:read)
163
+ expect(message.flags).to include(:Seen)
164
+ end
165
+
166
+ it "marks itself unread" do
167
+ message.mark(:read)
168
+
169
+ message.mark(:unread)
170
+ expect(message.flags).not_to include(:Seen)
171
+ end
172
+
173
+ it "deletes itself" do
174
+ trash_count = client.mailbox(:trash).emails.count
175
+
176
+ message.delete!
177
+
178
+ expect(client.mailbox(:trash).emails.count).to eq(trash_count + 1)
179
+ end
180
+ end
181
+ end