synapsis 0.0.6 → 0.0.7

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: f053fe7ebb33a87d6481ae87b43a22afb95034cb
4
- data.tar.gz: c56bb4477c91d0b0798e9973986a2bb33156e8ea
3
+ metadata.gz: 14bcbb633ac4588d0c5c2aec128086bc1a76ec6a
4
+ data.tar.gz: 161ed76607fc6fe4a5336e23423f1e2d3f894d8f
5
5
  SHA512:
6
- metadata.gz: 4b4f36ac061188c9a2e1ce644c31dc2808d833ec9e63bce24c4510d29f2a54ef4b2201472bacd954f0b8456b9642409959555aef3f13a660e0c788ed468f5f3f
7
- data.tar.gz: a85cbd37d511f08fff1c0116366ee9107649ff85610137248a4a96757b8758437b54513f09679a6db9c1cac8a634624af6a3e46b1a99ee447d70257e86c9ff1c
6
+ metadata.gz: 51b3daec18b29486ea45dd9b66b90cf73e6b88ec644ff8872eec042af25efc21b63558ce1c50ea3ffcce64d14bbf021faaa925fad6d7c2496d75738784df4d60
7
+ data.tar.gz: 55c997216c62ec91e687c59bcd651e6aca46e9d080e094a2a45706a160b481f64f76491bdb1fc6888562ee4dbacd9a61b551866708a5ec36a67fd32a46d73599
data/README.md CHANGED
@@ -22,6 +22,10 @@ Or install it yourself as:
22
22
 
23
23
  TODO: Write usage instructions here
24
24
 
25
+ ## Testing
26
+
27
+ Yasmin's username: `0d8b52f75e224400ba1511d411e598`
28
+
25
29
  ## Contributing
26
30
 
