soapy_cake 0.3.4 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +1 -0
  3. data/api_versions.yml +110 -110
  4. data/lib/soapy_cake.rb +10 -2
  5. data/lib/soapy_cake/admin.rb +34 -46
  6. data/lib/soapy_cake/affiliate.rb +5 -17
  7. data/lib/soapy_cake/client.rb +33 -3
  8. data/lib/soapy_cake/error.rb +4 -0
  9. data/lib/soapy_cake/helper.rb +16 -0
  10. data/lib/soapy_cake/request.rb +61 -0
  11. data/lib/soapy_cake/response.rb +48 -0
  12. data/lib/soapy_cake/version.rb +1 -1
  13. data/soapy_cake.gemspec +4 -4
  14. data/spec/fixtures/vcr_cassettes/Integration_test/raises_if_there_is_an_error.yml +50 -0
  15. data/spec/fixtures/vcr_cassettes/Integration_test/returns_an_affiliate_with_correct_data_types.yml +114 -0
  16. data/spec/lib/soapy_cake/admin_spec.rb +87 -199
  17. data/spec/lib/soapy_cake/affiliate_spec.rb +19 -39
  18. data/spec/lib/soapy_cake/integration_spec.rb +25 -0
  19. data/spec/spec_helper.rb +2 -0
  20. metadata +14 -55
  21. data/lib/soapy_cake/advertiser.rb +0 -21
  22. data/lib/soapy_cake/client/cake_client.rb +0 -157
  23. data/lib/soapy_cake/client/http_client.rb +0 -14
  24. data/spec/fixtures/vcr_cassettes/client_new_account_statuses.yml +0 -1200
  25. data/spec/fixtures/vcr_cassettes/client_new_advertisers.yml +0 -1202
  26. data/spec/fixtures/vcr_cassettes/client_new_affiliate_tags.yml +0 -1200
  27. data/spec/fixtures/vcr_cassettes/client_new_affiliate_tiers.yml +0 -1201
  28. data/spec/fixtures/vcr_cassettes/client_new_billing_cycles.yml +0 -1200
  29. data/spec/fixtures/vcr_cassettes/client_new_cap_intervals.yml +0 -1201
  30. data/spec/fixtures/vcr_cassettes/client_new_cap_types.yml +0 -1199
  31. data/spec/fixtures/vcr_cassettes/client_new_countries.yml +0 -1515
  32. data/spec/fixtures/vcr_cassettes/client_new_currencies.yml +0 -1199
  33. data/spec/fixtures/vcr_cassettes/client_new_empty_response.yml +0 -1200
  34. data/spec/fixtures/vcr_cassettes/client_new_empty_response_offer_summary.yml +0 -865
  35. data/spec/fixtures/vcr_cassettes/client_new_languages.yml +0 -1199
  36. data/spec/fixtures/vcr_cassettes/client_new_media_types.yml +0 -1215
  37. data/spec/fixtures/vcr_cassettes/client_new_offer_statuses.yml +0 -1202
  38. data/spec/fixtures/vcr_cassettes/client_new_offer_types.yml +0 -1201
  39. data/spec/fixtures/vcr_cassettes/client_new_payment_settings.yml +0 -1203
  40. data/spec/fixtures/vcr_cassettes/client_new_payment_types.yml +0 -1204
  41. data/spec/fixtures/vcr_cassettes/client_new_price_formats.yml +0 -1202
  42. data/spec/fixtures/vcr_cassettes/client_new_roles.yml +0 -1203
  43. data/spec/fixtures/vcr_cassettes/client_new_verticals.yml +0 -1197
  44. data/spec/fixtures/vcr_cassettes/client_new_with_username_and_password.yml +0 -1198
  45. data/spec/fixtures/vcr_cassettes/client_sekken_client_caches_results.yml +0 -1261
  46. data/spec/lib/soapy_cake/advertiser_spec.rb +0 -14
  47. data/spec/lib/soapy_cake/client/cake_client_spec.rb +0 -197
