voxcast_api 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/voxcast_api/base.rb +4 -0
- data/lib/voxcast_api/http.rb +0 -1
- data/spec/lib/voxcast_api_spec.rb +174 -0
- metadata +3 -2
data/lib/voxcast_api/base.rb
CHANGED
@@ -1,11 +1,15 @@
|
|
1
|
+
gem 'url_maker'
|
1
2
|
require 'time'
|
2
3
|
require 'set'
|
3
4
|
require 'digest/md5'
|
4
5
|
require 'forwardable'
|
5
6
|
require 'hpricot'
|
7
|
+
require 'active_support/core_ext/hash'
|
8
|
+
require 'url_maker'
|
6
9
|
|
7
10
|
class VoxcastApi::Base < VoxcastApi::Http
|
8
11
|
extend Forwardable
|
12
|
+
include UrlMaker
|
9
13
|
|
10
14
|
def_delegators :@entry, :device_id
|
11
15
|
attr_accessor :key, :secret_key
|
data/lib/voxcast_api/http.rb
CHANGED
@@ -0,0 +1,174 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
require 'net/http'
|
3
|
+
require 'digest/md5'
|
4
|
+
require 'voxcast_api'
|
5
|
+
|
6
|
+
describe VoxcastApi::Base do
|
7
|
+
class MockHTTP
|
8
|
+
attr_accessor :requests, :gets, :posts, :get_response, :auth,
|
9
|
+
:post_response, :request_response, :read_timeout, :use_ssl, :ssl_args
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@requests = []
|
13
|
+
@gets = []
|
14
|
+
@posts = []
|
15
|
+
@get_response = nil
|
16
|
+
@post_response = nil
|
17
|
+
@request_response = nil
|
18
|
+
@read_timeout = nil
|
19
|
+
@use_ssl = nil
|
20
|
+
@ssl_args = nil
|
21
|
+
# used to work with HTTPi expectations as well
|
22
|
+
@auth = MockAuth.new
|
23
|
+
end
|
24
|
+
|
25
|
+
def start
|
26
|
+
yield self
|
27
|
+
end
|
28
|
+
|
29
|
+
def ssl_client_auth(ssl_args)
|
30
|
+
@ssl_args = ssl_args
|
31
|
+
end
|
32
|
+
|
33
|
+
def request(req)
|
34
|
+
@requests << req
|
35
|
+
@request_response
|
36
|
+
end
|
37
|
+
|
38
|
+
def get(uri)
|
39
|
+
@gets << uri
|
40
|
+
@get_response
|
41
|
+
end
|
42
|
+
|
43
|
+
def post(uri, data)
|
44
|
+
@posts << [uri, data]
|
45
|
+
@post_response
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
class MockAuth
|
50
|
+
attr_accessor :user, :password, :verify_mode, :ssl
|
51
|
+
|
52
|
+
def initialize(init_ssl = true)
|
53
|
+
@user = @password = @verify_mode = nil
|
54
|
+
@ssl = MockAuth.new(false) if init_ssl
|
55
|
+
end
|
56
|
+
|
57
|
+
def basic(user, pass)
|
58
|
+
@user = user
|
59
|
+
@password = pass
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def mock_http(set = true)
|
64
|
+
http = MockHTTP.new
|
65
|
+
Net::HTTP.stub!(:new).and_return(http) if set
|
66
|
+
http
|
67
|
+
end
|
68
|
+
|
69
|
+
def setup_http(code = '200', body = '')
|
70
|
+
@mock_http = mock_http
|
71
|
+
@mock_resp = mock('response')
|
72
|
+
@mock_resp.stub!(:code).and_return code
|
73
|
+
@mock_resp.stub!(:body).and_return body
|
74
|
+
@mock_http.get_response = @mock_resp
|
75
|
+
@mock_http.post_response = @mock_resp
|
76
|
+
@mock_http.request_response = @mock_resp
|
77
|
+
end
|
78
|
+
|
79
|
+
before(:each) do
|
80
|
+
@mock_entry = mock("Voxcast", :purge_url => 'http://purge.com', :purge_user => 'user',
|
81
|
+
:purge_password => 'pass', :purge_key => 'key', :purge_secret_key => 'secret',
|
82
|
+
:http_domain => 'domain', :logger => nil)
|
83
|
+
@api = VoxcastApi::Base.new(@mock_entry)
|
84
|
+
base_dir = File.expand_path('../../../xml', __FILE__)
|
85
|
+
@log_list = File.join(base_dir, 'log_list.xml')
|
86
|
+
@purge_ret = File.join(base_dir, 'purge.xml')
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should check auth_key? properly" do
|
90
|
+
params = {}
|
91
|
+
@api.auth_key?(params).should == false
|
92
|
+
params = {'method' => 'something'}
|
93
|
+
@api.auth_key?(params).should == false
|
94
|
+
params = {'method' => 'voxel.hapi.authkeys.read'}
|
95
|
+
@api.auth_key?(params).should == true
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should execute_method properly" do
|
99
|
+
params = {'a' => 'b'}
|
100
|
+
looked = 'found'
|
101
|
+
@api.should_receive(:execute).with(nil, params.merge('method' => looked))
|
102
|
+
@api.should_receive(:lookup_method).with(:purge_file).and_return looked
|
103
|
+
@api.execute_method(:purge_file, params)
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should execute_method for auth_key" do
|
107
|
+
@api.should_receive(:execute).with('https://purge.com', {'method' => 'voxel.hapi.authkeys.read'})
|
108
|
+
@api.execute_method(:auth_key)
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should generate api_sig properly" do
|
112
|
+
params = {'a' => 'b',
|
113
|
+
'c' => 'd'
|
114
|
+
}
|
115
|
+
expected = Digest::MD5.hexdigest('secret keyabcd')
|
116
|
+
sig = @api.api_sig(params, 'secret key')
|
117
|
+
sig.should == expected
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should generate api_sig if using sym" do
|
121
|
+
params = {:c => 'd',
|
122
|
+
'a' => 'b'
|
123
|
+
}
|
124
|
+
expected = Digest::MD5.hexdigest('secret keyabcd')
|
125
|
+
sig = @api.api_sig(params, 'secret key')
|
126
|
+
sig.should == expected
|
127
|
+
end
|
128
|
+
|
129
|
+
it "should process_response properly" do
|
130
|
+
resp = mock('response')
|
131
|
+
body = File.read(@purge_ret)
|
132
|
+
resp.stub!(:code).and_return 200
|
133
|
+
resp.stub!(:body).and_return body
|
134
|
+
ret = @api.process_response(resp)
|
135
|
+
ret[:status].should == true
|
136
|
+
id = '048c7546-b4f8-42f4-89da-3544cbd13c4c'
|
137
|
+
ret[:detail]['transaction']['id'].should == id
|
138
|
+
end
|
139
|
+
|
140
|
+
it "should get_data properly" do
|
141
|
+
@api.should_receive(:timestamp).and_return 'timestamp'
|
142
|
+
@api.should_receive(:api_sig).and_return 'sig'
|
143
|
+
CGI.parse(@api.get_data).should == {'timestamp' => ['timestamp'], 'key' => ['key'], 'api_sig' => ['sig']}
|
144
|
+
end
|
145
|
+
|
146
|
+
it "should handle log_list which return error" do
|
147
|
+
@api.should_receive(:execute_method).with(:log_list, {:complex_parser => true}).and_return({:status => false})
|
148
|
+
@api.log_list.should == []
|
149
|
+
end
|
150
|
+
|
151
|
+
it "should handle log_list properly" do
|
152
|
+
setup_http
|
153
|
+
body = File.read(@log_list)
|
154
|
+
@mock_resp.stub!(:body).and_return body
|
155
|
+
ret = @api.log_list
|
156
|
+
# there should be 4 log files
|
157
|
+
ret.size.should == 4
|
158
|
+
end
|
159
|
+
|
160
|
+
it "should handle log_download properly" do
|
161
|
+
setup_http
|
162
|
+
@mock_resp.stub!(:body).and_return 'blah'
|
163
|
+
dst = File.join('/tmp', 'dst_file')
|
164
|
+
begin
|
165
|
+
@api.should_not_receive(:process_response)
|
166
|
+
@api.log_download('myfile', dst).should be_true
|
167
|
+
File.exists?(dst).should be_true
|
168
|
+
File.read(dst).should == 'blah'
|
169
|
+
ensure
|
170
|
+
File.delete(dst) if File.exists?(dst)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 1
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 1.0.
|
8
|
+
- 1
|
9
|
+
version: 1.0.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Bruce Wang
|
@@ -34,6 +34,7 @@ files:
|
|
34
34
|
- lib/voxcast_api/base.rb
|
35
35
|
- lib/voxcast_api/http.rb
|
36
36
|
- lib/voxcast_api/purge.rb
|
37
|
+
- spec/lib/voxcast_api_spec.rb
|
37
38
|
has_rdoc: true
|
38
39
|
homepage: http://rubygems.org/gems/voxcast_api
|
39
40
|
licenses: []
|