27
31
  1. Fork it ( https://github.com/[my-github-username]/synapsis/fork )
@@ -0,0 +1,14 @@
1
+ module Synapsis::APIOperations::Create
2
+ def create_request(params)
3
+ Synapsis.connection.post do |req|
4
+ req.headers['Content-Type'] = 'application/json'
5
+ req.url create_url
6
+ req.body = JSON.generate(params)
7
+ end
8
+ end
9
+
10
+ def create_url
11
+ "#{API_V2_PATH}#{class_name}/add"
12
+ end
13
+ end
14
+
@@ -0,0 +1,14 @@
1
+ module Synapsis::APIOperations::Edit
2
+ def edit_request(params)
3
+ Synapsis.connection.post do |req|
4
+ req.headers['Content-Type'] = 'application/json'
5
+ req.url edit_url
6
+ req.body = JSON.generate(params)
7
+ end
8
+ end
9
+
10
+ def edit_url
11
+ "#{API_V2_PATH}#{class_name}/edit/"
12
+ end
13
+ end
14
+
@@ -0,0 +1,13 @@
1
+ module Synapsis::APIOperations::View
2
+ def view_request(params)
3
+ Synapsis.connection.post do |req|
4
+ req.headers['Content-Type'] = 'application/json'
5
+ req.url view_url
6
+ req.body = JSON.generate(params)
7
+ end
8
+ end
9
+
10
+ def view_url
11
+ "#{API_V2_PATH}#{class_name}/show"
12
+ end
13
+ end
@@ -0,0 +1,23 @@
1
+ class Synapsis::APIResource
2
+ def self.class_name
3
+ name.partition('::').last.downcase
4
+ end
5
+
6
+ def class_name
7
+ self.class.name.partition('::').last.downcase
8
+ end
9
+
10
+ def self.return_response(response)
11
+ parsed_response = JSON.parse(response.body, object_class: Synapsis::Response)
12
+
13
+ if response.success?
14
+ return parsed_response
15
+ else
16
+ raise Synapsis::Error, parsed_response['reason']
17
+ end
18
+ end
19
+
20
+ def self.parse_as_synapse_resource(response)
21
+ return JSON.parse(response.body, object_class: Synapsis::Response)
22
+ end
23
+ end
data/lib/synapsis/bank.rb CHANGED
@@ -1,5 +1,6 @@
1
- class Synapsis::Bank
1
+ class Synapsis::Bank < Synapsis::APIResource
2
2
  include Synapsis::Utilities
3
+ extend Synapsis::APIOperations::Create
3
4
 
4
5
  module AccountClass
5
6
  PERSONAL = 1
@@ -12,90 +13,70 @@ class Synapsis::Bank
12
13
  end
13
14
 
14
15
  attr_accessor :account_class,
15
- :account_num,
16
+ :account_number_string,
16
17
  :account_type,
17
- :bank,
18
- :fullname,
19
- :mfa,
18
+ :address,
19
+ :balance,
20
+ :bank_name,
21
+ :date,
22
+ :email,
23
+ :id,
24
+ :is_active,
25
+ :is_buyer_default,
26
+ :is_seller_default,
27
+ :is_verified,
28
+ :mfa_verifed,
29
+ :name_on_account,
20
30
  :nickname,
21
- :oauth_consumer_key,
22
- :password,
23
- :pin,
24
- :routing_num,
25
- :username,
26
- :access_token
31
+ :phone_number,
32
+ :resource_uri,
33
+ :routing_number_string
27
34
 
28
35
  def self.add(params)
29
- self.new(params).add
36
+ added_bank = create_request(params)
37
+ return_response(added_bank)
30
38
  end
31
39
 
32
40
  def self.link(params)
33
- self.new(params).link
34
- end
35
-
36
- def self.view_linked_banks(params)
37
- self.new(params).view_linked_banks
38
- end
39
-
40
- def initialize(params)
41
- params.each do |k, v|
42
- send("#{k}=", v)
43
- end
44
- end
45
-
46
- def add
47
- added_bank = Synapsis.connection.post do |req|
48
- req.headers['Content-Type'] = 'application/json'
49
- req.url "#{API_V2_PATH}bank/add/"
50
- req.body = build_json_from_variable_hash
51
- end
52
-
53
- if JSON.parse(added_bank.body)['success']
54
- Synapsis::RetrievedBank.new(added_bank)
55
- else
56
- Synapsis::Error.new(JSON.parse(added_bank.body))
57
- end
58
- end
59
-
60
- def link
61
41
  partially_linked_bank = Synapsis.connection.post do |req|
62
42
  req.headers['Content-Type'] = 'application/json'
63
43
  req.url "#{API_V2_PATH}bank/login/?is_dev=yes"
64
- req.body = build_json_from_variable_hash
44
+ req.body = JSON.generate(params)
65
45
  end
66
46
 
67
- parsed_partially_linked_bank = JSON.parse(partially_linked_bank.body)
47
+ parsed_partially_linked_bank = parse_as_synapse_resource(partially_linked_bank)
68
48
 
69
- if parsed_partially_linked_bank['success']
70
- if parsed_partially_linked_bank['banks'] # This happens if the added bank has no MFA
71
- return Synapsis::RetrievedBank.new(partially_linked_bank)
49
+ if parsed_partially_linked_bank.success
50
+ if parsed_partially_linked_bank.banks # This happens if the added bank has no MFA
51
+ return parsed_partially_linked_bank
72
52
  end
73
53
 
74
- @access_token = parsed_partially_linked_bank['response']['access_token']
54
+ @access_token = parsed_partially_linked_bank.response.access_token
75
55
 
76
56
  new_bank = Synapsis.connection.post do |req|
77
57
  req.headers['Content-Type'] = 'application/json'
78
58
  req.url "#{API_V2_PATH}bank/mfa/?is_dev=yes"
79
- req.body = build_json_from_variable_hash
59
+ req.body = JSON.generate(params.merge(access_token: @access_token))
80
60
  end
81
61
 
82
- if JSON.parse(new_bank.body)['banks']
83
- Synapsis::RetrievedBank.new(new_bank)
62
+ parsed_new_bank = parse_as_synapse_resource(new_bank)
63
+
64
+ if parsed_new_bank.banks
65
+ return parsed_new_bank
84
66
  else
85
- Synapsis::Error.new({
86
- "reason" => "Wrong MFA answer."
87
- })
67
+ raise Synapsis::Error, 'Wrong MFA answer.'
88
68
  end
89
69
  else
90
- # API response is different so we parse the API response to get the message we need
91
- Synapsis::Error.new({
92
- "reason" => JSON.parse(partially_linked_bank.body)['message']
93
- })
70
+ raise Synapsis::Error, JSON.parse(partially_linked_bank.body)['message']
94
71
  end
95
72
  end
96
73
 
74
+ def self.view_linked_banks(params)
75
+ self.new(params).view_linked_banks
76
+ end
77
+
97
78
  def self.remove(bank_id, oauth_consumer_key)
98
- return Synapsis.connection.post do |req|
79
+ response = Synapsis.connection.post do |req|
99
80
  req.headers['Content-Type'] = 'application/json'
100
81
  req.url "#{API_V2_PATH}bank/delete/"
101
82
  req.body = JSON.generate(
@@ -103,6 +84,8 @@ class Synapsis::Bank
103
84
  oauth_consumer_key: oauth_consumer_key
104
85
  )
105
86
  end
87
+
88
+ return_response(response)
106
89
  end
107
90
 
108
91
  def view_linked_banks
@@ -113,39 +96,3 @@ class Synapsis::Bank
113
96
  end
114
97
  end
115
98
  end
116
-
117
- class Synapsis::RetrievedBank
118
- attr_accessor :account_class,
119
- :account_number_string,
120
- :account_type,
121
- :address,
122
- :balance,
123
- :bank_name,
124
- :date,
125
- :email,
126
- :id,
127
- :is_active,
128
- :is_buyer_default,
129
- :is_seller_default,
130
- :is_verified,
131
- :mfa_verifed,
132
- :name_on_account,
133
- :nickname,
134
- :phone_number,
135
- :resource_uri,
136
- :routing_number_string
137
-
138
- def initialize(synapse_response)
139
- parsed_response = JSON.parse(synapse_response.body)
140
-
141
- if parsed_response['banks']
142
- parsed_response['banks'].first.each do |k, v|
143
- send("#{k}=", v)
144
- end
145
- elsif parsed_response['bank']
146
- parsed_response['bank'].each do |k, v|
147
- send("#{k}=", v)
148
- end
149
- end
150
- end
151
- end
@@ -0,0 +1,10 @@
1
+ class Synapsis::Deposit < Synapsis::APIResource
2
+ include Synapsis::Utilities
3
+ extend Synapsis::APIOperations::Create
4
+
5
+ def self.create(params)
6
+ response = create_request(params)
7
+
8
+ return_response(response)
9
+ end
10
+ end
@@ -1,7 +1 @@
1
- class Synapsis::Error
2
- attr_accessor :reason
3
-
4
- def initialize(error_params)
5
- @reason = error_params['reason']
6
- end
7
- end
1
+ class Synapsis::Error < StandardError; end
@@ -0,0 +1,18 @@
1
+ class Synapsis::Order < Synapsis::APIResource
2
+ include Synapsis::Utilities
3
+ extend Synapsis::APIOperations::Create
4
+
5
+ def self.add(params)
6
+ response = create_request(params)
7
+ return_response(response)
8
+ end
9
+
10
+ def self.synapse_fee(transaction_amount)
11
+ if transaction_amount > 10
12
+ 0.25
13
+ else
14
+ 0.1
15
+ end
16
+ end
17
+ end
18
+
data/lib/synapsis/user.rb CHANGED
@@ -1,113 +1,35 @@
1
- class Synapsis::User
1
+ class Synapsis::User < Synapsis::APIResource
2
2
  include Synapsis::Utilities
3
-
4
- attr_accessor :email,
5
- :fullname,
6
- :password,
7
- :ip_address,
8
- :phonenumber,
9
- :access_token,
10
- :refresh_token,
11
- :username
3
+ extend Synapsis::APIOperations::Create
4
+ extend Synapsis::APIOperations::Edit
5
+ extend Synapsis::APIOperations::View
12
6
 
13
7
  def self.create(params)
14
- self.new(params).create
8
+ response = create_request(params.merge(client_credentials))
9
+ return_response(response)
15
10
  end
16
11
 
17
12
  def self.edit(params)
18
- self.new({}).edit(params)
19
- end
20
-
21
- def self.view(params)
22
- self.new({}).view(params)
23
- end
24
-
25
- def initialize(params)
26
- params.each do |k, v|
27
- send("#{k}=", v)
28
- end
29
- end
30
-
31
- def create
32
- response = Synapsis.connection.post do |req|
33
- req.headers['Content-Type'] = 'application/json'
34
- req.url "#{API_V2_PATH}user/create/"
35
- req.body = build_json_from_params
36
- end
37
-
38
- if JSON.parse(response.body)['success']
39
- update_attributes(response)
40
- return self
41
- else
42
- return Synapsis::Error.new(JSON.parse(response.body))
43
- end
13
+ response = edit_request(params)
14
+ return_response(response)
44
15
  end
45
16
 
46
- def edit(params)
47
- response = Synapsis.connection.post do |req|
48
- req.headers['Content-Type'] = 'application/json'
49
- req.url "#{API_V2_PATH}user/edit/"
50
- req.body = JSON.generate(params)
51
- end
52
-
53
-
54
- if JSON.parse(response.body)['success']
55
- update_attributes(response)
56
- return self
57
- else
58
- return Synapsis::Error.new(JSON.parse(response.body))
59
- end
60
- end
61
-
62
- def view(oauth_token = @access_token)
63
- response = Synapsis.connection.post do |req|
64
- req.headers['Content-Type'] = 'application/json'
65
- req.url "#{API_V2_PATH}user/show/"
66
- req.body = JSON.generate({ 'oauth_consumer_key' => oauth_token})
67
- end
68
-
69
- if response.success?
70
- return Synapsis::RetrievedUser.new(response)
71
- else
72
- return response
73
- end
17
+ def self.view(oauth_token)
18
+ response = view_request('oauth_consumer_key' => oauth_token)
19
+ return_response(response)
74
20
  end
75
21
 
76
22
  private
77
23
 
78
- def update_attributes(synapse_response)
79
- parsed_response = JSON.parse(synapse_response.body)
80
- @access_token = parsed_response['access_token']
81
- @refresh_token = parsed_response['refresh_token']
82
- @username = parsed_response['username']
83
-
84
- if parsed_response['user']
85
- @fullname = parsed_response['user']['fullname']
86
- end
24
+ def self.client_credentials
25
+ {
26
+ client_id: Synapsis.client_id,
27
+ client_secret: Synapsis.client_secret
28
+ }
87
29
  end
88
30
 
89
- class Synapsis::RetrievedUser
90
- attr_accessor :accept_bank_payments,
91
- :accept_gratuity,
92
- :balance,
93
- :email,
94
- :fullname,
95
- :has_avatar,
96
- :phone_number,
97
- :resource_uri,
98
- :seller_details,
99
- :user_id,
100
- :username,
101
- :visit_count,
102
- :visit_message
103
-
104
- def initialize(synapse_response)
105
- parsed_response = JSON.parse(synapse_response.body)
106
-
107
- parsed_response['user'].each do |k, v|
108
- send("#{k}=", v)
109
- end
110
- end
31
+ def self.create_url
32
+ "#{API_V2_PATH}user/create/"
111
33
  end
112
34
  end
113
35
 
@@ -1,8 +1,6 @@
1
1
  require 'json'
2
2
 
3
3
  module Synapsis::Utilities
4
- API_V2_PATH = 'api/v2/'
5
-
6
4
  def build_json_from_params
7
5
  JSON.generate(to_hash.merge(client_credentials))
8
6
  end
@@ -1,3 +1,3 @@
1
1
  module Synapsis
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
@@ -0,0 +1,25 @@
1
+ class Synapsis::Withdrawal < Synapsis::APIResource
2
+ include Synapsis::Utilities
3
+ extend Synapsis::APIOperations::Create
4
+ extend Synapsis::APIOperations::View
5
+
6
+ # Note: If you do not supply the bank_id, Synapse will attempt to withdraw from the primary bank.
7
+ def self.create(params)
8
+ response = create_request(params)
9
+
10
+ return_response(response)
11
+ end
12
+
13
+ def self.view(params)
14
+ response = view_request(params)
15
+
16
+ return_response(response)
17
+ end
18
+
19
+ private
20
+
21
+ # SynapseAPI's URI for withdrawals is /withdraw, not /withdrawal
22
+ def self.class_name
23
+ 'withdraw'
24
+ end
25
+ end
data/lib/synapsis.rb CHANGED
@@ -1,15 +1,29 @@
1
1
  # External dependencies
2
2
  require "faraday"
3
3
 
4
- # Internal dependencies
4
+ # Namespacing
5
+
6
+ module Synapsis
7
+ module APIOperations; end
8
+ end
5
9
 
10
+ # Internal dependencies
6
11
  require "synapsis/version"
7
12
  require "synapsis/utilities"
13
+ require "synapsis/api_resource"
14
+ require "synapsis/api_operations/create"
15
+ require "synapsis/api_operations/edit"
16
+ require "synapsis/api_operations/view"
8
17
  require "synapsis/authentication"
9
18
  require "synapsis/user"
10
19
  require "synapsis/bank"
20
+ require "synapsis/withdrawal"
21
+ require "synapsis/deposit"
22
+ require "synapsis/order"
11
23
  require "synapsis/error"
12
24
 
25
+ API_V2_PATH = 'api/v2/'
26
+
13
27
  module Synapsis
14
28
  class << self
15
29
  attr_accessor :client_id, :client_secret, :environment
@@ -34,4 +48,6 @@ module Synapsis
34
48
  yield(self)
35
49
  end
36
50
  end
51
+
52
+ class Response < OpenStruct; end
37
53
  end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Synapsis::APIResource do
4
+ context '.class_name' do
5
+ it 'gets the class name, without the Synapsis namespace' do
6
+ class Synapsis::Thingie < Synapsis::APIResource; end
7
+
8
+ expect(Synapsis::Thingie.class_name).to eq 'thingie'
9
+ end
10
+ end
11
+ end
@@ -25,13 +25,13 @@ RSpec.describe Synapsis::Bank do
25
25
 
26
26
  new_bank = Synapsis::Bank.link(bank_params)
27
27
 
28
- expect(new_bank.name_on_account).to eq user_params[:fullname]
29
- expect(new_bank.bank_name).to eq bank_params[:bank]
28
+ expect(new_bank.banks.first.name_on_account).to eq user_params[:fullname]
29
+ expect(new_bank.banks.first.bank_name).to eq bank_params[:bank]
30
30
  end
31
31
  end
32
32
 
33
33
  context 'errors' do
34
- it 'bad username returns a SynapsisError' do
34
+ it 'bad username raises a SynapsisError' do
35
35
  new_user = Synapsis::User.create(user_params)
36
36
 
37
37
  bank_params = {
@@ -43,28 +43,7 @@ RSpec.describe Synapsis::Bank do
43
43
  mfa: 'test_answer'
44
44
  }
45
45
 
46
- new_bank = Synapsis::Bank.link(bank_params)
47
-
48
- expect(new_bank.class).to eq Synapsis::Error
49
- expect(new_bank.reason).to be_a_kind_of String
50
- end
51
-
52
- it 'bad password returns a SynapsisError' do
53
- new_user = Synapsis::User.create(user_params)
54
-
55
- bank_params = {
56
- username: 'synapse_good',
57
- password: 'WRONG PASSWORD',
58
- pin: '1234',
59
- oauth_consumer_key: new_user.access_token,
60
- bank: 'US Bank',
61
- mfa: 'test_answer'
62
- }
63
-
64
- new_bank = Synapsis::Bank.link(bank_params)
65
-
66
- expect(new_bank.class).to eq Synapsis::Error
67
- expect(new_bank.reason).to be_a_kind_of String
46
+ expect{ Synapsis::Bank.link(bank_params) }.to raise_error(Synapsis::Error).with_message('The input you have entered is not valid. Please check your entry and try again.')
68
47
  end
69
48
 
70
49
  it 'bad mfa answer returns a SynapsisError' do
@@ -78,10 +57,7 @@ RSpec.describe Synapsis::Bank do
78
57
  mfa: 'WRONG MFA ANSWER'
79
58
  }
