gmailish 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +20 -0
- data/.simplecov +19 -0
- data/.travis.yml +8 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +89 -0
- data/Rakefile +1 -0
- data/gmailish.gemspec +29 -0
- data/lib/gmailish.rb +7 -0
- data/lib/gmailish/account.rb +41 -0
- data/lib/gmailish/actions.rb +53 -0
- data/lib/gmailish/all.rb +7 -0
- data/lib/gmailish/error.rb +6 -0
- data/lib/gmailish/flagger.rb +27 -0
- data/lib/gmailish/labeler.rb +29 -0
- data/lib/gmailish/message.rb +42 -0
- data/lib/gmailish/mover.rb +25 -0
- data/lib/gmailish/version.rb +3 -0
- data/spec/gmailish_spec.rb +135 -0
- data/spec/lib/gmailish/account_spec.rb +89 -0
- data/spec/lib/gmailish/actions_spec.rb +116 -0
- data/spec/lib/gmailish/error_spec.rb +19 -0
- data/spec/lib/gmailish/flagger_spec.rb +45 -0
- data/spec/lib/gmailish/labeler_spec.rb +75 -0
- data/spec/lib/gmailish/message_spec.rb +146 -0
- data/spec/lib/gmailish/mover_spec.rb +49 -0
- data/spec/spec_helper.rb +25 -0
- data/spec/support/data.rb +7 -0
- metadata +183 -0
@@ -0,0 +1,135 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require_relative 'support/data'
|
3
|
+
|
4
|
+
module Gmailish
|
5
|
+
describe Gmailish do
|
6
|
+
let(:instance) { Gmailish::Account.new(username, password) }
|
7
|
+
let(:username) { 'venkmanapp' }
|
8
|
+
let(:password) { 'ABC123456' }
|
9
|
+
|
10
|
+
let(:account) {
|
11
|
+
fire_double(
|
12
|
+
'Net::IMAP'
|
13
|
+
)
|
14
|
+
}
|
15
|
+
|
16
|
+
let(:tagged_response) {
|
17
|
+
fire_double(
|
18
|
+
'Net::IMAP::TaggedResponse',
|
19
|
+
:name => 'OK'
|
20
|
+
)
|
21
|
+
}
|
22
|
+
|
23
|
+
let(:fetch_data) {
|
24
|
+
fire_double(
|
25
|
+
'Net::IMAP::FetchData',
|
26
|
+
:attr => Gmailish::SupportData.fake_fetch_data_response
|
27
|
+
)
|
28
|
+
}
|
29
|
+
|
30
|
+
context 'invalid' do
|
31
|
+
subject { instance.process }
|
32
|
+
|
33
|
+
it 'raises error' do
|
34
|
+
expect { subject }.to raise_error(Net::IMAP::NoResponseError)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'valid' do
|
39
|
+
subject { instance.process }
|
40
|
+
|
41
|
+
let(:address) { 'imap.gmail.com' }
|
42
|
+
let(:port) { 993 }
|
43
|
+
|
44
|
+
let(:mailbox) { 'inbox' }
|
45
|
+
let(:read_label) { :Seen }
|
46
|
+
let(:unread_label) { 'UNSEEN' }
|
47
|
+
let(:delete_label) { :Deleted }
|
48
|
+
let(:transfered_label) { 'Transfered' }
|
49
|
+
let(:archive_label) { "[Gmail]/All Mail" }
|
50
|
+
let(:uid) { 110 }
|
51
|
+
let(:rfc) { 'RFC822' }
|
52
|
+
|
53
|
+
let(:mail_subject) {
|
54
|
+
"Fwd: Raising and Rescuing Custom Errors in Rails | We Are Stac"
|
55
|
+
}
|
56
|
+
|
57
|
+
let(:mail_to) {
|
58
|
+
["venkmanapp+40f7f061c2f7254b1b50f699d9eac16a@gmail.com"]
|
59
|
+
}
|
60
|
+
|
61
|
+
let(:mail_from) {
|
62
|
+
["chuckjhardy@gmail.com"]
|
63
|
+
}
|
64
|
+
|
65
|
+
it 'returns messages' do
|
66
|
+
# Create connection
|
67
|
+
Net::IMAP.should_receive(:new).
|
68
|
+
with(address, port, true, nil, false).
|
69
|
+
and_return(account)
|
70
|
+
|
71
|
+
# Login to account
|
72
|
+
account.should_receive(:login).
|
73
|
+
with(username, password).
|
74
|
+
and_return(tagged_response)
|
75
|
+
|
76
|
+
# Select Inbox
|
77
|
+
account.should_receive(:select).
|
78
|
+
with(mailbox).
|
79
|
+
and_return(tagged_response)
|
80
|
+
|
81
|
+
# Find unread messages
|
82
|
+
account.should_receive(:uid_search).
|
83
|
+
with([unread_label]).
|
84
|
+
and_return([uid])
|
85
|
+
|
86
|
+
# Get unread messages
|
87
|
+
account.should_receive(:uid_fetch).
|
88
|
+
with(uid, rfc).
|
89
|
+
and_return(fetch_data)
|
90
|
+
|
91
|
+
# Add 'Transfered' label to messages
|
92
|
+
account.should_receive(:uid_copy).
|
93
|
+
with(uid, transfered_label).
|
94
|
+
and_return(tagged_response)
|
95
|
+
|
96
|
+
# Make messages as read
|
97
|
+
account.should_receive(:uid_store).
|
98
|
+
with(uid, "+FLAGS", [read_label]).
|
99
|
+
and_return(tagged_response)
|
100
|
+
|
101
|
+
# Archive messages
|
102
|
+
account.should_receive(:uid_copy).
|
103
|
+
with(uid, archive_label).
|
104
|
+
and_return(tagged_response)
|
105
|
+
|
106
|
+
# Delete messages from inbox
|
107
|
+
account.should_receive(:uid_store).
|
108
|
+
with(uid, "+FLAGS", [delete_label]).
|
109
|
+
and_return(tagged_response)
|
110
|
+
|
111
|
+
# Logout of account
|
112
|
+
account.should_receive(:logout).
|
113
|
+
and_return(tagged_response)
|
114
|
+
|
115
|
+
# Always returns an array
|
116
|
+
expect(subject.messages).to be_an_instance_of(Array)
|
117
|
+
|
118
|
+
# Array contains Mail objects
|
119
|
+
expect(subject.messages.first).to be_an_instance_of(Mail::Message)
|
120
|
+
|
121
|
+
# Message has a subject
|
122
|
+
expect(subject.messages.first.subject).to eq(mail_subject)
|
123
|
+
|
124
|
+
# Message has a to field
|
125
|
+
expect(subject.messages.first.to).to eq(mail_to)
|
126
|
+
|
127
|
+
# Message has a from field
|
128
|
+
expect(subject.messages.first.from).to eq(mail_from)
|
129
|
+
|
130
|
+
# Message has a body field
|
131
|
+
expect(subject.messages.first.body).to be_an_instance_of(Mail::Body)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Gmailish
|
4
|
+
describe Account do
|
5
|
+
let(:instance) { Gmailish::Account.new(username, password) }
|
6
|
+
let(:username) { 'venkmanapp' }
|
7
|
+
let(:password) { 'ABC123456' }
|
8
|
+
|
9
|
+
let(:account) {
|
10
|
+
fire_double(
|
11
|
+
'Net::IMAP'
|
12
|
+
)
|
13
|
+
}
|
14
|
+
|
15
|
+
describe '#initialize' do
|
16
|
+
it 'take arguments' do
|
17
|
+
instance
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '.process' do
|
22
|
+
subject { described_class.process(username, password) }
|
23
|
+
|
24
|
+
it 'calls off to process' do
|
25
|
+
described_class.any_instance.should_receive(:process)
|
26
|
+
|
27
|
+
subject
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#process' do
|
32
|
+
subject { instance.process }
|
33
|
+
|
34
|
+
let(:actions) {
|
35
|
+
fire_double(
|
36
|
+
'Gmailish::Actions'
|
37
|
+
)
|
38
|
+
}
|
39
|
+
|
40
|
+
let(:messages) { lambda{} }
|
41
|
+
|
42
|
+
let(:address) { 'imap.gmail.com' }
|
43
|
+
let(:port) { 993 }
|
44
|
+
|
45
|
+
before { instance.stub(:messages => messages) }
|
46
|
+
|
47
|
+
it 'calls off to actions and return self' do
|
48
|
+
Net::IMAP.should_receive(:new).
|
49
|
+
with(address, port, true, nil, false).
|
50
|
+
and_return(account)
|
51
|
+
|
52
|
+
Actions.should_receive(:new).
|
53
|
+
with(account, username, password).
|
54
|
+
and_return(actions)
|
55
|
+
|
56
|
+
actions.should_receive(:process)
|
57
|
+
|
58
|
+
expect(subject).to be_an_instance_of(Gmailish::Account)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe '#messages' do
|
63
|
+
subject { instance.messages }
|
64
|
+
|
65
|
+
let(:label) { 'UNSEEN' }
|
66
|
+
let(:uid) { 37 }
|
67
|
+
let(:uids) { [ uid ] }
|
68
|
+
let(:message) {
|
69
|
+
fire_double(
|
70
|
+
'Gmailish::Message'
|
71
|
+
)
|
72
|
+
}
|
73
|
+
|
74
|
+
before { instance.stub(:account => account) }
|
75
|
+
|
76
|
+
it 'returns array of message objects' do
|
77
|
+
account.should_receive(:uid_search).
|
78
|
+
with([label]).
|
79
|
+
and_return(uids)
|
80
|
+
|
81
|
+
Message.should_receive(:process).
|
82
|
+
with(account, uid).
|
83
|
+
and_return(message)
|
84
|
+
|
85
|
+
expect(subject).to eq([message])
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Gmailish
|
4
|
+
describe Actions do
|
5
|
+
let(:instance) { Gmailish::Actions.new(account, username, password) }
|
6
|
+
let(:username) { 'venkmanapp' }
|
7
|
+
let(:password) { 'ABC123456' }
|
8
|
+
let(:account) {
|
9
|
+
fire_double(
|
10
|
+
'Net::IMAP'
|
11
|
+
)
|
12
|
+
}
|
13
|
+
|
14
|
+
let(:message) {
|
15
|
+
fire_double(
|
16
|
+
'Gmailish::Message'
|
17
|
+
)
|
18
|
+
}
|
19
|
+
|
20
|
+
let(:response) {
|
21
|
+
fire_double(
|
22
|
+
'Net::IMAP::TaggedResponse',
|
23
|
+
:name => 'OK'
|
24
|
+
)
|
25
|
+
}
|
26
|
+
|
27
|
+
describe '#initialize' do
|
28
|
+
it 'take arguments' do
|
29
|
+
instance
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#process' do
|
34
|
+
context 'called with message' do
|
35
|
+
subject { instance.process { message } }
|
36
|
+
|
37
|
+
it 'calls actions in order' do
|
38
|
+
instance.should_receive(:login)
|
39
|
+
instance.should_receive(:inbox)
|
40
|
+
instance.should_receive(:logout)
|
41
|
+
|
42
|
+
subject
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'login' do
|
46
|
+
before do
|
47
|
+
instance.stub(:inbox)
|
48
|
+
instance.stub(:logout)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'sets logged_in to true' do
|
52
|
+
account.should_receive(:login).
|
53
|
+
with(username, password).
|
54
|
+
and_return(response)
|
55
|
+
|
56
|
+
subject
|
57
|
+
|
58
|
+
expect(instance.logged_in).to be_true
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context 'inbox' do
|
63
|
+
before do
|
64
|
+
instance.stub(:login)
|
65
|
+
instance.stub(:logout)
|
66
|
+
end
|
67
|
+
|
68
|
+
let(:inbox) { 'inbox' }
|
69
|
+
|
70
|
+
it 'selects inbox' do
|
71
|
+
account.should_receive(:select).
|
72
|
+
with(inbox)
|
73
|
+
|
74
|
+
subject
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'logout' do
|
79
|
+
let(:response) { nil }
|
80
|
+
|
81
|
+
before do
|
82
|
+
instance.stub(:login)
|
83
|
+
instance.stub(:inbox)
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'sets logged_in to false' do
|
87
|
+
account.should_receive(:logout).
|
88
|
+
and_return(response)
|
89
|
+
|
90
|
+
subject
|
91
|
+
|
92
|
+
expect(instance.logged_in).to be_false
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
context 'called without message' do
|
98
|
+
subject { instance.process }
|
99
|
+
|
100
|
+
let(:msg) { "Messages must be passed within a block." }
|
101
|
+
|
102
|
+
it 'raises error' do
|
103
|
+
expect { subject }.to raise_error(Error::NoMessageError, msg)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
describe '#logged_in?' do
|
109
|
+
subject { instance.logged_in? }
|
110
|
+
|
111
|
+
it 'returns false' do
|
112
|
+
expect(subject).to be_false
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Gmailish
|
4
|
+
describe Error do
|
5
|
+
let(:dummy_class) { Class.new { include Gmailish::Error }.new }
|
6
|
+
|
7
|
+
describe Error::NoMessageError do
|
8
|
+
it 'raises error' do
|
9
|
+
expect { raise Error::NoMessageError }.to raise_error
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe Error::NoLabelError do
|
14
|
+
it 'raises error' do
|
15
|
+
expect { raise Error::NoLabelError }.to raise_error
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Gmailish
|
4
|
+
describe Flagger do
|
5
|
+
let(:instance) { Gmailish::Flagger.new(account, uid) }
|
6
|
+
let(:uid) { 37 }
|
7
|
+
let(:account) {
|
8
|
+
fire_double(
|
9
|
+
'Net::IMAP'
|
10
|
+
)
|
11
|
+
}
|
12
|
+
|
13
|
+
describe '#initialize' do
|
14
|
+
it 'take arguments' do
|
15
|
+
instance
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '#delete' do
|
20
|
+
subject { instance.delete }
|
21
|
+
|
22
|
+
let(:label) { :Deleted }
|
23
|
+
|
24
|
+
it 'calls uid_store with expected arguments' do
|
25
|
+
account.should_receive(:uid_store).
|
26
|
+
with(uid, "+FLAGS", [label])
|
27
|
+
|
28
|
+
subject
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#unread' do
|
33
|
+
subject { instance.unread }
|
34
|
+
|
35
|
+
let(:label) { :Seen }
|
36
|
+
|
37
|
+
it 'calls uid_store with expected arguments' do
|
38
|
+
account.should_receive(:uid_store).
|
39
|
+
with(uid, "+FLAGS", [label])
|
40
|
+
|
41
|
+
subject
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Gmailish
|
4
|
+
describe Labeler do
|
5
|
+
let(:instance) { Gmailish::Labeler.new(account, uid) }
|
6
|
+
let(:uid) { 37 }
|
7
|
+
let(:account) {
|
8
|
+
fire_double(
|
9
|
+
'Net::IMAP'
|
10
|
+
)
|
11
|
+
}
|
12
|
+
|
13
|
+
let(:uid_copy) { stub }
|
14
|
+
|
15
|
+
describe '#initialize' do
|
16
|
+
it 'takes arguments' do
|
17
|
+
instance
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#transfered' do
|
22
|
+
subject { instance.transfered }
|
23
|
+
|
24
|
+
let(:label) { 'Transfered' }
|
25
|
+
|
26
|
+
context 'label exists' do
|
27
|
+
it 'returns response' do
|
28
|
+
account.should_receive(:uid_copy).
|
29
|
+
with(uid, label)
|
30
|
+
|
31
|
+
subject
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'label does not exist' do
|
36
|
+
let(:msg) { "Manually create `#{label}' label." }
|
37
|
+
|
38
|
+
it 'raise error' do
|
39
|
+
account.should_receive(:uid_copy).
|
40
|
+
with(uid, label).
|
41
|
+
and_raise
|
42
|
+
|
43
|
+
expect { subject }.to raise_error(Error::NoLabelError, msg)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe '#all_mail' do
|
49
|
+
subject { instance.all_mail }
|
50
|
+
|
51
|
+
let(:label) { '[Gmail]/All Mail' }
|
52
|
+
|
53
|
+
context 'label exists' do
|
54
|
+
it 'returns response' do
|
55
|
+
account.should_receive(:uid_copy).
|
56
|
+
with(uid, label)
|
57
|
+
|
58
|
+
subject
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context 'label does not exist' do
|
63
|
+
let(:msg) { "Manually create `#{label}' label." }
|
64
|
+
|
65
|
+
it 'raise error' do
|
66
|
+
account.should_receive(:uid_copy).
|
67
|
+
with(uid, label).
|
68
|
+
and_raise
|
69
|
+
|
70
|
+
expect { subject }.to raise_error(Error::NoLabelError, msg)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|