straight-server 0.2.3 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +2 -2
- data/Gemfile +21 -16
- data/Gemfile.lock +44 -30
- data/Gemfile.travis +15 -16
- data/README.md +66 -47
- data/VERSION +1 -1
- data/db/migrations/011_add_callback_data_to_orders.rb +1 -1
- data/db/migrations/012_add_address_provider.rb +11 -0
- data/db/migrations/013_add_address_derivation_scheme.rb +11 -0
- data/db/migrations/014_pubkey_null_address_provider_not_null.rb +8 -0
- data/db/migrations/015_add_amount_paid_to_orders.rb +11 -0
- data/db/migrations/016_add_new_params_to_orders.rb +13 -0
- data/db/migrations/017_add_test_mode_to_gateways.rb +11 -0
- data/db/migrations/018_add_test_keychain_id_to_gateways.rb +11 -0
- data/db/migrations/019_add_test_pubkey_to_gateways.rb +11 -0
- data/db/migrations/020_add_test_mode_to_orders.rb +11 -0
- data/db/schema.rb +11 -1
- data/lib/straight-server.rb +11 -9
- data/lib/straight-server/config.rb +28 -18
- data/lib/straight-server/gateway.rb +167 -87
- data/lib/straight-server/initializer.rb +13 -7
- data/lib/straight-server/order.rb +39 -17
- data/lib/straight-server/orders_controller.rb +71 -21
- data/lib/straight-server/random_string.rb +3 -13
- data/lib/straight-server/server.rb +3 -4
- data/lib/straight-server/signature_validator.rb +69 -0
- data/lib/straight-server/thread.rb +19 -4
- data/lib/straight-server/throttler.rb +7 -13
- data/lib/tasks/db.rake +1 -1
- data/spec/.straight/config.yml +8 -3
- data/spec/.straight/default_test_last_keychain_id +1 -0
- data/spec/factories.rb +2 -1
- data/spec/lib/gateway_spec.rb +222 -94
- data/spec/lib/initializer_spec.rb +1 -1
- data/spec/lib/order_spec.rb +26 -7
- data/spec/lib/orders_controller_spec.rb +65 -6
- data/spec/lib/signature_validator_spec.rb +72 -0
- data/spec/lib/thread_spec.rb +16 -0
- data/spec/lib/throttle_spec.rb +2 -2
- data/spec/spec_helper.rb +17 -22
- data/straight-server.gemspec +31 -12
- data/templates/config.yml +19 -10
- metadata +52 -11
@@ -32,7 +32,7 @@ RSpec.describe StraightServer::Initializer do
|
|
32
32
|
remove_tmp_dir
|
33
33
|
end
|
34
34
|
|
35
|
-
# as #create_config_files method contains #exit method we need to rescue
|
35
|
+
# as #create_config_files method contains #exit method we need to rescue SystemExit: exit() error
|
36
36
|
# and at the same time its good to assert that method execution went well, which we do in rescue
|
37
37
|
let(:create_config_files) do
|
38
38
|
begin
|
data/spec/lib/order_spec.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# coding: utf-8
|
1
2
|
require 'spec_helper'
|
2
3
|
|
3
4
|
RSpec.describe StraightServer::Order do
|
@@ -9,6 +10,7 @@ RSpec.describe StraightServer::Order do
|
|
9
10
|
allow(@gateway).to receive(:id).and_return(1)
|
10
11
|
allow(@gateway).to receive(:active).and_return(true)
|
11
12
|
allow(@gateway).to receive(:order_status_changed)
|
13
|
+
allow(@gateway).to receive(:test_mode).and_return(false)
|
12
14
|
allow(@gateway).to receive(:save)
|
13
15
|
allow(@gateway).to receive(:increment_order_counter!)
|
14
16
|
allow(@gateway).to receive(:current_exchange_rate).and_return(111)
|
@@ -29,7 +31,7 @@ RSpec.describe StraightServer::Order do
|
|
29
31
|
|
30
32
|
it "prepares data as http params" do
|
31
33
|
allow(@order).to receive(:tid).and_return("tid1")
|
32
|
-
expect(@order.to_http_params).to eq("order_id=#{@order.id}&amount=10&amount_in_btc=#{@order.amount_in_btc(as: :string)}&status=#{@order.status}&address=#{@order.address}&tid=tid1&keychain_id=#{@order.keychain_id}&last_keychain_id=#{@order.gateway.last_keychain_id}")
|
34
|
+
expect(@order.to_http_params).to eq("order_id=#{@order.id}&amount=10&amount_in_btc=#{@order.amount_in_btc(as: :string)}&amount_paid_in_btc=#{@order.amount_in_btc(field: @order.amount_paid, as: :string)}&status=#{@order.status}&address=#{@order.address}&tid=tid1&keychain_id=#{@order.keychain_id}&last_keychain_id=#{@order.gateway.last_keychain_id}")
|
33
35
|
end
|
34
36
|
|
35
37
|
it "generates a payment_id" do
|
@@ -46,9 +48,10 @@ RSpec.describe StraightServer::Order do
|
|
46
48
|
end
|
47
49
|
|
48
50
|
it "checks DB for a status update first if the respective option for the gateway is turned on" do
|
49
|
-
allow(@order).to receive(:transaction).and_raise("Shouldn't ever be happening!")
|
51
|
+
# allow(@order).to receive(:transaction).and_raise("Shouldn't ever be happening!")
|
50
52
|
StraightServer::Config.check_order_status_in_db_first = true
|
51
53
|
StraightServer::Order.where(id: @order.id).update(status: 2)
|
54
|
+
allow(@order.gateway).to receive(:fetch_transactions_for).and_return([])
|
52
55
|
allow(@order.gateway).to receive(:order_status_changed)
|
53
56
|
expect(@order.status(reload: false)).to eq(0)
|
54
57
|
expect(@order.status(reload: true)).to eq(2)
|
@@ -75,21 +78,37 @@ RSpec.describe StraightServer::Order do
|
|
75
78
|
|
76
79
|
it "returns last_keychain_id for the gateway along with other order data" do
|
77
80
|
order = create(:order, gateway_id: @gateway.id)
|
78
|
-
expect(order.to_h).to include(keychain_id: order.keychain_id, last_keychain_id: @gateway.last_keychain_id)
|
81
|
+
expect(order.to_h).to include(keychain_id: order.keychain_id, last_keychain_id: @gateway.last_keychain_id)
|
82
|
+
end
|
83
|
+
|
84
|
+
it "returns test_last_keychain_id (as last_keychain_id) for the gateway in test mode" do
|
85
|
+
allow(@gateway).to receive(:test_mode).and_return(true)
|
86
|
+
allow(@gateway).to receive(:test_last_keychain_id).and_return(123)
|
87
|
+
order = create(:order, gateway_id: @gateway.id)
|
88
|
+
expect(order.to_h[:last_keychain_id]).to eq(123)
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'is cancelable only while new' do
|
92
|
+
order = build(:order, gateway_id: @gateway.id, status: 0)
|
93
|
+
expect(order.cancelable?).to eq true
|
94
|
+
(1..6).each do |status|
|
95
|
+
order.instance_variable_set :@status, status
|
96
|
+
expect(order.cancelable?).to eq false
|
97
|
+
end
|
79
98
|
end
|
80
99
|
|
81
100
|
describe "DB interaction" do
|
82
101
|
|
83
102
|
it "saves a new order into the database" do
|
84
|
-
expect(DB[:orders][:keychain_id => @order.id]).not_to be_nil
|
103
|
+
expect(DB[:orders][:keychain_id => @order.id]).not_to be_nil
|
85
104
|
end
|
86
105
|
|
87
106
|
it "updates an existing order" do
|
88
107
|
allow(@order).to receive(:gateway).and_return(@gateway)
|
89
|
-
expect(DB[:orders][:keychain_id => @order.id][:status]).to eq(0)
|
108
|
+
expect(DB[:orders][:keychain_id => @order.id][:status]).to eq(0)
|
90
109
|
@order.status = 1
|
91
110
|
@order.save
|
92
|
-
expect(DB[:orders][:keychain_id => @order.id][:status]).to eq(1)
|
111
|
+
expect(DB[:orders][:keychain_id => @order.id][:status]).to eq(1)
|
93
112
|
end
|
94
113
|
|
95
114
|
it "finds first order in the database by id" do
|
@@ -103,7 +122,7 @@ RSpec.describe StraightServer::Order do
|
|
103
122
|
it "finds orders in the database by any conditions" do
|
104
123
|
order1 = create(:order, gateway_id: @gateway.id)
|
105
124
|
order2 = create(:order, gateway_id: @gateway.id)
|
106
|
-
|
125
|
+
|
107
126
|
expect(StraightServer::Order.where(keychain_id: order1.keychain_id).first).to equal_order(order1)
|
108
127
|
expect(StraightServer::Order.where(keychain_id: order2.keychain_id).first).to equal_order(order2)
|
109
128
|
expect(StraightServer::Order.where(keychain_id: order2.keychain_id+1).first).to be_nil
|
@@ -5,7 +5,8 @@ RSpec.describe StraightServer::OrdersController do
|
|
5
5
|
before(:each) do
|
6
6
|
DB.run("DELETE FROM orders")
|
7
7
|
@gateway = gateway = StraightServer::Gateway.find_by_id(2)
|
8
|
-
allow(gateway).to
|
8
|
+
allow(gateway).to receive_message_chain("address_provider.takes_fees?").and_return(false)
|
9
|
+
allow(gateway).to receive_message_chain("address_provider.new_address").and_return("address#{gateway.last_keychain_id+1}")
|
9
10
|
allow(gateway).to receive(:fetch_transactions_for).with(anything).and_return([])
|
10
11
|
allow(gateway).to receive(:send_callback_http_request)
|
11
12
|
end
|
@@ -18,15 +19,22 @@ RSpec.describe StraightServer::OrdersController do
|
|
18
19
|
expect(response).to render_json_with(status: 0, amount: 10, address: "address1", tid: nil, id: :anything, keychain_id: @gateway.last_keychain_id, last_keychain_id: @gateway.last_keychain_id)
|
19
20
|
end
|
20
21
|
|
21
|
-
it "renders 409 error when an order cannot be created due to
|
22
|
+
it "renders 409 error when an order cannot be created due to invalid amount" do
|
22
23
|
send_request "POST", '/gateways/2/orders', amount: 0
|
23
24
|
expect(response[0]).to eq(409)
|
24
|
-
expect(response[2]).to eq("Invalid order: amount should be more than 0")
|
25
|
+
expect(response[2]).to eq("Invalid order: amount cannot be nil and should be more than 0")
|
26
|
+
end
|
27
|
+
|
28
|
+
it "renders 409 error when an order cannot be created due to other validation errors" do
|
29
|
+
send_request "POST", '/gateways/2/orders', amount: 1, description: 'A'*256
|
30
|
+
expect(response[0]).to eq(409)
|
31
|
+
expect(response[2]).to eq("Invalid order: description should be shorter than 256 characters")
|
25
32
|
end
|
26
33
|
|
27
34
|
it "starts tracking the order status in a separate thread" do
|
28
35
|
order_mock = double("order mock")
|
29
36
|
expect(order_mock).to receive(:start_periodic_status_check)
|
37
|
+
expect(order_mock).to receive(:payment_id).and_return('blabla')
|
30
38
|
allow(order_mock).to receive(:to_h).and_return({})
|
31
39
|
expect(@gateway).to receive(:create_order).and_return(order_mock)
|
32
40
|
send_request "POST", '/gateways/2/orders', amount: 10
|
@@ -58,7 +66,7 @@ RSpec.describe StraightServer::OrdersController do
|
|
58
66
|
end
|
59
67
|
|
60
68
|
it 'limits creation of orders without signature' do
|
61
|
-
new_config = StraightServer::Config.
|
69
|
+
new_config = StraightServer::Config.clone
|
62
70
|
new_config.throttle = {requests_limit: 1, period: 1}
|
63
71
|
stub_const 'StraightServer::Config', new_config
|
64
72
|
allow(StraightServer::Thread).to receive(:new)
|
@@ -72,7 +80,7 @@ RSpec.describe StraightServer::OrdersController do
|
|
72
80
|
@gateway1.check_signature = true
|
73
81
|
5.times do |i|
|
74
82
|
i += 1
|
75
|
-
|
83
|
+
send_signed_request @gateway1, "POST", '/gateways/1/orders', amount: 10, keychain_id: i
|
76
84
|
expect(response[0]).to eq 200
|
77
85
|
expect(response).to render_json_with(status: 0, amount: 10, tid: nil, id: :anything, keychain_id: i, last_keychain_id: i)
|
78
86
|
end
|
@@ -163,11 +171,62 @@ RSpec.describe StraightServer::OrdersController do
|
|
163
171
|
send_request "GET", '/gateways/2/orders/payment_id/websocket'
|
164
172
|
expect(response).to eq("ws rack response")
|
165
173
|
end
|
174
|
+
end
|
175
|
+
|
176
|
+
describe "cancel action" do
|
177
|
+
it "cancels new order" do
|
178
|
+
allow(StraightServer::Thread).to receive(:new)
|
179
|
+
send_request "POST", '/gateways/2/orders', amount: 1
|
180
|
+
payment_id = JSON.parse(response[2])['payment_id']
|
181
|
+
send_request "POST", "/gateways/2/orders/#{payment_id}/cancel"
|
182
|
+
expect(response[0]).to eq 200
|
183
|
+
end
|
166
184
|
|
185
|
+
it "requires signature to cancel signed order" do
|
186
|
+
allow(StraightServer::Thread).to receive(:new)
|
187
|
+
@gateway1 = StraightServer::Gateway.find_by_id(1)
|
188
|
+
@gateway1.check_signature = true
|
189
|
+
@order_mock = double('order mock')
|
190
|
+
allow(@order_mock).to receive(:status).with(reload: true)
|
191
|
+
allow(@order_mock).to receive(:status_changed?).and_return(false)
|
192
|
+
allow(@order_mock).to receive(:cancelable?).and_return(true)
|
193
|
+
expect(@order_mock).to receive(:cancel)
|
194
|
+
allow(StraightServer::Order).to receive(:[]).and_return(@order_mock)
|
195
|
+
send_request "POST", "/gateways/1/orders/payment_id/cancel"
|
196
|
+
expect(response).to eq [409, {}, 'X-Nonce is invalid: nil']
|
197
|
+
send_signed_request @gateway1, "POST", "/gateways/1/orders/payment_id/cancel"
|
198
|
+
expect(response[0]).to eq 200
|
199
|
+
end
|
200
|
+
|
201
|
+
it "do not cancel orders with status != new" do
|
202
|
+
@order_mock = double('order mock')
|
203
|
+
allow(@order_mock).to receive(:status).with(reload: true)
|
204
|
+
allow(@order_mock).to receive(:status_changed?).and_return(true)
|
205
|
+
expect(@order_mock).to receive(:save)
|
206
|
+
allow(@order_mock).to receive(:cancelable?).and_return(false)
|
207
|
+
allow(StraightServer::Order).to receive(:[]).and_return(@order_mock)
|
208
|
+
send_request "POST", "/gateways/2/orders/payment_id/cancel"
|
209
|
+
expect(response).to eq [409, {}, "Order is not cancelable"]
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
it 'return last_keychain_id' do
|
214
|
+
lk_id = 123
|
215
|
+
@gateway = StraightServer::Gateway.find_by_id(1)
|
216
|
+
@gateway.last_keychain_id = lk_id
|
217
|
+
@gateway.save
|
218
|
+
send_request "GET", '/gateway/1/last_keychain_id'
|
219
|
+
expect(response).to render_json_with(gateway_id: @gateway.id, last_keychain_id: lk_id)
|
167
220
|
end
|
168
221
|
|
169
222
|
def send_request(method, path, params={})
|
170
|
-
env = Hashie::Mash.new(
|
223
|
+
env = Hashie::Mash.new('REQUEST_METHOD' => method, 'REQUEST_PATH' => path, 'params' => params)
|
224
|
+
@controller = StraightServer::OrdersController.new(env)
|
225
|
+
end
|
226
|
+
|
227
|
+
def send_signed_request(gateway, method, path, params={})
|
228
|
+
env = Hashie::Mash.new('REQUEST_METHOD' => method, 'REQUEST_PATH' => path, 'params' => params, 'HTTP_X_NONCE' => (Time.now.to_f * 1e6).to_i)
|
229
|
+
env['HTTP_X_SIGNATURE'] = StraightServer::SignatureValidator.new(gateway, env).signature
|
171
230
|
@controller = StraightServer::OrdersController.new(env)
|
172
231
|
end
|
173
232
|
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe StraightServer::SignatureValidator do
|
4
|
+
|
5
|
+
it 'calculates signature' do
|
6
|
+
expect(described_class.signature(nonce: '123', body: '', method: 'GET', request_uri: '/somewhere', secret: 'gateway_secret')).to eq 'ZSWEKzuWy6QWCc05I+t4QYQhUtkeogkW7rCwieQvy/56Y+bVwxGGKB3yNQg1XL2LmtuNNwv2SXUxjlFEP7+0+A=='
|
7
|
+
expect(described_class.signature(nonce: '123', body: '', method: 'GET', request_uri: '/somewhere', secret: 'gateway-secret')).to eq 'nYLq7IXlgw5FAsXGc0+JoXmfHBEwl7zwVQhsix+FraIIFsPeGYnQ/22wkjPAwwyu0GoYEbM6gmN+sxEzciNkFg=='
|
8
|
+
expect(described_class.signature(nonce: '12345', body: 'text' * 10000, method: 'POST', request_uri: '/somewhere', secret: 'gateway_secret')).to eq 'F0GsyqPkxDgmqdTomIGVIRQ/ik2GiZtXy1GVNx0j+UDUL8VS496HsbcOlyUocKUM0fU96KkjhrpUh0LC29AXyQ=='
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'validates signature' do
|
12
|
+
@validator = described_class.new(
|
13
|
+
Struct.new(:secret).new('abc'),
|
14
|
+
{
|
15
|
+
'HTTP_X_NONCE' => '1',
|
16
|
+
'rack.input' => 'request body',
|
17
|
+
'REQUEST_METHOD' => 'POST',
|
18
|
+
'REQUEST_URI' => '/gateway/123/orders',
|
19
|
+
}
|
20
|
+
)
|
21
|
+
expect(@validator.env['HTTP_X_SIGNATURE'] = @validator.signature).to eq '1EtQNASecMF85tyag+pSSdF2yxLfy3xCddM2ZGA86M8OTxleEixBnbOeMEBp37Ke5+7jWQm+Gpx95y6MZiW6wQ=='
|
22
|
+
expect(@validator.valid_signature?).to eq true
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'validates nonce' do
|
26
|
+
@validator = described_class.new(
|
27
|
+
Struct.new(:id).new(1),
|
28
|
+
{'HTTP_X_NONCE' => '100500'}
|
29
|
+
)
|
30
|
+
expect(@validator.valid_nonce?).to eq true
|
31
|
+
expect(@validator.valid_nonce?).to eq false
|
32
|
+
@validator.env['HTTP_X_NONCE'] = '100499'
|
33
|
+
expect(@validator.valid_nonce?).to eq false
|
34
|
+
@validator.env['HTTP_X_NONCE'] = '100501'
|
35
|
+
expect(@validator.valid_nonce?).to eq true
|
36
|
+
expect(@validator.valid_nonce?).to eq false
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'validates nonce in a thread-safe way' do
|
40
|
+
# TODO: test on real concurrency (JRuby?)
|
41
|
+
@validator = described_class.new(
|
42
|
+
Struct.new(:id).new(2),
|
43
|
+
{'HTTP_X_NONCE' => '100500'}
|
44
|
+
)
|
45
|
+
thread_number = 100
|
46
|
+
@threads = thread_number.times.map do |i|
|
47
|
+
Thread.new do
|
48
|
+
sleep (thread_number - i) / 10000.0
|
49
|
+
Thread.current[:result] = @validator.valid_nonce?
|
50
|
+
end
|
51
|
+
end
|
52
|
+
@threads.each(&:join)
|
53
|
+
expect(@threads.select { |thread| thread[:result] }.size).to eq 1
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'raises exceptions if invalid' do
|
57
|
+
@validator = described_class.new(
|
58
|
+
Struct.new(:id, :secret).new(3, 'abc'),
|
59
|
+
{
|
60
|
+
'HTTP_X_NONCE' => '1',
|
61
|
+
'rack.input' => 'request body',
|
62
|
+
'REQUEST_METHOD' => 'POST',
|
63
|
+
'REQUEST_PATH' => '/gateway/123/orders',
|
64
|
+
}
|
65
|
+
)
|
66
|
+
@validator.env['HTTP_X_SIGNATURE'] = @validator.signature
|
67
|
+
expect(@validator.validate!).to eq true
|
68
|
+
expect { @validator.validate! }.to raise_error(described_class::InvalidNonce)
|
69
|
+
@validator.env['HTTP_X_NONCE'] = '2'
|
70
|
+
expect { @validator.validate! }.to raise_error(described_class::InvalidSignature)
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe StraightServer::Thread do
|
4
|
+
|
5
|
+
it 'labels threads' do
|
6
|
+
thread = described_class.new(label: 'payment_id'){}
|
7
|
+
expect(thread[:label]).to eq 'payment_id'
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'sets and clears interruption flag' do
|
11
|
+
thread = described_class.new(label: 'payment_id'){}
|
12
|
+
described_class.interrupt(label: 'payment_id')
|
13
|
+
expect(described_class.interrupted?(thread: thread)).to eq true
|
14
|
+
expect(described_class.interrupted?(thread: thread)).to eq false
|
15
|
+
end
|
16
|
+
end
|
data/spec/lib/throttle_spec.rb
CHANGED
@@ -4,7 +4,7 @@ require 'timecop'
|
|
4
4
|
RSpec.describe StraightServer::Throttler do
|
5
5
|
|
6
6
|
it 'throttles requests' do
|
7
|
-
new_config = StraightServer::Config.
|
7
|
+
new_config = StraightServer::Config.clone
|
8
8
|
new_config.throttle = {requests_limit: 1, period: 1}
|
9
9
|
stub_const 'StraightServer::Config', new_config
|
10
10
|
throttler1 = described_class.new(1)
|
@@ -29,7 +29,7 @@ RSpec.describe StraightServer::Throttler do
|
|
29
29
|
end
|
30
30
|
|
31
31
|
it 'bans by ip' do
|
32
|
-
new_config = StraightServer::Config.
|
32
|
+
new_config = StraightServer::Config.clone
|
33
33
|
new_config.throttle = {requests_limit: 3, period: 1, ip_ban_duration: 30}
|
34
34
|
stub_const 'StraightServer::Config', new_config
|
35
35
|
throttler1 = described_class.new(1)
|
data/spec/spec_helper.rb
CHANGED
@@ -12,40 +12,34 @@ DB = Sequel.sqlite
|
|
12
12
|
# 2. Then we can run migrations BEFORE we load actual models
|
13
13
|
Sequel::Migrator.run(DB, File.expand_path('../', File.dirname(__FILE__)) + '/db/migrations/')
|
14
14
|
|
15
|
-
#
|
16
|
-
|
15
|
+
# Actually load the initializer
|
16
|
+
require_relative '../lib/straight-server'
|
17
17
|
|
18
|
-
#
|
18
|
+
# This tells initializer where to read the config file from
|
19
19
|
ENV['HOME'] = File.expand_path(File.dirname(__FILE__))
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
include StraightServer::Initializer
|
26
|
-
StraightServer::Initializer::ConfigDir.set!
|
27
|
-
read_config_file
|
28
|
-
setup_redis_connection
|
29
|
-
|
30
|
-
# 4. Load the rest of the files, including models, which are now ready
|
31
|
-
# to be used as intended and will follow all the previous configuration.
|
32
|
-
require_relative '../lib/straight-server/order'
|
21
|
+
initializer = Class.new do
|
22
|
+
include StraightServer::Initializer
|
23
|
+
end.new
|
24
|
+
initializer.prepare
|
33
25
|
require_relative '../lib/straight-server/gateway'
|
34
|
-
require_relative '../lib/straight-server/
|
35
|
-
require_relative '../lib/straight-server'
|
26
|
+
require_relative '../lib/straight-server/order'
|
36
27
|
|
37
28
|
require_relative 'support/custom_matchers'
|
38
29
|
|
39
30
|
require "factory_girl"
|
40
31
|
require_relative "factories"
|
41
32
|
|
42
|
-
|
43
|
-
alias :save! :save
|
44
|
-
end
|
33
|
+
require 'webmock/rspec'
|
45
34
|
|
35
|
+
# class StraightServer::Order
|
36
|
+
# alias :save! :save
|
37
|
+
# end
|
38
|
+
#
|
46
39
|
class StraightServer::Thread
|
47
|
-
def self.new(&block)
|
40
|
+
def self.new(label: nil, &block)
|
48
41
|
block.call
|
42
|
+
{label: label}
|
49
43
|
end
|
50
44
|
end
|
51
45
|
|
@@ -57,7 +51,8 @@ RSpec.configure do |config|
|
|
57
51
|
StraightServer.db_connection = DB #use a memory DB
|
58
52
|
end
|
59
53
|
|
60
|
-
config.before(:each) do
|
54
|
+
config.before(:each) do |spec|
|
55
|
+
# puts spec.description
|
61
56
|
DB[:orders].delete
|
62
57
|
logger_mock = double("logger mock")
|
63
58
|
[:debug, :info, :warn, :fatal, :unknown, :blank_lines].each do |e|
|
data/straight-server.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: straight-server 0.
|
5
|
+
# stub: straight-server 1.0.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "straight-server"
|
9
|
-
s.version = "0.
|
9
|
+
s.version = "1.0.0"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Roman Snitko"]
|
14
|
-
s.date = "2015-
|
14
|
+
s.date = "2015-07-31"
|
15
15
|
s.description = "Accepts orders via http, returns payment info via http or streams updates via websockets, stores orders in a DB"
|
16
16
|
s.email = "roman.snitko@gmail.com"
|
17
17
|
s.executables = ["straight-console", "straight-server", "straight-server-benchmark"]
|
@@ -48,6 +48,15 @@ Gem::Specification.new do |s|
|
|
48
48
|
"db/migrations/009_add_hashed_id_to_gateways.rb",
|
49
49
|
"db/migrations/010_add_address_reusability_orders.rb",
|
50
50
|
"db/migrations/011_add_callback_data_to_orders.rb",
|
51
|
+
"db/migrations/012_add_address_provider.rb",
|
52
|
+
"db/migrations/013_add_address_derivation_scheme.rb",
|
53
|
+
"db/migrations/014_pubkey_null_address_provider_not_null.rb",
|
54
|
+
"db/migrations/015_add_amount_paid_to_orders.rb",
|
55
|
+
"db/migrations/016_add_new_params_to_orders.rb",
|
56
|
+
"db/migrations/017_add_test_mode_to_gateways.rb",
|
57
|
+
"db/migrations/018_add_test_keychain_id_to_gateways.rb",
|
58
|
+
"db/migrations/019_add_test_pubkey_to_gateways.rb",
|
59
|
+
"db/migrations/020_add_test_mode_to_orders.rb",
|
51
60
|
"db/schema.rb",
|
52
61
|
"examples/client/client.dart",
|
53
62
|
"examples/client/client.html",
|
@@ -61,11 +70,13 @@ Gem::Specification.new do |s|
|
|
61
70
|
"lib/straight-server/orders_controller.rb",
|
62
71
|
"lib/straight-server/random_string.rb",
|
63
72
|
"lib/straight-server/server.rb",
|
73
|
+
"lib/straight-server/signature_validator.rb",
|
64
74
|
"lib/straight-server/thread.rb",
|
65
75
|
"lib/straight-server/throttler.rb",
|
66
76
|
"lib/straight-server/utils/hash_string_to_sym_keys.rb",
|
67
77
|
"lib/tasks/db.rake",
|
68
78
|
"spec/.straight/config.yml",
|
79
|
+
"spec/.straight/default_test_last_keychain_id",
|
69
80
|
"spec/.straight/server_secret",
|
70
81
|
"spec/factories.rb",
|
71
82
|
"spec/fixtures/addons.yml",
|
@@ -74,6 +85,8 @@ Gem::Specification.new do |s|
|
|
74
85
|
"spec/lib/initializer_spec.rb",
|
75
86
|
"spec/lib/order_spec.rb",
|
76
87
|
"spec/lib/orders_controller_spec.rb",
|
88
|
+
"spec/lib/signature_validator_spec.rb",
|
89
|
+
"spec/lib/thread_spec.rb",
|
77
90
|
"spec/lib/throttle_spec.rb",
|
78
91
|
"spec/lib/utils/hash_string_to_sym_keys.rb",
|
79
92
|
"spec/spec_helper.rb",
|
@@ -91,42 +104,48 @@ Gem::Specification.new do |s|
|
|
91
104
|
s.specification_version = 4
|
92
105
|
|
93
106
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
94
|
-
s.add_runtime_dependency(%q<straight>, ["= 0.
|
95
|
-
s.add_runtime_dependency(%q<satoshi-unit>, [">= 0"])
|
107
|
+
s.add_runtime_dependency(%q<straight>, ["= 1.0.0"])
|
108
|
+
s.add_runtime_dependency(%q<satoshi-unit>, [">= 0.1.8"])
|
96
109
|
s.add_runtime_dependency(%q<goliath>, [">= 0"])
|
97
110
|
s.add_runtime_dependency(%q<faye-websocket>, [">= 0"])
|
98
111
|
s.add_runtime_dependency(%q<sequel>, [">= 0"])
|
99
112
|
s.add_runtime_dependency(%q<logmaster>, ["= 0.1.5"])
|
100
113
|
s.add_runtime_dependency(%q<ruby-hmac>, [">= 0"])
|
101
114
|
s.add_runtime_dependency(%q<httparty>, [">= 0"])
|
102
|
-
s.add_runtime_dependency(%q<
|
115
|
+
s.add_runtime_dependency(%q<redis>, [">= 0"])
|
116
|
+
s.add_runtime_dependency(%q<btcruby>, [">= 0"])
|
117
|
+
s.add_development_dependency(%q<byebug>, [">= 0"])
|
103
118
|
s.add_development_dependency(%q<bundler>, ["~> 1.0"])
|
104
119
|
s.add_development_dependency(%q<jeweler>, ["~> 2.0.1"])
|
105
120
|
s.add_development_dependency(%q<github_api>, ["= 0.11.3"])
|
106
121
|
else
|
107
|
-
s.add_dependency(%q<straight>, ["= 0.
|
108
|
-
s.add_dependency(%q<satoshi-unit>, [">= 0"])
|
122
|
+
s.add_dependency(%q<straight>, ["= 1.0.0"])
|
123
|
+
s.add_dependency(%q<satoshi-unit>, [">= 0.1.8"])
|
109
124
|
s.add_dependency(%q<goliath>, [">= 0"])
|
110
125
|
s.add_dependency(%q<faye-websocket>, [">= 0"])
|
111
126
|
s.add_dependency(%q<sequel>, [">= 0"])
|
112
127
|
s.add_dependency(%q<logmaster>, ["= 0.1.5"])
|
113
128
|
s.add_dependency(%q<ruby-hmac>, [">= 0"])
|
114
129
|
s.add_dependency(%q<httparty>, [">= 0"])
|
115
|
-
s.add_dependency(%q<
|
130
|
+
s.add_dependency(%q<redis>, [">= 0"])
|
131
|
+
s.add_dependency(%q<btcruby>, [">= 0"])
|
132
|
+
s.add_dependency(%q<byebug>, [">= 0"])
|
116
133
|
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
117
134
|
s.add_dependency(%q<jeweler>, ["~> 2.0.1"])
|
118
135
|
s.add_dependency(%q<github_api>, ["= 0.11.3"])
|
119
136
|
end
|
120
137
|
else
|
121
|
-
s.add_dependency(%q<straight>, ["= 0.
|
122
|
-
s.add_dependency(%q<satoshi-unit>, [">= 0"])
|
138
|
+
s.add_dependency(%q<straight>, ["= 1.0.0"])
|
139
|
+
s.add_dependency(%q<satoshi-unit>, [">= 0.1.8"])
|
123
140
|
s.add_dependency(%q<goliath>, [">= 0"])
|
124
141
|
s.add_dependency(%q<faye-websocket>, [">= 0"])
|
125
142
|
s.add_dependency(%q<sequel>, [">= 0"])
|
126
143
|
s.add_dependency(%q<logmaster>, ["= 0.1.5"])
|
127
144
|
s.add_dependency(%q<ruby-hmac>, [">= 0"])
|
128
145
|
s.add_dependency(%q<httparty>, [">= 0"])
|
129
|
-
s.add_dependency(%q<
|
146
|
+
s.add_dependency(%q<redis>, [">= 0"])
|
147
|
+
s.add_dependency(%q<btcruby>, [">= 0"])
|
148
|
+
s.add_dependency(%q<byebug>, [">= 0"])
|
130
149
|
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
131
150
|
s.add_dependency(%q<jeweler>, ["~> 2.0.1"])
|
132
151
|
s.add_dependency(%q<github_api>, ["= 0.11.3"])
|