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