80
59
 
81
- new_bank = Synapsis::Bank.link(bank_params)
82
-
83
- expect(new_bank.class).to eq Synapsis::Error
84
- expect(new_bank.reason).to be_a_kind_of String
60
+ expect{ Synapsis::Bank.link(bank_params) }.to raise_error(Synapsis::Error).with_message('Wrong MFA answer.')
85
61
  end
86
62
 
87
63
  xit 'bad PIN returns a SynapsisError--pending since trying test data with a wrong PIN still completes the linking process' do
@@ -118,8 +94,8 @@ RSpec.describe Synapsis::Bank do
118
94
 
119
95
  new_bank = Synapsis::Bank.link(bank_params)
120
96
 
121
- expect(new_bank.name_on_account).to eq user_params[:fullname]
122
- expect(new_bank.bank_name).to eq bank_params[:bank]
97
+ expect(new_bank.banks.first.name_on_account).to eq user_params[:fullname]
98
+ expect(new_bank.banks.first.bank_name).to eq bank_params[:bank]
123
99
  end
124
100
 
125
101
  context 'errors' do
@@ -135,28 +111,7 @@ RSpec.describe Synapsis::Bank do
135
111
  mfa: 'test_answer'
136
112
  }
137
113
 
138
- new_bank = Synapsis::Bank.link(bank_params)
139
-
140
- expect(new_bank.class).to eq Synapsis::Error
141
- expect(new_bank.reason).to be_a_kind_of String
142
- end
143
-
144
- it 'bad password returns a SynapsisError' do
145
- new_user = Synapsis::User.create(user_params)
146
-
147
- bank_params = {
148
- username: 'synapse_code',
149
- password: 'WRONG PASSWORD',
150
- pin: '1234',
151
- oauth_consumer_key: new_user.access_token,
152
- bank: 'Ally',
153
- mfa: 'test_answer'
154
- }
155
-
156
- new_bank = Synapsis::Bank.link(bank_params)
157
-
158
- expect(new_bank.class).to eq Synapsis::Error
159
- expect(new_bank.reason).to be_a_kind_of String
114
+ expect { Synapsis::Bank.link(bank_params) }.to raise_error(Synapsis::Error).with_message('Please Enter the Correct Username and Password')
160
115
  end