@@ -0,0 +1,4 @@
1
+ module SoapyCake
2
+ class Error < RuntimeError; end
3
+ class RequestFailed < Error; end
4
+ end
@@ -0,0 +1,16 @@
1
+ module SoapyCake
2
+ module Helper
3
+ def self.walk_tree(obj, key = nil, &block)
4
+ return nil if obj == {}
5
+
6
+ case obj
7
+ when Hash
8
+ obj.map { |hk, hv| [hk, walk_tree(hv, hk, &block)] }.to_h
9
+ when Array
10
+ obj.map { |av| walk_tree(av, &block) }
11
+ else
12
+ yield(obj, key)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,61 @@
1
+ module SoapyCake
2
+ class Request
3
+ attr_accessor :api_key, :time_offset
4
+ attr_reader :role, :service, :method, :opts
5
+
6
+ def initialize(role, service, method, opts = {})
7
+ @role = role.to_s
8
+ @service = service.to_s
9
+ @method = method.to_s
10
+ @opts = opts
11
+ end
12
+
13
+ def path
14
+ "/#{(role != 'admin') ? role : ''}/api/#{version}/#{service}.asmx"
15
+ end
16
+
17
+ def xml
18
+ Nokogiri::XML::Builder.new do |xml|
19
+ xml['env'].Envelope(xml_namespaces) do
20
+ xml.Header
21
+ xml.Body do
22
+ xml['cake'].send(method.camelize.to_sym) do
23
+ xml_params(xml)
24
+ end
25
+ end
26
+ end
27
+ end.to_xml
28
+ end
29
+
30
+ private
31
+
32
+ def xml_params(xml)
33
+ xml.api_key api_key
34
+ opts.each do |k, v|
35
+ xml.send(k.to_sym, format_param(v))
36
+ end
37
+ end
38
+
39
+ def xml_namespaces
40
+ {
41
+ 'xmlns:env' => 'http://www.w3.org/2003/05/soap-envelope',
42
+ 'xmlns:cake' => "http://cakemarketing.com/api/#{version}/"
43
+ }
44
+ end
45
+
46
+ def format_param(value)
47
+ case value
48
+ when Time, DateTime, Date
49
+ (value.to_datetime.utc + time_offset.to_i.hours).strftime('%Y-%m-%dT%H:%M:%S')
50
+ else
51
+ value
52
+ end
53
+ end
54
+
55
+ def version
56
+ API_VERSIONS[role][service][method] || fail
57
+ rescue
58
+ raise(Error, "Unknown API call #{role}::#{service}::#{method}")
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,48 @@
1
+ module SoapyCake
2
+ class Response
3
+ attr_accessor :time_offset
4
+ attr_reader :body
5
+
6
+ def initialize(body)
7
+ @body = body
8
+ end
9
+
10
+ def collection
11
+ check_errors!
12
+
13
+ sax.at_depth(5).map do |element|
14
+ typed_element(element)
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def typed_element(element)
21
+ Helper.walk_tree(element) do |value, key|
22
+ next value.to_i if key.to_s.end_with?('_id')
23
+
24
+ if /\A\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.?\d*\z/.match(value)
25
+ next DateTime.parse(value + format('%+03d:00', time_offset.to_i))
26
+ end
27
+
28
+ next false if value == 'false'
29
+ next true if value == 'true'
30
+
31
+ value
32
+ end
33
+ end
34
+
35
+ def sax
36
+ @sax ||= Saxerator.parser(StringIO.new(body)) do |config|
37
+ config.symbolize_keys!
38
+ config.ignore_namespaces!
39
+ end
40
+ end
41
+
42
+ def check_errors!
43
+ fault = sax.for_tag(:fault).first
44
+ fail RequestFailed, fault[:reason][:text] if fault
45
+ fail RequestFailed, sax.for_tag(:Text).first unless sax.for_tag(:success).first == 'true'
46
+ end
47
+ end
48
+ end
@@ -1,3 +1,3 @@
1
1
  module SoapyCake
2
- VERSION = '0.3.4'
2
+ VERSION = '1.0.0'
3
3
  end
