mixpanel_client 3.1.4 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,34 +2,53 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
3
  describe Mixpanel::Client do
4
4
  before :all do
5
- @client = Mixpanel::Client.new(:api_key => 'test_key', :api_secret => 'test_secret')
5
+ @client = Mixpanel::Client.new(
6
+ api_key: 'test_key',
7
+ api_secret: 'test_secret'
8
+ )
9
+
6
10
  @uri = Regexp.escape(Mixpanel::Client::BASE_URI)
7
11
  end
8
12
 
9
13
  context 'when initializing a new Mixpanel::Client' do
10
14
  it 'should not raise an exception if a hash is given' do
11
- Mixpanel::Client.new('api_key' => 'test_key', 'api_secret' => 'test_secret').should_not{raise_error}
15
+ Mixpanel::Client.new(
16
+ 'api_key' => 'test_key',
17
+ 'api_secret' => 'test_secret'
18
+ ).should_not { raise_error }
12
19
  end
13
20
 
14
21
  it 'should set a parallel option as false by default' do
15
- Mixpanel::Client.new(:api_key => 'test_key', :api_secret => 'test_secret').parallel.should == false
22
+ Mixpanel::Client.new(
23
+ api_key: 'test_key',
24
+ api_secret: 'test_secret'
25
+ ).parallel.should eq false
16
26
  end
17
27
 
18
28
  it 'should be able to set a parallel option when passed' do
19
- Mixpanel::Client.new(:api_key => 'test_key', :api_secret => 'test_secret', :parallel => true).parallel.should == true
29
+ Mixpanel::Client.new(
30
+ api_key: 'test_key',
31
+ api_secret: 'test_secret',
32
+ parallel: true
33
+ ).parallel.should eq true
20
34
  end
21
35
  end
22
36
 
23
37
  context 'when making an invalid request' do
24
- it 'should return an argument error "Wrong number of arguments" if using the deprecated usage' do
38
+ it 'should return an argument error "Wrong number of arguments" if using
39
+ the deprecated usage' do
25
40
  # Stub Mixpanel request
