bvr 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +8 -0
- data/Guardfile +1 -1
- data/README.md +18 -2
- data/bvr.gemspec +6 -6
- data/lib/bvr.rb +2 -1
- data/lib/bvr/call.rb +21 -11
- data/lib/bvr/call_collection.rb +62 -0
- data/lib/bvr/connection.rb +4 -3
- data/lib/bvr/credit.rb +47 -0
- data/lib/bvr/customer.rb +149 -0
- data/lib/bvr/phone.rb +1 -10
- data/lib/bvr/phone_collection.rb +59 -0
- data/lib/bvr/version.rb +1 -1
- data/spec/fixtures/changepassword.xml +7 -0
- data/spec/fixtures/changeuserinfo.xml +9 -0
- data/spec/fixtures/createcustomer_response.xml +7 -0
- data/spec/fixtures/customerblocked.xml +9 -0
- data/spec/fixtures/getuserinfo.xml +11 -0
- data/spec/fixtures/settransaction.xml +8 -0
- data/spec/fixtures/settransaction_failed.xml +6 -0
- data/spec/fixtures/validateuser.xml +6 -0
- data/spec/helpers/faraday_stub.rb +10 -0
- data/spec/lib/bvr/call_collection_spec.rb +120 -0
- data/spec/lib/bvr/call_spec.rb +60 -0
- data/spec/lib/bvr/connection_spec.rb +5 -18
- data/spec/lib/bvr/credit_spec.rb +166 -0
- data/spec/lib/bvr/customer_spec.rb +335 -0
- data/spec/lib/bvr/phone_collection_spec.rb +95 -0
- data/spec/lib/bvr_spec.rb +20 -0
- metadata +54 -24
- data/lib/bvr/call_overview.rb +0 -46
- data/spec/lib/bvr/call_overview_spec.rb +0 -94
data/lib/bvr/version.rb
CHANGED
@@ -0,0 +1,9 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<!DOCTYPE ChangeUserInfo>
|
3
|
+
<ChangeUserInfo>
|
4
|
+
<Customer>foo*provider</Customer>
|
5
|
+
<Result>Success</Result>
|
6
|
+
<Reason>GeoCallCLI Changed</Reason>
|
7
|
+
<Result>Success</Result>
|
8
|
+
<Reason>Request completely succeeded</Reason>
|
9
|
+
</ChangeUserInfo>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<!DOCTYPE ChangeUserInfo>
|
3
|
+
<ChangeUserInfo>
|
4
|
+
<Customer>foo*provider</Customer>
|
5
|
+
<Result>Success</Result>
|
6
|
+
<Reason>CustomerBlocked Changed</Reason>
|
7
|
+
<Result>Success</Result>
|
8
|
+
<Reason>Request completely succeeded</Reason>
|
9
|
+
</ChangeUserInfo>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<!DOCTYPE GetUserInfo>
|
3
|
+
<GetUserInfo>
|
4
|
+
<Customer>foo*provider</Customer>
|
5
|
+
<Balance>1.86</Balance>
|
6
|
+
<SpecificBalance>1.86828</SpecificBalance>
|
7
|
+
<Blocked>False</Blocked>
|
8
|
+
<EmailAddress>JohnDoe@gmail.com</EmailAddress>
|
9
|
+
<GeocallCLI>+4412345678</GeocallCLI>
|
10
|
+
<GeocallCLI>+4412345679</GeocallCLI>
|
11
|
+
</GetUserInfo>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class Module
|
2
|
+
include Minitest::Spec::DSL
|
3
|
+
end
|
4
|
+
module FaradayStub
|
5
|
+
let(:faraday_adapter) { Faraday::Adapter::Test::Stubs.new }
|
6
|
+
|
7
|
+
before do
|
8
|
+
Bvr.connection = Bvr::Connection.new.tap{ |con| con.faraday_connection = Faraday.new{|b| b.adapter :test, faraday_adapter} }
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
require_relative '../../spec_helper'
|
2
|
+
require_relative "../../helpers/faraday_stub"
|
3
|
+
|
4
|
+
describe Bvr::CallCollection do
|
5
|
+
|
6
|
+
describe '.find(customer_id, options={})' do
|
7
|
+
let(:customer_id) { 'john' }
|
8
|
+
let(:params) { { command: Bvr::CallCollection::API_COMMANDS[:find_by_customer_id], customer: customer_id } }
|
9
|
+
let(:connection) { Minitest::Mock.new }
|
10
|
+
|
11
|
+
before { Bvr.connection = connection }
|
12
|
+
|
13
|
+
subject{ Bvr::CallCollection.find_by_customer_id(customer_id) }
|
14
|
+
|
15
|
+
it 'sets the right command and the customer_id' do
|
16
|
+
connection.expect :get, {}, [params] #.merge({username: Bvr.config.username, password: Bvr.config.password})]
|
17
|
+
subject
|
18
|
+
connection.verify
|
19
|
+
end
|
20
|
+
|
21
|
+
describe 'when options are provided' do
|
22
|
+
let(:options) { { recordcount: 'bar', callid: 'foo' }.merge(params) }
|
23
|
+
|
24
|
+
subject{ Bvr::CallCollection.find_by_customer_id(customer_id, options) }
|
25
|
+
|
26
|
+
it 'merges the CallOverview command and the customer_id with options' do
|
27
|
+
connection.expect :get, {}, [options]
|
28
|
+
subject
|
29
|
+
connection.verify
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe 'when wrong options are provided' do
|
34
|
+
let(:options) { { foo: 'bar', john: 'Doe' }.merge(params) }
|
35
|
+
|
36
|
+
subject{ Bvr::CallCollection.find_by_customer_id(customer_id, options) }
|
37
|
+
|
38
|
+
it 'raise an ArgumentError' do
|
39
|
+
proc {subject}.must_raise ArgumentError
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe 'when there is a response' do
|
44
|
+
include FaradayStub
|
45
|
+
|
46
|
+
let(:response) do
|
47
|
+
File.read(File.join(File.dirname(__FILE__), '/..', '/..', '/fixtures/calloverview.xml'))
|
48
|
+
end
|
49
|
+
|
50
|
+
subject{ Bvr::CallCollection.find_by_customer_id(customer_id) }
|
51
|
+
|
52
|
+
before do
|
53
|
+
faraday_adapter.get(Bvr::Connection.uri_from_h(params)) { [200, {}, response] }
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'created a new Bvr::CallCollection from the response' do
|
57
|
+
subject.must_be_instance_of Bvr::CallCollection
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'sets the total calls' do
|
61
|
+
subject.count.must_equal 10
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'can tell if there is more data' do
|
65
|
+
subject.next?.must_equal false
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'sets a collection of Call' do
|
69
|
+
subject.collection.must_be_instance_of Array
|
70
|
+
subject.collection.size.must_equal 5
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe 'when there is not response' do
|
75
|
+
let(:connection) { Minitest::Mock.new }
|
76
|
+
let(:customer_id) { 'foo' }
|
77
|
+
let(:params) { { command: Bvr::CallCollection::API_COMMANDS[:find_by_customer_id], customer: customer_id } }
|
78
|
+
|
79
|
+
subject { Bvr::CallCollection.find_by_customer_id(customer_id) }
|
80
|
+
|
81
|
+
before do
|
82
|
+
Bvr.connection = connection
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'returns empty array' do
|
86
|
+
connection.expect(:get, {}, [params])
|
87
|
+
subject.must_equal []
|
88
|
+
connection.verify
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe '#count' do
|
94
|
+
let(:raw_count) { '20' }
|
95
|
+
let(:call_collection) {Bvr::CallCollection.new}
|
96
|
+
|
97
|
+
subject { call_collection.count }
|
98
|
+
|
99
|
+
it 'returns the number of counts' do
|
100
|
+
call_collection.stub(:raw_count, raw_count) do
|
101
|
+
subject.must_equal Integer(raw_count)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
describe '#next?' do
|
107
|
+
let(:raw_more_data) { 'True' }
|
108
|
+
let(:call_collection) {Bvr::CallCollection.new}
|
109
|
+
|
110
|
+
subject { call_collection.next? }
|
111
|
+
|
112
|
+
it 'says if there is more data' do
|
113
|
+
call_collection.stub(:raw_more_data, raw_more_data) do
|
114
|
+
subject.must_equal true
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require_relative '../../spec_helper'
|
2
|
+
|
3
|
+
describe Bvr::Call do
|
4
|
+
let(:h) do
|
5
|
+
customer_h = ::XmlSimple.xml_in File.read(File.join(File.dirname(__FILE__), '/..', '/..', '/fixtures/calloverview.xml'))
|
6
|
+
customer_h['Calls'][0]['Call'][0]
|
7
|
+
end
|
8
|
+
|
9
|
+
describe '.new_from_response(h)' do
|
10
|
+
subject { Bvr::Call.new_from_response(h) }
|
11
|
+
|
12
|
+
it 'Creates a new Call with the right params' do
|
13
|
+
start_time = "2013-12-24 18:05:26 (UTC)"
|
14
|
+
subject.must_be_instance_of Bvr::Call
|
15
|
+
subject.id.must_equal "1234567890"
|
16
|
+
subject.calltype.must_equal "PSTNOutSip"
|
17
|
+
subject.raw_start_time.must_equal start_time
|
18
|
+
subject.raw_dest.must_equal "+32123456788"
|
19
|
+
subject.raw_duration.must_equal "00:02:21"
|
20
|
+
subject.charge.must_equal "0.0705"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#duration' do
|
25
|
+
let(:raw_duration) { '00:02:21' }
|
26
|
+
let(:raw_start_time) { "2013-12-24 18:05:26 (UTC)" }
|
27
|
+
let(:call) { Bvr::Call.new.tap{ |call| call.raw_duration = raw_duration; call.raw_start_time = raw_start_time } }
|
28
|
+
|
29
|
+
subject { call.duration }
|
30
|
+
|
31
|
+
it 'returns the relative time duration' do
|
32
|
+
subject.must_be_instance_of Time
|
33
|
+
subject.must_equal Time.parse(raw_duration, call.start_time)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#start_time' do
|
38
|
+
let(:raw_start_time) { "2013-12-24 18:05:26 (UTC)" }
|
39
|
+
let(:call) { Bvr::Call.new.tap{ |call| call.raw_start_time = raw_start_time } }
|
40
|
+
|
41
|
+
subject { call.start_time }
|
42
|
+
|
43
|
+
it 'return the time' do
|
44
|
+
subject.must_be_instance_of Time
|
45
|
+
subject.must_equal Time.parse(raw_start_time)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '#dest' do
|
50
|
+
let(:raw_dest) { "+32123456788" }
|
51
|
+
let(:call) { Bvr::Call.new.tap{ |call| call.raw_dest = raw_dest } }
|
52
|
+
|
53
|
+
subject { call.dest }
|
54
|
+
|
55
|
+
it 'returns a phone' do
|
56
|
+
subject.must_be_instance_of Bvr::Phone
|
57
|
+
subject.number.must_equal raw_dest
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative '../../spec_helper'
|
2
|
+
require_relative "../../helpers/faraday_stub"
|
2
3
|
|
3
4
|
describe Bvr::Connection do
|
4
5
|
describe '.new(faraday_adapter)' do
|
@@ -32,36 +33,22 @@ describe Bvr::Connection do
|
|
32
33
|
end
|
33
34
|
end
|
34
35
|
|
35
|
-
before do
|
36
|
-
Bvr.configure do |config|
|
37
|
-
config.username = username
|
38
|
-
config.password = password
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
36
|
subject { connection.get(params) }
|
43
37
|
|
44
38
|
it 'calls connection.get with the right uri' do
|
45
39
|
response = Minitest::Mock.new
|
46
|
-
faraday_connection.expect :get, response, [
|
47
|
-
response.expect :body,
|
40
|
+
faraday_connection.expect :get, response, [Bvr::Connection.uri_from_h(params)]
|
41
|
+
response.expect :body, ::XmlSimple.xml_out({})
|
48
42
|
subject
|
49
43
|
faraday_connection.verify
|
50
44
|
response.verify
|
51
45
|
end
|
52
|
-
|
53
46
|
end
|
54
47
|
|
55
|
-
describe '
|
48
|
+
describe 'self.uri_from_h(queryH)' do
|
56
49
|
let(:queryH) { { foo: 'bar', bar: 'foo'} }
|
57
50
|
let(:username) { 'username' }
|
58
|
-
let(:faraday_connection) { Minitest::Mock.new }
|
59
51
|
let(:password) { 'password' }
|
60
|
-
let(:connection) do
|
61
|
-
Bvr::Connection.new.tap do |connection|
|
62
|
-
connection.faraday_connection = faraday_connection
|
63
|
-
end
|
64
|
-
end
|
65
52
|
|
66
53
|
before do
|
67
54
|
Bvr.configure do |config|
|
@@ -70,7 +57,7 @@ describe Bvr::Connection do
|
|
70
57
|
end
|
71
58
|
end
|
72
59
|
|
73
|
-
subject {
|
60
|
+
subject { Bvr::Connection.uri_from_h(queryH) }
|
74
61
|
|
75
62
|
it 'match the api path' do
|
76
63
|
subject.must_match Regexp.new(Bvr::Connection::API_PATH)
|
@@ -0,0 +1,166 @@
|
|
1
|
+
require_relative '../../spec_helper'
|
2
|
+
require_relative "../../helpers/faraday_stub"
|
3
|
+
|
4
|
+
describe Bvr::Credit do
|
5
|
+
describe '.add(customer_id, amount)' do
|
6
|
+
include FaradayStub
|
7
|
+
let(:customer_id) { 'foo' }
|
8
|
+
let(:amount) { 10 }
|
9
|
+
let(:options) do
|
10
|
+
{
|
11
|
+
command: Bvr::Credit::API_COMMANDS[:add],
|
12
|
+
customer: customer_id,
|
13
|
+
amount: amount
|
14
|
+
}
|
15
|
+
end
|
16
|
+
let(:response) do
|
17
|
+
File.read(File.join(File.dirname(__FILE__), '/..', '/..', '/fixtures/settransaction.xml'))
|
18
|
+
end
|
19
|
+
|
20
|
+
subject { Bvr::Credit.add(customer_id, amount) }
|
21
|
+
|
22
|
+
before do
|
23
|
+
faraday_adapter.get(Bvr::Connection.uri_from_h(options)) { [200, {}, response] }
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'returns a result' do
|
27
|
+
subject['Result'].must_be_instance_of String
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
describe '#add(amount)' do
|
33
|
+
include FaradayStub
|
34
|
+
let(:raw_specific_balance) { 10.12345 }
|
35
|
+
let(:raw_balance) { 10.12 }
|
36
|
+
let(:amount) { 1 }
|
37
|
+
let(:customer) { Bvr::Customer.new(customer_id) }
|
38
|
+
let(:credit) { Bvr::Credit.new(raw_specific_balance, raw_balance, customer) }
|
39
|
+
let(:customer_id) { 'foo' }
|
40
|
+
let(:options) do
|
41
|
+
{
|
42
|
+
command: Bvr::Credit::API_COMMANDS[:add],
|
43
|
+
customer: customer_id,
|
44
|
+
amount: amount
|
45
|
+
}
|
46
|
+
end
|
47
|
+
let(:response) do
|
48
|
+
File.read(File.join(File.dirname(__FILE__), '/..', '/..', '/fixtures/settransaction.xml'))
|
49
|
+
end
|
50
|
+
|
51
|
+
subject { credit.add(amount) }
|
52
|
+
|
53
|
+
before do
|
54
|
+
faraday_adapter.get(Bvr::Connection.uri_from_h(options)) { [200, {}, response] }
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'increase the amout' do
|
58
|
+
customer.stub(:id, customer_id) do
|
59
|
+
credit.specific_balance.must_equal raw_specific_balance
|
60
|
+
credit.balance.must_equal raw_balance
|
61
|
+
|
62
|
+
subject.must_equal true
|
63
|
+
|
64
|
+
credit.specific_balance.must_equal raw_specific_balance + amount
|
65
|
+
credit.balance.must_equal raw_balance + amount
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe 'when the amount if more than .5f' do
|
70
|
+
let(:amount) { 1.000001 }
|
71
|
+
|
72
|
+
it 'round up' do
|
73
|
+
customer.id = customer_id
|
74
|
+
|
75
|
+
credit.specific_balance.must_equal raw_specific_balance
|
76
|
+
credit.balance.must_equal raw_balance
|
77
|
+
|
78
|
+
subject.must_equal true
|
79
|
+
|
80
|
+
credit.specific_balance.must_equal raw_specific_balance + Float("%.5f" % amount)
|
81
|
+
credit.balance.must_equal raw_balance + Float("%.2f" % amount)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe 'when there is an error' do
|
86
|
+
let(:response) do
|
87
|
+
File.read(File.join(File.dirname(__FILE__), '/..', '/..', '/fixtures/settransaction_failed.xml'))
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'does not change the amout and return false' do
|
91
|
+
customer.stub(:id, customer_id) do
|
92
|
+
credit.raw_specific_balance.must_equal raw_specific_balance
|
93
|
+
credit.raw_balance.must_equal raw_balance
|
94
|
+
|
95
|
+
subject.must_equal false
|
96
|
+
|
97
|
+
credit.raw_specific_balance.must_equal raw_specific_balance
|
98
|
+
credit.raw_balance.must_equal raw_balance
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
describe '#rm(amount)' do
|
105
|
+
include FaradayStub
|
106
|
+
let(:raw_specific_balance) { 10.12345 }
|
107
|
+
let(:raw_balance) { 10.12 }
|
108
|
+
let(:amount) { 1 }
|
109
|
+
let(:customer) { Bvr::Customer.new(customer_id) }
|
110
|
+
let(:credit) { Bvr::Credit.new(raw_specific_balance, raw_balance, customer) }
|
111
|
+
let(:customer_id) { 'foo' }
|
112
|
+
let(:options) do
|
113
|
+
{
|
114
|
+
command: Bvr::Credit::API_COMMANDS[:add],
|
115
|
+
customer: customer_id,
|
116
|
+
amount: - amount
|
117
|
+
}
|
118
|
+
end
|
119
|
+
let(:response) do
|
120
|
+
File.read(File.join(File.dirname(__FILE__), '/..', '/..', '/fixtures/settransaction.xml'))
|
121
|
+
end
|
122
|
+
|
123
|
+
subject { credit.rm(amount) }
|
124
|
+
|
125
|
+
before do
|
126
|
+
faraday_adapter.get(Bvr::Connection.uri_from_h(options)) { [200, {}, response] }
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'decrease the amout' do
|
130
|
+
customer.stub(:id, customer_id) do
|
131
|
+
credit.specific_balance.must_equal raw_specific_balance
|
132
|
+
credit.balance.must_equal raw_balance
|
133
|
+
|
134
|
+
subject.must_equal true
|
135
|
+
|
136
|
+
credit.specific_balance.must_equal raw_specific_balance - amount
|
137
|
+
credit.balance.must_equal raw_balance - amount
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
142
|
+
|
143
|
+
describe '#balance' do
|
144
|
+
let(:raw_balance) { "10.12" }
|
145
|
+
let(:credit) { Bvr::Credit.new(nil, raw_balance) }
|
146
|
+
|
147
|
+
subject { credit.balance }
|
148
|
+
|
149
|
+
it 'return a float out of the balance' do
|
150
|
+
subject.must_be_instance_of Float
|
151
|
+
subject.must_equal Float(raw_balance)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
describe '#specific_balance' do
|
156
|
+
let(:raw_specific_balance) { "10.12345" }
|
157
|
+
let(:credit) { Bvr::Credit.new(raw_specific_balance) }
|
158
|
+
|
159
|
+
subject { credit.specific_balance }
|
160
|
+
|
161
|
+
it 'return a float out of the balance' do
|
162
|
+
subject.must_be_instance_of Float
|
163
|
+
subject.must_equal Float(raw_specific_balance)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|