161
116
 
162
117
  it 'bad mfa answer returns a SynapsisError' do
@@ -170,10 +125,7 @@ RSpec.describe Synapsis::Bank do
170
125
  mfa: 'WRONG MFA ANSWER'
171
126
  }
172
127
 
173
- new_bank = Synapsis::Bank.link(bank_params)
174
-
175
- expect(new_bank.class).to eq Synapsis::Error
176
- expect(new_bank.reason).to be_a_kind_of String
128
+ expect { Synapsis::Bank.link(bank_params) }.to raise_error(Synapsis::Error).with_message('Wrong MFA answer.')
177
129
  end
178
130
  end
179
131
  end
@@ -192,8 +144,9 @@ RSpec.describe Synapsis::Bank do
192
144
 
193
145
  new_bank = Synapsis::Bank.link(bank_params)
194
146
 
195
- expect(new_bank.name_on_account).to eq user_params[:fullname]
196
- expect(new_bank.bank_name).to eq bank_params[:bank]
147
+ # Upcase since Synapse automatically downcases titles such as "MD, PHD" (it becomes Md or Phd)
148
+ expect(new_bank.banks.first.name_on_account.upcase).to eq user_params[:fullname].upcase
149
+ expect(new_bank.banks.first.bank_name).to eq bank_params[:bank]
197
150
  end
