mirror-api 0.0.9 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.coveralls.yml +1 -0
- data/.rspec +1 -1
- data/README.md +130 -13
- data/lib/mirror-api.rb +0 -1
- data/lib/mirror-api/client.rb +18 -12
- data/lib/mirror-api/errors.rb +10 -0
- data/lib/mirror-api/oauth.rb +8 -6
- data/lib/mirror-api/request.rb +157 -12
- data/lib/mirror-api/request_data.rb +11 -0
- data/lib/mirror-api/resource.rb +15 -4
- data/lib/mirror-api/response_data.rb +15 -0
- data/lib/mirror-api/version.rb +1 -1
- data/spec/client_spec.rb +16 -465
- data/spec/contacts_spec.rb +218 -0
- data/spec/fixtures/subscriptions_item.json +25 -0
- data/spec/fixtures/subscriptions_list.json +30 -0
- data/spec/fixtures/timeline_item.json +7 -7
- data/spec/fixtures/timeline_list.json +15 -0
- data/spec/locations_spec.rb +68 -0
- data/spec/oauth_spec.rb +17 -0
- data/spec/request_data_spec.rb +38 -0
- data/spec/request_spec.rb +66 -0
- data/spec/spec_helper.rb +21 -0
- data/spec/subscriptions_spec.rb +170 -0
- data/spec/timeline_attachments_spec.rb +141 -0
- data/spec/timeline_spec.rb +239 -0
- metadata +26 -3
- data/lib/mirror-api/base.rb +0 -146
@@ -0,0 +1,218 @@
|
|
1
|
+
require_relative "spec_helper"
|
2
|
+
|
3
|
+
describe "Contacts" do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@token = "my-token"
|
7
|
+
@api = Mirror::Api::Client.new(@token)
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "delete" do
|
11
|
+
context "with valid params" do
|
12
|
+
before do
|
13
|
+
@id = "123123312"
|
14
|
+
stub_request(:delete, "https://www.googleapis.com/mirror/v1/contacts/#{@id}").
|
15
|
+
with(headers: json_get_request_headers(@token)).
|
16
|
+
to_return(status: 200,
|
17
|
+
body: "",
|
18
|
+
headers: {})
|
19
|
+
end
|
20
|
+
it "should return true" do
|
21
|
+
@api.contacts.delete(@id).should be_true
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "with invalid params" do
|
26
|
+
before do
|
27
|
+
@id = "blah"
|
28
|
+
stub_request(:delete, "https://www.googleapis.com/mirror/v1/contacts/#{@id}").
|
29
|
+
with(headers: json_get_request_headers(@token)).
|
30
|
+
to_return(status: 400,
|
31
|
+
body: "",
|
32
|
+
headers: {})
|
33
|
+
end
|
34
|
+
it "should return nil" do
|
35
|
+
contact = @api.contacts.delete(@id)
|
36
|
+
contact.should == nil
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "get" do
|
43
|
+
|
44
|
+
context "with valid params" do
|
45
|
+
before do
|
46
|
+
@id = "0987"
|
47
|
+
|
48
|
+
stub_request(:get, "https://www.googleapis.com/mirror/v1/contacts/#{@id}").
|
49
|
+
with(headers: json_get_request_headers(@token)).
|
50
|
+
to_return(status: 200,
|
51
|
+
body: fixture("contacts_item.json", true),
|
52
|
+
headers: {})
|
53
|
+
end
|
54
|
+
it "should return a contact with .kind == 'mirror#contact'" do
|
55
|
+
contact = @api.contacts.get(@id)
|
56
|
+
contact.kind.should == 'mirror#contact'
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context "with invalid params" do
|
61
|
+
before do
|
62
|
+
@id = "bad_id"
|
63
|
+
|
64
|
+
stub_request(:get, "https://www.googleapis.com/mirror/v1/contacts/#{@id}").
|
65
|
+
with(headers: json_get_request_headers(@token)).
|
66
|
+
to_return(status: 404,
|
67
|
+
body: fixture("contacts_item.json", true),
|
68
|
+
headers: {})
|
69
|
+
end
|
70
|
+
it "should return nil" do
|
71
|
+
contact = @api.contacts.get(@id)
|
72
|
+
contact.should == nil
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "insert" do
|
79
|
+
|
80
|
+
context "with valid params" do
|
81
|
+
before do
|
82
|
+
@body = {id: '1234', displayName: 'Demo App', imageUrls: ["http://pixelr3ap3r.com/wp-content/uploads/2012/08/357c6328ee4b11e1bfbf22000a1c91a7_7.jpg"]}
|
83
|
+
|
84
|
+
stub_request(:post, "https://www.googleapis.com/mirror/v1/contacts/").
|
85
|
+
with(body: @body,
|
86
|
+
headers: json_post_request_headers(@token, @body.to_json)).
|
87
|
+
to_return(status: 200,
|
88
|
+
body: fixture("contacts_item.json", true),
|
89
|
+
headers: {})
|
90
|
+
end
|
91
|
+
it "should return a contact with .kind == 'mirror#contact'" do
|
92
|
+
contact = @api.contacts.insert(@body)
|
93
|
+
contact.kind.should == 'mirror#contact'
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
context "with invalid params" do
|
98
|
+
before do
|
99
|
+
@body = {canIHazContact: "Really you thought that was valid?!"}
|
100
|
+
|
101
|
+
stub_request(:post, "https://www.googleapis.com/mirror/v1/contacts/").
|
102
|
+
with(body: @body,
|
103
|
+
headers: json_post_request_headers(@token, @body.to_json)).
|
104
|
+
to_return(status: 404,
|
105
|
+
body: "",
|
106
|
+
headers: {})
|
107
|
+
end
|
108
|
+
it "should return nil" do
|
109
|
+
contact = @api.contacts.insert(@body)
|
110
|
+
contact.should == nil
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
|
116
|
+
describe "list" do
|
117
|
+
|
118
|
+
context "with valid params" do
|
119
|
+
before do
|
120
|
+
|
121
|
+
stub_request(:get, "https://www.googleapis.com/mirror/v1/contacts/").
|
122
|
+
with(headers: json_get_request_headers(@token)).
|
123
|
+
to_return(status: 200,
|
124
|
+
body: fixture("contacts_list.json", true),
|
125
|
+
headers: {})
|
126
|
+
end
|
127
|
+
|
128
|
+
it "should return a list of contacts" do
|
129
|
+
contacts = @api.contacts.list()
|
130
|
+
contacts.should_not be_nil
|
131
|
+
contacts.items.count.should == 2 # see fixture
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
136
|
+
|
137
|
+
describe "patch" do
|
138
|
+
|
139
|
+
context "with valid params" do
|
140
|
+
before do
|
141
|
+
@id = '1234'
|
142
|
+
@body = {displayName: 'Demo App'}
|
143
|
+
|
144
|
+
stub_request(:patch, "https://www.googleapis.com/mirror/v1/contacts/#{@id}").
|
145
|
+
with(body: @body,
|
146
|
+
headers: json_post_request_headers(@token, @body.to_json)).
|
147
|
+
to_return(status: 200,
|
148
|
+
body: fixture("contacts_item.json", true),
|
149
|
+
headers: {})
|
150
|
+
end
|
151
|
+
it "should return a contact with .kind == 'mirror#contact'" do
|
152
|
+
contact = @api.contacts.patch(@id, @body)
|
153
|
+
contact.kind.should == 'mirror#contact'
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
context "with invalid params" do
|
158
|
+
before do
|
159
|
+
@id = '1234'
|
160
|
+
@body = {derp: 'troll'}
|
161
|
+
|
162
|
+
stub_request(:patch, "https://www.googleapis.com/mirror/v1/contacts/#{@id}").
|
163
|
+
with(body: @body,
|
164
|
+
headers: json_post_request_headers(@token, @body.to_json)).
|
165
|
+
to_return(status: 400,
|
166
|
+
body: "",
|
167
|
+
headers: {})
|
168
|
+
end
|
169
|
+
it "should return nil" do
|
170
|
+
contact = @api.contacts.patch(@id, @body)
|
171
|
+
contact.should == nil
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
end
|
176
|
+
|
177
|
+
describe "update" do
|
178
|
+
|
179
|
+
context "with valid params" do
|
180
|
+
before do
|
181
|
+
@id = '1234'
|
182
|
+
@body = {displayName: 'Demo App'}
|
183
|
+
|
184
|
+
stub_request(:put, "https://www.googleapis.com/mirror/v1/contacts/#{@id}").
|
185
|
+
with(body: @body,
|
186
|
+
headers: json_post_request_headers(@token, @body.to_json)).
|
187
|
+
to_return(status: 200,
|
188
|
+
body: fixture("contacts_item.json", true),
|
189
|
+
headers: {})
|
190
|
+
end
|
191
|
+
it "should return a contact with .kind == 'mirror#contact'" do
|
192
|
+
contact = @api.contacts.update(@id, @body)
|
193
|
+
contact.kind.should == 'mirror#contact'
|
194
|
+
contact.phone_number.should == "1234345587"
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
context "with invalid params" do
|
199
|
+
before do
|
200
|
+
@id = '1234'
|
201
|
+
@body = {derp: 'troll'}
|
202
|
+
|
203
|
+
stub_request(:put, "https://www.googleapis.com/mirror/v1/contacts/#{@id}").
|
204
|
+
with(body: @body,
|
205
|
+
headers: json_post_request_headers(@token, @body.to_json)).
|
206
|
+
to_return(status: 400,
|
207
|
+
body: "",
|
208
|
+
headers: {})
|
209
|
+
end
|
210
|
+
it "should return nil" do
|
211
|
+
contact = @api.contacts.update(@id, @body)
|
212
|
+
contact.should == nil
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
end
|
217
|
+
|
218
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
{
|
2
|
+
"kind": "mirror#subscription",
|
3
|
+
"id": "timeline",
|
4
|
+
"updated": "2013-04-23T04:38:18.124Z",
|
5
|
+
"collection": "timeline",
|
6
|
+
"operation": [
|
7
|
+
"UPDATE"
|
8
|
+
],
|
9
|
+
"callbackUrl": "https://yourawesomewebsite.com/callback",
|
10
|
+
"verifyToken": "longstringthatissupposedtobesecure",
|
11
|
+
"userToken": "user_1",
|
12
|
+
"notification": {
|
13
|
+
"collection": "timeline",
|
14
|
+
"itemId": "1234",
|
15
|
+
"operation": "UPDATE",
|
16
|
+
"userActions": [
|
17
|
+
{
|
18
|
+
"type": "SHARE",
|
19
|
+
"payload": "string"
|
20
|
+
}
|
21
|
+
],
|
22
|
+
"verifyToken": "longstringthatissupposedtobesecure",
|
23
|
+
"userToken": "user_1"
|
24
|
+
}
|
25
|
+
}
|
@@ -0,0 +1,30 @@
|
|
1
|
+
{
|
2
|
+
"kind": "mirror#subscriptionsList",
|
3
|
+
"items": [
|
4
|
+
{
|
5
|
+
"kind": "mirror#subscription",
|
6
|
+
"id": "timeline",
|
7
|
+
"updated": "2013-04-23T04:38:18.124Z",
|
8
|
+
"collection": "timeline",
|
9
|
+
"operation": [
|
10
|
+
"UPDATE"
|
11
|
+
],
|
12
|
+
"callbackUrl": "https://yourawesomewebsite.com/callback",
|
13
|
+
"verifyToken": "longstringthatissupposedtobesecure",
|
14
|
+
"userToken": "user_1",
|
15
|
+
"notification": {
|
16
|
+
"collection": "timeline",
|
17
|
+
"itemId": "1234",
|
18
|
+
"operation": "UPDATE",
|
19
|
+
"userActions": [
|
20
|
+
{
|
21
|
+
"type": "SHARE",
|
22
|
+
"payload": "string"
|
23
|
+
}
|
24
|
+
],
|
25
|
+
"verifyToken": "longstringthatissupposedtobesecure",
|
26
|
+
"userToken": "user_1"
|
27
|
+
}
|
28
|
+
}
|
29
|
+
]
|
30
|
+
}
|
@@ -1,9 +1,9 @@
|
|
1
1
|
{
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
2
|
+
"kind": "mirror#timelineItem",
|
3
|
+
"id": "1234567890",
|
4
|
+
"selfLink": "https://www.googleapis.com/mirror/v1/timeline/1234567890",
|
5
|
+
"created": "2012-09-25T23:28:43.192Z",
|
6
|
+
"updated": "2012-09-25T23:28:43.192Z",
|
7
|
+
"etag": "\"G5BI0RWvj-0jWdBrdWrPZV7xPKw/t25selcGS3uDEVT6FB09hAG-QQ\"",
|
8
|
+
"text": "Hello world"
|
9
9
|
}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
{
|
2
|
+
"kind": "mirror#timeline",
|
3
|
+
"nextPageToken": "string",
|
4
|
+
"items": [
|
5
|
+
{
|
6
|
+
"kind": "glass#timelineItem",
|
7
|
+
"id": "1234567890",
|
8
|
+
"selfLink": "https://www.googleapis.com/mirror/v1/timeline/1234567890",
|
9
|
+
"created": "2012-09-25T23:28:43.192Z",
|
10
|
+
"updated": "2012-09-25T23:28:43.192Z",
|
11
|
+
"etag": "\"G5BI0RWvj-0jWdBrdWrPZV7xPKw/t25selcGS3uDEVT6FB09hAG-QQ\"",
|
12
|
+
"text": "Hello world"
|
13
|
+
}
|
14
|
+
]
|
15
|
+
}
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require_relative "spec_helper"
|
2
|
+
|
3
|
+
describe "Locations" do
|
4
|
+
before do
|
5
|
+
@token = "my-token"
|
6
|
+
@api = Mirror::Api::Client.new(@token)
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "get" do
|
10
|
+
|
11
|
+
context "with valid params" do
|
12
|
+
before do
|
13
|
+
@id = "0987"
|
14
|
+
|
15
|
+
stub_request(:get, "https://www.googleapis.com/mirror/v1/locations/#{@id}").
|
16
|
+
with(headers: json_get_request_headers(@token)).
|
17
|
+
to_return(status: 200,
|
18
|
+
body: fixture("locations_item.json", true),
|
19
|
+
headers: {})
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should get the location for @id" do
|
23
|
+
location = @api.locations.get(@id)
|
24
|
+
location.should_not be_nil
|
25
|
+
location.display_name.should == "Home" # see fixture
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "with invalid params" do
|
30
|
+
before do
|
31
|
+
@id = "0987asdasds"
|
32
|
+
|
33
|
+
stub_request(:get, "https://www.googleapis.com/mirror/v1/locations/#{@id}").
|
34
|
+
with(headers: json_get_request_headers(@token)).
|
35
|
+
to_return(status: 404, body: "",
|
36
|
+
headers: {})
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should not get the item" do
|
41
|
+
|
42
|
+
item = @api.locations.get(@id)
|
43
|
+
item.should be_nil
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "list" do
|
49
|
+
|
50
|
+
context "with valid params" do
|
51
|
+
before do
|
52
|
+
|
53
|
+
stub_request(:get, "https://www.googleapis.com/mirror/v1/locations/").
|
54
|
+
with(headers: json_get_request_headers(@token)).
|
55
|
+
to_return(status: 200,
|
56
|
+
body: fixture("locations_list.json", true),
|
57
|
+
headers: {})
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should return a list of locations" do
|
61
|
+
locations = @api.locations.list()
|
62
|
+
locations.should_not be_nil
|
63
|
+
locations.items.count.should == 2 # see fixture
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
data/spec/oauth_spec.rb
CHANGED
@@ -21,6 +21,23 @@ describe Mirror::Api::OAuth do
|
|
21
21
|
access_token.should == "BOOYAH"
|
22
22
|
end
|
23
23
|
end
|
24
|
+
|
25
|
+
context "has invalid params" do
|
26
|
+
before do
|
27
|
+
@body = {client_id: @oauth.client_id, client_secret: @oauth.client_secret, refresh_token: @oauth.refresh_token, grant_type: "refresh_token"}
|
28
|
+
|
29
|
+
stub_request(:post, "https://accounts.google.com/o/oauth2/token").
|
30
|
+
with(body: @body,
|
31
|
+
headers: json_post_request_headers(@body.to_json)).
|
32
|
+
to_return(status: 200,
|
33
|
+
body: {:error => {:message => "bad request"}}.to_json,
|
34
|
+
headers: {})
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should raise an error" do
|
38
|
+
expect{@oauth.get_access_token}.to raise_error
|
39
|
+
end
|
40
|
+
end
|
24
41
|
|
25
42
|
end
|
26
43
|
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Mirror::Api::RequestData do
|
4
|
+
|
5
|
+
describe "initialize" do
|
6
|
+
it 'should should convert keys to camelCase' do
|
7
|
+
data = Mirror::Api::RequestData.new(:text => "abc", :menu_items => ["ABC"])
|
8
|
+
data.should_not be_nil
|
9
|
+
data.text.should == "abc"
|
10
|
+
data.menu_items.should == ["ABC"]
|
11
|
+
data.menuItems.should == ["ABC"]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "to_json" do
|
16
|
+
it "should only pass the camelCase" do
|
17
|
+
data = Mirror::Api::RequestData.new(:text => "abc", :menu_items => ["ABC"])
|
18
|
+
json = data.to_json
|
19
|
+
JSON.parse(json).should == {"text"=>"abc", "menuItems"=>["ABC"]}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "updates" do
|
24
|
+
it "should support changes" do
|
25
|
+
data = Mirror::Api::RequestData.new(:text => "abc", :menu_items => ["ABC"])
|
26
|
+
data.menu_items = ["DEF"]
|
27
|
+
json = data.to_json
|
28
|
+
JSON.parse(json).should == {"text"=>"abc", "menuItems"=>["DEF"]}
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should support appending" do
|
32
|
+
data = Mirror::Api::RequestData.new(:text => "abc", :menu_items => ["ABC"])
|
33
|
+
data.menu_items << "DEF"
|
34
|
+
json = data.to_json
|
35
|
+
JSON.parse(json).should == {"text"=>"abc", "menuItems"=>["ABC", "DEF"]}
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Mirror::Api::Request do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@creds = {:token => "swewew"}
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "initialize" do
|
10
|
+
it 'should create a Request' do
|
11
|
+
req = Mirror::Api::Request.new(@creds)
|
12
|
+
req.should_not be_nil
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "options" do
|
16
|
+
|
17
|
+
describe "resource" do
|
18
|
+
it 'defaults to TIMELINE' do
|
19
|
+
req = Mirror::Api::Request.new(@creds)
|
20
|
+
req.resource == Mirror::Api::Request::TIMELINE
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'validates resource is valid' do
|
24
|
+
req = Mirror::Api::Request.new(@creds, {:resource => Mirror::Api::Request::LOCATIONS})
|
25
|
+
req.resource == Mirror::Api::Request::LOCATIONS
|
26
|
+
|
27
|
+
expect{req.resource = "soup"}.to raise_error
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "params" do
|
32
|
+
it "should take a RequestData" do
|
33
|
+
data = Mirror::Api::RequestData.new({params: {text: "abc"}})
|
34
|
+
req = Mirror::Api::Request.new(@creds, data)
|
35
|
+
req.params.text.should == "abc"
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should take a hash" do
|
39
|
+
req = Mirror::Api::Request.new(@creds, {params: {text: "abc"}})
|
40
|
+
req.params.text.should == "abc"
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should ignore empty hashes" do
|
44
|
+
req = Mirror::Api::Request.new(@creds, {})
|
45
|
+
req.params.should be_nil
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should throw an error for other data types" do
|
49
|
+
expect {Mirror::Api::Request.new(@creds, {params: 45})}.to raise_error
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "logger" do
|
54
|
+
it "should take a logger" do
|
55
|
+
logger = Logger.new(STDOUT)
|
56
|
+
req = Mirror::Api::Request.new(@creds, {logger: logger, params: {text: "abc"}})
|
57
|
+
req.logger.should == logger
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should raise an error when logger is not a logger" do
|
61
|
+
expect{Mirror::Api::Request.new(@creds, {logger: "Hi", params: {text: "abc"}})}.to raise_error
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|