adzerk 0.1.4 → 0.2
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/lib/adzerk.rb +15 -0
- data/lib/adzerk/advertiser.rb +9 -0
- data/lib/adzerk/api_endpoint.rb +41 -0
- data/lib/adzerk/channel_site_map.rb +53 -0
- data/lib/adzerk/client.rb +80 -0
- data/lib/adzerk/creative.rb +17 -0
- data/lib/adzerk/creative_map.rb +38 -0
- data/lib/adzerk/flight.rb +12 -0
- data/lib/adzerk/invitation.rb +23 -0
- data/lib/adzerk/publisher.rb +17 -0
- data/lib/adzerk/reporting.rb +21 -0
- data/lib/adzerk/util.rb +37 -0
- data/lib/adzerk/version.rb +3 -0
- data/test/advertiser_api_spec.rb +57 -82
- data/test/campaign_api_spec.rb +150 -271
- data/test/channel_api_spec.rb +72 -79
- data/test/channel_site_map_api_spec.rb +43 -94
- data/test/creative_api_spec.rb +82 -251
- data/test/creative_map_api_spec.rb +291 -375
- data/test/flight_api_spec.rb +165 -493
- data/test/invitation_api_spec.rb +18 -41
- data/test/login_api_spec.rb +24 -49
- data/test/priority_api_spec.rb +53 -83
- data/test/publisher_api_spec.rb +71 -142
- data/test/rakefile.rb +7 -7
- data/test/report_api_spec.rb +18 -24
- data/test/security_api_spec.rb +21 -0
- data/test/site_api_spec.rb +37 -51
- data/test/spec_helper.rb +4 -17
- data/test/zone_api_spec.rb +38 -64
- metadata +61 -23
- data/lib/Adzerk.rb +0 -55
- data/lib/adzerk/Advertiser.rb +0 -39
- data/lib/adzerk/Campaign.rb +0 -33
- data/lib/adzerk/Channel.rb +0 -33
- data/lib/adzerk/ChannelSiteMap.rb +0 -44
- data/lib/adzerk/Creative.rb +0 -43
- data/lib/adzerk/CreativeMap.rb +0 -33
- data/lib/adzerk/Flight.rb +0 -44
- data/lib/adzerk/Invitation.rb +0 -17
- data/lib/adzerk/Login.rb +0 -28
- data/lib/adzerk/Priority.rb +0 -34
- data/lib/adzerk/Publisher.rb +0 -47
- data/lib/adzerk/Reporting.rb +0 -16
- data/lib/adzerk/Site.rb +0 -35
- data/lib/adzerk/Zone.rb +0 -35
- data/test/channel_api_security_spec.rb +0 -51
- data/test/csv_export_spec.rb +0 -89
- data/test/delivery-test.rb +0 -132
- data/test/test.rb +0 -43
- data/test/test2.rb +0 -175
data/lib/adzerk.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require "json"
|
2
|
+
require "net/http"
|
3
|
+
require "active_support/inflector"
|
4
|
+
require "rest_client"
|
5
|
+
require "adzerk/util"
|
6
|
+
require "adzerk/api_endpoint"
|
7
|
+
require "adzerk/advertiser"
|
8
|
+
require "adzerk/flight"
|
9
|
+
require "adzerk/creative"
|
10
|
+
require "adzerk/creative_map"
|
11
|
+
require "adzerk/publisher"
|
12
|
+
require "adzerk/invitation"
|
13
|
+
require "adzerk/reporting"
|
14
|
+
require "adzerk/channel_site_map"
|
15
|
+
require "adzerk/client"
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Adzerk
|
2
|
+
class ApiEndpoint
|
3
|
+
|
4
|
+
include Adzerk::Util
|
5
|
+
|
6
|
+
attr_reader :client, :endpoint
|
7
|
+
|
8
|
+
def initialize(args= {})
|
9
|
+
@client = args[:client]
|
10
|
+
@endpoint = args[:endpoint]
|
11
|
+
end
|
12
|
+
|
13
|
+
def create(opts={})
|
14
|
+
data = { endpoint => camelize_data(opts).to_json }
|
15
|
+
response = @client.post_request(endpoint, data)
|
16
|
+
parse_response(response)
|
17
|
+
end
|
18
|
+
|
19
|
+
def get(id)
|
20
|
+
response = @client.get_request("#{endpoint}/#{id}")
|
21
|
+
parse_response(response)
|
22
|
+
end
|
23
|
+
|
24
|
+
def list
|
25
|
+
response = @client.get_request(endpoint)
|
26
|
+
parse_response(response)
|
27
|
+
end
|
28
|
+
|
29
|
+
def update(opts={})
|
30
|
+
id = opts[:id].to_s
|
31
|
+
data = { endpoint => camelize_data(opts).to_json }
|
32
|
+
response = @client.put_request("#{endpoint}/#{id}", data)
|
33
|
+
parse_response(response)
|
34
|
+
end
|
35
|
+
|
36
|
+
def delete(id)
|
37
|
+
url = "#{endpoint}/#{id}/delete"
|
38
|
+
@client.get_request(url)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Adzerk
|
2
|
+
class ChannelSiteMap
|
3
|
+
|
4
|
+
include Adzerk::Util
|
5
|
+
|
6
|
+
attr_reader :client
|
7
|
+
|
8
|
+
def initialize(args= {})
|
9
|
+
@client = args[:client]
|
10
|
+
end
|
11
|
+
|
12
|
+
def create(data={})
|
13
|
+
data = { 'channelSite' => camelize_data(data).to_json }
|
14
|
+
response = client.post_request('channelSite', data)
|
15
|
+
parse_response(response)
|
16
|
+
end
|
17
|
+
|
18
|
+
def get(channel_id, site_id)
|
19
|
+
url = "channel/#{channel_id}/site/#{site_id}"
|
20
|
+
response = client.get_request(url)
|
21
|
+
response = parse_response(response)
|
22
|
+
end
|
23
|
+
|
24
|
+
def list
|
25
|
+
response = client.get_request('channelSite')
|
26
|
+
parse_response(response)
|
27
|
+
end
|
28
|
+
|
29
|
+
def update(data={})
|
30
|
+
data = { 'channelSite' => camelize_data(data).to_json }
|
31
|
+
response = client.put_request('channelSite', data)
|
32
|
+
parse_response(response)
|
33
|
+
end
|
34
|
+
|
35
|
+
def delete(channel_id, site_id)
|
36
|
+
url = "channel/#{channel_id}/site/#{site_id}/delete"
|
37
|
+
client.get_request(url)
|
38
|
+
end
|
39
|
+
|
40
|
+
def sites_in_channel(channel_id)
|
41
|
+
url = "sitesInChannel/#{channel_id}"
|
42
|
+
response = client.get_request(url)
|
43
|
+
parse_response(response)
|
44
|
+
end
|
45
|
+
|
46
|
+
def channels_in_site(site_id)
|
47
|
+
url = "channelsInSite/#{site_id}"
|
48
|
+
response = client.get_request(url)
|
49
|
+
parse_response(response)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module Adzerk
|
2
|
+
class Client
|
3
|
+
|
4
|
+
include Adzerk::Util
|
5
|
+
|
6
|
+
attr_reader :sites, :zones, :campaigns, :channels, :priorities,
|
7
|
+
:advertisers, :flights, :creatives, :creative_maps,
|
8
|
+
:publishers, :invitations, :reports, :channel_site_maps,
|
9
|
+
:logins
|
10
|
+
|
11
|
+
DEFAULTS = {
|
12
|
+
:host => ENV["ADZERK_API_HOST"] || 'http://api.adzerk.net/v1/',
|
13
|
+
:header => 'X-Adzerk-ApiKey'
|
14
|
+
}
|
15
|
+
|
16
|
+
def initialize(key, opts = {})
|
17
|
+
@api_key = key
|
18
|
+
@config = DEFAULTS.merge!(opts)
|
19
|
+
@sites = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'site')
|
20
|
+
@flights = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'flight')
|
21
|
+
@zones = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'zone')
|
22
|
+
@campaigns = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'campaign')
|
23
|
+
@channels = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'channel')
|
24
|
+
@priorities = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'priority')
|
25
|
+
@advertisers = Adzerk::Advertiser.new(:client => self, :endpoint => 'advertiser')
|
26
|
+
@publishers = Adzerk::Publisher.new(:client => self, :endpoint => 'publisher')
|
27
|
+
@creatives = Adzerk::Creative.new(:client => self, :endpoint => 'creative')
|
28
|
+
@creative_maps = Adzerk::CreativeMap.new(:client => self)
|
29
|
+
@invitations = Adzerk::Invitation.new(:client => self)
|
30
|
+
@reports = Adzerk::Reporting.new(:client => self)
|
31
|
+
@channel_site_maps = Adzerk::ChannelSiteMap.new(:client => self)
|
32
|
+
@logins = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'login')
|
33
|
+
end
|
34
|
+
|
35
|
+
def get_request(url)
|
36
|
+
uri = URI.parse(@config[:host] + url)
|
37
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
38
|
+
request = Net::HTTP::Get.new(uri.request_uri)
|
39
|
+
request.add_field(@config[:header], @api_key)
|
40
|
+
http.request(request)
|
41
|
+
end
|
42
|
+
|
43
|
+
def post_request(url, data)
|
44
|
+
uri = URI.parse(@config[:host] + url)
|
45
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
46
|
+
request = Net::HTTP::Post.new(uri.request_uri)
|
47
|
+
request.add_field(@config[:header], @api_key)
|
48
|
+
request.set_form_data(data)
|
49
|
+
http.request(request)
|
50
|
+
end
|
51
|
+
|
52
|
+
def put_request(url, data)
|
53
|
+
uri = URI.parse(@config[:host] + url)
|
54
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
55
|
+
request = Net::HTTP::Put.new(uri.request_uri)
|
56
|
+
request.add_field(@config[:header], @api_key)
|
57
|
+
request.set_form_data(data)
|
58
|
+
http.request(request)
|
59
|
+
end
|
60
|
+
|
61
|
+
def create_creative(data={}, image_path='')
|
62
|
+
response = RestClient.post(@config[:host] + 'creative',
|
63
|
+
{:creative => camelize_data(data).to_json},
|
64
|
+
:X_Adzerk_ApiKey => @api_key,
|
65
|
+
:content_type => :json,
|
66
|
+
:accept => :json)
|
67
|
+
response = upload_creative(JSON.parse(response)["Id"], image_path) unless image_path.empty?
|
68
|
+
response
|
69
|
+
end
|
70
|
+
|
71
|
+
def upload_creative(id, image_path)
|
72
|
+
image = File.new(image_path, 'rb')
|
73
|
+
RestClient.post(@config[:host] + 'creative/' + id.to_s + '/upload',
|
74
|
+
{:image => image},
|
75
|
+
"X-Adzerk-ApiKey" => @api_key,
|
76
|
+
:accept => :mime)
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "rest_client"
|
2
|
+
|
3
|
+
module Adzerk
|
4
|
+
class Creative < ApiEndpoint
|
5
|
+
|
6
|
+
def create(data= {}, imagepath='')
|
7
|
+
response = @client.create_creative(data, imagepath)
|
8
|
+
uncamelize_data(JSON.parse(response))
|
9
|
+
end
|
10
|
+
|
11
|
+
def list(advertiserId)
|
12
|
+
url = 'advertiser/' + advertiserId.to_s + "/creatives"
|
13
|
+
parse_response(@client.get_request(url))
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Adzerk
|
2
|
+
class CreativeMap
|
3
|
+
|
4
|
+
include Adzerk::Util
|
5
|
+
|
6
|
+
def initialize(args={})
|
7
|
+
@client = args[:client]
|
8
|
+
end
|
9
|
+
|
10
|
+
def create(data={})
|
11
|
+
url = "flight/#{data[:flight_id]}/creative"
|
12
|
+
data = { 'creative' => camelize_data(data).to_json }
|
13
|
+
parse_response(@client.post_request(url, data))
|
14
|
+
end
|
15
|
+
|
16
|
+
def get(id, flight_id)
|
17
|
+
url = "flight/#{flight_id}/creative/#{id}"
|
18
|
+
parse_response(@client.get_request(url))
|
19
|
+
end
|
20
|
+
|
21
|
+
def list(flight_id)
|
22
|
+
url = "flight/#{flight_id}/creatives"
|
23
|
+
parse_response(@client.get_request(url))
|
24
|
+
end
|
25
|
+
|
26
|
+
def update(data={})
|
27
|
+
url = "flight/#{data[:flight_id]}/creative/#{data[:id]}"
|
28
|
+
data = { 'creative' => camelize_data(data).to_json }
|
29
|
+
parse_response(@client.put_request(url, data))
|
30
|
+
end
|
31
|
+
|
32
|
+
def delete(id, flight_id)
|
33
|
+
url = "flight/#{flight_id}/creative/#{id}/delete"
|
34
|
+
@client.get_request(url)
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Adzerk
|
2
|
+
class Invitation
|
3
|
+
|
4
|
+
include Adzerk::Util
|
5
|
+
|
6
|
+
attr_reader :client
|
7
|
+
|
8
|
+
def initialize(args= {})
|
9
|
+
@client = args[:client]
|
10
|
+
end
|
11
|
+
|
12
|
+
def invite_publisher(data={})
|
13
|
+
data = { 'invitation' => camelize_data(data).to_json }
|
14
|
+
@client.post_request('invite-publisher', data)
|
15
|
+
end
|
16
|
+
|
17
|
+
def invite_advertiser(data={})
|
18
|
+
data = { 'invitation' => camelize_data(data).to_json }
|
19
|
+
@client.post_request('invite-advertiser', data)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Adzerk
|
2
|
+
class Publisher < ApiEndpoint
|
3
|
+
|
4
|
+
def earnings(data={})
|
5
|
+
data = { 'earnings' => camelize_data(data).to_json }
|
6
|
+
response = @client.post_request('/earnings', data)
|
7
|
+
parse_response(response)
|
8
|
+
end
|
9
|
+
|
10
|
+
def payments(data={})
|
11
|
+
data = { 'payments' => camelize_data(data).to_json }
|
12
|
+
response = @client.post_request('/payments', data)
|
13
|
+
parse_response(response)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Adzerk
|
2
|
+
class Reporting
|
3
|
+
include Adzerk::Util
|
4
|
+
|
5
|
+
attr_accessor :client
|
6
|
+
|
7
|
+
def initialize(args = {})
|
8
|
+
@client = args.fetch(:client)
|
9
|
+
end
|
10
|
+
|
11
|
+
def create_report(data={})
|
12
|
+
data = { 'criteria' => camelize_data(data).to_json }
|
13
|
+
parse_response(client.post_request('report', data))
|
14
|
+
end
|
15
|
+
|
16
|
+
def retrieve_report(id)
|
17
|
+
url = 'report/' + id
|
18
|
+
client.get_request(url)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/adzerk/util.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
module Adzerk
|
2
|
+
module Util
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def camelize_data(data)
|
6
|
+
return data unless data.respond_to?(:reduce)
|
7
|
+
data.reduce({}) do |acc, (sym, val)|
|
8
|
+
acc[sym.to_s.camelize] = case val
|
9
|
+
when Hash then camelize_data(val)
|
10
|
+
when Array then val.map { |elem| camelize_data(elem) }
|
11
|
+
else val
|
12
|
+
end
|
13
|
+
acc
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def uncamelize_data(data)
|
18
|
+
# stop condition for the recursion
|
19
|
+
return data unless data.respond_to?(:reduce)
|
20
|
+
data.reduce({}) do |acc, (key, val)|
|
21
|
+
acc[key.underscore.to_sym] = case val
|
22
|
+
when Hash then uncamelize_data(val)
|
23
|
+
when Array then val.map {|elem| uncamelize_data(elem) }
|
24
|
+
else val
|
25
|
+
end
|
26
|
+
acc
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def parse_response(response)
|
31
|
+
if response.code == "200" or response.code == "400"
|
32
|
+
uncamelize_data(JSON.parse(response.body))
|
33
|
+
else
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/test/advertiser_api_spec.rb
CHANGED
@@ -1,106 +1,81 @@
|
|
1
|
-
require '
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
3
|
describe "Advertiser API" do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
|
5
|
+
before do
|
6
|
+
@advertisers = Adzerk::Client.new(API_KEY).advertisers
|
7
|
+
end
|
8
|
+
|
8
9
|
it "should create a new advertiser" do
|
9
10
|
$title = 'Test advertiser ' + rand(1000000).to_s
|
10
|
-
$
|
11
|
-
$
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
$advertiser_id = JSON.parse(response.body)["Id"].to_s
|
21
|
-
$title.should == JSON.parse(response.body)["Title"]
|
22
|
-
$isActive.should == JSON.parse(response.body)["IsActive"]
|
23
|
-
$isDeleted.should == JSON.parse(response.body)["IsDeleted"]
|
11
|
+
$is_active = true
|
12
|
+
$is_deleted = false
|
13
|
+
|
14
|
+
advertiser = @advertisers.create(:title => $title,
|
15
|
+
:is_active => $is_active,
|
16
|
+
:is_deleted => $is_deleted)
|
17
|
+
$advertiser_id = advertiser[:id].to_s
|
18
|
+
$title.should == advertiser[:title]
|
19
|
+
$is_active.should == advertiser[:is_active]
|
20
|
+
$is_deleted.should == advertiser[:is_deleted]
|
24
21
|
end
|
25
|
-
|
22
|
+
|
26
23
|
it "should list a specific advertiser" do
|
27
|
-
|
28
|
-
|
24
|
+
advertiser = @advertisers.get($advertiser_id)
|
25
|
+
$title.should == advertiser[:title]
|
26
|
+
$is_active.should == advertiser[:is_active]
|
27
|
+
$is_deleted.should == advertiser[:is_deleted]
|
29
28
|
end
|
30
|
-
|
31
|
-
|
29
|
+
|
32
30
|
it "should list all advertisers" do
|
33
|
-
result =
|
31
|
+
result = @advertisers.list
|
34
32
|
result.length.should > 0
|
35
|
-
result[
|
36
|
-
|
37
|
-
|
38
|
-
|
33
|
+
advertiser = result[:items].last
|
34
|
+
$title.should == advertiser[:title]
|
35
|
+
$is_active.should == advertiser[:is_active]
|
36
|
+
$is_deleted.should == advertiser[:is_deleted]
|
37
|
+
$advertiser_id.should == advertiser[:id].to_s
|
39
38
|
end
|
40
|
-
|
39
|
+
|
41
40
|
it "should update a advertiser" do
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
response = @@advertiser.update(updated_advertiser)
|
53
|
-
$advertiser_id = JSON.parse(response.body)["Id"].to_s
|
54
|
-
$title.should == JSON.parse(response.body)["Title"]
|
55
|
-
$isActive.should == JSON.parse(response.body)["IsActive"]
|
56
|
-
$isDeleted.should == JSON.parse(response.body)["IsDeleted"]
|
41
|
+
advertiser = @advertisers.update(:id => $advertiser_id,
|
42
|
+
:title => "Cocacola",
|
43
|
+
:is_active => false)
|
44
|
+
advertiser[:title].should eq("Cocacola")
|
45
|
+
advertiser[:is_active].should eq(false)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should search advertiser based on name" do
|
49
|
+
advertiser = @advertisers.search("Cocacola")
|
50
|
+
advertiser[:total_items].should > 0
|
57
51
|
end
|
58
52
|
|
59
53
|
it "should delete a new advertiser" do
|
60
|
-
response =
|
61
|
-
response.body.should == '
|
54
|
+
response = @advertisers.delete($advertiser_id)
|
55
|
+
response.body.should == '"Successfully deleted."'
|
62
56
|
end
|
63
|
-
|
57
|
+
|
64
58
|
it "should not list deleted advertisers" do
|
65
|
-
|
66
|
-
|
67
|
-
r["Id"].
|
59
|
+
response = @advertisers.list
|
60
|
+
response[:items].each do |r|
|
61
|
+
r["Id"].should_not == $advertiser_id
|
68
62
|
end
|
69
63
|
end
|
70
|
-
|
64
|
+
|
71
65
|
it "should not get individual deleted advertiser" do
|
72
|
-
response =
|
73
|
-
|
66
|
+
response = @advertisers.get $advertiser_id
|
67
|
+
response[:message].should eq("This advertiser is deleted.")
|
74
68
|
end
|
75
|
-
|
76
|
-
it "should not update deleted
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
}
|
81
|
-
response = @@advertiser.update(updated_advertiser)
|
82
|
-
JSON.parse(response.body)["Id"].should == 0
|
83
|
-
end
|
84
|
-
|
85
|
-
it "should create a new advertiser without IsActive or IsDeleted" do
|
86
|
-
new_advertiser = {
|
87
|
-
'Title' => $title
|
88
|
-
}
|
89
|
-
response = @@advertiser.create(new_advertiser)
|
90
|
-
$title.should == JSON.parse(response.body)["Title"]
|
91
|
-
JSON.parse(response.body)["IsActive"].should == false
|
92
|
-
JSON.parse(response.body)["IsDeleted"].should == false
|
69
|
+
|
70
|
+
it "should not update a deleted advertiser" do
|
71
|
+
advertiser = @advertisers.update(:id => $advertiser_id,
|
72
|
+
:title => "Cocacola")
|
73
|
+
advertiser[:message].should eq("This advertiser is deleted.")
|
93
74
|
end
|
94
|
-
|
75
|
+
|
95
76
|
it "should require a title" do
|
96
|
-
|
97
|
-
response
|
98
|
-
true.should == !response.body.scan(/Exception/).empty?
|
77
|
+
response = @advertisers.create()
|
78
|
+
response[:message].should eq("A title is required.")
|
99
79
|
end
|
100
80
|
|
101
|
-
|
102
|
-
response = @@advertiser.search("test")
|
103
|
-
|
104
|
-
JSON.parse(response.body)["TotalItems"].should > 0
|
105
|
-
end
|
106
|
-
end
|
81
|
+
end
|