package cgeo.geocaching.connector.gc;
import static org.assertj.core.api.Java6Assertions.assertThat;
import cgeo.geocaching.log.LogEntry;
import cgeo.geocaching.log.LogType;
import cgeo.geocaching.log.TrackableLog;
import cgeo.geocaching.models.Image;
import cgeo.geocaching.models.Trackable;
import cgeo.geocaching.test.AbstractResourceInstrumentationTestCase;
import cgeo.geocaching.test.R;
import cgeo.geocaching.utils.TextUtils;
import java.util.List;
public class TrackablesTest extends AbstractResourceInstrumentationTestCase {
public void testLogPageWithTrackables() {
final List<TrackableLog> tbLogs = GCParser.parseTrackableLog(getFileContent(R.raw.log_with_2tb));
assertThat(tbLogs).isNotNull();
assert tbLogs != null;
assertThat(tbLogs).hasSize(2);
final TrackableLog log = tbLogs.get(0);
assertThat(log.name).isEqualTo("Steffen's Kaiserwagen");
assertThat(log.trackCode).isEqualTo("1QG1EE");
}
public void testLogPageWithoutTrackables() {
final List<TrackableLog> tbLogs = GCParser.parseTrackableLog(getFileContent(R.raw.log_without_tb));
assertThat(tbLogs).isNotNull();
assertThat(tbLogs).isEmpty();
}
public void testTrackable() {
final Trackable trackable = getTB2R124();
assertThat(trackable.getGeocode()).isEqualTo("TB2R124");
assertThat(trackable.getName()).isEqualTo("Bor. Dortmund - FC Schalke 04");
assertThat(trackable.getOwner()).isEqualTo("Spiridon Lui");
}
public void testTrackableWithoutImage() {
final Trackable trackable = getTB2R124();
assertThat(trackable.getImage()).isNull();
assertThat(trackable.getDetails()).isNotNull();
}
public void testTrackableWithLogImages() {
final Trackable trackable = getTBXATG();
assertThat(trackable.getGeocode()).isEqualTo("TBXATG");
final List<LogEntry> log = trackable.getLogs();
assertThat(log).isNotNull();
assertThat(log).hasSize(10);
// log entry 4 has several images; just check the first one
final List<Image> log4Images = log.get(4).getLogImages();
assertThat(log4Images).isNotNull();
assertThat(log4Images).hasSize(1);
assertThat(log4Images.get(0).getUrl()).isEqualTo("http://imgcdn.geocaching.com/track/log/large/3dc286d2-671e-4502-937a-f1bd35a13813.jpg");
assertThat(log4Images.get(0).getTitle()).isEqualTo("@Osaka");
for (final LogEntry entry : log) {
assertThat(entry.log.startsWith("<div>")).isFalse();
}
assertThat(log.get(0).log).isEqualTo("Dropped in Una Bhan (GC49XCJ)");
}
public void testParseTrackableWithoutReleaseDate() {
final Trackable trackable = parseTrackable(R.raw.tb14wfv);
assertThat(trackable).isNotNull();
assertThat(trackable.getName()).isEqualTo("The Brickster");
assertThat(trackable.getOwner()).isEqualTo("Adrian C");
assertThat(trackable.getGoal()).startsWith("I'm on the run from the law.");
assertThat(trackable.getGoal()).endsWith("what I've seen.");
assertThat(trackable.getDistance()).isGreaterThanOrEqualTo(11663.5f);
// the next two items are normally available for trackables, but not for this one, so explicitly test for null
assertThat(trackable.getReleased()).isNull();
assertThat(trackable.getOrigin()).isNull();
}
public void testParseRelativeLink() {
final Trackable trackable = parseTrackable(R.raw.tb4cwjx);
assertThat(trackable).isNotNull();
assertThat(trackable.getName()).isEqualTo("The Golden Lisa");
final String goal = trackable.getGoal();
assertThat(goal).isNotNull();
assertThat(goal).doesNotContain("..");
assertThat(goal).contains("href=\"https://www.geocaching.com/seek/cache_details.aspx?wp=GC3B7PD#\"");
}
public void testParseSpeedManagerCompressedTrackable() {
final Trackable tbNormal = parseTrackable(R.raw.tb54vjj_no_speedmanager_html);
assertTB54VJJ(tbNormal);
final Trackable tbCompressed = parseTrackable(R.raw.tb54vjj_speedmanager_html);
assertTB54VJJ(tbCompressed);
}
private static void assertTB54VJJ(final Trackable trackable) {
assertThat(trackable).isNotNull();
assertThat(trackable.getName()).isEqualTo("Krtek - Der kleine Maulwurf");
final String goal = trackable.getGoal();
assertThat(goal).isNotNull();
assertThat(goal).startsWith("Bei meinem Besitzer auf der Couch");
assertThat(goal).endsWith("Geocachern zusammen fotografieren.");
assertThat(trackable.getDetails()).isEqualTo("Der kleine Maulwurf in etwas größer :-)");
assertThat(trackable.getGeocode()).isEqualTo("TB54VJJ");
assertThat(trackable.getOrigin()).isEqualTo("Nordrhein-Westfalen, Germany");
assertThat(trackable.getOwner()).isEqualTo("Lineflyer");
// the icon url is manipulated during compression
assertThat(trackable.getIconUrl()).endsWith("www.geocaching.com/images/wpttypes/21.gif");
assertThat(trackable.getImage()).endsWith("img.geocaching.com/track/large/d9a475fa-da90-43ec-aec0-92afe26163e1.jpg");
assertThat(trackable.getOwnerGuid()).isEqualTo("d11a3e3d-7db0-4d43-87f2-7893238844a6");
assertThat(trackable.getSpottedGuid()).isNull();
assertThat(trackable.getSpottedType()).isEqualTo(Trackable.SPOTTED_OWNER);
assertThat(trackable.getReleased()).isNotNull();
assertThat(trackable.getType()).isEqualTo("Travel Bug Dog Tag");
final List<LogEntry> logs = trackable.getLogs();
assertThat(logs).isNotNull();
assertThat(logs).hasSize(10);
}
private Trackable parseTrackable(final int trackablePage) {
final String pageContent = getFileContent(trackablePage);
return GCParser.parseTrackable(TextUtils.replaceWhitespace(pageContent), null);
}
public void testParseMarkMissing() {
final Trackable trackable = parseTrackable(R.raw.tb3f206);
assertThat(trackable).isNotNull();
final List<LogEntry> logs = trackable.getLogs();
assertThat(logs).isNotNull();
assertThat(logs).isNotEmpty();
final LogEntry marked = logs.get(0);
assertThat(marked.getType()).isEqualTo(LogType.MARKED_MISSING);
}
private Trackable getTB2R124() {
return parseTrackable(R.raw.trackable_tb2r124);
}
private Trackable getTBXATG() {
return parseTrackable(R.raw.trackable_tbxatg);
}
public void testParseTrackableNotExisting() {
final Trackable trackable = GCParser.parseTrackable(getFileContent(R.raw.tb_not_existing), null);
assertThat(trackable).isNull();
}
}