Reserve number in appropriate backend
Amolith
created 2 years ago
- At the start of registration, numbers are now reserved in
Bandwidth or "reserved" in the local inventory, whichever source the
number is from
- Tests mock successful reservation rather than half of a reservation
Signed-off-by: Amolith <amolith@secluded.site>
Change summary
lib/registration.rb | 17 +++++++++++++++--
lib/tel_selections.rb | 8 ++++++++
test/test_helper.rb | 5 +++++
test/test_registration.rb | 17 +++++++++++++++++
4 files changed, 45 insertions(+), 2 deletions(-)
Detailed changes
@@ -22,12 +22,25 @@ class Registration
Registered.for(customer, reg.phone)
else
tel_selections[customer.jid].then(&:choose_tel).then do |tel|
- BandwidthTnReservationRepo.new.ensure(customer, tel)
- FinishOrStartActivation.for(customer, google_play_userid, tel)
+ reserve_and_continue(tel_selections, customer, tel).then do
+ FinishOrStartActivation.for(customer, google_play_userid, tel)
+ end
end
end
end
+ def self.reserve_and_continue(tel_selections, customer, tel)
+ tel.reserve(customer).catch do
+ tel_selections.delete(customer.jid).then {
+ tel_selections[customer.jid]
+ }.then { |choose|
+ choose.choose_tel(
+ error: "The JMP number #{tel} is no longer available."
+ )
+ }.then { |n_tel| reserve_and_continue(tel_selections, customer, n_tel) }
+ end
+ end
+
class Registered
def self.for(customer, tel)
jid = ProxiedJID.new(customer.jid).unproxied
@@ -258,12 +258,20 @@ class TelSelections
def pending_value
tel
end
+
+ def reserve(customer)
+ BandwidthTnReservationRepo.new.ensure(customer, tel)
+ end
end
class LocalInventory < SimpleDelegator
def pending_value
"LocalInventory/#{tel}"
end
+
+ def reserve(*)
+ EMPromise.resolve(nil)
+ end
end
end
@@ -242,6 +242,11 @@ class FakeRedis
set(key, value)
end
+ def del(key)
+ @values.delete(key)
+ EMPromise.resolve("OK")
+ end
+
def mget(*keys)
EMPromise.all(keys.map(&method(:get)))
end
@@ -28,7 +28,24 @@ class RegistrationTest < Minitest::Test
reservation_req = stub_request(
:post,
"https://dashboard.bandwidth.com/v1.0/accounts//tnreservation"
+ ).to_return(
+ status: 201,
+ headers: {
+ location: "https://dashboard.bandwidth.com/api/accounts//TnReservation/8da0f39c-043c-4806-9f0f-497b2d197bc5"
+ }
)
+ stub_request(
+ :get, "https://dashboard.bandwidth.com/v1.0/accounts//tnreservation/8da0f39c-043c-4806-9f0f-497b2d197bc5"
+ ).to_return(status: 200, body: <<~RESPONSE)
+ <ReservationResponse>
+ <Reservation>
+ <ReservationId>f342904f-b03a-4499-bac0-e8f43a2664a1</ReservationId>
+ <AccountId>12346099</AccountId>
+ <ReservationExpires>1492</ReservationExpires>
+ <ReservedTn>4354776010</ReservedTn>
+ </Reservation>
+ </ReservationResponse>
+ RESPONSE
web_manager = TelSelections.new(
redis: FakeRedis.new, db: FakeDB.new, memcache: FakeMemcache.new
)