soapy_cake 1.7.0 → 1.7.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7eea19c2388dc1e422ca91bc48ab0b35abf5183f
4
- data.tar.gz: 4b9ece74aa02f1e16b7297ce3c7134e70bbdf3e3
3
+ metadata.gz: 00d5799aaeb8efca06f9ab1c1f9cbd90c4159f64
4
+ data.tar.gz: 96e577c979fec1ae24018e09598bc07763ffdb00
5
5
  SHA512:
6
- metadata.gz: e1fa623c4a902904656667f0b48b9531ea4244adc855e709875dc62607e528295b42c2eff23abb2b71738f0c4eedd63e430bf293558c74c40e4140aaa8a0650f
7
- data.tar.gz: 7e76731726a781d5f57a26cbfefbd77073d356f49dee5333c032308c70033485ab2fb77fd0d5b22016d4ceeda60cbdb76cecf8b52e348af50e88c44d0298fd9d
6
+ metadata.gz: 39d2eadbaf1878b02ce401aa50d16cb96f710ca7d5f6a2a55f55f060d28d34def74fd95668854e8c579ff2a970709a0c70efaa9d9561fe80363f767394df70b8
7
+ data.tar.gz: 2f224424014bfc7d70c2f19e31d68b057e5b5c06b27753485dfe1a3fd34770be94cf3bf36e61d224d4cad639f02103e75ffd55ce9565ca3b02c3a512666e5d08
@@ -12,6 +12,7 @@ require 'soapy_cake/helper'
12
12
  require 'soapy_cake/error'
13
13
  require 'soapy_cake/request'
14
14
  require 'soapy_cake/response'
15
+ require 'soapy_cake/response_value'
15
16
  require 'soapy_cake/client'
16
17
  require 'soapy_cake/admin'
17
18
  require 'soapy_cake/admin_addedit'
@@ -24,24 +24,10 @@ module SoapyCake
24
24
 
25
25
  def typed_element(element)
26
26
  walk_tree(element) do |value, key|
27
- parse_element(key, value)
27
+ ResponseValue.new(key, value, time_offset: time_offset).parse
28
28
  end
29
29
  end
30
30
 
31
- def parse_element(key, value)
32
- return value.to_i if key.to_s.end_with?('_id') && !key.to_s.end_with?('tax_id')
33
- return false if value == 'false'
34
- return true if value == 'true'
35
- return parse_date(value) if /\A\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.?\d*\z/.match(value)
36
-
37
- # cast to primitive string to get rid of Saxerator string class
38
- value.to_s
39
- end
40
-
41
- def parse_date(value)
42
- DateTime.parse(value + format('%+03d:00', time_offset.to_i))
43
- end
44
-
45
31
  def sax
46
32
  @sax ||= Saxerator.parser(StringIO.new(body)) do |config|
47
33
  config.symbolize_keys!
@@ -0,0 +1,62 @@
1
+ module SoapyCake
2
+ class ResponseValue
3
+ attr_reader :value
4
+ attr_reader :key
5
+
6
+ # Known string ids that should not be parsed as integers
7
+ STRING_IDS = %w(tax_id transaction_id)
8
+
9
+ def initialize(key, value, opts = {})
10
+ @key = key.to_s
11
+ @value = value
12
+ @opts = opts
13
+ end
14
+
15
+ def parse
16
+ return parse_int if id? && !string_id?
17
+ return false if false?
18
+ return true if true?
19
+ return parse_date if date?
20
+
21
+ # cast to primitive string to get rid of Saxerator string class
22
+ value.to_s
23
+ end
24
+
25
+ private
26
+
27
+ def false?
28
+ value == 'false'
29
+ end
30
+
31
+ def true?
32
+ value == 'true'
33
+ end
34
+
35
+ def date?
36
+ value =~ /\A\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.?\d*\z/
37
+ end
38
+
39
+ def id?
40
+ key.to_s.end_with?('_id')
41
+ end
42
+
43
+ def string_id?
44
+ STRING_IDS.any? { |id| key.end_with?(id) }
45
+ end
46
+
47
+ def numeric?
48
+ value =~ /\A-?\d*\z/
49
+ end
50
+
51
+ def parse_int
52
+ unless value.nil? || numeric?
53
+ fail Error, "'#{key}' contains non-digit chars but was to be parsed as an integer id"
54
+ end
55
+ value.to_i
56
+ end
57
+
58
+ def parse_date
59
+ DateTime.parse(value + format('%+03d:00', @opts[:time_offset].to_i))
60
+ end
61
+ end
62
+ end
@@ -1,3 +1,3 @@
1
1
  module SoapyCake
