135 lines
4.2 KiB
Ruby
135 lines
4.2 KiB
Ruby
require "test_helper"
|
|
|
|
class IpapiTest < ActiveSupport::TestCase
|
|
def setup
|
|
@ipapi_data = JSON.parse(
|
|
File.read(Rails.root.join("test/fixtures/files/ipapi_91_84_96_0.json"))
|
|
)
|
|
end
|
|
|
|
test "parse_company_network_range extracts and converts IP range to CIDR" do
|
|
cidr = Ipapi.parse_company_network_range(@ipapi_data)
|
|
|
|
assert_equal "91.84.96.0/19", cidr
|
|
end
|
|
|
|
test "parse_company_network_range handles already formatted CIDR" do
|
|
data = { "company" => { "network" => "1.2.3.0/24" } }
|
|
cidr = Ipapi.parse_company_network_range(data)
|
|
|
|
assert_equal "1.2.3.0/24", cidr
|
|
end
|
|
|
|
test "parse_company_network_range returns nil for invalid range" do
|
|
data = { "company" => { "network" => "invalid" } }
|
|
cidr = Ipapi.parse_company_network_range(data)
|
|
|
|
assert_nil cidr
|
|
end
|
|
|
|
test "parse_company_network_range returns nil when no network data present" do
|
|
data = { "company" => {} }
|
|
cidr = Ipapi.parse_company_network_range(data)
|
|
|
|
assert_nil cidr
|
|
end
|
|
|
|
test "parse_company_network_range falls back to datacenter.network" do
|
|
data = { "datacenter" => { "network" => "1.2.3.0 - 1.2.3.255" } }
|
|
cidr = Ipapi.parse_company_network_range(data)
|
|
|
|
assert_equal "1.2.3.0/24", cidr
|
|
end
|
|
|
|
test "populate_network_attributes sets all network attributes" do
|
|
network_range = NetworkRange.new(network: "91.84.96.0/24")
|
|
Ipapi.populate_network_attributes(network_range, @ipapi_data)
|
|
|
|
assert_equal 216071, network_range.asn
|
|
assert_equal "SERVERS TECH FZCO", network_range.asn_org
|
|
assert_equal "SERVERS TECH FZCO", network_range.company
|
|
assert_equal "NL", network_range.country
|
|
assert network_range.is_datacenter
|
|
refute network_range.is_vpn
|
|
refute network_range.is_proxy
|
|
end
|
|
|
|
test "process_ipapi_data creates both company and BGP route networks" do
|
|
# Use a different tracking network so BGP route gets created
|
|
tracking_network = NetworkRange.create!(
|
|
network: "91.84.97.0/24",
|
|
source: "auto_generated"
|
|
)
|
|
|
|
assert_difference "NetworkRange.count", 2 do
|
|
result = Ipapi.process_ipapi_data(@ipapi_data, tracking_network)
|
|
|
|
assert_equal 2, result[:networks].length
|
|
assert_equal "91.84.96.0/19", result[:broadest_cidr]
|
|
end
|
|
|
|
# Verify company network was created
|
|
company_network = NetworkRange.find_by(network: "91.84.96.0/19")
|
|
assert_not_nil company_network
|
|
assert_equal "api_imported", company_network.source
|
|
assert_equal "SERVERS TECH FZCO", company_network.company
|
|
assert company_network.is_datacenter
|
|
|
|
# Verify BGP route network was created
|
|
bgp_network = NetworkRange.find_by(network: "91.84.96.0/24")
|
|
assert_not_nil bgp_network
|
|
assert_equal "SERVERS TECH FZCO", bgp_network.company
|
|
end
|
|
|
|
test "process_ipapi_data handles missing company network gracefully" do
|
|
# Create data without company network range
|
|
data = @ipapi_data.deep_dup
|
|
data["company"].delete("network")
|
|
data["datacenter"].delete("network")
|
|
|
|
tracking_network = NetworkRange.create!(
|
|
network: "91.84.96.0/24",
|
|
source: "auto_generated"
|
|
)
|
|
|
|
# Should only create the BGP route network (which matches tracking, so 0 new)
|
|
assert_no_difference "NetworkRange.count" do
|
|
result = Ipapi.process_ipapi_data(data, tracking_network)
|
|
|
|
assert_equal 0, result[:networks].length
|
|
assert_equal "91.84.96.0/24", result[:broadest_cidr]
|
|
end
|
|
end
|
|
|
|
test "process_ipapi_data updates existing networks instead of creating duplicates" do
|
|
# Pre-create both networks
|
|
company_network = NetworkRange.create!(
|
|
network: "91.84.96.0/19",
|
|
source: "manual",
|
|
company: "Old Company"
|
|
)
|
|
|
|
bgp_network = NetworkRange.create!(
|
|
network: "91.84.96.0/24",
|
|
source: "manual"
|
|
)
|
|
|
|
tracking_network = NetworkRange.create!(
|
|
network: "91.84.97.0/24",
|
|
source: "auto_generated"
|
|
)
|
|
|
|
# Should not create new networks, just update existing ones
|
|
assert_no_difference "NetworkRange.count" do
|
|
result = Ipapi.process_ipapi_data(@ipapi_data, tracking_network)
|
|
|
|
assert_equal 2, result[:networks].length
|
|
end
|
|
|
|
# Verify updates
|
|
company_network.reload
|
|
assert_equal "SERVERS TECH FZCO", company_network.company
|
|
assert company_network.network_data.key?("ipapi")
|
|
end
|
|
end
|