198
151
  end
199
152
 
@@ -208,26 +161,7 @@ RSpec.describe Synapsis::Bank do
208
161
  bank: 'Capital One 360'
209
162
  }
210
163
 
211
- new_bank = Synapsis::Bank.link(bank_params)
212
-
213
- expect(new_bank.class).to eq Synapsis::Error
214
- expect(new_bank.reason).to be_a_kind_of String
215
- end
216
-
217
- it 'bad password returns a SynapsisError' do
218
- new_user = Synapsis::User.create(user_params)
219
-
220
- bank_params = {
221
- username: 'synapsenomfa',
222
- password: 'test12345',
223
- oauth_consumer_key: new_user.access_token,
224
- bank: 'Capital One 360'
225
- }
226
-
227
- new_bank = Synapsis::Bank.link(bank_params)
228
-
229
- expect(new_bank.class).to eq Synapsis::Error
230
- expect(new_bank.reason).to be_a_kind_of String
164
+ expect { Synapsis::Bank.link(bank_params) }.to raise_error(Synapsis::Error).with_message('The username or password provided were not correct.')
231
165
  end
232
166
 
233
167
  it 'bad mfa answer returns a SynapsisError' do
@@ -241,12 +175,54 @@ RSpec.describe Synapsis::Bank do
241
175
  mfa: 'WRONG MFA ANSWER'
242
176
  }
243
177
 
244
- new_bank = Synapsis::Bank.link(bank_params)
245
-
246
- expect(new_bank.class).to eq Synapsis::Error
247
- expect(new_bank.reason).to be_a_kind_of String
178
+ expect { Synapsis::Bank.link(bank_params) }.to raise_error(Synapsis::Error).with_message('Wrong MFA answer.')
248
179
  end
249
180
  end
250
181
  end
182
+
183
+ context 'multiple bank linkages' do
184
+ xit 'works' do
185
+ new_user = Synapsis::User.create(user_params)
186
+
187
+ first_bank_params = {
188
+ username: 'synapse_code',
189
+ password: 'test1234',
190
+ oauth_consumer_key: new_user.access_token,
191
+ bank: 'Ally',
192
+ mfa: 'test_answer'
193
+ }
194
+
195
+ first_bank = Synapsis::Bank.new(first_bank_params).link
196
+
197
+ expect(first_bank.name_on_account).to eq user_params[:fullname]
198
+ expect(first_bank.bank_name).to eq first_bank_params[:bank]
199
+
200
+ bank_params = {
201
+ fullname: new_user.fullname,
202
+ account_num: '1111111112',
203
+ routing_num: '121000358',
204
+ nickname: 'Sourcepad Bank',
205
+ oauth_consumer_key: new_user.access_token,
206
+ account_type: Synapsis::Bank::AccountType::CHECKING,
207
+ account_class: Synapsis::Bank::AccountClass::PERSONAL
208
+ }
209
+
210
+ new_bank = Synapsis::Bank.add(bank_params)
211
+
212
+ second_bank_params = {
213
+ username: 'synapse_good',
214
+ password: 'test1234',
215
+ oauth_consumer_key: new_user.access_token,
216
+ bank: 'PNC',
217
+ mfa: 'test_answer'
218
+ }
219
+
220
+ second_bank = Synapsis::Bank.new(second_bank_params).link
221
+
222
+ expect(second_bank.name_on_account).to eq user_params[:fullname]
223
+ expect(second_bank.bank_name).to eq second_bank_params[:bank]
224
+
225
+ end
226
+ end
251
227
  end
252
228
  end
@@ -11,33 +11,29 @@ RSpec.describe Synapsis::Bank do
11
11
  end
12
12
  end
13
13
 
14
- context '#add' do
15
- it 'adds a bank account' do
16
- # We need to create a user because Synapse limits bank accounts to 5 per user.
17
- user_params = {
18
- email: Faker::Internet.email,
19
- fullname: Faker::Name.name,
20
- phonenumber: Faker::PhoneNumber.phone_number,
21
- password: '5ourcep4d',
22
- ip_address: '8.8.8.8'
23
- }
14
+ context '#add/ #remove' do
15
+ it 'adds and removes a bank account' do
16
+ random_persons_access_token = 'dcd234d9d9fb55ad9711c4c41e254868ef3768d4'
24
17
 
25
- new_user = Synapsis::User.create(user_params)
18
+ viewed_user = Synapsis::User.view(random_persons_access_token)
26
19
 
27
20
  bank_params = {
28
- fullname: new_user.fullname,
21
+ fullname: viewed_user.user.fullname,
29
22
  account_num: '1111111112',
30
23
  routing_num: '121000358',
31
24
  nickname: 'Sourcepad Bank',
32
- oauth_consumer_key: new_user.access_token,
25
+ oauth_consumer_key: random_persons_access_token,
33
26
  account_type: Synapsis::Bank::AccountType::CHECKING,
34
27
  account_class: Synapsis::Bank::AccountClass::PERSONAL
35
28
  }
36
29
 
37
30
  new_bank = Synapsis::Bank.add(bank_params)