2
- VERSION = '1.7.0'
2
+ VERSION = '1.7.1'
3
3
  end
@@ -0,0 +1,162 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://cake-partner-domain.com/api/11/reports.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/11/">
11
+ <env:Header/>
12
+ <env:Body>
13
+ <cake:Conversions>
14
+ <cake:api_key>cake-api-key</cake:api_key>
15
+ <cake:start_date>2015-04-11T01:00:00</cake:start_date>
16
+ <cake:end_date>2015-04-12T01:00:00</cake:end_date>
17
+ <cake:row_limit>1</cake:row_limit>
18
+ <cake:conversion_type>conversions</cake:conversion_type>
19
+ </cake:Conversions>
20
+ </env:Body>
21
+ </env:Envelope>
22
+ headers:
23
+ Content-Type:
24
+ - application/soap+xml;charset=UTF-8
25
+ response:
26
+ status:
27
+ code: 200
28
+ message: OK
29
+ headers:
30
+ Cache-Control:
31
+ - private, max-age=0
32
+ Content-Type:
33
+ - application/soap+xml; charset=utf-8
34
+ Server:
35
+ - Microsoft-IIS/8.0
36
+ X-Aspnet-Version:
37
+ - 4.0.30319
38
+ X-Powered-By:
39
+ - ASP.NET
40
+ Date:
41
+ - Thu, 07 May 2015 09:36:54 GMT
42
+ Content-Length:
43
+ - '5081'
44
+ body:
45
+ encoding: ASCII-8BIT
46
+ string: !binary |-
47
+ PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c29hcDpF
48
+ bnZlbG9wZSB4bWxuczpzb2FwPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1
49
+ L3NvYXAtZW52ZWxvcGUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcv
50
+ MjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnhzZD0iaHR0cDovL3d3
51
+ dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPjxzb2FwOkJvZHk+PENvbnZlcnNp
52
+ b25zUmVzcG9uc2UgeG1sbnM9Imh0dHA6Ly9jYWtlbWFya2V0aW5nLmNvbS9h
53
+ cGkvMTEvIj48Q29udmVyc2lvbnNSZXN1bHQ+PHN1Y2Nlc3M+dHJ1ZTwvc3Vj
54
+ Y2Vzcz48cm93X2NvdW50PjI2OTk5PC9yb3dfY291bnQ+PGNvbnZlcnNpb25z
55
+ Pjxjb252ZXJzaW9uPjxjb252ZXJzaW9uX2lkPjgyOTczMjM8L2NvbnZlcnNp
56
+ b25faWQ+PHZpc2l0b3JfaWQ+MzcxOTA0OTMwPC92aXNpdG9yX2lkPjxyZXF1
57
+ ZXN0X3Nlc3Npb25faWQ+NzAzMzg3NDgzPC9yZXF1ZXN0X3Nlc3Npb25faWQ+
58
+ PGNsaWNrX3JlcXVlc3Rfc2Vzc2lvbl9pZD42NTM5Mjg5MTI8L2NsaWNrX3Jl
59
+ cXVlc3Rfc2Vzc2lvbl9pZD48Y2xpY2tfaWQ+NDk0MDQ5NDA2PC9jbGlja19p
60
+ ZD48Y29udmVyc2lvbl9kYXRlPjIwMTUtMDQtMTFUMDE6MDA6MDAuNTI8L2Nv
61
+ bnZlcnNpb25fZGF0ZT48bGFzdF91cGRhdGVkPjIwMTUtMDQtMTFUMDE6MDk6
62
+ MzAuMzk3PC9sYXN0X3VwZGF0ZWQ+PGNsaWNrX2RhdGU+MjAxNS0wMy0yNlQx
63
+ Nzo1Nzo1OC4yNDwvY2xpY2tfZGF0ZT48YWZmaWxpYXRlPjxhZmZpbGlhdGVf
64
+ aWQgeG1sbnM9IkFQSTppZF9uYW1lX3N0b3JlIj4xNjU2ODwvYWZmaWxpYXRl
65
+ X2lkPjxhZmZpbGlhdGVfbmFtZSB4bWxucz0iQVBJOmlkX25hbWVfc3RvcmUi
66
+ PkFnw6puY2lhIFByb21tbyAtIEV2ZW50b3MgZSBNa3RnIFByb21vY2lvbmFs
67
+ IEVpcmVsaTwvYWZmaWxpYXRlX25hbWU+PC9hZmZpbGlhdGU+PGFkdmVydGlz
68
+ ZXI+PGFkdmVydGlzZXJfaWQgeG1sbnM9IkFQSTppZF9uYW1lX3N0b3JlIj4x
69
+ NTg4NDwvYWR2ZXJ0aXNlcl9pZD48YWR2ZXJ0aXNlcl9uYW1lIHhtbG5zPSJB
70
+ UEk6aWRfbmFtZV9zdG9yZSI+U21pbGVnYXRlIFdlc3QgKEc0Ym94KTwvYWR2
71
+ ZXJ0aXNlcl9uYW1lPjwvYWR2ZXJ0aXNlcj48b2ZmZXI+PG9mZmVyX2lkIHht
72
+ bG5zPSJBUEk6aWRfbmFtZV9zdG9yZSI+OTYxMTwvb2ZmZXJfaWQ+PG9mZmVy
73
+ X25hbWUgeG1sbnM9IkFQSTppZF9uYW1lX3N0b3JlIj5Dcm9zc2ZpcmUgWW91
74
+ dHViZSBCUjwvb2ZmZXJfbmFtZT48L29mZmVyPjxvZmZlcl9jb250cmFjdD48
75
+ b2ZmZXJfY29udHJhY3RfaWQgeG1sbnM9IkFQSTppZF9uYW1lX3N0b3JlIj4y
76
+ MTYzPC9vZmZlcl9jb250cmFjdF9pZD48b2ZmZXJfY29udHJhY3RfbmFtZSB4
77
+ bWxucz0iQVBJOmlkX25hbWVfc3RvcmUiIC8+PC9vZmZlcl9jb250cmFjdD48
78
+ Y2FtcGFpZ24+PGNhbXBhaWduX2lkPjE2Mjg2NjwvY2FtcGFpZ25faWQ+PGNh
79
+ bXBhaWduX3R5cGU+PGNhbXBhaWduX3R5cGVfaWQ+MTwvY2FtcGFpZ25fdHlw
80
+ ZV9pZD48Y2FtcGFpZ25fdHlwZV9uYW1lPlN0YW5kYXJkPC9jYW1wYWlnbl90
81
+ eXBlX25hbWU+PC9jYW1wYWlnbl90eXBlPjwvY2FtcGFpZ24+PGNyZWF0aXZl
82
+ PjxjcmVhdGl2ZV9pZCB4bWxucz0iQVBJOmlkX25hbWVfc3RvcmUiPjQwMzE3
83
+ PC9jcmVhdGl2ZV9pZD48Y3JlYXRpdmVfbmFtZSB4bWxucz0iQVBJOmlkX25h
84
+ bWVfc3RvcmUiPjQwMzE3PC9jcmVhdGl2ZV9uYW1lPjwvY3JlYXRpdmU+PHN1
85
+ Yl9pZF8xPnZpbGhlbmE8L3N1Yl9pZF8xPjxzdWJfaWRfMiAvPjxzdWJfaWRf
86
+ MyAvPjxzdWJfaWRfNCAvPjxzdWJfaWRfNSAvPjxjb252ZXJzaW9uX2lwX2Fk
87
+ ZHJlc3M+MTg3LjM4LjYwLjk0PC9jb252ZXJzaW9uX2lwX2FkZHJlc3M+PGNs
88
+ aWNrX2lwX2FkZHJlc3M+MTg3LjM4LjYwLjk0PC9jbGlja19pcF9hZGRyZXNz
89
+ Pjxjb252ZXJzaW9uX3JlZmVycmVyX3VybD5odHRwOi8vYnIuejhnYW1lcy5j
90
+ b20vbG9naW5nL2dsb2JlcmVnaXN0ZXJfZG9uZS5odG1sP3NpZ251cD1kb25l
91
+ PC9jb252ZXJzaW9uX3JlZmVycmVyX3VybD48Y29udmVyc2lvbl91c2VyX2Fn
92
+ ZW50Pk1vemlsbGEvNS4wIChXaW5kb3dzIE5UIDYuMSkgQXBwbGVXZWJLaXQv
93
+ NTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzQxLjAuMjI3Mi4x
94
+ MTggU2FmYXJpLzUzNy4zNjwvY29udmVyc2lvbl91c2VyX2FnZW50PjxjbGlj
95
+ a191c2VyX2FnZW50Pk1vemlsbGEvNS4wIChXaW5kb3dzIE5UIDYuMSkgQXBw
96
+ bGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzQx
97
+ LjAuMjI3Mi4xMDEgU2FmYXJpLzUzNy4zNjwvY2xpY2tfdXNlcl9hZ2VudD48
98
+ c291cmNlX3R5cGU+Q2xpY2s8L3NvdXJjZV90eXBlPjxwcmljZV9mb3JtYXQ+
99
+ PHByaWNlX2Zvcm1hdF9pZCB4bWxucz0iQVBJOmlkX25hbWVfc3RvcmUiPjE8
100
+ L3ByaWNlX2Zvcm1hdF9pZD48cHJpY2VfZm9ybWF0X25hbWUgeG1sbnM9IkFQ
101
+ STppZF9uYW1lX3N0b3JlIj5DUEE8L3ByaWNlX2Zvcm1hdF9uYW1lPjwvcHJp
102
+ Y2VfZm9ybWF0PjxwYWlkPjxjdXJyZW5jeV9pZD4xPC9jdXJyZW5jeV9pZD48
103
+ YW1vdW50PjAuNzAwMDwvYW1vdW50Pjxmb3JtYXR0ZWRfYW1vdW50PiQwLjcw
104
+ PC9mb3JtYXR0ZWRfYW1vdW50PjwvcGFpZD48cGFpZF91bmJpbGxlZD48Y3Vy
105
+ cmVuY3lfaWQ+MTwvY3VycmVuY3lfaWQ+PGFtb3VudD4wLjcwMDA8L2Ftb3Vu
106
+ dD48Zm9ybWF0dGVkX2Ftb3VudD4kMC43MDwvZm9ybWF0dGVkX2Ftb3VudD48
107
+ L3BhaWRfdW5iaWxsZWQ+PHJlY2VpdmVkPjxjdXJyZW5jeV9pZD4xPC9jdXJy
108
+ ZW5jeV9pZD48YW1vdW50PjEuMDAwMDwvYW1vdW50Pjxmb3JtYXR0ZWRfYW1v
109
+ dW50PiQxLjAwPC9mb3JtYXR0ZWRfYW1vdW50PjwvcmVjZWl2ZWQ+PHJlY2Vp
110
+ dmVkX3VuYmlsbGVkPjxjdXJyZW5jeV9pZD4xPC9jdXJyZW5jeV9pZD48YW1v
111
+ dW50PjAuMDg2NTwvYW1vdW50Pjxmb3JtYXR0ZWRfYW1vdW50PiQwLjA4NjU8
112
+ L2Zvcm1hdHRlZF9hbW91bnQ+PC9yZWNlaXZlZF91bmJpbGxlZD48c3RlcF9y
113
+ ZWFjaGVkPjE8L3N0ZXBfcmVhY2hlZD48cGl4ZWxfZHJvcHBlZD5mYWxzZTwv
114
+ cGl4ZWxfZHJvcHBlZD48c3VwcHJlc3NlZD5mYWxzZTwvc3VwcHJlc3NlZD48
115
+ cmV0dXJuZWQ+ZmFsc2U8L3JldHVybmVkPjx0ZXN0PmZhbHNlPC90ZXN0Pjx0
116
+ cmFuc2FjdGlvbl9pZD5UUkFOU0FDVElPTl9JRDwvdHJhbnNhY3Rpb25faWQ+
117
+ PGN1cnJlbnRfZGlzcG9zaXRpb24+PGRpc3Bvc2l0aW9uX2lkPjM8L2Rpc3Bv
118
+ c2l0aW9uX2lkPjxkaXNwb3NpdGlvbl9uYW1lPkFwcHJvdmVkPC9kaXNwb3Np
119
+ dGlvbl9uYW1lPjxkaXNwb3NpdGlvbl90eXBlPjxkaXNwb3NpdGlvbl90eXBl
120
+ X2lkIHhtbG5zPSJBUEk6aWRfbmFtZV9zdG9yZSI+MzwvZGlzcG9zaXRpb25f
121
+ dHlwZV9pZD48ZGlzcG9zaXRpb25fdHlwZV9uYW1lIHhtbG5zPSJBUEk6aWRf
122
+ bmFtZV9zdG9yZSI+QXBwcm92ZWQ8L2Rpc3Bvc2l0aW9uX3R5cGVfbmFtZT48
123
+ L2Rpc3Bvc2l0aW9uX3R5cGU+PGNvbnRhY3Q+U3lzdGVtIFByb2Nlc3M8L2Nv
124
+ bnRhY3Q+PGRpc3Bvc2l0aW9uX2RhdGU+MjAxNS0wNC0xMVQwMTowMDowMC41
125
+ MjwvZGlzcG9zaXRpb25fZGF0ZT48L2N1cnJlbnRfZGlzcG9zaXRpb24+PGNv
126
+ bnZlcnNpb25fc2NvcmU+MC4wMDwvY29udmVyc2lvbl9zY29yZT48Y291bnRy
127
+ eT48Y291bnRyeV9jb2RlIHhtbG5zPSJBUEk6aWRfbmFtZV9zdG9yZSI+QlI8
128
+ L2NvdW50cnlfY29kZT48Y291bnRyeV9uYW1lIHhtbG5zPSJBUEk6aWRfbmFt
129
+ ZV9zdG9yZSI+QnJhemlsPC9jb3VudHJ5X25hbWU+PC9jb3VudHJ5PjxyZWdp
130
+ b24+PHJlZ2lvbl9jb2RlIHhtbG5zPSJBUEk6aWRfbmFtZV9zdG9yZSI+U1A8
131
+ L3JlZ2lvbl9jb2RlPjxyZWdpb25fbmFtZSB4bWxucz0iQVBJOmlkX25hbWVf
132
+ c3RvcmUiPlNhbyBQYXVsbzwvcmVnaW9uX25hbWU+PC9yZWdpb24+PGxhbmd1
133
+ YWdlPjxsYW5ndWFnZV9pZCB4bWxucz0iQVBJOmlkX25hbWVfc3RvcmUiPjc0
134
+ PC9sYW5ndWFnZV9pZD48bGFuZ3VhZ2VfbmFtZSB4bWxucz0iQVBJOmlkX25h
135
+ bWVfc3RvcmUiPlBvcnR1Z3Vlc2U8L2xhbmd1YWdlX25hbWU+PC9sYW5ndWFn
136
+ ZT48aXNwPjxpc3BfaWQgeG1sbnM9IkFQSTppZF9uYW1lX3N0b3JlIj4zNzYy
137
+ NDwvaXNwX2lkPjxpc3BfbmFtZSB4bWxucz0iQVBJOmlkX25hbWVfc3RvcmUi
138
+ Pk5ldCBTZXJ2aW9zIERlIENvbXVuaWNhbyBTLkEuPC9pc3BfbmFtZT48L2lz
139
+ cD48b3BlcmF0aW5nX3N5c3RlbT48b3BlcmF0aW5nX3N5c3RlbV9pZD4xODwv
140
+ b3BlcmF0aW5nX3N5c3RlbV9pZD48b3BlcmF0aW5nX3N5c3RlbV9uYW1lPldp
141
+ bmRvd3M8L29wZXJhdGluZ19zeXN0ZW1fbmFtZT48b3BlcmF0aW5nX3N5c3Rl
142
+ bV92ZXJzaW9uPjx2ZXJzaW9uX2lkIHhtbG5zPSJBUEk6aWRfbmFtZV9zdG9y
143
+ ZSI+OTwvdmVyc2lvbl9pZD48dmVyc2lvbl9uYW1lIHhtbG5zPSJBUEk6aWRf
144
+ bmFtZV9zdG9yZSI+V2luZG93cyA3PC92ZXJzaW9uX25hbWU+PC9vcGVyYXRp
145
+ bmdfc3lzdGVtX3ZlcnNpb24+PG9wZXJhdGluZ19zeXN0ZW1fdmVyc2lvbl9t
146
+ aW5vcj48dmVyc2lvbl9pZCB4bWxucz0iQVBJOmlkX25hbWVfc3RvcmUiPjk8
147
+ L3ZlcnNpb25faWQ+PHZlcnNpb25fbmFtZSB4bWxucz0iQVBJOmlkX25hbWVf
148
+ c3RvcmUiIC8+PC9vcGVyYXRpbmdfc3lzdGVtX3ZlcnNpb25fbWlub3I+PC9v
149
+ cGVyYXRpbmdfc3lzdGVtPjxicm93c2VyPjxicm93c2VyX2lkPjI8L2Jyb3dz
150
+ ZXJfaWQ+PGJyb3dzZXJfbmFtZT5DaHJvbWU8L2Jyb3dzZXJfbmFtZT48YnJv
151
+ d3Nlcl92ZXJzaW9uPjx2ZXJzaW9uX2lkIHhtbG5zPSJBUEk6aWRfbmFtZV9z
152
+ dG9yZSI+MjQ8L3ZlcnNpb25faWQ+PHZlcnNpb25fbmFtZSB4bWxucz0iQVBJ
153
+ OmlkX25hbWVfc3RvcmUiPk90aGVyPC92ZXJzaW9uX25hbWU+PC9icm93c2Vy
154
+ X3ZlcnNpb24+PGJyb3dzZXJfdmVyc2lvbl9taW5vcj48dmVyc2lvbl9pZCB4
155
+ bWxucz0iQVBJOmlkX25hbWVfc3RvcmUiPjI0PC92ZXJzaW9uX2lkPjx2ZXJz
156
+ aW9uX25hbWUgeG1sbnM9IkFQSTppZF9uYW1lX3N0b3JlIiAvPjwvYnJvd3Nl
157
+ cl92ZXJzaW9uX21pbm9yPjwvYnJvd3Nlcj48bm90ZSAvPjwvY29udmVyc2lv
158
+ bj48L2NvbnZlcnNpb25zPjwvQ29udmVyc2lvbnNSZXN1bHQ+PC9Db252ZXJz
159
+ aW9uc1Jlc3BvbnNlPjwvc29hcDpCb2R5Pjwvc29hcDpFbnZlbG9wZT4=
160
+ http_version:
161
+ recorded_at: Thu, 07 May 2015 09:37:00 GMT
162
+ recorded_with: VCR 2.9.3
@@ -38,6 +38,17 @@ RSpec.describe SoapyCake::Admin do
38
38
  )
