end-to-end change_number test

Phillip Davis created

Change summary

test/test_admin_command.rb | 109 ++++++++++++++++++++++++++++++++++++---
1 file changed, 99 insertions(+), 10 deletions(-)

Detailed changes

test/test_admin_command.rb 🔗

@@ -5,6 +5,7 @@ require "admin_command"
 require "admin_action"
 
 BackendSgx::IQ_MANAGER = Minitest::Mock.new
+BackendSgx::REDIS = Minitest::Mock.new
 AdminAction::LaunchSnikket::IQ_MANAGER = Minitest::Mock.new
 Customer::BLATHER = Minitest::Mock.new
 AdminActionRepo::REDIS = Minitest::Mock.new
@@ -351,19 +352,107 @@ class AdminCommandTest < Minitest::Test
 	end
 	em :test_action_cancel_account_keep_number
 
-	def test_change_num_for_unregistered_customer
-		_sgx, admin = admin_command(registered: false)
+	def test_change_num_default_sgx
+		# Same as default given by `sgx.registered?` returned by `admin_command`
+		old_tel = "+15556667777"
+		new_tel = "+12222222222"
 
-		error =
-			assert_raises("number_change should have raised") {
-				admin.action_number_change.sync
+		admin_number_change_form = Blather::Stanza::Iq::Command.new
+		admin_number_change_form.form.fields = [
+			{ var: "new_tel", value: new_tel },
+			{ var: "should_delete", value: false }
+		]
+		admin_number_change_form.from = "test@example.com"
+
+		execute_command { |exe|
+			sgx, admin = admin_command
+
+			exe.customer_repo.expect(
+				:find_by_jid,
+				EMPromise.resolve(customer(sgx: sgx)),
+				[Matching.new do |jid|
+					assert jid.is_a? Blather::JID
+					assert_equal jid.stripped.to_s, "test@example.com"
+				end]
+			)
+
+			AdminAction::NumberChange::REDIS.expect(
+				:exists,
+				EMPromise.resolve(1),
+				["catapult_jid-#{old_tel}"]
+			)
+
+			AdminAction::NumberChange::REDIS.expect(
+				:get,
+				EMPromise.resolve(nil), # Default SGX creds
+				["jmp_customer_backend_sgx-test"]
+			)
+
+			AdminAction::NumberChange::REDIS.expect(
+				:rename,
+				EMPromise.resolve(nil), # Default SGX creds
+				["catapult_fwd-#{old_tel}", "catapult_fwd-#{new_tel}"]
+			)
+
+			BackendSgx::REDIS.expect(
+				:set,
+				EMPromise.resolve(nil), # Default SGX creds
+				["catapult_jid-#{new_tel}", "customer_test@component"]
+			)
+
+			expected_xadd_args = {
+				customer_id: "test",
+				old_tel: old_tel,
+				new_tel: new_tel,
+				should_delete: nil,
+				actor_id: "test",
+				class: "NumberChange",
+				direction: :forward
 			}
 
-		assert_equal "Customer not registered", error.message
+			AdminActionRepo::REDIS.expect(
+				:xadd,
+				EMPromise.resolve(nil)
+			) do |admin_actions, star, **xadd_args|
+				assert_equal admin_actions, "admin_actions"
+				assert_equal star, "*"
 
-		assert_mock BackendSgx::IQ_MANAGER
-		assert_mock Customer::BLATHER
-		assert_mock BandwidthTnRepo::DB
+				xadd_args.each do |k, v|
+					assert_equal v, expected_xadd_args[k]
+				end
+			end
+
+			# Make sure the IBR record was sent off for
+			# the new number.
+			BackendSgx::IQ_MANAGER.expect(
+				:write,
+				EMPromise.resolve(nil),
+				[Matching.new do |iq|
+					assert_equal iq.nick, "test_bw_account"
+					assert_equal iq.username, "test_bw_user"
+					assert_equal iq.password, "test_bw_password"
+					assert_equal iq.phone, new_tel
+				end]
+			)
+
+			Command::COMMAND_MANAGER.expect(
+				:write,
+				EMPromise.resolve(admin_number_change_form),
+				[Matching.new do |iq|
+					assert_undoable_form(iq)
+					assert iq.form.field("new_tel")
+					assert iq.form.field("should_delete")
+				end]
+			)
+
+			admin.action_number_change.sync
+
+			assert_mock Command::COMMAND_MANAGER
+			assert_mock exe.customer_repo
+			assert_mock AdminAction::NumberChange::REDIS
+			assert_mock AdminActionRepo::REDIS
+			assert_mock BackendSgx::IQ_MANAGER
+		}
 	end
-	em :test_change_num_for_unregistered_customer
+	em :test_change_num_default_sgx
 end