privacygate 1.1.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 +7 -0
- data/.github/ISSUE_REQUEST_TEMPLATE/issue_request_template.md +36 -0
- data/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +51 -0
- data/.gitignore +51 -0
- data/Gemfile +3 -0
- data/LICENSE +21 -0
- data/README.md +278 -0
- data/Rakefile +6 -0
- data/examples/charge.rb +38 -0
- data/examples/checkout.rb +61 -0
- data/examples/event.rb +26 -0
- data/examples/webhook.rb +35 -0
- data/lib/privacygate/api_errors.rb +157 -0
- data/lib/privacygate/api_resources/base/api_object.rb +206 -0
- data/lib/privacygate/api_resources/base/api_resource.rb +25 -0
- data/lib/privacygate/api_resources/base/create.rb +15 -0
- data/lib/privacygate/api_resources/base/delete.rb +16 -0
- data/lib/privacygate/api_resources/base/list.rb +25 -0
- data/lib/privacygate/api_resources/base/save.rb +18 -0
- data/lib/privacygate/api_resources/base/update.rb +15 -0
- data/lib/privacygate/api_resources/charge.rb +14 -0
- data/lib/privacygate/api_resources/checkout.rb +19 -0
- data/lib/privacygate/api_resources/event.rb +13 -0
- data/lib/privacygate/api_response.rb +48 -0
- data/lib/privacygate/client.rb +120 -0
- data/lib/privacygate/util.rb +59 -0
- data/lib/privacygate/version.rb +3 -0
- data/lib/privacygate/webhooks.rb +52 -0
- data/lib/privacygate.rb +42 -0
- data/privacygate.gemspec +28 -0
- data/spec/api_resources/base/api_object_spec.rb +156 -0
- data/spec/api_resources/base/api_resource_spec.rb +32 -0
- data/spec/api_resources/charge_spec.rb +19 -0
- data/spec/api_resources/checkout_spec.rb +31 -0
- data/spec/api_resources/event_spec.rb +12 -0
- data/spec/endpont_spec.rb +103 -0
- data/spec/error_spec.rb +58 -0
- data/spec/response_spec.rb +43 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/webhook_spec.rb +36 -0
- metadata +161 -0
@@ -0,0 +1,59 @@
|
|
1
|
+
module PrivacyGate
|
2
|
+
module Util
|
3
|
+
|
4
|
+
def self.object_classes
|
5
|
+
# Class mappings for api responce fetching
|
6
|
+
@object_classes ||= {
|
7
|
+
# API Resources
|
8
|
+
APIResources::Checkout::OBJECT_NAME => APIResources::Checkout,
|
9
|
+
APIResources::Charge::OBJECT_NAME => APIResources::Charge,
|
10
|
+
APIResources::Event::OBJECT_NAME => APIResources::Event,
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
def self.convert_to_api_object(data, client = nil, klass = nil)
|
16
|
+
# Converts a hash of fields or an array of hashes into a
|
17
|
+
# appropriate APIResources of APIObjects form
|
18
|
+
case data
|
19
|
+
when Array
|
20
|
+
data.map {|i| convert_to_api_object(i, client, klass)}
|
21
|
+
when Hash
|
22
|
+
# If class received in params, create instance
|
23
|
+
if klass
|
24
|
+
klass.create_from(data, client)
|
25
|
+
else
|
26
|
+
# Try converting to a known object class.
|
27
|
+
# If none available, fall back to generic APIObject
|
28
|
+
klass = object_classes.fetch(data[:resource], APIResources::Base::APIObject)
|
29
|
+
# Provide client relation only for APIResource objects
|
30
|
+
klass != APIResources::Base::APIObject ? klass.create_from(data, client) : klass.create_from(data)
|
31
|
+
end
|
32
|
+
else
|
33
|
+
data
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.symbolize_names(object)
|
38
|
+
# Convert object key and values to symbols if its possible
|
39
|
+
case object
|
40
|
+
when Hash
|
41
|
+
new_hash = {}
|
42
|
+
object.each do |key, value|
|
43
|
+
key = (
|
44
|
+
begin
|
45
|
+
key.to_sym
|
46
|
+
rescue StandardError
|
47
|
+
key
|
48
|
+
end) || key
|
49
|
+
new_hash[key] = symbolize_names(value)
|
50
|
+
end
|
51
|
+
new_hash
|
52
|
+
when Array
|
53
|
+
object.map {|value| symbolize_names(value)}
|
54
|
+
else
|
55
|
+
object
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PrivacyGate
|
4
|
+
module Webhook
|
5
|
+
# Analyze and construct appropriate event object based on webhook notification
|
6
|
+
def self.construct_event(payload, sig_header, secret)
|
7
|
+
data = JSON.parse(payload, symbolize_names: true)
|
8
|
+
if data.key?(:event)
|
9
|
+
WebhookSignature.verify_header(payload, sig_header, secret)
|
10
|
+
PrivacyGate::APIResources::Event.create_from(data[:event])
|
11
|
+
else
|
12
|
+
raise PrivacyGate::Errors::WebhookInvalidPayload.new("no event in payload",
|
13
|
+
sig_header, http_body: payload)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module WebhookSignature
|
18
|
+
def self.verify_header(payload, sig_header, secret)
|
19
|
+
unless [payload, sig_header, secret].all?
|
20
|
+
raise PrivacyGate::Errors::WebhookInvalidPayload.new(
|
21
|
+
"Missing payload or signature",
|
22
|
+
sig_header, http_body: payload)
|
23
|
+
end
|
24
|
+
expected_sig = compute_signature(payload, secret)
|
25
|
+
unless secure_compare(expected_sig, sig_header)
|
26
|
+
raise PrivacyGate::Errors::SignatureVerificationError.new(
|
27
|
+
"No signatures found matching the expected signature for payload",
|
28
|
+
sig_header, http_body: payload
|
29
|
+
)
|
30
|
+
end
|
31
|
+
true
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.secure_compare(a, b)
|
35
|
+
return false unless a.bytesize == b.bytesize
|
36
|
+
|
37
|
+
l = a.unpack "C#{a.bytesize}"
|
38
|
+
res = 0
|
39
|
+
b.each_byte {|byte| res |= byte ^ l.shift}
|
40
|
+
res.zero?
|
41
|
+
end
|
42
|
+
|
43
|
+
private_class_method :secure_compare
|
44
|
+
|
45
|
+
def self.compute_signature(payload, secret)
|
46
|
+
OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new("sha256"), secret, payload)
|
47
|
+
end
|
48
|
+
|
49
|
+
private_class_method :compute_signature
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/privacygate.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# general
|
2
|
+
require "json"
|
3
|
+
require "uri"
|
4
|
+
require "faraday"
|
5
|
+
require "openssl"
|
6
|
+
|
7
|
+
# version
|
8
|
+
require "privacygate/version"
|
9
|
+
|
10
|
+
# client
|
11
|
+
require "privacygate/client"
|
12
|
+
|
13
|
+
# api response and errors
|
14
|
+
require "privacygate/api_errors"
|
15
|
+
require "privacygate/api_response"
|
16
|
+
|
17
|
+
# api base object
|
18
|
+
require "privacygate/api_resources/base/api_object"
|
19
|
+
|
20
|
+
# api resource base model
|
21
|
+
require "privacygate/api_resources/base/api_resource"
|
22
|
+
|
23
|
+
# api base operations
|
24
|
+
require "privacygate/api_resources/base/create"
|
25
|
+
require "privacygate/api_resources/base/update"
|
26
|
+
require "privacygate/api_resources/base/save"
|
27
|
+
require "privacygate/api_resources/base/list"
|
28
|
+
require "privacygate/api_resources/base/delete"
|
29
|
+
|
30
|
+
# api resources
|
31
|
+
require "privacygate/api_resources/checkout"
|
32
|
+
require "privacygate/api_resources/charge"
|
33
|
+
require "privacygate/api_resources/event"
|
34
|
+
|
35
|
+
# webhooks
|
36
|
+
require "privacygate/webhooks"
|
37
|
+
|
38
|
+
# utils
|
39
|
+
require "privacygate/util"
|
40
|
+
|
41
|
+
module PrivacyGate
|
42
|
+
end
|
data/privacygate.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "lib"))
|
4
|
+
require 'privacygate/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "privacygate"
|
8
|
+
gem.version = "1.1.1"
|
9
|
+
gem.license = "MIT"
|
10
|
+
gem.required_ruby_version = ">= 2.0.0"
|
11
|
+
gem.authors = ["PrivacyGate"]
|
12
|
+
|
13
|
+
gem.description = "Client library for PrivacyGate API"
|
14
|
+
gem.summary = "Client library for PrivacyGate API"
|
15
|
+
gem.homepage = "https://privacygate.io/docs/"
|
16
|
+
|
17
|
+
gem.files = `git ls-files`.sub("privacygate.gemspec", "privacygate.gemspec").split($/)
|
18
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
19
|
+
gem.test_files = gem.files.grep(%r{^(spec|gem|features)/})
|
20
|
+
gem.require_paths = ["lib"]
|
21
|
+
|
22
|
+
gem.add_dependency("faraday", "~> 0.10")
|
23
|
+
|
24
|
+
gem.add_development_dependency "rake"
|
25
|
+
gem.add_development_dependency "rspec"
|
26
|
+
gem.add_development_dependency "webmock"
|
27
|
+
gem.add_development_dependency "pry-byebug"
|
28
|
+
end
|
@@ -0,0 +1,156 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe PrivacyGate::APIResources::Base::APIObject do
|
6
|
+
describe "#respond_to" do
|
7
|
+
it "should implement respond_to method" do
|
8
|
+
obj = PrivacyGate::APIResources::Base::APIObject.create_from(id: 1, foo: "bar")
|
9
|
+
expect(obj.respond_to?(:foo)).to be true
|
10
|
+
expect(obj.respond_to?(:baz)).to be false
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "#serialize params" do
|
15
|
+
it "should serialize params on an empty object" do
|
16
|
+
obj = PrivacyGate::APIResources::Base::APIObject.create_from({})
|
17
|
+
expect({}).to eq obj.serialize_params
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should serialize params on a new object with a sub object" do
|
21
|
+
obj = PrivacyGate::APIResources::Base::APIObject.new
|
22
|
+
obj.metadata = {foo: "bar"}
|
23
|
+
expect({metadata: {foo: "bar"}}).to eq obj.serialize_params
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should serialize params on a basic object" do
|
27
|
+
obj = PrivacyGate::APIResources::Base::APIObject.create_from(foo: nil)
|
28
|
+
obj.update_attributes(foo: "bar")
|
29
|
+
expect({foo: "bar"}).to eq obj.serialize_params
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should serialize params on a complex object" do
|
33
|
+
obj = PrivacyGate::APIResources::Base::APIObject.create_from(
|
34
|
+
foo: PrivacyGate::APIResources::Base::APIObject.create_from(bar: nil, baz: nil))
|
35
|
+
obj.foo.bar = "newbar"
|
36
|
+
expect({foo: {bar: "newbar"}}).to eq obj.serialize_params
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should serialize params on an array" do
|
40
|
+
obj = PrivacyGate::APIResources::Base::APIObject.create_from(foo: nil)
|
41
|
+
obj.foo = ["new-value"]
|
42
|
+
expect({foo: ["new-value"]}).to eq obj.serialize_params
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should serialize params on an array that shortens" do
|
46
|
+
obj = PrivacyGate::APIResources::Base::APIObject.create_from(foo: ["0-index", "1-index", "2-index"])
|
47
|
+
obj.foo = ["new-value"]
|
48
|
+
expect({foo: ["new-value"]}).to eq obj.serialize_params
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should serialize params on an array of hashes" do
|
52
|
+
obj = PrivacyGate::APIResources::Base::APIObject.create_from(foo: nil)
|
53
|
+
obj.foo = [
|
54
|
+
PrivacyGate::APIResources::Base::APIObject.create_from(bar: nil),
|
55
|
+
]
|
56
|
+
obj.foo[0].bar = "baz"
|
57
|
+
expect({foo: [{bar: "baz"}]}).to eq obj.serialize_params
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should serialize params doesn't include unchanged values" do
|
61
|
+
obj = PrivacyGate::APIResources::Base::APIObject.create_from(foo: nil)
|
62
|
+
expect({}).to eq obj.serialize_params
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should serialize params with a APIObject" do
|
66
|
+
obj = PrivacyGate::APIResources::Base::APIObject.create_from({})
|
67
|
+
obj.metadata = PrivacyGate::APIResources::Base::APIObject.create_from(foo: "bar")
|
68
|
+
serialized = obj.serialize_params
|
69
|
+
expect({foo: "bar"}).to eq serialized[:metadata]
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should serialize params with APIObject that's been replaced" do
|
73
|
+
obj = PrivacyGate::APIResources::Base::APIObject.create_from(
|
74
|
+
source: PrivacyGate::APIResources::Base::APIObject.create_from(bar: "foo"))
|
75
|
+
|
76
|
+
obj.source = PrivacyGate::APIResources::Base::APIObject.create_from(baz: "foo")
|
77
|
+
|
78
|
+
serialized = obj.serialize_params
|
79
|
+
expect({baz: "foo"}).to eq serialized[:source]
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should serialize params with an array of APIObjects" do
|
83
|
+
stub_request(:post, "#{@api_base}charges").to_return(body: {data: mock_item}.to_json)
|
84
|
+
obj = PrivacyGate::APIResources::Base::APIObject.create_from({})
|
85
|
+
obj.metadata = [
|
86
|
+
PrivacyGate::APIResources::Base::APIObject.create_from(foo: "bar"),
|
87
|
+
]
|
88
|
+
|
89
|
+
serialized = obj.serialize_params
|
90
|
+
expect([{foo: "bar"}]).to eq serialized[:metadata]
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should serialize params with embed API resources" do
|
94
|
+
charge = PrivacyGate::APIResources::Charge.create_from(id: "charge_id")
|
95
|
+
obj = PrivacyGate::APIResources::Base::APIObject.create_from({})
|
96
|
+
obj.charge = charge
|
97
|
+
expect(obj.charge).is_a? PrivacyGate::APIResources::Charge
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should serialize params and not include API resources that have not been set" do
|
101
|
+
obj = PrivacyGate::APIResources::Base::APIObject.create_from(id: "cus_123")
|
102
|
+
obj2 = PrivacyGate::APIResources::Base::APIObject.create_from(obj: obj)
|
103
|
+
serialized = obj2.serialize_params
|
104
|
+
expect({}).to eq serialized
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should serialize params takes a push option" do
|
108
|
+
obj = PrivacyGate::APIResources::Base::APIObject.create_from(
|
109
|
+
id: "id", metadata: PrivacyGate::APIResources::Base::APIObject.create_from(foo: "bar"))
|
110
|
+
serialized = obj.serialize_params(push: true)
|
111
|
+
expect({id: "id", metadata: {foo: "bar"}}).to eq serialized
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
describe "update attributes" do
|
116
|
+
it "should update attributes with a hash" do
|
117
|
+
obj = PrivacyGate::APIResources::Base::APIObject.create_from({})
|
118
|
+
obj.update_attributes(metadata: {foo: "bar"})
|
119
|
+
expect(obj.metadata.class).to eq PrivacyGate::APIResources::Base::APIObject
|
120
|
+
end
|
121
|
+
|
122
|
+
it "should assign question mark accessors for booleans added after initialization" do
|
123
|
+
obj = PrivacyGate::APIResources::Base::APIObject.new
|
124
|
+
obj.bool = true
|
125
|
+
expect(obj.respond_to?(:bool?)).to be true
|
126
|
+
expect(obj.bool?).to be true
|
127
|
+
end
|
128
|
+
|
129
|
+
it "should assign question mark accessors for booleans" do
|
130
|
+
obj = PrivacyGate::APIResources::Base::APIObject.create_from(id: 1, bool: true, not_bool: "bar")
|
131
|
+
expect(obj.respond_to?(:bool?)).to be true
|
132
|
+
expect(obj.respond_to?(:not_bool)).to be true
|
133
|
+
expect(obj.bool?).to be true
|
134
|
+
end
|
135
|
+
|
136
|
+
it "should create accessors when update attributes is called" do
|
137
|
+
obj = PrivacyGate::APIResources::Base::APIObject.create_from({})
|
138
|
+
expect(obj.send(:metaclass).method_defined?(:foo)).to eq false
|
139
|
+
obj.update_attributes(foo: "bar")
|
140
|
+
expect(obj.send(:metaclass).method_defined?(:foo)).to eq true
|
141
|
+
end
|
142
|
+
|
143
|
+
it "should update attributes with a hash" do
|
144
|
+
obj = PrivacyGate::APIResources::Base::APIObject.create_from({})
|
145
|
+
obj.update_attributes(metadata: {foo: "bar"})
|
146
|
+
expect(PrivacyGate::APIResources::Base::APIObject).to eq obj.metadata.class
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should create accessors when update attributes is called" do
|
150
|
+
obj = PrivacyGate::APIResources::Base::APIObject.create_from({})
|
151
|
+
expect(obj.send(:metaclass).method_defined?(:foo)).to be false
|
152
|
+
obj.update_attributes(foo: "bar")
|
153
|
+
expect(obj.send(:metaclass).method_defined?(:foo)).to be true
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PrivacyGate::APIResources::Base::APIResource do
|
4
|
+
before :all do
|
5
|
+
@client = PrivacyGate::Client.new(api_key: 'api_key')
|
6
|
+
@api_base = @client.instance_variable_get :@api_uri
|
7
|
+
end
|
8
|
+
|
9
|
+
it "shout create a new APIResource without request" do
|
10
|
+
PrivacyGate::APIResources::Base::APIResource.new("id")
|
11
|
+
assert_not_requested :get, %r{#{@api_base}/.*}
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should create APIResource object form hash without request" do
|
15
|
+
PrivacyGate::APIResources::Base::APIResource.create_from(id: "some_id",
|
16
|
+
param: {id: "param_id"})
|
17
|
+
assert_not_requested :get, %r{#{@api_base}/.*}
|
18
|
+
end
|
19
|
+
|
20
|
+
it "setting an attribute should not cause a network request" do
|
21
|
+
c = PrivacyGate::APIResources::Base::APIResource.new("cus_123")
|
22
|
+
c.param = {id: "param_id"}
|
23
|
+
assert_not_requested :get, %r{#{@api_base}/.*}
|
24
|
+
assert_not_requested :post, %r{#{@api_base}/.*}
|
25
|
+
end
|
26
|
+
|
27
|
+
it "accessing id should not issue a fetch" do
|
28
|
+
c = PrivacyGate::APIResources::Base::APIResource.new("cus_123")
|
29
|
+
c.id
|
30
|
+
assert_not_requested :get, %r{#{@api_base}/.*}
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
describe PrivacyGate::APIResources::Charge do
|
2
|
+
before :all do
|
3
|
+
@client = PrivacyGate::Client.new(api_key: 'api_key')
|
4
|
+
@api_base = @client.instance_variable_get :@api_uri
|
5
|
+
end
|
6
|
+
|
7
|
+
it "making a POST request with parameters should have a body and no query string" do
|
8
|
+
stub_request(:post, "#{@api_base}#{PrivacyGate::APIResources::Charge::RESOURCE_PATH}")
|
9
|
+
.with(body: {:id => "id_value", :key => "key_value"})
|
10
|
+
.to_return(body: {data: {id: "id_value", key: "key_value"}}.to_json)
|
11
|
+
@client.charge.create(id: "id_value", key: "key_value")
|
12
|
+
end
|
13
|
+
|
14
|
+
it "making a GET request with parameters should have a query string and no body" do
|
15
|
+
stub_request(:get, "#{@api_base}#{PrivacyGate::APIResources::Charge::RESOURCE_PATH}")
|
16
|
+
.with(query: {limit: 5}).to_return(body: JSON.generate(data: [mock_list]))
|
17
|
+
@client.charge.list(limit: 5)
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
describe PrivacyGate::APIResources::Checkout do
|
2
|
+
before :all do
|
3
|
+
@client = PrivacyGate::Client.new(api_key: 'api_key')
|
4
|
+
@api_base = @client.instance_variable_get :@api_uri
|
5
|
+
end
|
6
|
+
|
7
|
+
it "checkout should save nothing if nothing changes" do
|
8
|
+
stub_request(:post, "#{@api_base}#{PrivacyGate::APIResources::Checkout::RESOURCE_PATH}")
|
9
|
+
.to_return(body: {data: {id: "id_value", key: "key_value"}}.to_json)
|
10
|
+
checkout = @client.checkout.create(id: "id_value", key: "key_value")
|
11
|
+
|
12
|
+
stub_request(:put, "#{@api_base}#{PrivacyGate::APIResources::Checkout::RESOURCE_PATH}/id_value")
|
13
|
+
.with(body: {})
|
14
|
+
.to_return(body: JSON.generate("id" => "id_value", "key" => "key_value"))
|
15
|
+
|
16
|
+
checkout.save
|
17
|
+
end
|
18
|
+
|
19
|
+
it "making a POST request with parameters should have a body and no query string" do
|
20
|
+
stub_request(:post, "#{@api_base}#{PrivacyGate::APIResources::Checkout::RESOURCE_PATH}")
|
21
|
+
.with(body: {:id => "id_value", :key => "key_value"})
|
22
|
+
.to_return(body: {data: {id: "id_value", key: "key_value"}}.to_json)
|
23
|
+
@client.checkout.create(id: "id_value", key: "key_value")
|
24
|
+
end
|
25
|
+
|
26
|
+
it "making a GET request with parameters should have a query string and no body" do
|
27
|
+
stub_request(:get, "#{@api_base}#{PrivacyGate::APIResources::Checkout::RESOURCE_PATH}")
|
28
|
+
.with(query: {limit: 5}).to_return(body: JSON.generate(data: [mock_list]))
|
29
|
+
@client.checkout.list(limit: 5)
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
describe PrivacyGate::APIResources::Event do
|
2
|
+
before :all do
|
3
|
+
@client = PrivacyGate::Client.new(api_key: 'api_key')
|
4
|
+
@api_base = @client.instance_variable_get :@api_uri
|
5
|
+
end
|
6
|
+
|
7
|
+
it "making a GET request with parameters should have a query string and no body" do
|
8
|
+
stub_request(:get, "#{@api_base}#{PrivacyGate::APIResources::Event::RESOURCE_PATH}")
|
9
|
+
.with(query: {limit: 5}).to_return(body: JSON.generate(data: [mock_list]))
|
10
|
+
@client.event.list(limit: 5)
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe PrivacyGate do
|
5
|
+
before :all do
|
6
|
+
@client = PrivacyGate::Client.new(api_key: 'api_key')
|
7
|
+
@api_base = @client.instance_variable_get :@api_uri
|
8
|
+
end
|
9
|
+
|
10
|
+
# test list resources
|
11
|
+
it "should get charges" do
|
12
|
+
stub_request(:get, "#{@api_base}charges").to_return(body: mock_list.to_json)
|
13
|
+
charge_list = @client.charge.list
|
14
|
+
expect(charge_list).is_a? @client.charge
|
15
|
+
expect(charge_list.data).is_a? Array
|
16
|
+
expect(charge_list.pagination).is_a? PrivacyGate::APIResources::Base::APIObject
|
17
|
+
expect(charge_list.data[0].to_hash).to eq mock_item
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should get checkouts" do
|
21
|
+
stub_request(:get, "#{@api_base}checkouts").to_return(body: mock_list.to_json)
|
22
|
+
checkout_list = @client.checkout.list
|
23
|
+
expect(checkout_list).is_a? @client.checkout
|
24
|
+
expect(checkout_list.data).is_a? Array
|
25
|
+
expect(checkout_list.pagination).is_a? PrivacyGate::APIResources::Base::APIObject
|
26
|
+
expect(checkout_list.data[0].to_hash).to eq mock_item
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should should get events" do
|
30
|
+
stub_request(:get, "#{@api_base}events").to_return(body: mock_list.to_json)
|
31
|
+
event_list = @client.event.list
|
32
|
+
expect(event_list).is_a? @client.checkout
|
33
|
+
expect(event_list.data).is_a? Array
|
34
|
+
expect(event_list.pagination).is_a? PrivacyGate::APIResources::Base::APIObject
|
35
|
+
expect(event_list.data[0].to_hash).to eq mock_item
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
# test single resources
|
40
|
+
it "should get charge" do
|
41
|
+
stub_request(:get, "#{@api_base}charges/key").to_return(body: {data: mock_item}.to_json)
|
42
|
+
charge = @client.charge.retrieve :key
|
43
|
+
expect(charge).is_a? @client.charge
|
44
|
+
expect(charge).is_a? PrivacyGate::APIResources::Base::APIObject
|
45
|
+
expect(charge.id).to eq mock_item[:id]
|
46
|
+
expect(charge.key).to eq mock_item[:key]
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should get checkout" do
|
50
|
+
stub_request(:get, "#{@api_base}checkouts/key").to_return(body: {data: mock_item}.to_json)
|
51
|
+
checkout = @client.checkout.retrieve :key
|
52
|
+
expect(checkout).is_a? @client.checkout
|
53
|
+
expect(checkout).is_a? PrivacyGate::APIResources::Base::APIObject
|
54
|
+
expect(checkout.id).to eq mock_item[:id]
|
55
|
+
expect(checkout.key).to eq mock_item[:key]
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should get event" do
|
59
|
+
stub_request(:get, "#{@api_base}events/key").to_return(body: {data: mock_item}.to_json)
|
60
|
+
event = @client.event.retrieve :key
|
61
|
+
expect(event).is_a? @client.charge
|
62
|
+
expect(event).is_a? PrivacyGate::APIResources::Base::APIObject
|
63
|
+
expect(event.id).to eq mock_item[:id]
|
64
|
+
expect(event.key).to eq mock_item[:key]
|
65
|
+
end
|
66
|
+
|
67
|
+
# test create resources
|
68
|
+
it "should create charge" do
|
69
|
+
stub_request(:post, "#{@api_base}charges").to_return(body: {data: mock_item}.to_json)
|
70
|
+
charge = @client.charge.create(mock_item)
|
71
|
+
expect(charge).is_a? @client.charge
|
72
|
+
expect(charge).is_a? PrivacyGate::APIResources::Base::APIObject
|
73
|
+
expect(charge.id).to eq mock_item[:id]
|
74
|
+
expect(charge.key).to eq mock_item[:key]
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should create checkout" do
|
78
|
+
stub_request(:post, "#{@api_base}checkouts").to_return(body: {data: mock_item}.to_json)
|
79
|
+
checkout = @client.checkout.create(mock_item)
|
80
|
+
expect(checkout).is_a? @client.checkout
|
81
|
+
expect(checkout).is_a? PrivacyGate::APIResources::Base::APIObject
|
82
|
+
expect(checkout.id).to eq mock_item[:id]
|
83
|
+
expect(checkout.key).to eq mock_item[:key]
|
84
|
+
end
|
85
|
+
|
86
|
+
# test delete resources
|
87
|
+
it "should delete checkout" do
|
88
|
+
stub_request(:post, "#{@api_base}checkouts").to_return(body: {data: mock_item}.to_json)
|
89
|
+
stub_request(:delete, "#{@api_base}checkouts/val").to_return(body: {}.to_json)
|
90
|
+
checkout = @client.checkout.create(mock_item)
|
91
|
+
checkout.delete
|
92
|
+
end
|
93
|
+
|
94
|
+
# test save resources
|
95
|
+
it "should save checkout" do
|
96
|
+
stub_request(:post, "#{@api_base}checkouts").to_return(body: {data: mock_item}.to_json)
|
97
|
+
stub_request(:put, "#{@api_base}checkouts/val").to_return(body: {:edited => true}.to_json)
|
98
|
+
checkout = @client.checkout.create(mock_item)
|
99
|
+
checkout.key = "new value"
|
100
|
+
checkout.save
|
101
|
+
expect(checkout.edited).to eq true
|
102
|
+
end
|
103
|
+
end
|
data/spec/error_spec.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe PrivacyGate do
|
5
|
+
before :all do
|
6
|
+
@client = PrivacyGate::Client.new(api_key: 'api_key')
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should get appropriate error when invalid response object" do
|
10
|
+
stub_request(:get, /.*/).to_return(body: {errors: [{id: "boo", message: "foo"}]}.to_json, status: 400)
|
11
|
+
expect {@client.checkout.list}.to raise_error PrivacyGate::Errors::APIError
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should handle invalid request general" do
|
15
|
+
stub_request(:get, /.*/).to_return(body: {error: {type: "invalid_request", message: "test"}}.to_json, status: 400)
|
16
|
+
expect {@client.checkout.list}.to raise_error PrivacyGate::Errors::InvalidRequestError
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should handle param required" do
|
20
|
+
stub_request(:get, /.*/).to_return(body: {error: {type: "param_required", message: "param_required"}}.to_json, status: 400)
|
21
|
+
expect {@client.checkout.list}.to raise_error PrivacyGate::Errors::ParamRequiredError
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should handle validation error" do
|
25
|
+
stub_request(:get, /.*/).to_return(body: {error: {type: "validation_error", message: "validation_error"}}.to_json, status: 400)
|
26
|
+
expect {@client.checkout.list}.to raise_error PrivacyGate::Errors::ValidationError
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should handle param_required" do
|
30
|
+
stub_request(:get, /.*/).to_return(body: {error: {type: "invalid_request", message: "invalid_request"}}.to_json, status: 400)
|
31
|
+
expect {@client.checkout.list}.to raise_error PrivacyGate::Errors::InvalidRequestError
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should handle authentication error" do
|
35
|
+
stub_request(:get, /.*/).to_return(body: {error: {type: "auth_error", message: "auth_error"}}.to_json, status: 401)
|
36
|
+
expect {@client.checkout.list}.to raise_error PrivacyGate::Errors::AuthenticationError
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should handle resource not found error" do
|
40
|
+
stub_request(:get, /.*/).to_return(body: {error: {type: "not_found", message: "not_found"}}.to_json, status: 404)
|
41
|
+
expect {@client.checkout.list}.to raise_error PrivacyGate::Errors::ResourceNotFoundError
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should handle rate limit exceeded error" do
|
45
|
+
stub_request(:get, /.*/).to_return(body: {error: {type: "rate_limit_exceeded", message: "rate_limit_exceeded"}}.to_json, status: 429)
|
46
|
+
expect {@client.checkout.list}.to raise_error PrivacyGate::Errors::RateLimitExceededError
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should handle internal server error" do
|
50
|
+
stub_request(:get, /.*/).to_return(body: {error: {type: "internal_error", message: "internal_error"}}.to_json, status: 500)
|
51
|
+
expect {@client.checkout.list}.to raise_error PrivacyGate::Errors::InternalServerError
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should handle service unavailable error" do
|
55
|
+
stub_request(:get, /.*/).to_return(body: {error: {type: "service_unavailable", message: "service_unavailable"}}.to_json, status: 503)
|
56
|
+
expect {@client.checkout.list}.to raise_error PrivacyGate::Errors::ServiceUnavailableError
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe PrivacyGate::PrivacyGateResponse do
|
5
|
+
describe "from_faraday_hash" do
|
6
|
+
it "should initialize a PrivacyGateResponse object from a Hash like the kind" do
|
7
|
+
body = '{"foo": "bar"}'
|
8
|
+
headers = {"x-request-id" => "x-request-id"}
|
9
|
+
http_resp = {
|
10
|
+
body: body,
|
11
|
+
headers: headers,
|
12
|
+
status: 200,
|
13
|
+
}
|
14
|
+
resp = PrivacyGate::PrivacyGateResponse.from_faraday_hash(http_resp)
|
15
|
+
|
16
|
+
expect(JSON.parse(body, symbolize_names: true)).to eq resp.data
|
17
|
+
expect(body).to eq resp.http_body
|
18
|
+
expect(headers).to eq resp.http_headers
|
19
|
+
expect(200).to eq resp.http_status
|
20
|
+
expect("x-request-id").to eq resp.request_id
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "from_faraday_response" do
|
25
|
+
it "should initialize a PrivacyGateResponse object from a Faraday HTTP response object." do
|
26
|
+
body = '{"foo": "bar"}'
|
27
|
+
headers = {"x-request-id" => "x-request-id"}
|
28
|
+
env = Faraday::Env.from(
|
29
|
+
status: 200, body: body,
|
30
|
+
response_headers: headers
|
31
|
+
)
|
32
|
+
http_resp = Faraday::Response.new(env)
|
33
|
+
|
34
|
+
resp = PrivacyGate::PrivacyGateResponse.from_faraday_response(http_resp)
|
35
|
+
|
36
|
+
expect(JSON.parse(body, symbolize_names: true)).to eq resp.data
|
37
|
+
expect(body).to eq resp.http_body
|
38
|
+
expect(headers).to eq resp.http_headers
|
39
|
+
expect(200).to eq resp.http_status
|
40
|
+
expect("x-request-id").to eq resp.request_id
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/spec/spec_helper.rb
ADDED