@@ -14,13 +14,13 @@ Gem::Specification.new do |spec|
14
14
  spec.license = 'MIT'
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0")
17
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
+ spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(/^(test|spec|features)\//)
19
19
  spec.require_paths = ['lib']
20
20
 
21
21
  spec.add_dependency 'activesupport'
22
- spec.add_dependency 'sekken'
23
- spec.add_dependency 'local_copy'
22
+ spec.add_dependency 'saxerator'
23
+ spec.add_dependency 'nokogiri'
24
24
  spec.add_dependency 'httparty'
25
25
 
26
26
  spec.add_development_dependency 'bundler'
@@ -0,0 +1,50 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://cake-partner-domain.com//api/5/export.asmx
6
+ body:
7
+ encoding: UTF-8
8
+ string: |
9
+ <?xml version="1.0"?>
10
+ <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:cake="http://cakemarketing.com/api/5/">
11
+ <env:Header/>
12
+ <env:Body>
13
+ <cake:Affiliates>
14
+ <cake:api_key>cake-api-key</cake:api_key>
15
+ <cake:affiliate_id>bloops</cake:affiliate_id>
16
+ </cake:Affiliates>
17
+ </env:Body>
18
+ </env:Envelope>
19
+ headers:
20
+ Content-Type:
21
+ - application/soap+xml;charset=UTF-8
22
+ response:
23
+ status:
24
+ code: 500
25
+ message: Internal Server Error
26
+ headers:
27
+ Cache-Control:
28
+ - private
29
+ Content-Type:
30
+ - application/soap+xml; charset=utf-8
31
+ Server:
32
+ - Microsoft-IIS/8.0
33
+ X-Aspnet-Version:
34
+ - 4.0.30319
35
+ X-Powered-By:
36
+ - ASP.NET
37
+ Date:
38
+ - Tue, 10 Feb 2015 13:00:42 GMT
39
+ Content-Length:
40
+ - '542'
41
+ body:
42
+ encoding: UTF-8
43
+ string: <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
44
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><soap:Fault><soap:Code><soap:Value>soap:Sender</soap:Value></soap:Code><soap:Reason><soap:Text
45
+ xml:lang="en">Server was unable to read request. ---&gt; There is an error
46
+ in XML document (7, 52). ---&gt; Input string was not in a correct format.</soap:Text></soap:Reason><soap:Detail
47
+ /></soap:Fault></soap:Body></soap:Envelope>
48
+ http_version:
49
+ recorded_at: Tue, 10 Feb 2015 13:00:44 GMT
50
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,114 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://cake-partner-domain.com//api/5/export.asmx
6
+ body:
7
+ encoding: UTF-8
8
+ string: |
9
+ <?xml version="1.0"?>
10
+ <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:cake="http://cakemarketing.com/api/5/">
11
+ <env:Header/>
12
+ <env:Body>
13
+ <cake:Affiliates>
14
+ <cake:api_key>cake-api-key</cake:api_key>
15
+ <cake:affiliate_id>16027</cake:affiliate_id>
16
+ </cake:Affiliates>
17
+ </env:Body>
18
+ </env:Envelope>
19
+ headers:
20
+ Content-Type:
21
+ - application/soap+xml;charset=UTF-8
22
+ response:
23
+ status:
24
+ code: 200
25
+ message: OK
26
+ headers:
27
+ Cache-Control:
28
+ - private, max-age=0
29
+ Content-Type:
30
+ - application/soap+xml; charset=utf-8
31
+ Server:
32
+ - Microsoft-IIS/8.0
33
+ X-Aspnet-Version:
34
+ - 4.0.30319
35
+ X-Powered-By:
36
+ - ASP.NET
37
+ Date:
38
+ - Tue, 10 Feb 2015 12:50:36 GMT
39
+ Content-Length:
40
+ - '3036'
41
+ body:
42
+ encoding: ASCII-8BIT
43
+ string: !binary |-
44
+ PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c29hcDpF
45
+ bnZlbG9wZSB4bWxuczpzb2FwPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1
46
+ L3NvYXAtZW52ZWxvcGUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcv
47
+ MjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzZD0iaHR0cDovL3d3
48
+ dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPjxzb2FwOkJvZHk+PEFmZmlsaWF0
49
+ ZXNSZXNwb25zZSB4bWxucz0iaHR0cDovL2Nha2VtYXJrZXRpbmcuY29tL2Fw
50
+ aS81LyI+PEFmZmlsaWF0ZXNSZXN1bHQ+PHN1Y2Nlc3M+dHJ1ZTwvc3VjY2Vz
51
+ cz48cm93X2NvdW50PjE8L3Jvd19jb3VudD48YWZmaWxpYXRlcz48YWZmaWxp
52
+ YXRlPjxhZmZpbGlhdGVfaWQ+MTYwMjc8L2FmZmlsaWF0ZV9pZD48YWZmaWxp
53
+ YXRlX25hbWU+QWZmaWxpYXRlIFRlc3QgMTwvYWZmaWxpYXRlX25hbWU+PHRp
54
+ ZXI+PGFmZmlsaWF0ZV90aWVyX2lkIHhtbG5zPSJBUEk6aWRfbmFtZV9zdG9y
55
+ ZSI+NTwvYWZmaWxpYXRlX3RpZXJfaWQ+PGFmZmlsaWF0ZV90aWVyX25hbWUg
56
+ eG1sbnM9IkFQSTppZF9uYW1lX3N0b3JlIj5icm9uemUgdGllcjwvYWZmaWxp
57
+ YXRlX3RpZXJfbmFtZT48L3RpZXI+PGFjY291bnRfbWFuYWdlcnM+PGNvbnRh
58
+ Y3Q+PGNvbnRhY3RfaWQgeG1sbnM9IkFQSTppZF9uYW1lX3N0b3JlIj4xNzU8
59
+ L2NvbnRhY3RfaWQ+PGNvbnRhY3RfbmFtZSB4bWxucz0iQVBJOmlkX25hbWVf
60
+ c3RvcmUiPlBhcnRuZXIgU3VwcG9ydDwvY29udGFjdF9uYW1lPjwvY29udGFj
61
+ dD48L2FjY291bnRfbWFuYWdlcnM+PGFjY291bnRfc3RhdHVzPjxhY2NvdW50
62
+ X3N0YXR1c19pZCB4bWxucz0iQVBJOmlkX25hbWVfc3RvcmUiPjE8L2FjY291
63
+ bnRfc3RhdHVzX2lkPjxhY2NvdW50X3N0YXR1c19uYW1lIHhtbG5zPSJBUEk6
64
+ aWRfbmFtZV9zdG9yZSI+QWN0aXZlPC9hY2NvdW50X3N0YXR1c19uYW1lPjwv
65
+ YWNjb3VudF9zdGF0dXM+PGFkZHJlc3M+PHN0cmVldF8xIC8+PHN0cmVldF8y
66
+ IC8+PGNpdHkgLz48c3RhdGUgLz48emlwX2NvZGUgLz48Y291bnRyeSAvPjwv
67
+ YWRkcmVzcz48d2Vic2l0ZSAvPjxwYXltZW50X3R5cGU+PHBheW1lbnRfdHlw
68
+ ZV9pZD40PC9wYXltZW50X3R5cGVfaWQ+PHBheW1lbnRfdHlwZV9uYW1lPlBh
69
+ eVBhbDwvcGF5bWVudF90eXBlX25hbWU+PHBheW1lbnRfdHlwZV9pbmZvPmFA
70
+ YXNkZmFzLmNvbTwvcGF5bWVudF90eXBlX2luZm8+PC9wYXltZW50X3R5cGU+
71
+ PGNvbnRhY3RzIC8+PHRhZ3MgLz48dHJhZmZpY190eXBlcz48cHJpY2VfZm9y
72
+ bWF0cyAvPjxtZWRpYV90eXBlcyAvPjx2ZXJ0aWNhbF9jYXRlZ29yaWVzIC8+
73
+ PGNvdW50cmllcyAvPjwvdHJhZmZpY190eXBlcz48bWluaW11bV9wYXltZW50
74
+ X3RocmVzaG9sZD4wLjAwMDA8L21pbmltdW1fcGF5bWVudF90aHJlc2hvbGQ+
75
+ PGF1dG9fcGF5bWVudF9mZWU+MC4wMDAwPC9hdXRvX3BheW1lbnRfZmVlPjxw
76
+ YXltZW50X3RvPkNvbXBhbnk8L3BheW1lbnRfdG8+PHBheV92YXQ+ZmFsc2U8
77
+ L3BheV92YXQ+PHJlZmVycmFsc19lbmFibGVkPmZhbHNlPC9yZWZlcnJhbHNf
78
+ ZW5hYmxlZD48cmVmZXJyYWxfaW5mbyAvPjxiaWxsaW5nX2N5Y2xlPjxiaWxs
79
+ aW5nX2N5Y2xlX2lkIHhtbG5zPSJBUEk6aWRfbmFtZV9zdG9yZSI+MTwvYmls
80
+ bGluZ19jeWNsZV9pZD48YmlsbGluZ19jeWNsZV9uYW1lIHhtbG5zPSJBUEk6
81
+ aWRfbmFtZV9zdG9yZSI+V2Vla2x5PC9iaWxsaW5nX2N5Y2xlX25hbWU+PC9i
82
+ aWxsaW5nX2N5Y2xlPjxjdXJyZW5jeV9zZXR0aW5ncz48Y3VycmVuY3k+PGN1
83
+ cnJlbmN5X2lkIHhtbG5zPSJBUEk6aWRfbmFtZV9zdG9yZSI+MjwvY3VycmVu
84
+ Y3lfaWQ+PGN1cnJlbmN5X3N5bWJvbCB4bWxucz0iQVBJOmlkX25hbWVfc3Rv
85
+ cmUiPuKCrDwvY3VycmVuY3lfc3ltYm9sPjxjdXJyZW5jeV9uYW1lIHhtbG5z
86
+ PSJBUEk6aWRfbmFtZV9zdG9yZSI+RXVybzwvY3VycmVuY3lfbmFtZT48Y3Vy
87
+ cmVuY3lfYWJiciB4bWxucz0iQVBJOmlkX25hbWVfc3RvcmUiPkVVUjwvY3Vy
88
+ cmVuY3lfYWJicj48L2N1cnJlbmN5PjxwYXltZW50X3NldHRpbmc+PHBheW1l
89
+ bnRfc2V0dGluZ19pZCB4bWxucz0iQVBJOmlkX25hbWVfc3RvcmUiPjM8L3Bh
90
+ eW1lbnRfc2V0dGluZ19pZD48cGF5bWVudF9zZXR0aW5nX25hbWUgeG1sbnM9
91
+ IkFQSTppZF9uYW1lX3N0b3JlIj5QYXkgYWZmaWxpYXRlIGluIGFmZmlsaWF0
92
+ ZSdzIGN1cnJlbmN5PC9wYXltZW50X3NldHRpbmdfbmFtZT48L3BheW1lbnRf
93
+ c2V0dGluZz48L2N1cnJlbmN5X3NldHRpbmdzPjxxdWlja2Jvb2tzX2lkIHhz
94
+ aTpuaWw9InRydWUiIC8+PG9ubGluZV9zaWdudXA+ZmFsc2U8L29ubGluZV9z
95
+ aWdudXA+PHNpZ251cF9pcF9hZGRyZXNzIC8+PHBheV9mb3JfY29udmVyc2lv
96
+ bnM+dHJ1ZTwvcGF5X2Zvcl9jb252ZXJzaW9ucz48cmV2aWV3PmZhbHNlPC9y
97
+ ZXZpZXc+PHJldmlld19uZXdfc3ViYWZmaWxpYXRlcz5mYWxzZTwvcmV2aWV3
98
+ X25ld19zdWJhZmZpbGlhdGVzPjxzdXBwcmVzc2lvbj5mYWxzZTwvc3VwcHJl
99
+ c3Npb24+PHN1cHByZXNzaW9uX2NhcCB4c2k6bmlsPSJ0cnVlIiAvPjxwaXhl
100
+ bF9pbmZvPjxwaXhlbF9odG1sIC8+PHBvc3RiYWNrX3VybCAvPjxwb3N0YmFj
101
+ a19kZWxheV9tcyB4c2k6bmlsPSJ0cnVlIiAvPjwvcGl4ZWxfaW5mbz48Zmly
102
+ ZV9nbG9iYWxfcGl4ZWw+ZmFsc2U8L2ZpcmVfZ2xvYmFsX3BpeGVsPjxibGFj
103
+ a2xpc3RzIC8+PGF1dG9fYXBwcm92ZV9jYW1wYWlnbnM+ZmFsc2U8L2F1dG9f
104
+ YXBwcm92ZV9jYW1wYWlnbnM+PGF1dG9fYXBwcm92ZV9waXhlbHM+ZmFsc2U8
105
+ L2F1dG9fYXBwcm92ZV9waXhlbHM+PGhpZGVfb2ZmZXJzPmZhbHNlPC9oaWRl
106
+ X29mZmVycz48YXBpX2tleT5UY1huRHppazFrTm9kend3WGpvWUlRPC9hcGlf
107
+ a2V5PjxkYXRlX2NyZWF0ZWQ+MjAxNC0wNC0yOFQxMDo1MjoxNS41Mzc8L2Rh
108
+ dGVfY3JlYXRlZD48ZGF0ZV9sYXN0X2FjY2VwdGVkX3Rlcm1zIHhzaTpuaWw9
109
+ InRydWUiIC8+PG5vdGVzIC8+PC9hZmZpbGlhdGU+PC9hZmZpbGlhdGVzPjwv
110
+ QWZmaWxpYXRlc1Jlc3VsdD48L0FmZmlsaWF0ZXNSZXNwb25zZT48L3NvYXA6
111
+ Qm9keT48L3NvYXA6RW52ZWxvcGU+
112
+ http_version:
113
+ recorded_at: Tue, 10 Feb 2015 12:50:38 GMT
114
+ recorded_with: VCR 2.9.3
@@ -1,251 +1,139 @@
1
- require 'spec_helper'
2
-
3
1
  RSpec.describe SoapyCake::Admin do
4
- describe '.affiliate_bill_received!' do
5
- it 'marks an affiliate bill as received' do
6
- expect_any_instance_of(SoapyCake::Client::CakeClient)
7
- .to receive(:mark_affiliate_bill_as_received)
8
- .with(affiliate_id: 2)
9
-
10
- subject.affiliate_bill_received!(affiliate_id: 2)
11
- end
12
- end
2
+ let(:opts) { { a: 1 } }
3
+ let(:cake_opts) { opts }
4
+ let(:cake_method) { method }
13
5
 
14
- describe '.affiliate_bills' do
15
- it 'exports bills' do
16
- expect_any_instance_of(SoapyCake::Client::CakeClient)
17
- .to receive(:export_affiliate_bills)
18
- .with(affiliate_id: 2)
6
+ shared_examples_for 'a cake admin method' do
7
+ it 'runs the request' do
8
+ request = double('request')
9
+ expect(SoapyCake::Request).to receive(:new)
10
+ .with(:admin, service, cake_method, cake_opts).and_return(request)
11
+ expect(subject).to receive(:run).with(request)
19
12
 
20
- subject.affiliate_bills(affiliate_id: 2)
13
+ subject.public_send(method, opts)
21
14
  end
22
15
  end
23
16
 
24
- describe '.advertiser_bills' do
25
- it 'exports bills' do
26
- expect_any_instance_of(SoapyCake::Client::CakeClient)
27
- .to receive(:export_advertiser_bills)
28
- .with(advertiser_id: 2)
17
+ describe 'accounting service' do
18
+ let(:service) { :accounting }
29
19
 
30
- subject.advertiser_bills(advertiser_id: 2)
20
+ describe '#affiliate_bills' do
21
+ let(:method) { :affiliate_bills }
22
+ let(:cake_method) { :export_affiliate_bills }
23
+ it_behaves_like 'a cake admin method'
31
24
  end
32
- end
33
-
34
- describe '.campaign_summary' do
35
- let(:start_date) { Date.new(2014, 7, 1) }
36
- let(:end_date) { Date.new(2014, 7, 3) }
37
25
 
38
- it 'returns the campaign summary report for the given days' do
39
- expect_any_instance_of(SoapyCake::Client::CakeClient)
40
- .to receive(:campaign_summary)
41
- .with(start_date: start_date, end_date: end_date, offer_id: 12)
42
- .and_return('result')
43
-
44
- expect(subject.campaign_summary(start_date: start_date, end_date: end_date, offer_id: 12))
45
- .to eq('result')
26
+ describe '#advertiser_bills' do
27
+ let(:method) { :advertiser_bills }
28
+ let(:cake_method) { :export_advertiser_bills }
29
+ it_behaves_like 'a cake admin method'
46
30
  end
47
31
 
48
- it 'returns the campaign summary report for the start_date if no end_date is given' do
49
- expect_any_instance_of(SoapyCake::Client::CakeClient)
50
- .to receive(:campaign_summary)
51
- .with(start_date: start_date, end_date: start_date + 1, offer_id: 12)
52
- .and_return('result')
53
-
54
- expect(subject.campaign_summary(start_date: start_date, offer_id: 12))
55
- .to eq('result')
32
+ describe '#mark_affiliate_bill_as_received' do
33
+ let(:method) { :mark_affiliate_bill_as_received }
34
+ it_behaves_like 'a cake admin method'
56
35
  end
57
- end
58
36
 
59
-
60
- describe '.advertisers' do
61
- it 'returns advertisers' do
62
- expect_any_instance_of(SoapyCake::Client::CakeClient)
63
- .to receive(:advertisers)
64
-
65
- subject.advertisers
37
+ describe '#mark_affiliate_bill_as_paid' do
38
+ let(:method) { :mark_affiliate_bill_as_paid }
39
+ it_behaves_like 'a cake admin method'
66
40
  end
67
41
  end
68
42
 
69
- describe '.affiliates' do
70
- it 'returns affiliates' do
71
- expect_any_instance_of(SoapyCake::Client::CakeClient)
72
- .to receive(:affiliates)
43
+ describe 'export service' do
44
+ let(:service) { :export }
73
45
 
74
- subject.affiliates(force: true)
46
+ describe '#advertisers' do
47
+ let(:method) { :advertisers }
48
+ it_behaves_like 'a cake admin method'
75
49
  end
76
- end
77
50
 
78
- describe '.campaigns' do
79
- it 'returns all campaigns' do
80
- opts = { foo: :bar }
81
- expected = [{ ping: :pong }]
82
- expect_any_instance_of(SoapyCake::Client::CakeClient)
83
- .to receive(:campaigns)
84
- .with(opts).and_return(expected)
85
- expect(subject.campaigns(opts)).to eq(expected)
51
+ describe '#affiliates' do
52
+ let(:method) { :affiliates }
53
+ it_behaves_like 'a cake admin method'
86
54
  end
87
- end
88
55
 
89
- describe '.offers' do
90
- it 'returns all offers' do
91
- opts = { foo: :bar }
92
- expected = [{ ping: :pong }]
93
- expect_any_instance_of(SoapyCake::Client::CakeClient)
94
- .to receive(:offers)
95
- .with(opts).and_return(expected)
96
- expect(subject.offers(opts)).to eq(expected)
56
+ describe '#campaigns' do
57
+ let(:method) { :campaigns }
58
+ it_behaves_like 'a cake admin method'
97
59
  end
98
- end
99
60
 
100
- describe '.affiliate_summary' do
101
- let(:start_date) { Date.new(2014, 7, 1) }
102
- let(:end_date) { Date.new(2014, 7, 3) }
103
-
104
- it 'returns the affiliate summary report for the given days' do
105
- expect_any_instance_of(SoapyCake::Client::CakeClient)
106
- .to receive(:affiliate_summary)
107
- .with(start_date: start_date, end_date: end_date).and_return(
108
- [{ affiliate: { affiliate_id: '1' } },
109
- { affiliate: { affiliate_id: '2' } }]
110
- )
111
-
112
- expect(subject.affiliate_summary(start_date: start_date, end_date: end_date))
113
- .to eq(
114
- [{ affiliate: { affiliate_id: '1' } },
115
- { affiliate: { affiliate_id: '2' } }]
116
- )
117
- end
118
-
119
- it 'returns the affiliate summary report for the start_date if no end_date is given' do
120
- expect_any_instance_of(SoapyCake::Client::CakeClient)
121
- .to receive(:affiliate_summary)
122
- .with(start_date: start_date, end_date: start_date + 1).and_return(
123
- [{ affiliate: { affiliate_id: '1' } },
124
- { affiliate: { affiliate_id: '2' } }]
125
- )
126
-
127
- expect(subject.affiliate_summary(start_date: start_date)).to eq(
128
- [{ affiliate: { affiliate_id: '1' } },
129
- { affiliate: { affiliate_id: '2' } }]
130
- )
61
+ describe '#offers' do
62
+ let(:method) { :offers }
63
+ it_behaves_like 'a cake admin method'
131
64
  end
132
- end
133
65
 
134
- describe '.advertiser_summary' do
135
- let(:start_date) { Date.new(2014, 7, 1) }
136
- let(:end_date) { Date.new(2014, 7, 3) }
137
-
138
- it 'returns the advertiser summary report for the given days' do
139
- expect_any_instance_of(SoapyCake::Client::CakeClient)
140
- .to receive(:advertiser_summary)
141
- .with(start_date: start_date, end_date: end_date).and_return(
142
- [{ advertiser: { advertiser_id: '1' } },
143
- { advertiser: { advertiser_id: '2' } }]
144
- )
145
-
146
- expect(subject.advertiser_summary(start_date: start_date, end_date: end_date))
147
- .to eq(
148
- [{ advertiser: { advertiser_id: '1' } },
149
- { advertiser: { advertiser_id: '2' } }]
150
- )
151
- end
152
-
153
- it 'returns the advertiser summary report for the start_date if no end_date is given' do
154
- expect_any_instance_of(SoapyCake::Client::CakeClient)
155
- .to receive(:advertiser_summary)
156
- .with(start_date: start_date, end_date: start_date + 1).and_return(
157
- [{ advertiser: { advertiser_id: '1' } },
158
- { advertiser: { advertiser_id: '2' } }]
159
- )
160
-
161
- expect(subject.advertiser_summary(start_date: start_date)).to eq(
162
- [{ advertiser: { advertiser_id: '1' } },
163
- { advertiser: { advertiser_id: '2' } }]
164
- )
66
+ describe '#creatives' do
67
+ let(:method) { :creatives }
68
+ it_behaves_like 'a cake admin method'
165
69
  end
166
70
  end
167
71
 
168
- describe '.offer_summary' do
169
- let(:start_date) { Date.new(2014, 7, 1) }
170
- let(:end_date) { Date.new(2014, 7, 3) }
72
+ describe 'reports service' do
73
+ let(:service) { :reports }
171
74
 
172
- it 'returns the offer summary report for the given days' do
173
- expect_any_instance_of(SoapyCake::Client::CakeClient)
174
- .to receive(:offer_summary)
175
- .with(start_date: start_date, end_date: end_date, offer_id: 1)
176
- .and_return('result')
177
-
178
- expect(subject.offer_summary(start_date: start_date, end_date: end_date, offer_id: 1))
179
- .to eq('result')
75
+ describe '#campaign_summary' do
76
+ let(:method) { :campaign_summary }
77
+ it_behaves_like 'a cake admin method'
180
78
  end
181
79
 
182
- it 'returns the offer summary report for the start_date if no end_date is given' do
183
- expect_any_instance_of(SoapyCake::Client::CakeClient)
184
- .to receive(:offer_summary)
185
- .with(start_date: start_date, end_date: start_date + 1, offer_id: 1)
186
- .and_return('result')
187
-
188
- expect(subject.offer_summary(start_date: start_date, offer_id: 1))
189
- .to eq('result')
80
+ describe '#offer_summary' do
81
+ let(:method) { :offer_summary }
82
+ it_behaves_like 'a cake admin method'
190
83
  end
191
- end
192
84
 
193
- describe '.conversions' do
194
- it 'returns only conversions' do
195
- expect_any_instance_of(SoapyCake::Client::CakeClient)
196
- .to receive(:conversions)
197
- .with(color: 'green', conversion_type: 'conversions')
85
+ describe '#affiliate_summary' do
86
+ let(:method) { :affiliate_summary }
87
+ it_behaves_like 'a cake admin method'
88
+ end
198
89
 
199
- subject.conversions(color: 'green')
90
+ describe '#advertiser_summary' do
91
+ let(:method) { :advertiser_summary }
92
+ it_behaves_like 'a cake admin method'
200
93
  end
201
- end
202
94
 
203
- describe '.events' do
204
- it 'returns only events' do
205
- expect_any_instance_of(SoapyCake::Client::CakeClient)
206
- .to receive(:conversions)
207
- .with(color: 'red', conversion_type: 'events')
95
+ describe '#clicks' do
96
+ let(:method) { :clicks }
97
+ it_behaves_like 'a cake admin method'
98
+ end
208
99
 
209
- subject.events(color: 'red')
100
+ describe '#conversions' do
101
+ let(:method) { :conversions }
102
+ let(:cake_opts) { opts.merge(conversion_type: 'conversions') }
103
+ it_behaves_like 'a cake admin method'
210
104
  end
211
- end
212
105
 
213
- describe '#mark_affiliate_bill_as_paid' do
214
- it 'marks credit notes as paid' do
215
- expect_any_instance_of(SoapyCake::Client::CakeClient)
216
- .to receive(:mark_affiliate_bill_as_paid).with(bill_id: 1)
217
- subject.mark_affiliate_bill_as_paid(bill_id: 1)
106
+ describe '#events' do
107
+ let(:method) { :events }
108
+ let(:cake_method) { :conversions }
109
+ let(:cake_opts) { opts.merge(conversion_type: 'events') }
110
+ it_behaves_like 'a cake admin method'
218
111
  end
219
- end
220
112
 
221
- describe '#creatives' do
222
- it 'fetches creatives from CAKE' do
223
- expect_any_instance_of(SoapyCake::Client::CakeClient)
224
- .to receive(:creatives)
225
- .with(offer_id: 1)
226
- subject.creatives(offer_id: 1)
113
+ describe '#traffic' do
114
+ let(:method) { :traffic }
115
+ let(:cake_method) { :traffic_export }
116
+ it_behaves_like 'a cake admin method'
227
117
  end
228
118
  end
229
119
 
230
- describe '#traffic' do
231
- let(:start_date) { Date.new(2014, 7, 1) }
232
- let(:end_date) { Date.new(2014, 7, 3) }
233
-
234
- it 'fetches a traffic report' do
235
- expect_any_instance_of(SoapyCake::Client::CakeClient)
236
- .to receive(:traffic_export)
237
- .with(start_date: start_date, end_date: end_date)
120
+ describe 'get service' do
121
+ let(:service) { :get }
238
122
 
239
- subject.traffic(start_date: start_date, end_date: end_date)
123
+ describe '#currencies' do
124
+ let(:method) { :currencies }
125
+ let(:cake_opts) { {} }
126
+ it_behaves_like 'a cake admin method'
240
127
  end
241
128
  end
242
129
 
243
- describe '#update_creative' do
244
- it 'updates a creative' do
245
- expect_any_instance_of(SoapyCake::Client::CakeClient).to receive(:creative)
246
- .with(offer_id: 1, creative_status_id: 1)
130
+ describe 'addedit service' do
131
+ let(:service) { :addedit }
247
132
 
248
- subject.update_creative(offer_id: 1, creative_status_id: 1)
133
+ describe '#update_creative' do
134
+ let(:method) { :update_creative }
135
+ let(:cake_method) { :creative }
136
+ it_behaves_like 'a cake admin method'
249
137
  end
250
138
  end
251
139
  end