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