31
+ expect(new_bank.bank.name_on_account).to eq viewed_user.user.fullname
32
+ expect(new_bank.bank.nickname).to eq bank_params[:nickname]
38
33
 
39
- expect(new_bank.name_on_account).to eq user_params[:fullname]
40
- expect(new_bank.nickname).to eq bank_params[:nickname]
34
+ removed_bank = Synapsis::Bank.remove(new_bank.bank.id, random_persons_access_token)
35
+
36
+ expect(removed_bank.success).to eq true
41
37
  end
42
38
 
43
39
  it 'adds a bank account (errors)' do
@@ -62,40 +58,7 @@ RSpec.describe Synapsis::Bank do
62
58
  account_class: Synapsis::Bank::AccountClass::PERSONAL
63
59
  }
64
60
 
65
- new_bank = Synapsis::Bank.add(bank_params)
66
-
67
- expect(new_bank.class).to eq Synapsis::Error
68
- expect(new_bank.reason).to be_a_kind_of String
69
- end
70
- end
71
-
72
- context '#remove' do
73
- it 'removes the bank' do
74
- user_params = {
75
- email: Faker::Internet.email,
76
- fullname: Faker::Name.name,
77
- phonenumber: Faker::PhoneNumber.phone_number,
78
- password: '5ourcep4d',
79
- ip_address: '8.8.8.8'
80
- }
81
-
82
- new_user = Synapsis::User.create(user_params)
83
-
84
- bank_params = {
85
- fullname: new_user.fullname,
86
- account_num: '1111111112',
87
- routing_num: '121000358',
88
- nickname: 'Sourcepad Bank',
89
- oauth_consumer_key: new_user.access_token,
90
- account_type: Synapsis::Bank::AccountType::CHECKING,
91
- account_class: Synapsis::Bank::AccountClass::PERSONAL
92
- }
93
-
94
- new_bank = Synapsis::Bank.add(bank_params)
95
-
96
- removed_bank = Synapsis::Bank.remove(new_bank.id, new_user.access_token)
97
-
98
- expect(JSON.parse(removed_bank.body)['success']).to eq true
61
+ expect { Synapsis::Bank.add(bank_params) }.to raise_error(Synapsis::Error).with_message('Because of security reasons you can only add a bank account that belongs to you and is in your name.')
99
62
  end
100
63
  end
101
64
  end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Synapsis::Deposit do
4
+ context '#add' do
5
+ let!(:deposit_params) {{
6
+ amount: 100,
7
+ oauth_consumer_key: '3bdb5790692d06983d8cb0feb40365886631e52d',
8
+ bank_id: 2182
9
+ }}
10
+
11
+ context 'happy path' do
12
+ it 'constructs the correct deposit object' do
13
+ deposit_response = Synapsis::Deposit.create(deposit_params)
14
+
15
+ DEPOSIT_SPECIFIC_PARAMS = ['amount', 'bank', 'date_created', 'id', 'resource_uri', 'status', 'status_url', 'user_id']
16
+
17
+ (DEPOSIT_SPECIFIC_PARAMS - ['status_url']).each do |x|
18
+ expect(deposit_response.deposit.send(x.to_s.gsub('@', ''))).not_to be_nil
19
+ end
20
+ end
21
+ end
22
+
23
+ context 'errors' do
24
+ it 'create a Synapsis::Error object' do
25
+ # Missing amount
26
+ expect { Synapsis::Deposit.create(deposit_params.merge(amount: 0)) }.to raise_error(Synapsis::Error).with_message('Missing amount')
27
+
28
+ # OAuth error
29
+ expect { Synapsis::Deposit.create(deposit_params.merge(oauth_consumer_key: 'WRONG!!!')) }.to raise_error(Synapsis::Error).with_message('Error in OAuth Authentication.')
30
+
31
+ # Wrong bank ID (user does not own bank_id 1)
32
+ expect{ Synapsis::Deposit.create(deposit_params.merge(bank_id: 1))}.to raise_error(Synapsis::Error).with_message('Bank account not associated with the user')
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Synapsis::Order do
4
+ context '#add' do
5
+ let!(:delta) { 0.001 }
6
+ let!(:buyer_consumer_key) { '3bdb5790692d06983d8cb0feb40365886631e52d' }
7
+ let!(:seller_consumer_key) { '325ea5c0c3a7927280c54ed3ad310c02b45129d8' }
8
+ let!(:order_params) {{
9
+ amount: 1,
10
+ oauth_consumer_key: buyer_consumer_key,
11
+ seller_id: 3437
12
+ }}
13
+
14
+ context 'happy path' do
15
+ it 'constructs the correct Order object' do
16
+ order = Synapsis::Order.add(order_params)
17
+
18
+ ORDER_PARAMS = ['account_type', 'amount', 'date', 'date_settled', 'discount', 'facilitator_fee', 'fee', 'id', 'is_buyer', 'note', 'resource_uri', 'seller', 'status', 'status_uri', 'ticket_number', 'tip', 'total']
19
+
20
+ (ORDER_PARAMS - ['status_uri']).each do |x|
21
+ expect(order.order.send(x)).not_to be_nil
22
+ end
23
+ end
24
+
25
+ it 'subtracts the money from the consumer\'s account and adds to the seller\'s account' do
26
+ buyer_account_balance = Synapsis::User.view(buyer_consumer_key).user.balance
27
+ seller_account_balance = Synapsis::User.view(seller_consumer_key).user.balance
28
+
29
+ order = Synapsis::Order.add(order_params)
30
+
31
+ new_buyer_account_balance = Synapsis::User.view(buyer_consumer_key).user.balance
32
+ new_seller_account_balance = Synapsis::User.view(seller_consumer_key).user.balance
33
+
34
+ expect(new_buyer_account_balance).to be_within(delta).of(buyer_account_balance - order_params[:amount])
35
+ expect(new_seller_account_balance).to be_within(seller_account_balance + order_params[:amount] - Synapsis::Order.synapse_fee(order_params[:amount]))
36
+ end
37
+
38
+ it 'subtracts the money from the consumer\'s account and adds to the seller\'s account, with a charge of ' do
39
+ buyer_account_balance = Synapsis::User.view(buyer_consumer_key).user.balance
40
+ seller_account_balance = Synapsis::User.view(seller_consumer_key).user.balance
41
+
42
+ order = Synapsis::Order.add(order_params.merge(amount: 10.1))
43
+
44
+ new_buyer_account_balance = Synapsis::User.view(buyer_consumer_key).user.balance
45
+ new_seller_account_balance = Synapsis::User.view(seller_consumer_key).user.balance
46
+
47
+ expect(new_buyer_account_balance).to be_within(delta).of(buyer_account_balance - 10.1)
48
+ expect(new_seller_account_balance).to be_within(delta).of(seller_account_balance + 10.1- 0.25)
49
+ end
50
+ end
51
+
52
+ context 'no amount specified' do
53
+ it 'raises a Synapsis::Error' do
54
+ expect{ Synapsis::Order.add(order_params.merge(oauth_consumer_key: 'WRONG!')) }.to raise_error(Synapsis::Error).with_message('Error in OAuth Authentication.')
55
+ expect{ Synapsis::Order.add(order_params.merge(amount: 0)) }.to raise_error(Synapsis::Error).with_message('Missing amount')
56
+ expect{ Synapsis::Order.add(order_params.merge(seller_id: 0)) }.to raise_error(Synapsis::Error).with_message('Missing seller_id')
57
+ end
58
+ end
59
+ end
60
+ end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  RSpec.describe Synapsis::User do
4
4
  describe '#create' do
