soapy_cake 1.7.0 → 1.7.1

Sign up to get free protection for your applications and to get access to all the features.
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