test_port_repo.rb

  1# frozen_string_literal: true
  2
  3require "date"
  4require "test_helper"
  5require "port_repo"
  6require "db_port"
  7
  8class FakeDbForPorts < FakeDB
  9	def initialize(rows=[])
 10		super({})
 11		@rows = rows
 12	end
 13
 14	def exec_defer(_, _)
 15		EMPromise.resolve(@rows)
 16	end
 17end
 18
 19class PortRepoDbTest < Minitest::Test
 20	def setup
 21		@output = FullManual.new
 22	end
 23
 24	def test_list_returns_db_ports
 25		rows = [
 26			{
 27				"id" => "port1",
 28				"actual_foc_date" => DateTime.now,
 29				"updated_at" => DateTime.now,
 30				"tel" => "+12225551234",
 31				"customer_id" => "cust1",
 32				"backend_sgx" => "sgx"
 33			}
 34		]
 35		# Make sure that `processing_status`
 36		# resolves to "complete"
 37		sleep 1
 38		db = FakeDbForPorts.new(rows)
 39		repo = PortRepo::Db.new(@output, db: db)
 40
 41		ports = repo.list.sync
 42
 43		assert_equal 1, ports.length
 44		assert_kind_of DbPort, ports[0]
 45		assert_equal "port1", ports[0].id
 46		assert_equal DbPort::Status::COMPLETE, ports[0].processing_status
 47	end
 48	em :test_list_returns_db_ports
 49
 50	def test_list_empty_when_no_rows
 51		db = FakeDbForPorts.new([])
 52		repo = PortRepo::Db.new(@output, db: db)
 53
 54		ports = repo.list.sync
 55
 56		assert_equal 0, ports.length
 57	end
 58	em :test_list_empty_when_no_rows
 59end
 60
 61class PortRepoTickTest < Minitest::Test
 62	def setup
 63		@expected_output = Minitest::Mock.new
 64		@output = MockOutputs.new(@expected_output)
 65	end
 66
 67	def test_process_continues_after_individual_port_error
 68		error = RuntimeError.new("port exploded")
 69
 70		failing_port = PortRepo::Fake::FakePort.new(
 71			"T02", "COMPLETE", DateTime.now, DateTime.now,
 72			"0001", "2223334444", "testroute"
 73		)
 74		ok_port = PortRepo::Fake::FakePort.new(
 75			"T01", "SUBMITTED", nil, DateTime.now - 1,
 76			"ignored", "9998887777", "testroute"
 77		)
 78
 79		failing_step = Minitest::Mock.new(
 80			PortingStepRepo::Frozen.new(failing_port, output: @output)
 81		)
 82		failing_step.expect(:perform_next_step, EMPromise.reject(error))
 83
 84		ok_step = Minitest::Mock.new(
 85			PortingStepRepo::Frozen.new(ok_port, output: @output)
 86		)
 87		ok_step.expect(:perform_next_step, EMPromise.resolve(nil))
 88
 89		step_repo = Minitest::Mock.new(PortingStepRepo.new(output: @output))
 90		step_repo.expect(:find, EMPromise.resolve(failing_step), [failing_port])
 91		step_repo.expect(:find, EMPromise.resolve(ok_step), [ok_port])
 92
 93		@expected_output.expect(:error, nil, [failing_port.id, :catch, error])
 94		@expected_output.expect(
 95			:info, nil, [failing_port.id, :class, failing_step.class]
 96		)
 97		@expected_output.expect(:info, nil, [ok_port.id, :class, ok_step.class])
 98
 99		repo = PortRepo::Fake.new(@output)
100		repo.instance_variable_set(:@step_repo, step_repo)
101		repo.stub(:list, EMPromise.resolve([failing_port, ok_port])) do
102			repo.process.sync
103		end
104
105		@output.verify
106	end
107	em :test_process_continues_after_individual_port_error
108end
109
110class PortRepoBandwidthTest < Minitest::Test
111	def setup
112		@output = FullManual.new
113	end
114
115	def test_list_returns_empty_when_no_ports
116		stub_request(
117			:get,
118			/https:\/\/dashboard\.bandwidth\.com\/v1\.0\/accounts\/.*\/portins/
119		).to_return(status: 204, body: "")
120
121		repo = PortRepo::Bandwidth.new(@output)
122		ports = repo.list
123
124		assert_equal 0, ports.length
125	end
126
127	def test_list_wraps_ports_in_port_with_backend
128		stub_request(
129			:get,
130			/https:\/\/dashboard\.bandwidth\.com\/v1\.0\/accounts\/.*\/portins/
131		).to_return(status: 200, body: <<~XML)
132			<LNPResponseWrapper>
133				<TotalCount>1</TotalCount>
134				<Links/>
135				<lnpPortInfoForGivenStatus>
136					<OrderId>abc123</OrderId>
137					<CustomerOrderId>cust456</CustomerOrderId>
138					<BillingTelephoneNumber>5551234567</BillingTelephoneNumber>
139					<lastModifiedDate>2025-01-13T12:00:00.000Z</lastModifiedDate>
140					<OrderDate>2025-01-12T12:00:00.000Z</OrderDate>
141					<ProcessingStatus>COMPLETE</ProcessingStatus>
142				</lnpPortInfoForGivenStatus>
143			</LNPResponseWrapper>
144		XML
145
146		repo = PortRepo::Bandwidth.new(@output)
147		ports = repo.list
148
149		assert_equal 1, ports.length
150		port = ports[0]
151		assert_kind_of PortRepo::Bandwidth::PortWithBackend, port
152		assert_equal "abc123", port.id
153		assert_equal "cust456", port.customer_id
154		assert_equal "+15551234567", port.tel
155		assert_equal CONFIG[:sgx], port.backend_sgx
156	end
157end