5
5
  it 'creates a user account and returns the SynapsePay username, access_token and refresh_token' do
6
- user_email = Faker::Internet.email
6
+ user_email = Faker::Internet.email[0, 29] # Limit 30 characters
7
7
 
8
8
  user_params = {
9
9
  email: user_email,
@@ -15,11 +15,10 @@ RSpec.describe Synapsis::User do
15
15
 
16
16
  new_synapse_user = Synapsis::User.create(user_params)
17
17
 
18
- expect(new_synapse_user.class).to eq Synapsis::User
19
- expect(new_synapse_user.email).to eq user_params[:email]
20
- expect(new_synapse_user.username).to be_a_kind_of String
21
- expect(new_synapse_user.access_token).to be_a_kind_of String
22
- expect(new_synapse_user.refresh_token).to be_a_kind_of String
18
+ ['access_token', 'oauth_consumer_key', 'expires_in',
19
+ 'reason', 'refresh_token', 'success', 'username', 'user_id'].each do |k|
20
+ expect(new_synapse_user.send(k)).not_to be_nil
21
+ end
23
22
  end
24
23
 
25
24
  it 'returns an error if the params are bad' do
@@ -31,9 +30,7 @@ RSpec.describe Synapsis::User do
31
30
  ip_address: '8.8.8.8'
32
31
  }
33
32
 
34
- new_synapse_user = Synapsis::User.create(user_params)
35
-
36
- expect(new_synapse_user).to be_a_kind_of Synapsis::Error
33
+ expect { Synapsis::User.create(user_params) }.to raise_error(Synapsis::Error).with_message('Add full name to create an account')
37
34
  end
38
35
  end
39
36
 
@@ -47,7 +44,7 @@ RSpec.describe Synapsis::User do
47
44
 
48
45
  edited_user = Synapsis::User.edit(edit_user_attributes)
49
46
 
50
- expect(edited_user.fullname).to eq edit_user_attributes['fullname']
47
+ expect(edited_user.user.fullname).to eq edit_user_attributes['fullname']
51
48
  end
52
49
 
53
50
  it 'returns an error if the update didnt work' do
@@ -57,42 +54,29 @@ RSpec.describe Synapsis::User do
57
54
  'oauth_consumer_key' => oauth_token
58
55
  }
59
56
 
60
- response = Synapsis::User.edit(edit_user_attributes)
61
-
62
- expect(response.reason).to be_a_kind_of String
57
+ expect { Synapsis::User.edit(edit_user_attributes) }.to raise_error(Synapsis::Error).with_message('Error in OAuth Authentication.')
63
58
  end
64
59
  end
65
60
 
66
- describe '#view' do
67
- it 'retrieves the user and returns their information in Struct form' do
68
- oauth_token = 'c7eda20ff7b2554c0bed2ad596ac5dfeb33124e1'
69
- response = Synapsis::User.view(oauth_token)
61
+ describe '.view' do
62
+ context 'happy path' do
63
+ it 'retrieves the user and returns their information in Struct form' do
64
+ oauth_token = 'c7eda20ff7b2554c0bed2ad596ac5dfeb33124e1'
65
+ response = Synapsis::User.view(oauth_token)
70
66
 
71
- user_attributes = [:accept_gratuity, :balance, :email, :fullname, :has_avatar, :phone_number, :resource_uri, :seller_details, :user_id, :username, :visit_count, :visit_message]
67
+ user_attributes = [:accept_gratuity, :balance, :email, :fullname, :has_avatar, :phone_number, :seller_details, :user_id, :username, :visit_count, :visit_message]
72
68
 
73
- user_attributes.each do |user_attribute|
74
- expect(response.send(user_attribute)).not_to be_nil
69
+ user_attributes.each do |user_attribute|
70
+ expect(response.user.send(user_attribute)).not_to be_nil
71
+ end
75
72
  end
76
73
  end
