soapy_cake 0.3.4 → 1.0.0

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.
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