office_autopilot 0.0.1 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +15 -5
- data/lib/office_autopilot/client/contacts.rb +60 -10
- data/lib/office_autopilot/client.rb +13 -23
- data/lib/office_autopilot/error.rb +7 -0
- data/lib/office_autopilot/request.rb +11 -0
- data/lib/office_autopilot/version.rb +1 -1
- data/spec/data/contacts_add_response.xml +69 -0
- data/spec/data/invalid_xml_error_response.xml +3 -0
- data/spec/office_autopilot/client/contacts_spec.rb +139 -46
- data/spec/office_autopilot/client_spec.rb +25 -61
- data/spec/office_autopilot/request_spec.rb +15 -0
- data/spec/spec_helper.rb +6 -5
- metadata +10 -2
data/README.md
CHANGED
@@ -11,11 +11,22 @@ Usage Examples
|
|
11
11
|
require "rubygems"
|
12
12
|
require "office_autopilot"
|
13
13
|
|
14
|
-
|
14
|
+
client = OfficeAutopilot::Client.new(:api_id => 'xxx', :api_key => 'yyy')
|
15
15
|
|
16
16
|
# Search Contacts
|
17
|
-
puts
|
18
|
-
|
17
|
+
puts client.contacts_search(:field => 'E-Mail', :op => 'e', :value => 'prashant@example.com')
|
18
|
+
# results truncated for brevity but ALL fields (including custom fields) are returned
|
19
|
+
=> [{"id"=>"7",
|
20
|
+
"Contact Information"=>{"First Name"=>"testing", "Last Name"=>"testing", "E-Mail"=>"prashant@example.com"},
|
21
|
+
"Lead Information"=>{"Contact Owner"=>"XXX", "First Referrer"=>"", "Last Referrer"=>""},
|
22
|
+
"Sequences and Tags"=>{"Sequences"=>"*/*", "Contact Tags"=>""},
|
23
|
+
"Purchase History"=>{}
|
24
|
+
}]
|
25
|
+
|
26
|
+
# Add Contact
|
27
|
+
puts client.contacts_add({ 'Contact Information' => {'First Name' => 'Turtle', 'Last Name' => 'Jones', 'E-Mail' => 'mrturtles@example.com'} })
|
28
|
+
# results truncated for brevity
|
29
|
+
=> {"id"=>"24", "Contact Information"=>{"First Name"=>"Turtle", "Last Name"=>"Jones", "E-Mail"=>"mrturtles@example.com"}}
|
19
30
|
|
20
31
|
Documentation
|
21
32
|
-------------
|
@@ -25,7 +36,6 @@ Todo
|
|
25
36
|
----
|
26
37
|
|
27
38
|
* support ALL API calls
|
28
|
-
* allow returning all possible contact details instead of the current subset
|
29
39
|
|
30
40
|
Submitting a Pull Request
|
31
41
|
-------------------------
|
@@ -36,7 +46,7 @@ Submitting a Pull Request
|
|
36
46
|
5. Add specs for your feature or bug fix.
|
37
47
|
6. Run <tt>bundle exec rake spec</tt>. If your changes are not 100% covered, go back to step 5.
|
38
48
|
7. Commit and push your changes.
|
39
|
-
8. Submit a pull request. Please do not include changes to the gemspec
|
49
|
+
8. Submit a pull request. Please do not include changes to the gemspec or version file. (If you want to create your own version for some reason, please do so in a separate commit.)
|
40
50
|
|
41
51
|
Copyright
|
42
52
|
---------
|
@@ -1,27 +1,77 @@
|
|
1
1
|
module OfficeAutopilot
|
2
2
|
class Client
|
3
|
-
|
4
3
|
module Contacts
|
5
4
|
|
6
5
|
CONTACTS_ENDPOINT = '/cdata.php'
|
7
6
|
|
8
|
-
def contacts_search(options
|
7
|
+
def contacts_search(options)
|
9
8
|
xml = xml_for_search(options)
|
10
|
-
response =
|
9
|
+
response = request(:post, CONTACTS_ENDPOINT, :body => {'reqType' => 'search', 'data' => xml}.merge(auth))
|
10
|
+
parse_contacts_xml(response)
|
11
|
+
end
|
12
|
+
|
13
|
+
def contacts_add(options)
|
14
|
+
xml = xml_for_contact(options)
|
15
|
+
response = request(:post, CONTACTS_ENDPOINT, :body => {'reqType' => 'add', 'return_id' => '1', 'data' => xml}.merge(auth))
|
16
|
+
parse_contacts_xml(response)[0]
|
17
|
+
end
|
18
|
+
|
19
|
+
def xml_for_search(options)
|
20
|
+
if options.is_a?(Hash)
|
21
|
+
options = [options]
|
22
|
+
end
|
23
|
+
|
24
|
+
xml = Builder::XmlMarkup.new
|
25
|
+
xml.search do
|
26
|
+
options.each do |option|
|
27
|
+
xml.equation do
|
28
|
+
xml.field option[:field]
|
29
|
+
xml.op option[:op]
|
30
|
+
xml.value option[:value]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
11
35
|
|
36
|
+
def xml_for_contact(options)
|
37
|
+
attrs = {}
|
38
|
+
|
39
|
+
id = options.delete('id')
|
40
|
+
attrs[:id] = id if id
|
41
|
+
|
42
|
+
xml = Builder::XmlMarkup.new
|
43
|
+
xml.contact(attrs) do
|
44
|
+
options.each_key do |group_tag|
|
45
|
+
xml.Group_Tag(:name => group_tag) do
|
46
|
+
options[group_tag].each do |field, value|
|
47
|
+
xml.field(value, :name => field)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def parse_contacts_xml(response)
|
12
55
|
contacts = []
|
13
56
|
xml = Nokogiri::XML(response)
|
14
57
|
xml.css('result contact').each do |node|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
58
|
+
contact = {}
|
59
|
+
contact['id'] = node['id']
|
60
|
+
|
61
|
+
node.css('Group_Tag').each do |group_tag|
|
62
|
+
group_tag_name = group_tag['name']
|
63
|
+
contact[group_tag_name] = {}
|
64
|
+
|
65
|
+
group_tag.css('field').each do |field|
|
66
|
+
field_name = field['name']
|
67
|
+
contact[group_tag_name][field_name] = field.content
|
68
|
+
end
|
69
|
+
end
|
70
|
+
contacts << contact
|
21
71
|
end
|
22
72
|
contacts
|
23
73
|
end
|
24
|
-
end
|
25
74
|
|
75
|
+
end
|
26
76
|
end
|
27
77
|
end
|
@@ -1,21 +1,14 @@
|
|
1
|
-
require 'httparty'
|
2
1
|
require 'builder'
|
3
2
|
require 'nokogiri'
|
4
3
|
|
5
|
-
|
4
|
+
require File.expand_path('../error', __FILE__)
|
5
|
+
require File.expand_path('../request', __FILE__)
|
6
6
|
require File.expand_path('../client/contacts', __FILE__)
|
7
7
|
|
8
|
-
|
9
8
|
module OfficeAutopilot
|
10
9
|
class Client
|
11
10
|
|
12
|
-
include
|
13
|
-
|
14
|
-
include OfficeAutopilot::Client::Contacts
|
15
|
-
|
16
|
-
base_uri 'http://api.moon-ray.com'
|
17
|
-
format :plain
|
18
|
-
|
11
|
+
include Contacts
|
19
12
|
|
20
13
|
def initialize(options)
|
21
14
|
@api = {
|
@@ -39,21 +32,18 @@ module OfficeAutopilot
|
|
39
32
|
{ 'Appid' => api_id, 'Key' => api_key }
|
40
33
|
end
|
41
34
|
|
42
|
-
def
|
43
|
-
|
44
|
-
|
45
|
-
end
|
35
|
+
def request(method, path, options)
|
36
|
+
handle_response( OfficeAutopilot::Request.send(method, path, options) )
|
37
|
+
end
|
46
38
|
|
47
|
-
|
48
|
-
xml
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
xml.op option[:op]
|
53
|
-
xml.value option[:value]
|
54
|
-
end
|
55
|
-
end
|
39
|
+
def handle_response(response)
|
40
|
+
xml = Nokogiri::XML(response)
|
41
|
+
|
42
|
+
if xml.at_css('result').content =~ /failure/i
|
43
|
+
raise OfficeAutopilot::XmlError if xml.at_css('result error').content =~ /Invalid XML/i
|
56
44
|
end
|
45
|
+
|
46
|
+
response
|
57
47
|
end
|
58
48
|
|
59
49
|
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
<result>
|
2
|
+
<contact id='7' date='1299671887' dlm='1299674450' score='0.00' purl='prashant' bulk_mail='1'>
|
3
|
+
<Group_Tag name='Contact Information'>
|
4
|
+
<field name="First Name">prashant</field>
|
5
|
+
<field name="Last Name">nadarajan</field>
|
6
|
+
<field name="E-Mail">prashant@example.com</field>
|
7
|
+
<field name="Home Phone"/>
|
8
|
+
<field name="Title"/>
|
9
|
+
<field name="Office Phone"/>
|
10
|
+
<field name="Cell Phone"/>
|
11
|
+
<field name="Fax"/>
|
12
|
+
<field name="Address"/>
|
13
|
+
<field name="Company"/>
|
14
|
+
<field name="Address 2"/>
|
15
|
+
<field name="City"/>
|
16
|
+
<field name="State"/>
|
17
|
+
<field name="Zip Code"/>
|
18
|
+
<field name="Website "/>
|
19
|
+
<field name="Country"/>
|
20
|
+
<field name="Birthday"/>
|
21
|
+
</Group_Tag>
|
22
|
+
<Group_Tag name='Lead Information'>
|
23
|
+
<field name="Contact Owner">Don Corleone</field>
|
24
|
+
<field name="First Referrer"/>
|
25
|
+
<field name="Last Referrer"/>
|
26
|
+
<field name="Lead Source"/>
|
27
|
+
<field name="Campaign"/>
|
28
|
+
<field name="Ad"/>
|
29
|
+
<field name="Media"/>
|
30
|
+
</Group_Tag>
|
31
|
+
<Group_Tag name='Sequences and Tags'>
|
32
|
+
<field name="Sequences">*/*</field>
|
33
|
+
<field name="Contact Tags"/>
|
34
|
+
</Group_Tag>
|
35
|
+
<Group_Tag name='Purchase History'></Group_Tag>
|
36
|
+
<Group_Tag name='Most Recent Charge'>
|
37
|
+
<field name="Charge Amount">$0.00</field>
|
38
|
+
<field name="Charge Invoice #"/>
|
39
|
+
</Group_Tag>
|
40
|
+
<Group_Tag name='Affiliate Data'>
|
41
|
+
<field name="Affiliate Program"/>
|
42
|
+
<field name="Number of Sales"/>
|
43
|
+
<field name="$ Sales">$0.00</field>
|
44
|
+
<field name="Paypal E-mail"/>
|
45
|
+
<field name="Affiliate Paypal"/>
|
46
|
+
</Group_Tag>
|
47
|
+
<Group_Tag
|
48
|
+
name='Most Recent Invoice'>
|
49
|
+
<field name="Invoice #"/>
|
50
|
+
<field name="Total Invoice Amount">$0.00</field>
|
51
|
+
</Group_Tag>
|
52
|
+
<Group_Tag name='Lead Status'>
|
53
|
+
<field name="Lead Status"/>
|
54
|
+
<field name="Preferencia Contacto"/>
|
55
|
+
</Group_Tag>
|
56
|
+
<Group_Tag name='Credit Card'>
|
57
|
+
<field name="Card Type"/>
|
58
|
+
<field name="Card Expiration Month"/>
|
59
|
+
<field name="Charge Result"/>
|
60
|
+
<field name="Card Expiration Year"/>
|
61
|
+
<field name="Card Number (Last 4)"/>
|
62
|
+
<field name="Payment Center Link"/>
|
63
|
+
</Group_Tag>
|
64
|
+
<Group_Tag name='Invoices'></Group_Tag>
|
65
|
+
<Group_Tag name='Subscriptions and Payment Plans'></Group_Tag>
|
66
|
+
<Group_Tag name='Website Subscribers'></Group_Tag>
|
67
|
+
</contact>
|
68
|
+
<status>Success</status>
|
69
|
+
</result>
|
@@ -8,64 +8,157 @@ describe OfficeAutopilot::Client::Contacts do
|
|
8
8
|
@auth_str = "Appid=#{@client.api_id}&Key=#{@client.api_key}"
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
11
|
+
describe "#xml_for_search" do
|
12
|
+
# <search>
|
13
|
+
# <equation>
|
14
|
+
# <field>E-Mail</field>
|
15
|
+
# <op>e</op>
|
16
|
+
# <value>john@example.com</value>
|
17
|
+
# </equation>
|
18
|
+
# </search>
|
19
|
+
|
20
|
+
context "searching with one field" do
|
21
|
+
it "returns a valid simple search data xml" do
|
22
|
+
field = "E-Mail"
|
23
|
+
op = "e"
|
24
|
+
value = "john@example.com"
|
25
|
+
|
26
|
+
xml = Nokogiri::XML(@client.xml_for_search(:field => field, :op => op, :value => value))
|
27
|
+
xml.at_css('field').content.should == field
|
28
|
+
xml.at_css('op').content.should == op
|
29
|
+
xml.at_css('value').content.should == value
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "searching with more than one field" do
|
34
|
+
it "returns a valid multi search data xml" do
|
35
|
+
search_options = [
|
36
|
+
{:field => 'E-Mail', :op => 'e', :value => 'foo@example.com'},
|
37
|
+
{:field => 'Contact Tags', :op => 'n', :value => 'bar'},
|
38
|
+
]
|
39
|
+
|
40
|
+
xml = @client.xml_for_search(search_options)
|
41
|
+
xml = Nokogiri::XML(xml)
|
42
|
+
xml.css('field')[0].content.should == 'E-Mail'
|
43
|
+
xml.css('op')[0].content.should == 'e'
|
44
|
+
xml.css('value')[0].content.should == 'foo@example.com'
|
45
|
+
|
46
|
+
xml.css('field')[1].content.should == 'Contact Tags'
|
47
|
+
xml.css('op')[1].content.should == 'n'
|
48
|
+
xml.css('value')[1].content.should == 'bar'
|
49
|
+
end
|
21
50
|
end
|
22
|
-
contacts
|
23
51
|
end
|
24
52
|
|
25
53
|
describe "#contacts_search" do
|
26
|
-
|
54
|
+
it "returns the matched contacts" do
|
55
|
+
search_options = {:field => 'E-Mail', :op => 'e', :value => 'prashant@example.com'}
|
56
|
+
search_xml = @client.xml_for_search(search_options)
|
57
|
+
contacts_xml = test_data('contacts_search_single_response.xml')
|
58
|
+
|
59
|
+
request_body = "reqType=search&data=#{escape_xml(search_xml)}&#{@auth_str}"
|
60
|
+
stub_request(:post, @contact_endpoint).with(:body => request_body).to_return(:body => contacts_xml)
|
61
|
+
|
62
|
+
contacts = @client.contacts_search(search_options)
|
63
|
+
WebMock.should have_requested(:post, @contact_endpoint).with(:body => request_body)
|
64
|
+
contacts.should == @client.parse_contacts_xml(contacts_xml)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "#xml_for_contact" do
|
69
|
+
before do
|
70
|
+
@contact_options = {
|
71
|
+
'Contact Information' => {'First Name' => 'Bob', 'Last Name' => 'Foo', 'E-Mail' => 'b@example.com'},
|
72
|
+
'Lead Information' => {'Contact Owner' => 'Mr Bar'}
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
it "returns a valid contacts xml" do
|
77
|
+
xml = @client.xml_for_contact(@contact_options)
|
78
|
+
xml = Nokogiri::XML(xml)
|
79
|
+
|
80
|
+
xml.at_css('contact')['id'].should be_nil
|
81
|
+
|
82
|
+
contact_info = xml.css("contact Group_Tag[name='Contact Information']")
|
83
|
+
contact_info.at_css("field[name='First Name']").content.should == 'Bob'
|
84
|
+
contact_info.at_css("field[name='Last Name']").content.should == 'Foo'
|
85
|
+
|
86
|
+
lead_info = xml.css("contact Group_Tag[name='Lead Information']")
|
87
|
+
lead_info.at_css("field[name='Contact Owner']").content.should == 'Mr Bar'
|
88
|
+
end
|
89
|
+
|
90
|
+
context "when 'id' is specified" do
|
91
|
+
it "returns a valid contact xml containing the contact id" do
|
92
|
+
@contact_options.merge!('id' => '1234')
|
93
|
+
xml = Nokogiri::XML( @client.xml_for_contact(@contact_options) )
|
94
|
+
|
95
|
+
xml.at_css('contact')['id'].should == '1234'
|
96
|
+
contact_info = xml.css("contact Group_Tag[name='Contact Information']")
|
97
|
+
contact_info.at_css("field[name='First Name']").content.should == 'Bob'
|
98
|
+
contact_info.at_css("field[name='Last Name']").content.should == 'Foo'
|
99
|
+
|
100
|
+
lead_info = xml.css("contact Group_Tag[name='Lead Information']")
|
101
|
+
lead_info.at_css("field[name='Contact Owner']").content.should == 'Mr Bar'
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
describe "#parse_contacts_xml" do
|
107
|
+
context "when the results contain one contact" do
|
27
108
|
it "returns an array containing the contact" do
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
response = @client.contacts_search(search_params)
|
39
|
-
response.each_with_index do |contact, index|
|
40
|
-
contact[:id].should == xml_contacts[index][:id]
|
41
|
-
contact[:first_name].should == xml_contacts[index][:first_name]
|
42
|
-
contact[:last_name].should == xml_contacts[index][:last_name]
|
43
|
-
contact[:email].should == xml_contacts[index][:email]
|
109
|
+
contacts = @client.parse_contacts_xml( test_data('contacts_search_single_response.xml') )
|
110
|
+
|
111
|
+
contacts.size.should == 1
|
112
|
+
|
113
|
+
contacts.each do |contact|
|
114
|
+
contact['id'].should == '7'
|
115
|
+
contact['Contact Information']['First Name'].should == 'prashant'
|
116
|
+
contact['Contact Information']['Last Name'].should == 'nadarajan'
|
117
|
+
contact['Contact Information']['E-Mail'].should == 'prashant@example.com'
|
118
|
+
contact['Lead Information']['Contact Owner'].should == 'Don Corleone'
|
44
119
|
end
|
45
120
|
end
|
46
121
|
end
|
47
122
|
|
48
|
-
context "when the results contain more than one
|
123
|
+
context "when the results contain more than one contact" do
|
49
124
|
it "returns an array containing the contacts" do
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
response.each_with_index do |contact, index|
|
62
|
-
contact[:id].should == xml_contacts[index][:id]
|
63
|
-
contact[:first_name].should == xml_contacts[index][:first_name]
|
64
|
-
contact[:last_name].should == xml_contacts[index][:last_name]
|
65
|
-
contact[:email].should == xml_contacts[index][:email]
|
66
|
-
end
|
125
|
+
contacts = @client.parse_contacts_xml(test_data('contacts_search_multiple_response.xml'))
|
126
|
+
|
127
|
+
contacts.size.should == 3
|
128
|
+
|
129
|
+
contacts[0]['id'].should == '8'
|
130
|
+
contacts[0]['Contact Information']['E-Mail'].should == 'bobby@example.com'
|
131
|
+
contacts[0]['Lead Information']['Contact Owner'].should == 'Jimbo Watunusi'
|
132
|
+
|
133
|
+
contacts[1]['id'].should == '5'
|
134
|
+
contacts[1]['Contact Information']['E-Mail'].should == 'ali@example.com'
|
135
|
+
contacts[1]['Lead Information']['Contact Owner'].should == 'Jimbo Watunusi'
|
67
136
|
end
|
68
137
|
end
|
69
138
|
end
|
70
139
|
|
140
|
+
describe "#contacts_add" do
|
141
|
+
it "returns the newly created contact" do
|
142
|
+
contact_options = {
|
143
|
+
'Contact Information' => {'First Name' => 'prashant', 'Last Name' => 'nadarajan', 'E-Mail' => 'prashant@example.com'},
|
144
|
+
'Lead Information' => {'Contact Owner' => 'Don Corleone'}
|
145
|
+
}
|
146
|
+
|
147
|
+
request_contact_xml = @client.xml_for_contact(contact_options)
|
148
|
+
response_contact_xml = test_data('contacts_add_response.xml')
|
149
|
+
|
150
|
+
request_body = "reqType=add&return_id=1&data=#{escape_xml(request_contact_xml)}&#{@auth_str}"
|
151
|
+
stub_request(:post, @contact_endpoint).with(:body => request_body).to_return(:body => response_contact_xml)
|
152
|
+
|
153
|
+
contact = @client.contacts_add(contact_options)
|
154
|
+
WebMock.should have_requested(:post, @contact_endpoint).with(:body => request_body)
|
155
|
+
|
156
|
+
contact['id'].should == '7'
|
157
|
+
contact['Contact Information']['First Name'].should == 'prashant'
|
158
|
+
contact['Contact Information']['Last Name'].should == 'nadarajan'
|
159
|
+
contact['Contact Information']['E-Mail'].should == 'prashant@example.com'
|
160
|
+
contact['Lead Information']['Contact Owner'].should == 'Don Corleone'
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
71
164
|
end
|
@@ -2,87 +2,51 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe OfficeAutopilot::Client do
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
before do
|
6
|
+
@api_id = 'foo'
|
7
|
+
@api_key = 'bar'
|
8
|
+
@client = OfficeAutopilot::Client.new(:api_id => @api_id, :api_key => @api_key)
|
9
|
+
end
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
client.api_id.should == @api_id
|
14
|
-
client.api_key.should == @api_key
|
15
|
-
client.auth.should == { 'Appid' => @api_id, 'Key' => @api_key }
|
11
|
+
describe "#new" do
|
12
|
+
it "initializes with the given API credentials" do
|
13
|
+
@client.api_id.should == @api_id
|
14
|
+
@client.api_key.should == @api_key
|
15
|
+
@client.auth.should == { 'Appid' => @api_id, 'Key' => @api_key }
|
16
16
|
end
|
17
17
|
|
18
|
-
it "raises an ArgumentError when api_id is not provided" do
|
18
|
+
it "raises an ArgumentError when :api_id is not provided" do
|
19
19
|
expect {
|
20
20
|
OfficeAutopilot::Client.new(:api_key => 'foo')
|
21
21
|
}.to raise_error(ArgumentError)
|
22
22
|
end
|
23
23
|
|
24
|
-
it "raises an ArgumentError when api_key is not provided" do
|
24
|
+
it "raises an ArgumentError when :api_key is not provided" do
|
25
25
|
expect {
|
26
26
|
OfficeAutopilot::Client.new(:api_id => 'foo')
|
27
27
|
}.to raise_error(ArgumentError)
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
-
describe "
|
32
|
-
it "
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
it "set the format to :xml" do
|
37
|
-
OfficeAutopilot::Client.format.should == :plain
|
31
|
+
describe "#request" do
|
32
|
+
it "makes a HTTP request" do
|
33
|
+
pending "can't seem to stub out OfficeAutopilot::Request.post"
|
38
34
|
end
|
39
35
|
end
|
40
36
|
|
41
|
-
describe "#
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
# <search>
|
47
|
-
# <equation>
|
48
|
-
# <field>E-Mail</field>
|
49
|
-
# <op>e</op>
|
50
|
-
# <value>john@example.com</value>
|
51
|
-
# </equation>
|
52
|
-
# </search>
|
53
|
-
|
54
|
-
context "searching with one field" do
|
55
|
-
it "returns a valid simple search data xml" do
|
56
|
-
field = "E-Mail"
|
57
|
-
op = "e"
|
58
|
-
value = "john@example.com"
|
59
|
-
|
60
|
-
xml = Nokogiri::XML(@client.xml_for_search(:field => field, :op => op, :value => value))
|
61
|
-
xml.at_css('field').content.should == field
|
62
|
-
xml.at_css('op').content.should == op
|
63
|
-
xml.at_css('value').content.should == value
|
37
|
+
describe "#handle_response" do
|
38
|
+
context "when there are no errors" do
|
39
|
+
it "returns the response verbatim" do
|
40
|
+
response = '<result>Success</result>'
|
41
|
+
@client.handle_response(response).should == response
|
64
42
|
end
|
65
43
|
end
|
66
44
|
|
67
|
-
context "
|
68
|
-
it "
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
search_options = [
|
74
|
-
{:field => 'E-Mail', :op => 'e', :value => 'foo@example.com'},
|
75
|
-
{:field => 'Contact Tags', :op => 'n', :value => 'bar'},
|
76
|
-
]
|
77
|
-
|
78
|
-
xml = @client.xml_for_search(search_options)
|
79
|
-
xml = Nokogiri::XML(xml)
|
80
|
-
xml.css('field')[0].content.should == 'E-Mail'
|
81
|
-
xml.css('op')[0].content.should == 'e'
|
82
|
-
xml.css('value')[0].content.should == 'foo@example.com'
|
83
|
-
xml.css('field')[1].content.should == 'Contact Tags'
|
84
|
-
xml.css('op')[1].content.should == 'n'
|
85
|
-
xml.css('value')[1].content.should == 'bar'
|
45
|
+
context "invalid XML error" do
|
46
|
+
it "raises OfficeAutopilot::XmlError" do
|
47
|
+
expect {
|
48
|
+
@client.handle_response( test_data('invalid_xml_error_response.xml') )
|
49
|
+
}.to raise_error(OfficeAutopilot::XmlError)
|
86
50
|
end
|
87
51
|
end
|
88
52
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe OfficeAutopilot::Request do
|
4
|
+
|
5
|
+
describe "HTTParty" do
|
6
|
+
it "sets the base uri to the Office Autopilot API host" do
|
7
|
+
OfficeAutopilot::Request.base_uri.should == 'http://api.moon-ray.com'
|
8
|
+
end
|
9
|
+
|
10
|
+
it "set the format to :plain" do
|
11
|
+
OfficeAutopilot::Request.format.should == :plain
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
|
-
#Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
|
2
|
-
|
3
|
-
|
4
1
|
require 'office_autopilot'
|
5
2
|
|
6
3
|
require 'cgi'
|
7
4
|
require 'webmock/rspec'
|
8
5
|
|
9
6
|
|
7
|
+
# disallow all non-local connections
|
8
|
+
#WebMock.disable_net_connect!(:allow_localhost => true)
|
9
|
+
|
10
|
+
|
10
11
|
RSpec.configure do |config|
|
11
12
|
end
|
12
13
|
|
@@ -16,9 +17,9 @@ def test_data(file_name)
|
|
16
17
|
end
|
17
18
|
|
18
19
|
def api_endpoint
|
19
|
-
|
20
|
+
"http://api.moon-ray.com"
|
20
21
|
end
|
21
22
|
|
22
23
|
def escape_xml(xml)
|
23
|
-
CGI.escape(xml)
|
24
|
+
CGI.escape(xml).gsub('+', '%20')
|
24
25
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: office_autopilot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.3
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Prashant Nadarajan
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-03
|
13
|
+
date: 2011-05-03 00:00:00 +08:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -98,12 +98,17 @@ files:
|
|
98
98
|
- lib/office_autopilot.rb
|
99
99
|
- lib/office_autopilot/client.rb
|
100
100
|
- lib/office_autopilot/client/contacts.rb
|
101
|
+
- lib/office_autopilot/error.rb
|
102
|
+
- lib/office_autopilot/request.rb
|
101
103
|
- lib/office_autopilot/version.rb
|
102
104
|
- office_autopilot.gemspec
|
105
|
+
- spec/data/contacts_add_response.xml
|
103
106
|
- spec/data/contacts_search_multiple_response.xml
|
104
107
|
- spec/data/contacts_search_single_response.xml
|
108
|
+
- spec/data/invalid_xml_error_response.xml
|
105
109
|
- spec/office_autopilot/client/contacts_spec.rb
|
106
110
|
- spec/office_autopilot/client_spec.rb
|
111
|
+
- spec/office_autopilot/request_spec.rb
|
107
112
|
- spec/spec_helper.rb
|
108
113
|
has_rdoc: true
|
109
114
|
homepage: https://github.com/prashantrajan/office_autopilot
|
@@ -134,8 +139,11 @@ signing_key:
|
|
134
139
|
specification_version: 3
|
135
140
|
summary: Ruby wrapper for the OfficeAutopilot API
|
136
141
|
test_files:
|
142
|
+
- spec/data/contacts_add_response.xml
|
137
143
|
- spec/data/contacts_search_multiple_response.xml
|
138
144
|
- spec/data/contacts_search_single_response.xml
|
145
|
+
- spec/data/invalid_xml_error_response.xml
|
139
146
|
- spec/office_autopilot/client/contacts_spec.rb
|
140
147
|
- spec/office_autopilot/client_spec.rb
|
148
|
+
- spec/office_autopilot/request_spec.rb
|
141
149
|
- spec/spec_helper.rb
|