39
39
  end
40
40
 
41
+ it 'does not parse a transaction_id as an integer', :vcr do
42
+ result = subject.conversions(
43
+ start_date: Date.new(2015, 4, 11),
44
+ end_date: Date.new(2015, 4, 12),
45
+ row_limit: 1
46
+ )
47
+
48
+ expect(result.count).to eq(1)
49
+ expect(result.first[:transaction_id]).to eq('TRANSACTION_ID')
50
+ end
51
+
41
52
  it 'raises if there is an error', :vcr do
42
53
  expect do
43
54
  subject.affiliates(affiliate_id: 'bloops')
@@ -0,0 +1,59 @@
1
+ RSpec.describe SoapyCake::ResponseValue do
2
+ def subject(*args)
3
+ described_class.new(*args)
4
+ end
5
+
6
+ describe '#parse' do
7
+ context 'booleans' do
8
+ it 'converts the string "true" to the true value' do
9
+ expect(subject(:foo, 'true').parse).to eq(true)
10
+ end
11
+
12
+ it 'converts the string "false" to the false value' do
13
+ expect(subject(:foo, 'false').parse).to eq(false)
14
+ end
15
+ end
16
+
17
+ context 'dates' do
18
+ it 'parses an ISO-formatted date' do
19
+ expect(subject(:foo, '2014-06-30T01:00:00').parse).to eq(DateTime.new(2014, 6, 30, 1))
20
+ end
21
+
22
+ it 'properly applies the provided time offset' do
23
+ expect(subject(:foo, '2014-01-01T00:00:00', time_offset: 5).parse)
24
+ .to eq(DateTime.new(2014, 1, 1, 0).change(offset: '+0500'))
25
+
26
+ expect(subject(:foo, '2014-12-31T01:00:00', time_offset: -2).parse)
27
+ .to eq(DateTime.new(2014, 12, 31, 1).change(offset: '-0200'))
28
+ end
29
+ end
30
+
31
+ context 'strings' do
32
+ it 'parses a string' do
33
+ expect(subject(:foo, 'abc').parse).to eq('abc')
34
+ end
35
+ end
36
+
37
+ context 'IDs' do
38
+ it 'converts keys ending in "_id" to integers' do
39
+ expect(subject(:conversion_id, '42').parse).to eq(42)
40
+ end
41
+
42
+ it "doesn't convert ids in the blacklist to integers" do
43
+ expect(subject(:tax_id, '123abc').parse).to eq('123abc')
44
+ expect(subject(:other_tax_id, '123abc').parse).to eq('123abc')
45
+ expect(subject(:transaction_id, '123abc').parse).to eq('123abc')
46
+ end
47
+
48
+ it 'raises an error if not in the blacklist and non-digit characters are detected' do
49
+ expect { subject(:foo_id, '123abc').parse }.to raise_error(SoapyCake::Error)
50
+ end
51
+
52
+ it 'does not raise an error if the value is absent' do
53
+ expect(subject(:foo_id, '-1').parse).to eq(-1)
54
+ expect(subject(:foo_id, '').parse).to eq(0)
55
+ expect(subject(:foo_id, nil).parse).to eq(0)
56
+ end
57
+ end
58
+ end
59
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: soapy_cake
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.0
4
+ version: 1.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - ad2games GmbH
@@ -191,8 +191,10 @@ files:
191
191
  - lib/soapy_cake/helper.rb
