contextio 1.5.0 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +11 -0
- data/README.md +254 -24
- data/contextio.gemspec +1 -1
- data/lib/contextio/api.rb +13 -5
- data/lib/contextio/file.rb +1 -1
- data/lib/contextio/message.rb +2 -1
- data/lib/contextio/source.rb +0 -10
- data/lib/contextio/source_collection.rb +6 -6
- data/lib/contextio/version.rb +1 -1
- data/spec/spec_helper.rb +4 -0
- data/spec/unit/contextio/account_collection_spec.rb +7 -7
- data/spec/unit/contextio/account_spec.rb +3 -3
- data/spec/unit/contextio/api/resource_collection_spec.rb +16 -16
- data/spec/unit/contextio/api/resource_spec.rb +22 -22
- data/spec/unit/contextio/api_spec.rb +60 -3
- data/spec/unit/contextio/connect_token_collection_spec.rb +7 -7
- data/spec/unit/contextio/connect_token_spec.rb +2 -2
- data/spec/unit/contextio/email_settings_spec.rb +10 -10
- data/spec/unit/contextio/oauth_provider_collection_spec.rb +3 -3
- data/spec/unit/contextio/oauth_provider_spec.rb +7 -7
- data/spec/unit/contextio/source_collection_spec.rb +7 -7
- data/spec/unit/contextio/source_spec.rb +11 -5
- metadata +4 -4
@@ -10,6 +10,25 @@ describe ContextIO::API do
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
+
describe "#version" do
|
14
|
+
context "without version change" do
|
15
|
+
subject { ContextIO::API.new(nil, nil) }
|
16
|
+
|
17
|
+
it "uses API version 2.0" do
|
18
|
+
expect(subject.version).to eq('2.0')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context "with version change" do
|
23
|
+
subject { ContextIO::API.new(nil, nil) }
|
24
|
+
|
25
|
+
it "changes the API version used" do
|
26
|
+
subject.version = '1.1'
|
27
|
+
expect(subject.version).to eq('1.1')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
13
32
|
describe ".base_url" do
|
14
33
|
subject { ContextIO::API }
|
15
34
|
|
@@ -18,6 +37,25 @@ describe ContextIO::API do
|
|
18
37
|
end
|
19
38
|
end
|
20
39
|
|
40
|
+
describe "#base_url" do
|
41
|
+
context "without base_url change" do
|
42
|
+
subject { ContextIO::API.new(nil, nil) }
|
43
|
+
|
44
|
+
it "is https://api.context.io" do
|
45
|
+
expect(subject.base_url).to eq('https://api.context.io')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context "with base_url change" do
|
50
|
+
subject { ContextIO::API.new(nil, nil) }
|
51
|
+
|
52
|
+
it "changes the base_url" do
|
53
|
+
subject.base_url = 'https://api.example.com'
|
54
|
+
expect(subject.base_url).to eq('https://api.example.com')
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
21
59
|
describe ".new" do
|
22
60
|
subject { ContextIO::API.new('test_key', 'test_secret', {a:'b'}) }
|
23
61
|
|
@@ -35,7 +73,7 @@ describe ContextIO::API do
|
|
35
73
|
end
|
36
74
|
|
37
75
|
describe "#path" do
|
38
|
-
context "without params" do
|
76
|
+
context "without params and default version" do
|
39
77
|
subject { ContextIO::API.new(nil, nil).path('test_command') }
|
40
78
|
|
41
79
|
it "puts the command in the path" do
|
@@ -43,6 +81,15 @@ describe ContextIO::API do
|
|
43
81
|
end
|
44
82
|
end
|
45
83
|
|
84
|
+
context "without params and version change" do
|
85
|
+
subject { ContextIO::API.new(nil, nil) }
|
86
|
+
|
87
|
+
it "puts the command in the path" do
|
88
|
+
subject.version = '2.5'
|
89
|
+
expect(subject.path('test_command')).to eq('/2.5/test_command')
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
46
93
|
context "with params" do
|
47
94
|
subject { ContextIO::API.new(nil, nil).path('test_command', foo: 1, bar: %w(a b c)) }
|
48
95
|
|
@@ -58,6 +105,16 @@ describe ContextIO::API do
|
|
58
105
|
expect(subject).to eq('/2.0/test_command')
|
59
106
|
end
|
60
107
|
end
|
108
|
+
|
109
|
+
context "with a full URL and version and base_url change" do
|
110
|
+
subject { ContextIO::API.new(nil, nil) }
|
111
|
+
|
112
|
+
it "strips out the command" do
|
113
|
+
subject.version = '2.5'
|
114
|
+
subject.base_url = 'https://api.example.com'
|
115
|
+
expect(subject.path('https://api.example.com/2.5/test_command')).to eq('/2.5/test_command')
|
116
|
+
end
|
117
|
+
end
|
61
118
|
end
|
62
119
|
|
63
120
|
describe "#request" do
|
@@ -109,7 +166,7 @@ describe ContextIO::API do
|
|
109
166
|
|
110
167
|
describe ".url_for" do
|
111
168
|
it "delegates to ContextIO::API::URLBuilder" do
|
112
|
-
ContextIO::API::URLBuilder.
|
169
|
+
expect(ContextIO::API::URLBuilder).to receive(:url_for).with('foo')
|
113
170
|
|
114
171
|
ContextIO::API.url_for('foo')
|
115
172
|
end
|
@@ -119,7 +176,7 @@ describe ContextIO::API do
|
|
119
176
|
subject { ContextIO::API.new('test_key', 'test_secret') }
|
120
177
|
|
121
178
|
it "delegates to the class" do
|
122
|
-
ContextIO::API.
|
179
|
+
expect(ContextIO::API).to receive(:url_for).with('foo')
|
123
180
|
|
124
181
|
subject.url_for('foo')
|
125
182
|
end
|
@@ -8,11 +8,11 @@ describe ContextIO::ConnectTokenCollection do
|
|
8
8
|
|
9
9
|
describe "#create" do
|
10
10
|
before do
|
11
|
-
api.
|
11
|
+
allow(api).to receive(:request).with(:post, anything, anything).and_return({ token: '1234' })
|
12
12
|
end
|
13
13
|
|
14
14
|
it "posts to the api" do
|
15
|
-
api.
|
15
|
+
expect(api).to receive(:request).with(
|
16
16
|
:post,
|
17
17
|
'url from api',
|
18
18
|
hash_including(callback_url: 'http://callback.com')
|
@@ -22,7 +22,7 @@ describe ContextIO::ConnectTokenCollection do
|
|
22
22
|
end
|
23
23
|
|
24
24
|
it "doesn't make any more API calls than it needs to" do
|
25
|
-
api.
|
25
|
+
expect(api).to_not receive(:request).with(:get, anything, anything)
|
26
26
|
|
27
27
|
subject.create('http://callback.com')
|
28
28
|
end
|
@@ -32,7 +32,7 @@ describe ContextIO::ConnectTokenCollection do
|
|
32
32
|
end
|
33
33
|
|
34
34
|
it "takes an optional service level" do
|
35
|
-
api.
|
35
|
+
expect(api).to receive(:request).with(
|
36
36
|
anything,
|
37
37
|
anything,
|
38
38
|
hash_including(service_level: 'PRO')
|
@@ -42,7 +42,7 @@ describe ContextIO::ConnectTokenCollection do
|
|
42
42
|
end
|
43
43
|
|
44
44
|
it "takes an optional email" do
|
45
|
-
api.
|
45
|
+
expect(api).to receive(:request).with(
|
46
46
|
anything,
|
47
47
|
anything,
|
48
48
|
hash_including(email: 'person@email.com')
|
@@ -52,7 +52,7 @@ describe ContextIO::ConnectTokenCollection do
|
|
52
52
|
end
|
53
53
|
|
54
54
|
it "takes an optional first name" do
|
55
|
-
api.
|
55
|
+
expect(api).to receive(:request).with(
|
56
56
|
anything,
|
57
57
|
anything,
|
58
58
|
hash_including(first_name: 'Bruno')
|
@@ -62,7 +62,7 @@ describe ContextIO::ConnectTokenCollection do
|
|
62
62
|
end
|
63
63
|
|
64
64
|
it "takes an optional last name" do
|
65
|
-
api.
|
65
|
+
expect(api).to receive(:request).with(
|
66
66
|
anything,
|
67
67
|
anything,
|
68
68
|
hash_including(last_name: 'Morency')
|
@@ -34,7 +34,7 @@ describe ContextIO::ConnectToken do
|
|
34
34
|
subject { ContextIO::ConnectToken.new(api, token: '1234') }
|
35
35
|
|
36
36
|
it "uses the input key" do
|
37
|
-
api.
|
37
|
+
expect(api).to_not receive(:request)
|
38
38
|
|
39
39
|
expect(subject.token).to eq('1234')
|
40
40
|
end
|
@@ -44,7 +44,7 @@ describe ContextIO::ConnectToken do
|
|
44
44
|
subject { ContextIO::ConnectToken.new(api, resource_url: 'http://example.com/hitme') }
|
45
45
|
|
46
46
|
it "loads it from the API" do
|
47
|
-
api.
|
47
|
+
expect(api).to receive(:request).with(
|
48
48
|
:get,
|
49
49
|
'http://example.com/hitme'
|
50
50
|
).and_return({
|
@@ -38,63 +38,63 @@ describe ContextIO::EmailSettings do
|
|
38
38
|
|
39
39
|
describe "#documentation" do
|
40
40
|
it "fetches it from the api" do
|
41
|
-
api.
|
41
|
+
expect(api).to receive(:request).with(:get, anything, anything).and_return({ 'documentation' => ['foo', 'bar'] })
|
42
42
|
expect(subject.documentation).to eq(['foo', 'bar'])
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
46
|
describe "#found?" do
|
47
47
|
it "fetches it from the api" do
|
48
|
-
api.
|
48
|
+
expect(api).to receive(:request).with(:get, anything, anything).and_return({ 'found' => true })
|
49
49
|
expect(subject).to be_found
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
53
|
describe "#type" do
|
54
54
|
it "fetches it from the api" do
|
55
|
-
api.
|
55
|
+
expect(api).to receive(:request).with(:get, anything, anything).and_return({ 'type' => 'gmail' })
|
56
56
|
expect(subject.type).to eq('gmail')
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
60
|
describe "#server" do
|
61
61
|
it "fetches it from the api" do
|
62
|
-
api.
|
62
|
+
expect(api).to receive(:request).with(:get, anything, anything).and_return({ 'imap' => { 'server' => 'imap.gmail.com' }})
|
63
63
|
expect(subject.server).to eq('imap.gmail.com')
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
67
|
describe "#username" do
|
68
68
|
it "fetches it from the api" do
|
69
|
-
api.
|
69
|
+
expect(api).to receive(:request).with(:get, anything, anything).and_return({ 'imap' => { 'username' => 'ben' }})
|
70
70
|
expect(subject.username).to eq('ben')
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
74
|
describe "#port" do
|
75
75
|
it "fetches it from the api" do
|
76
|
-
api.
|
76
|
+
expect(api).to receive(:request).with(:get, anything, anything).and_return({ 'imap' => { 'port' => 993 }})
|
77
77
|
expect(subject.port).to eq(993)
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
81
81
|
describe "#oauth?" do
|
82
82
|
it "fetches it from the api" do
|
83
|
-
api.
|
83
|
+
expect(api).to receive(:request).with(:get, anything, anything).and_return({ 'imap' => { 'oauth' => false }})
|
84
84
|
expect(subject).to_not be_oauth
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
88
88
|
describe "#use_ssl?" do
|
89
89
|
it "fetches it from the api" do
|
90
|
-
api.
|
90
|
+
expect(api).to receive(:request).with(:get, anything, anything).and_return({ 'imap' => { 'use_ssl' => false }})
|
91
91
|
expect(subject).to_not be_use_ssl
|
92
92
|
end
|
93
93
|
end
|
94
94
|
|
95
95
|
describe "#fetch_attributes" do
|
96
96
|
before do
|
97
|
-
api.
|
97
|
+
allow(api).to receive(:request).with(:get, anything, anything).and_return({ 'foo' => 'bar' })
|
98
98
|
end
|
99
99
|
|
100
100
|
it "defines a getter if one doesn't already exist" do
|
@@ -104,7 +104,7 @@ describe ContextIO::EmailSettings do
|
|
104
104
|
end
|
105
105
|
|
106
106
|
it "hits the right URL" do
|
107
|
-
api.
|
107
|
+
expect(api).to receive(:request).with(:get, 'discovery', 'email' => 'email@email.com', 'source_type' => 'IMAP')
|
108
108
|
|
109
109
|
subject.send(:fetch_attributes)
|
110
110
|
end
|
@@ -8,11 +8,11 @@ describe ContextIO::OAuthProviderCollection do
|
|
8
8
|
|
9
9
|
describe "#create" do
|
10
10
|
before do
|
11
|
-
api.
|
11
|
+
allow(api).to receive(:request).with(:post, anything, anything).and_return({ provider_consumer_key: 'test_key' })
|
12
12
|
end
|
13
13
|
|
14
14
|
it "posts to the api" do
|
15
|
-
api.
|
15
|
+
expect(api).to receive(:request).with(
|
16
16
|
:post,
|
17
17
|
'url from api',
|
18
18
|
type: 'GMAIL',
|
@@ -24,7 +24,7 @@ describe ContextIO::OAuthProviderCollection do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
it "doesn't make any more API requests than it needs to" do
|
27
|
-
api.
|
27
|
+
expect(api).to receive(:request).exactly(:once)
|
28
28
|
|
29
29
|
subject.create('GMAIL', 'test_key', 'test_secret')
|
30
30
|
end
|
@@ -42,7 +42,7 @@ describe ContextIO::OAuthProvider do
|
|
42
42
|
subject { ContextIO::OAuthProvider.new(api, provider_consumer_key: '1234') }
|
43
43
|
|
44
44
|
it "asks the api for a URL" do
|
45
|
-
api.
|
45
|
+
expect(api).to receive(:url_for).with(subject)
|
46
46
|
|
47
47
|
subject.resource_url
|
48
48
|
end
|
@@ -54,7 +54,7 @@ describe ContextIO::OAuthProvider do
|
|
54
54
|
subject { ContextIO::OAuthProvider.new(api, provider_consumer_key: '1234') }
|
55
55
|
|
56
56
|
it "uses the input key" do
|
57
|
-
api.
|
57
|
+
expect(api).to_not receive(:request)
|
58
58
|
|
59
59
|
expect(subject.provider_consumer_key).to eq('1234')
|
60
60
|
end
|
@@ -64,7 +64,7 @@ describe ContextIO::OAuthProvider do
|
|
64
64
|
subject { ContextIO::OAuthProvider.new(api, resource_url: 'http://example.com/hitme') }
|
65
65
|
|
66
66
|
it "loads it from the API" do
|
67
|
-
api.
|
67
|
+
expect(api).to receive(:request).with(
|
68
68
|
:get,
|
69
69
|
'http://example.com/hitme'
|
70
70
|
).and_return({
|
@@ -81,7 +81,7 @@ describe ContextIO::OAuthProvider do
|
|
81
81
|
subject { ContextIO::OAuthProvider.new(api, provider_consumer_key: '1234', provider_consumer_secret: '0987') }
|
82
82
|
|
83
83
|
it "uses the input provider_consumer_secret" do
|
84
|
-
api.
|
84
|
+
expect(api).to_not receive(:request)
|
85
85
|
|
86
86
|
expect(subject.provider_consumer_secret).to eq('0987')
|
87
87
|
end
|
@@ -91,7 +91,7 @@ describe ContextIO::OAuthProvider do
|
|
91
91
|
subject { ContextIO::OAuthProvider.new(api, provider_consumer_key: '1234') }
|
92
92
|
|
93
93
|
it "loads it from the API" do
|
94
|
-
api.
|
94
|
+
expect(api).to receive(:request).with(:get, anything).and_return({ 'provider_consumer_secret' => '1029' })
|
95
95
|
expect(subject.provider_consumer_secret).to eq('1029')
|
96
96
|
end
|
97
97
|
end
|
@@ -102,7 +102,7 @@ describe ContextIO::OAuthProvider do
|
|
102
102
|
subject { ContextIO::OAuthProvider.new(api, provider_consumer_key: '1234', type: 'GMAIL') }
|
103
103
|
|
104
104
|
it "uses the input type" do
|
105
|
-
api.
|
105
|
+
expect(api).to_not receive(:request)
|
106
106
|
|
107
107
|
expect(subject.type).to eq('GMAIL')
|
108
108
|
end
|
@@ -112,7 +112,7 @@ describe ContextIO::OAuthProvider do
|
|
112
112
|
subject { ContextIO::OAuthProvider.new(api, provider_consumer_key: '1234') }
|
113
113
|
|
114
114
|
it "loads it from the API" do
|
115
|
-
api.
|
115
|
+
expect(api).to receive(:request).with(:get, anything).and_return({ 'type' => 'GOOGLEAPPSMARKETPLACE' })
|
116
116
|
expect(subject.type).to eq('GOOGLEAPPSMARKETPLACE')
|
117
117
|
end
|
118
118
|
end
|
@@ -8,14 +8,14 @@ describe ContextIO::SourceCollection do
|
|
8
8
|
|
9
9
|
describe "#create" do
|
10
10
|
before do
|
11
|
-
api.
|
11
|
+
allow(api).to receive(:request).with(:post, anything, anything).and_return(
|
12
12
|
'success' => true,
|
13
13
|
'resource_url' => 'resource_url'
|
14
14
|
)
|
15
15
|
end
|
16
16
|
|
17
17
|
it "posts to the api" do
|
18
|
-
api.
|
18
|
+
expect(api).to receive(:request).with(
|
19
19
|
:post,
|
20
20
|
'url from api',
|
21
21
|
anything
|
@@ -25,27 +25,27 @@ describe ContextIO::SourceCollection do
|
|
25
25
|
end
|
26
26
|
|
27
27
|
it "converts boolean to number string for ssl" do
|
28
|
-
api.
|
28
|
+
expect(api).to receive(:request).with(
|
29
29
|
anything,
|
30
30
|
anything,
|
31
|
-
hash_including(
|
31
|
+
hash_including(:use_ssl => '1')
|
32
32
|
)
|
33
33
|
|
34
34
|
subject.create('hello@gmail.com', 'imap.email.com', 'hello', true, 993, 'IMAP')
|
35
35
|
end
|
36
36
|
|
37
37
|
it "converts integer to number string for port" do
|
38
|
-
api.
|
38
|
+
expect(api).to receive(:request).with(
|
39
39
|
anything,
|
40
40
|
anything,
|
41
|
-
hash_including(
|
41
|
+
hash_including(:port => '993')
|
42
42
|
)
|
43
43
|
|
44
44
|
subject.create('hello@gmail.com', 'imap.email.com', 'hello', true, 993, 'IMAP')
|
45
45
|
end
|
46
46
|
|
47
47
|
it "doesn't make any more API calls than it needs to" do
|
48
|
-
api.
|
48
|
+
expect(api).to_not receive(:request).with(:get, anything, anything)
|
49
49
|
|
50
50
|
subject.create('hello@gmail.com', 'imap.email.com', 'hello', true, 993, 'IMAP')
|
51
51
|
end
|
@@ -22,13 +22,13 @@ describe ContextIO::Source do
|
|
22
22
|
|
23
23
|
describe "#update" do
|
24
24
|
before do
|
25
|
-
api.
|
25
|
+
allow(api).to receive(:request).and_return({'success' => true})
|
26
26
|
end
|
27
27
|
|
28
28
|
subject { ContextIO::Source.new(api, resource_url: 'resource_url', sync_period: '1h') }
|
29
29
|
|
30
30
|
it "posts to the api" do
|
31
|
-
api.
|
31
|
+
expect(api).to receive(:request).with(
|
32
32
|
:post,
|
33
33
|
'resource_url',
|
34
34
|
sync_period: '4h'
|
@@ -44,21 +44,27 @@ describe ContextIO::Source do
|
|
44
44
|
end
|
45
45
|
|
46
46
|
it "doesn't make any more API calls than it needs to" do
|
47
|
-
api.
|
47
|
+
expect(api).to_not receive(:request).with(:get, anything, anything)
|
48
48
|
|
49
49
|
subject.update(sync_period: '4h')
|
50
50
|
end
|
51
|
+
|
52
|
+
it "allows you to send arbitrary arguments to the API" do
|
53
|
+
expect(api).to receive(:request).with(:post, anything, {foo: 'bar'})
|
54
|
+
|
55
|
+
subject.update(foo: 'bar')
|
56
|
+
end
|
51
57
|
end
|
52
58
|
|
53
59
|
describe ".sync!" do
|
54
60
|
before do
|
55
|
-
api.
|
61
|
+
allow(api).to receive(:request).and_return({'success' => true})
|
56
62
|
end
|
57
63
|
|
58
64
|
subject { ContextIO::Source.new(api, resource_url: 'resource_url', sync_period: '1h') }
|
59
65
|
|
60
66
|
it "syncs to the api" do
|
61
|
-
api.
|
67
|
+
expect(api).to receive(:request).with(
|
62
68
|
:post,
|
63
69
|
'resource_url/sync',
|
64
70
|
{}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: contextio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Hamill
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-08-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oauth
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '2.
|
61
|
+
version: '2.14'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '2.
|
68
|
+
version: '2.14'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rake
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|