package com.maxmind.geoip2.model; import com.fasterxml.jackson.databind.InjectableValues; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.jr.ob.JSON; import org.junit.Test; import java.io.IOException; import java.util.Collections; import static org.junit.Assert.assertEquals; public class JsonTest { @Test public void testInsightsSerialization() throws IOException { String json = JSON.std .composeString() .startObject() .startObjectField("maxmind") .put("queries_remaining", 11) .end() .startObjectField("registered_country") .put("geoname_id", 2) .startObjectField("names") .put("en", "Canada") .end() .put("iso_code", "CA") .end() .startObjectField("traits") .put("is_anonymous_proxy", true) .put("autonomous_system_number", 1234) .put("isp", "Comcast") .put("ip_address", "1.2.3.4") .put("is_satellite_provider", true) .put("autonomous_system_organization", "AS Organization") .put("user_type", "college") .put("organization", "Blorg") .put("domain", "example.com") // This is here just to simplify the testing. We expect the // difference .put("is_legitimate_proxy", false) .end() .startObjectField("country") .startObjectField("names") .put("en", "United States of America") .end() .put("geoname_id", 1) .put("iso_code", "US") .put("confidence", 99) .end() .startObjectField("continent") .startObjectField("names") .put("en", "North America") .end() .put("code", "NA") .put("geoname_id", 42) .end() .startObjectField("location") .put("average_income", 24626) .put("population_density", 1341) .put("time_zone", "America/Chicago") .put("accuracy_radius", 1500) .put("metro_code", 765) .put("latitude", 44.98) .put("longitude", 93.2636) .end() .startArrayField("subdivisions") .startObject() .put("confidence", 88) .put("iso_code", "MN") .put("geoname_id", 574635) .startObjectField("names") .put("en", "Minnesota") .end() .end() .startObject() .put("iso_code", "TT") .end() .end() .startObjectField("represented_country") .put("geoname_id", 3) .startObjectField("names") .put("en", "United Kingdom") .end() .put("type", "C<military>") .put("iso_code", "GB") .end() .startObjectField("postal") .put("code", "55401") .put("confidence", 33) .end() .startObjectField("city") .put("confidence", 76) .put("geoname_id", 9876) .startObjectField("names") .put("en", "Minneapolis") .end() .end() .end() .finish(); testRoundTrip(InsightsResponse.class, json); } @Test public void testCitySerialization() throws IOException { String json = JSON.std .composeString() .startObject() .startObjectField("maxmind") .put("queries_remaining", 11) .end() .startObjectField("registered_country") .put("geoname_id", 2) .startObjectField("names") .put("en", "Canada") .end() .put("iso_code", "CA") .end() .startObjectField("traits") .put("is_anonymous_proxy", true) .put("autonomous_system_number", 1234) .put("isp", "Comcast") .put("ip_address", "1.2.3.4") .put("is_satellite_provider", true) .put("autonomous_system_organization", "AS Organization") .put("organization", "Blorg") .put("domain", "example.com") // This is here just to simplify the testing. We expect the // difference .put("is_legitimate_proxy", false) .end() .startObjectField("country") .startObjectField("names") .put("en", "United States of America") .end() .put("geoname_id", 1) .put("iso_code", "US") .end() .startObjectField("continent") .startObjectField("names") .put("en", "North America") .end() .put("code", "NA") .put("geoname_id", 42) .end() .startObjectField("location") .put("time_zone", "America/Chicago") .put("metro_code", 765) .put("latitude", 44.98) .put("longitude", 93.2636) .end() .startArrayField("subdivisions") .startObject() .put("iso_code", "MN") .put("geoname_id", 574635) .startObjectField("names") .put("en", "Minnesota") .end() .end() .startObject() .put("iso_code", "TT") .end() .end() .startObjectField("represented_country") .put("geoname_id", 3) .startObjectField("names") .put("en", "United Kingdom") .end() .put("type", "C<military>") .put("iso_code", "GB") .end() .startObjectField("postal") .put("code", "55401") .end() .startObjectField("city") .put("geoname_id", 9876) .startObjectField("names") .put("en", "Minneapolis") .end() .end() .end() .finish(); testRoundTrip(CityResponse.class, json); } @Test public void testCountrySerialization() throws IOException { String json = JSON.std .composeString() .startObject() .startObjectField("maxmind") .put("queries_remaining", 11) .end() .startObjectField("registered_country") .put("geoname_id", 2) .startObjectField("names") .put("en", "Canada") .end() .put("iso_code", "CA") .end() .startObjectField("traits") .put("is_anonymous_proxy", true) .put("ip_address", "1.2.3.4") .put("is_satellite_provider", true) // This is here just to simplify the testing. We expect the // difference .put("is_legitimate_proxy", false) .end() .startObjectField("country") .startObjectField("names") .put("en", "United States of America") .end() .put("geoname_id", 1) .put("iso_code", "US") .end() .startObjectField("continent") .startObjectField("names") .put("en", "North America") .end() .put("code", "NA") .put("geoname_id", 42) .end() .startObjectField("represented_country") .put("geoname_id", 3) .startObjectField("names") .put("en", "United Kingdom") .end() .put("type", "C<military>") .put("iso_code", "GB") .end() .end() .finish(); testRoundTrip(CountryResponse.class, json); } @Test public void testAnonymousIPSerialization() throws Exception { String json = JSON.std .composeString() .startObject() .put("is_anonymous", true) .put("is_anonymous_vpn", true) .put("is_hosting_provider", true) .put("is_public_proxy", true) .put("is_tor_exit_node", true) .put("ip_address", "1.1.1.1") .end() .finish(); testRoundTrip(AnonymousIpResponse.class, json); } @Test public void testConnectionTypeSerialization() throws Exception { String json = JSON.std .composeString() .startObject() .put("connection_type", "Dialup") .put("ip_address", "1.1.1.1") .end() .finish(); testRoundTrip(ConnectionTypeResponse.class, json); } @Test public void testDomainSerialization() throws Exception { String json = JSON.std .composeString() .startObject() .put("domain", "gmail.com") .put("ip_address", "1.1.1.1") .end() .finish(); testRoundTrip(DomainResponse.class, json); } @Test public void testIspSerialization() throws Exception { String json = JSON.std .composeString() .startObject() .put("autonomous_system_number", 2121) .put("autonomous_system_organization", "Google, Inc.") .put("isp", "ISP, Inc.") .put("organization", "Google, Inc.") .put("ip_address", "1.1.1.1") .end() .finish(); testRoundTrip(IspResponse.class, json); } protected <T extends AbstractResponse> void testRoundTrip (Class<T> cls, String json) throws IOException { ObjectMapper mapper = new ObjectMapper(); mapper.configure(MapperFeature.CAN_OVERRIDE_ACCESS_MODIFIERS, false); InjectableValues inject = new InjectableValues.Std().addValue( "locales", Collections.singletonList("en")); T response = mapper.reader(cls).with(inject).readValue(json); JsonNode expectedNode = mapper.readValue(json, JsonNode.class); JsonNode actualNode = mapper.readValue(response.toJson(), JsonNode.class); assertEquals(expectedNode, actualNode); } }