192
192
  - lib/soapy_cake/request.rb
193
193
  - lib/soapy_cake/response.rb
194
+ - lib/soapy_cake/response_value.rb
194
195
  - lib/soapy_cake/version.rb
195
196
  - soapy_cake.gemspec
197
+ - spec/fixtures/vcr_cassettes/SoapyCake_Admin/does_not_parse_a_transaction_id_as_an_integer.yml
196
198
  - spec/fixtures/vcr_cassettes/SoapyCake_Admin/raises_if_there_is_an_error.yml
197
199
  - spec/fixtures/vcr_cassettes/SoapyCake_Admin/returns_a_clicks_report_with_a_defined_time_range.yml
198
200
  - spec/fixtures/vcr_cassettes/SoapyCake_Admin/returns_an_affiliate_with_correct_data_types.yml
@@ -213,6 +215,7 @@ files:
213
215
  - spec/lib/soapy_cake/admin_track_spec.rb
214
216
  - spec/lib/soapy_cake/affiliate_spec.rb
215
217
  - spec/lib/soapy_cake/request_spec.rb
218
+ - spec/lib/soapy_cake/response_value_spec.rb
216
219
  - spec/spec_helper.rb
217
220
  - spec/support/admin_method_example.rb
218
221
  homepage: http://ad2games.com