77
- end
78
-
79
- describe 'infrastructure' do
80
- it 'builds' do
81
- result = '{"email":"test5@synapsepay.com","fullname":"Test Account","ip_address":"11.111.11.11","phonenumber":"123456789","client_id":"ce65d5ce9116ae4c77bb","client_secret":"41877da204b32dbee3095033069ed81bcf512154"}'
82
-
83
- parsed_result = JSON.parse(result)
84
-
85
- user_params = {
86
- email: 'test5@synapsepay.com',
87
- fullname: 'Test Account',
88
- ip_address: '11.111.11.11',
89
- phonenumber: '123456789'
90
- }
91
74
 
92
- built = JSON.parse(Synapsis::User.new(user_params).build_json_from_params)
75
+ context 'error' do
76
+ it ' raises an Error' do
77
+ oauth_token = 'WRONG!!!'
93
78
 
94
- user_params.each do |k, v|
95
- expect(built[k]).to eq(parsed_result[k])
79
+ expect { Synapsis::User.view(oauth_token) }.to raise_error(Synapsis::Error).with_message('Error in OAuth Authentication.')
96
80
  end
97
81
  end
98
82
  end
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Synapsis::Withdrawal do
4
+ context '#add' do
5
+ let!(:withdrawal_params) {{
6
+ amount: 100,
7
+ oauth_consumer_key: '3bdb5790692d06983d8cb0feb40365886631e52d',
8
+ bank_id: 2182
9
+ }}
10
+
11
+ context 'happy path' do
12
+ it 'constructs the correct Withdrawal object' do
13
+ withdrawal_response = Synapsis::Withdrawal.create(withdrawal_params)
14
+
15
+ WITHDRAWAL_SPECIFIC_PARAMS = ['amount', 'bank', 'date_created', 'fee', 'id', 'instant_credit', 'resource_uri', 'status', 'status_url', 'user_id']
16
+
17
+ (WITHDRAWAL_SPECIFIC_PARAMS - ['status_url']).each do |x|
18
+ expect(withdrawal_response.withdrawal.send(x.to_s.gsub('@', ''))).not_to be_nil
19
+ end
20
+ end
21
+ end
22
+
23
+ context 'errors' do
24
+ it 'create a Synapsis::Error object' do
25
+ # Missing amount
26
+ expect { Synapsis::Withdrawal.create(withdrawal_params.merge(amount: 0)) }.to raise_error(Synapsis::Error).with_message('Missing amount')
27
+
28
+ # OAuth error
29
+ expect { Synapsis::Withdrawal.create(withdrawal_params.merge(oauth_consumer_key: 'WRONG!!!')) }.to raise_error(Synapsis::Error).with_message('Error in OAuth Authentication.')
30
+
31
+ # Wrong bank ID (user does not own bank_id 1)
32
+ expect{ Synapsis::Withdrawal.create(withdrawal_params.merge(bank_id: 1))}.to raise_error(Synapsis::Error).with_message('Bank account not associated with the user')
33
+ end
34
+ end
35
+ end
36
+
37
+ context '#view' do
38
+ context 'no ID' do
39
+ let!(:withdrawal_params) {{
40
+ oauth_consumer_key: '3bdb5790692d06983d8cb0feb40365886631e52d'
41
+ }}
42
+
43
+ context 'happy path' do
44
+ xit 'returns an array of the user\'s withdrawals' do
45
+ all_withdrawals = Synapsis::Withdrawal.view(withdrawal_params)
46
+ end
47
+ end
48
+ end
49
+
50
+ context 'with ID' do
51
+ let!(:withdrawal_params) {{
52
+ id: 354,
53
+ oauth_consumer_key: '3bdb5790692d06983d8cb0feb40365886631e52d'
54
+ }}
55
+
56
+ context 'happy path' do
57
+ xit 'returns an array of the user\'s withdrawals' do
58
+ pending
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: synapsis
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daryll Santos
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-05 00:00:00.000000000 Z
11
+ date: 2015-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -109,19 +109,30 @@ files:
109
109
  - README.md
110
110
  - Rakefile
111
111
  - lib/synapsis.rb
112
+ - lib/synapsis/api_operations/create.rb
113
+ - lib/synapsis/api_operations/edit.rb
114
+ - lib/synapsis/api_operations/view.rb
115
+ - lib/synapsis/api_resource.rb
112
116
  - lib/synapsis/authentication.rb
113
117
  - lib/synapsis/bank.rb
118
+ - lib/synapsis/deposit.rb
114
119
  - lib/synapsis/error.rb
120
+ - lib/synapsis/order.rb
115
121
  - lib/synapsis/user.rb
116
122
  - lib/synapsis/utilities.rb
117
123
  - lib/synapsis/version.rb
124
+ - lib/synapsis/withdrawal.rb
118
125
  - spec/config.yml
119
126
  - spec/spec_helper.rb
120
127
  - spec/support/json_helpers.rb
128
+ - spec/synapsis/api_resource_spec.rb
121
129
  - spec/synapsis/authentication_spec.rb
122
130
  - spec/synapsis/bank_link_spec.rb
123
131
  - spec/synapsis/bank_spec.rb
132
+ - spec/synapsis/deposit_spec.rb
133
+ - spec/synapsis/order_spec.rb
124
134
  - spec/synapsis/user_spec.rb
135
+ - spec/synapsis/withdrawal_spec.rb
125
136
  - synapsis.gemspec
126
137
  homepage: ''
127
138
  licenses:
@@ -151,7 +162,11 @@ test_files:
151
162
  - spec/config.yml
152
163
  - spec/spec_helper.rb
153
164
  - spec/support/json_helpers.rb
165
+ - spec/synapsis/api_resource_spec.rb
154
166
  - spec/synapsis/authentication_spec.rb
155
167
  - spec/synapsis/bank_link_spec.rb
156
168
  - spec/synapsis/bank_spec.rb
169
+ - spec/synapsis/deposit_spec.rb
170
+ - spec/synapsis/order_spec.rb
157
171
  - spec/synapsis/user_spec.rb
172
+ - spec/synapsis/withdrawal_spec.rb