26
- stub_request(:get, /^#{@uri}.*/).to_return(:body => '{"legend_size": 0, "data": {"series": [], "values": {}}}')
27
-
28
- data = lambda{@client.request(nil, :events, {
29
- :event => '["test-event"]',
30
- :unit => 'hour',
31
- :interval => 24
32
- })}
41
+ stub_request(:get, /^#{@uri}.*/)
42
+ .to_return(
43
+ body: '{"legend_size": 0, "data": {"series": [], "values": {}}}'
44
+ )
45
+
46
+ data = lambda do@client.request(nil, :events,
47
+ event: '["test-event"]',
48
+ unit: 'hour',
49
+ interval: 24
50
+ )
51
+ end
33
52
  data.should raise_error(ArgumentError)
34
53
  end
35
54
  end
@@ -37,91 +56,134 @@ describe Mixpanel::Client do
37
56
  context 'when making a valid request' do
38
57
  it 'should work without an endpoint' do
39
58
  # Stub Mixpanel request
40
- stub_request(:get, /^#{@uri}.*/).to_return(:body => '{"legend_size": 0, "data": {"series": [], "values": {}}}')
59
+ stub_request(:get, /^#{@uri}.*/)
60
+ .to_return(
61
+ body: '{"legend_size": 0, "data": {"series": [], "values": {}}}'
62
+ )
41
63
 
42
64
  # No endpoint
43
- data = @client.request('events', {
44
- :event => '["test-event"]',
45
- :unit => 'hour',
46
- :interval => 24
47
- })
48
- data.should == {"data"=>{"series"=>[], "values"=>{}}, "legend_size"=>0}
65
+ data = @client.request('events',
66
+ event: '["test-event"]',
67
+ unit: 'hour',
68
+ interval: 24
69
+ )
70
+ data.should eq(
71
+ 'data' => {
72
+ 'series' => [],
73
+ 'values' => {}
74
+ },
75
+ 'legend_size' => 0
76
+ )
49
77
  end
50
78
 
51
79
  it 'should work when it receives an integer response on import' do
52
80
  @import_uri = Regexp.escape(Mixpanel::Client::IMPORT_URI)
53
81
  # Stub Mixpanel import request to return a realistic response
54
- stub_request(:get, /^#{@import_uri}.*/).to_return(:body => '1')
82
+ stub_request(:get, /^#{@import_uri}.*/).to_return(body: '1')
55
83
 
56
- data = @client.request('import', {
57
- :data => 'base64_encoded_data',
58
- :api_key => 'test_key'
59
- })
84
+ data = @client.request('import',
85
+ data: 'base64_encoded_data',
86
+ api_key: 'test_key'
87
+ )
60
88
  data.should == [1]
61
89
  end
62
90
 
63
91
  it 'should work with an endpoint, method, and type' do
64
92
  # Stub Mixpanel request
65
- stub_request(:get, /^#{@uri}.*/).to_return(:body => '{"events": [], "type": "general"}')
93
+ stub_request(:get, /^#{@uri}.*/)
94
+ .to_return(
95
+ body: '{"events": [], "type": "general"}'
96
+ )
66
97
 
67
98
  # With endpoint
68
- data = @client.request('events/top', {
69
- :type => 'general'
70
- })
71
- data.should == {"events"=>[], "type"=>"general"}
99
+ data = @client.request(
100
+ 'events/top',
101
+ type: 'general'
102
+ )
103
+
104
+ data.should eq(
105
+ 'events' => [],
106
+ 'type' => 'general'
107
+ )
72
108
  end
73
109
 
74
110
  it 'does not modify the provided options' do
75
111
  options = { foo: 'bar' }
76
112
  # Stub Mixpanel request
77
- stub_request(:get, /^#{@uri}.*/).to_return(:body => '{"events": [], "type": "general"}')
78
- expect {
113
+ stub_request(:get, /^#{@uri}.*/)
114
+ .to_return(
115
+ body: '{"events": [], "type": "general"}'
116
+ )
117
+
118
+ expect do
79
119
  @client.request('events/top', options)
80
- }.to_not change { options }
120
+ end.to_not change { options }
81
121
  end
82
122
 
83
123
  context 'with a custom expiry time' do
84
124
  # Stub Mixpanel request
85
- before { stub_request(:get, /^#{@uri}.*/).to_return(:body => '{"events": [], "type": "general"}') }
86
- let(:expiry) { Time.now + 100000 }
125
+ before do
126
+ stub_request(:get, /^#{@uri}.*/)
127
+ .to_return(
128
+ body: '{"events": [], "type": "general"}'
129
+ )
130
+ end
131
+
132
+ let(:expiry) { Time.now + 100_000 }
87
133
  let(:fake_url) { Mixpanel::Client::BASE_URI }
88
134
 
89
- specify 'Client#request should return a hash with empty events and type' do
135
+ specify 'Client#request should return a hash with empty events and
136
+ type' do
90
137
  # With endpoint
91
- data = @client.request('events/top', {
92
- :type => 'general',
93
- :expire => expiry
94
- })
95
- data.should == {"events"=>[], "type"=>"general"}
138
+ data = @client.request(
139
+ 'events/top',
140
+ type: 'general',
141
+ expire: expiry
142
+ )
143
+
144
+ data.should eq(
145
+ 'events' => [],
146
+ 'type' => 'general'
147
+ )
96
148
  end
97
149
 
98
- specify 'Mixpanel::URI instance should receive the custom expiry time in the options[:expiry] instead of 600s' do
150
+ specify 'Mixpanel::URI instance should receive the custom expiry time in
151
+ the options[:expiry] instead of 600s' do
99
152
  Mixpanel::URI.should_receive(:mixpanel).with do |*args|
100
- args.pop[:expire].should == expiry.to_i
153
+ args.pop[:expire].should eq expiry.to_i
101
154
  true
102
155
  end.and_return(fake_url)
103
- @client.request('events/top', {
104
- :type => 'general',
105
- :expire => expiry
106
- })
156
+ @client.request('events/top',
157
+ type: 'general',
158
+ expire: expiry
159
+ )
107
160
  end
108
161
  end
109
162
 
110
- context "with parallel option enabled" do
163
+ context 'with parallel option enabled' do
111
164
  before :all do
112
- @parallel_client = Mixpanel::Client.new(:api_key => 'test_key', :api_secret => 'test_secret', :parallel => true)
165
+ @parallel_client = Mixpanel::Client.new(
166
+ api_key: 'test_key',
167
+ api_secret: 'test_secret',
168
+ parallel: true
169
+ )
113
170
  end
114
171
 
115
- it "should return Typhoeus::Request" do
172
+ it 'should return Typhoeus::Request' do
116
173
  # Stub Mixpanel request
117
- stub_request(:get, /^#{@uri}.*/).to_return(:body => '{"legend_size": 0, "data": {"series": [], "values": {}}}')
174
+ stub_request(:get, /^#{@uri}.*/)
175
+ .to_return(
176
+ body: '{"legend_size": 0, "data": {"series": [], "values": {}}}'
177
+ )
118
178
 
119
179
  # No endpoint
120
- data = @parallel_client.request('events', {
121
- :event => '["test-event"]',
122
- :unit => 'hour',
123
- :interval => 24
124
- })
180
+ data = @parallel_client.request(
181
+ 'events',
182
+ event: '["test-event"]',
183
+ unit: 'hour',
184
+ interval: 24
185
+ )
186
+
125
187
  data.should be_a Typhoeus::Request
126
188
  end
127
189
 
@@ -134,45 +196,89 @@ describe Mixpanel::Client do
134
196
  describe '#run_parallel_requests' do
135
197
  it 'should run queued requests' do
136
198
  # Stub Mixpanel request
137
- stub_request(:any, /^#{@uri}.*/).to_return(:body => '{"legend_size": 1, "data": {"series": ["2010-05-29","2010-05-30","2010-05-31"],
138
- "values": {
139
- "account-page": {"2010-05-30": 1},
140
- "splash features": {"2010-05-29": 6,
141
- "2010-05-30": 4,
142
- "2010-05-31": 5
143
- }
144
- }
145
- }
146
- }')
147
-
148
-
149
- stub_request(:any, /^#{@uri}.*secondevent.*/).to_return(:body => '{"legend_size": 2, "data": {"series": ["2010-05-29","2010-05-30","2010-05-31"],
150
- "values": {
151
- "account-page": {"2010-05-30": 2},
152
- "splash features": {"2010-05-29": 8,
153
- "2010-05-30": 6,
154
- "2010-05-31": 7
155
- }
156
- }
157
- }
158
- }')
159
-
160
- first_request = @parallel_client.request('events', {
161
- :event => '["firstevent"]',
162
- :unit => 'day'
163
- })
164
-
165
-
166
- second_request = @parallel_client.request('events', {
167
- :event => '["secondevent"]',
168
- :unit => 'day'
169
- })
199
+ stub_request(:any, /^#{@uri}.*/)
200
+ .to_return(
201
+ body: '{
202
+ "legend_size": 1,
203
+ "data": {
204
+ "series": ["2010-05-29","2010-05-30","2010-05-31"],
205
+ "values": {
206
+ "account-page": {"2010-05-30": 1},
207
+ "splash features": {
208
+ "2010-05-29": 6,
209
+ "2010-05-30": 4,
210
+ "2010-05-31": 5
211
+ }
212
+ }
213
+ }
214
+ }'
215
+ )
216
+
217
+ stub_request(:any, /^#{@uri}.*secondevent.*/)
218
+ .to_return(
219
+ body: '{
220
+ "legend_size": 2,
221
+ "data": {
222
+ "series": ["2010-05-29","2010-05-30","2010-05-31"],
223
+ "values": {
224
+ "account-page": {"2010-05-30": 2},
225
+ "splash features": {
226
+ "2010-05-29": 8,
227
+ "2010-05-30": 6,
228
+ "2010-05-31": 7
229
+ }
230
+ }
231
+ }
232
+ }'
233
+ )
234
+
235
+ first_request = @parallel_client.request(
236
+ 'events',
237
+ event: '["firstevent"]',
238
+ unit: 'day'
239
+ )
240
+
241
+ second_request = @parallel_client.request(
242
+ 'events',
243
+ event: '["secondevent"]',
244
+ unit: 'day'
245
+ )
170
246
 
171
247
  @parallel_client.run_parallel_requests
172
248
 
173
- first_request.response.handled_response.should == {"data"=>{"series"=>["2010-05-29", "2010-05-30", "2010-05-31"], "values"=>{"splash features"=>{"2010-05-29"=>6, "2010-05-30"=>4, "2010-05-31"=>5}, "account-page"=>{"2010-05-30"=>1}}}, "legend_size"=>1}
174
-
175
- second_request.response.handled_response.should == {"data"=>{"series"=>["2010-05-29", "2010-05-30", "2010-05-31"], "values"=>{"splash features"=>{"2010-05-29"=>8, "2010-05-30"=>6, "2010-05-31"=>7}, "account-page"=>{"2010-05-30"=>2}}}, "legend_size"=>2}
249
+ first_request.response.handled_response.should eq(
250
+ 'data' => {
251
+ 'series' => %w(2010-05-29 2010-05-30 2010-05-31),
252
+ 'values' => {
253
+ 'splash features' => {
254
+ '2010-05-29' => 6,
255
+ '2010-05-30' => 4,
256
+ '2010-05-31' => 5
257
+ },
258
+ 'account-page' => {
259
+ '2010-05-30' => 1
260
+ }
261
+ }
262
+ },
263
+ 'legend_size' => 1
264
+ )
265
+
266
+ second_request.response.handled_response.should eq(
267
+ 'data' => {
268
+ 'series' => %w(2010-05-29 2010-05-30 2010-05-31),
269
+ 'values' => {
270
+ 'splash features' => {
271
+ '2010-05-29' => 8,
272
+ '2010-05-30' => 6,
273
+ '2010-05-31' => 7
274
+ },
275
+ 'account-page' => {
276
+ '2010-05-30' => 2
277
+ }
278
+ }
279
+ },
280
+ 'legend_size' => 2
281
+ )
176
282
  end
177
283
  end
178
284
  end
@@ -180,16 +286,32 @@ describe Mixpanel::Client do
180
286
 
181
287
  describe '#hash_args' do
182
288
  it 'should return a hashed string alpha sorted by key names.' do
183
- args = {:c => 'see', :a => 'ey', :d => 'dee', :b => 'bee'}
184
- args_alpha_sorted = {:a => 'ey', :b => 'bee', :c => 'see', :d => 'dee'}
185
- Mixpanel::Client::Utils.generate_signature(args, @client.api_secret).should == Mixpanel::Client::Utils.generate_signature(args_alpha_sorted, @client.api_secret)
289
+ args = { c: 'see', a: 'ey', d: 'dee', b: 'bee' }
290
+ args_alpha_sorted = { a: 'ey', b: 'bee', c: 'see', d: 'dee' }
291
+
292
+ unsorted_signature = Mixpanel::Client::Utils.generate_signature(
293
+ args,
294
+ @client.api_secret
295
+ )
296
+
297
+ sorted_signature = Mixpanel::Client::Utils.generate_signature(
298
+ args_alpha_sorted,
299
+ @client.api_secret
300
+ )
301
+
302
+ unsorted_signature.should eq sorted_signature
186
303
  end
187
304
  end
188
305
 
189
306
  describe '#to_hash' do
190
307
  it 'should return a ruby hash given json as a string' do
191
- Mixpanel::Client::Utils.to_hash('{"a" : "ey", "b" : "bee"}', :json).should == {'a' => 'ey', 'b' => 'bee'}
308
+ Mixpanel::Client::Utils.to_hash(
309
+ '{"a" : "ey", "b" : "bee"}',
310
+ :json
311
+ ).should eq(
312
+ 'a' => 'ey',
313
+ 'b' => 'bee'
314
+ )
192
315
  end
193
316
  end
194
-
195
317
  end
@@ -4,30 +4,37 @@ WebMock.allow_net_connect!
4
4
 
5
5
  describe 'External calls to mixpanel' do
6
6
  before :all do
7
- config = YAML.load_file(File.dirname(__FILE__) + '/../../config/mixpanel.yml')['mixpanel']
7
+ config = YAML.load_file(File.join(
8
+ File.dirname(__FILE__),
9
+ '..',
10
+ '..',
11
+ 'config',
12
+ 'mixpanel.yml'
13
+ ))['mixpanel']
14
+
8
15
  config.should_not be_nil
9
16
  @client = Mixpanel::Client.new(config)
10
17
  end
11
18
 
12
19
  context 'when requesting event properties' do
13
20
  it 'should raise an error for bad requests' do
14
- data = lambda {
21
+ data = lambda do
15
22
  @client.request('properties', {})
16
- }
23
+ end
17
24
  data.should raise_error(Mixpanel::HTTPError)
18
25
  end
19
26
 
20
27
  it 'should return events' do
21
- data = @client.request('events/properties', {
22
- :event => '["test-event"]',
23
- :name => 'hello',
24
- :values => '["uno", "dos"]',
25
- :type => 'general',
26
- :unit => 'hour',
27
- :interval => 24,
28
- :limit => 5,
29
- :bucket => 'kicked'
30
- })
28
+ data = @client.request('events/properties',
29
+ event: '["test-event"]',
30
+ name: 'hello',
31
+ values: '["uno", "dos"]',
32
+ type: 'general',
33
+ unit: 'hour',
34
+ interval: 24,
35
+ limit: 5,
36
+ bucket: 'kicked'
37
+ )
31
38
  data.should_not be_a Exception
32
39
  end
33
40
  end
@@ -3,35 +3,57 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
3
3
 
4
4
  describe Mixpanel::URI do
5
5
  describe '.mixpanel' do
6
- it 'should return a properly formatted mixpanel uri as a string (without an endpoint)' do
7
- resource, params = ['events', {:c => 'see', :a => 'ey'}]
8
- Mixpanel::URI.mixpanel(resource, params).should == "#{Mixpanel::Client::BASE_URI}/events?a=ey&c=see"
6
+ it 'should return a properly formatted mixpanel uri as a string (without an
7
+ endpoint)' do
8
+ resource, params = ['events', { c: 'see', a: 'ey' }]
9
+
10
+ Mixpanel::URI.mixpanel(resource, params).should eq(
11
+ "#{Mixpanel::Client::BASE_URI}/events?a=ey&c=see"
12
+ )
9
13
  end
10
- it 'should return a properly formatted mixpanel uri as a string (with an endpoint)' do
11
- resource, params = ['events/top', {:c => 'see', :a => 'ey'}]
12
- Mixpanel::URI.mixpanel(resource, params).should == "#{Mixpanel::Client::BASE_URI}/events/top?a=ey&c=see"
14
+
15
+ it 'should return a properly formatted mixpanel uri as a string (with an
16
+ endpoint)' do
17
+ resource, params = ['events/top', { c: 'see', a: 'ey' }]
18
+
19
+ Mixpanel::URI.mixpanel(resource, params).should eq(
20
+ "#{Mixpanel::Client::BASE_URI}/events/top?a=ey&c=see"
21
+ )
13
22
  end
14
- it 'should return a uri with a different endpoint when doing a raw data export' do
15
- resource, params = ['export', {:c => 'see', :a => 'ey'}]
16
- Mixpanel::URI.mixpanel(resource, params).should == "#{Mixpanel::Client::DATA_URI}/export?a=ey&c=see"
23
+
24
+ it 'should return a uri with a different endpoint when doing a raw data
25
+ export' do
26
+ resource, params = ['export', { c: 'see', a: 'ey' }]
27
+
28
+ Mixpanel::URI.mixpanel(resource, params).should eq(
29
+ "#{Mixpanel::Client::DATA_URI}/export?a=ey&c=see"
30
+ )
17
31
  end
18
- it 'should return a uri with a the correct endpoint when doing an import' do
19
- resource, params = ['import', {:c => 'see', :a => 'ey'}]
20
- Mixpanel::URI.mixpanel(resource, params).should == "#{Mixpanel::Client::IMPORT_URI}/import?a=ey&c=see"
32
+
33
+ it 'should return a uri with a the correct endpoint when doing an
34
+ import' do
35
+ resource, params = ['import', { c: 'see', a: 'ey' }]
36
+ Mixpanel::URI.mixpanel(resource, params).should eq(
37
+ "#{Mixpanel::Client::IMPORT_URI}/import?a=ey&c=see"
38
+ )
21
39
  end
22
40
  end
23
41
 
24
42
  describe '.encode' do
25
43
  it 'should return a string with url encoded values.' do
26
- params = {:hey => '!@#$%^&*()\/"Ü', :soo => "hëllö?"}
27
- Mixpanel::URI.encode(params).should == 'hey=%21%40%23%24%25%5E%26%2A%28%29%5C%2F%22%C3%9C&soo=h%C3%ABll%C3%B6%3F'
44
+ params = { hey: '!@#$%^&*()\/"Ü', soo: 'hëllö?' }
45
+
46
+ Mixpanel::URI.encode(params).should eq(
47
+ 'hey=%21%40%23%24%25%5E%26%2A%28%29%5C%2F%22%C3%9C&soo=h%C3%ABll%C3%B6%3F' # rubocop:disable LineLength
48
+ )
28
49
  end
29
50
  end
30
51
 
31
52
  describe '.get' do
32
53
  it 'should return a string response' do
33
- stub_request(:get, 'http://example.com').to_return(:body => 'something')
34
- Mixpanel::URI.get('http://example.com').should == 'something'
54
+ stub_request(:get, 'http://example.com').to_return(body: 'something')
55
+
56
+ Mixpanel::URI.get('http://example.com').should eq 'something'
35
57
  end
36
58
  end
37
59
  end