@@ -235,11 +238,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
235
238
  version: '0'
236
239
  requirements: []
237
240
  rubyforge_project:
238
- rubygems_version: 2.4.6
241
+ rubygems_version: 2.4.5
239
242
  signing_key:
240
243
  specification_version: 4
241
244
  summary: Simple client for the CAKE API
242
245
  test_files:
246
+ - spec/fixtures/vcr_cassettes/SoapyCake_Admin/does_not_parse_a_transaction_id_as_an_integer.yml
243
247
  - spec/fixtures/vcr_cassettes/SoapyCake_Admin/raises_if_there_is_an_error.yml
244
248
  - spec/fixtures/vcr_cassettes/SoapyCake_Admin/returns_a_clicks_report_with_a_defined_time_range.yml
245
249
  - spec/fixtures/vcr_cassettes/SoapyCake_Admin/returns_an_affiliate_with_correct_data_types.yml
@@ -260,5 +264,6 @@ test_files:
260
264
  - spec/lib/soapy_cake/admin_track_spec.rb
261
265
  - spec/lib/soapy_cake/affiliate_spec.rb
262
266
  - spec/lib/soapy_cake/request_spec.rb
267
+ - spec/lib/soapy_cake/response_value_spec.rb
263
268
  - spec/spec_helper.rb
264
269
  - spec/support/admin_method_example.rb