@Test public void traitsAreCopied() { assertThat(analyticsContext.traits()).isEqualTo(traits).isNotSameAs(traits); Traits traits = new Traits().putAnonymousId("foo"); analyticsContext.setTraits(traits); assertThat(analyticsContext.traits()).isEqualTo(traits).isNotSameAs(traits); }
@Test public void copyIsImmutable() { AnalyticsContext copy = analyticsContext.unmodifiableCopy(); //noinspection EmptyCatchBlock try { copy.put("foo", "bar"); fail("Inserting into copy should throw UnsupportedOperationException"); } catch (UnsupportedOperationException expected) { } }
@Test public void copyReturnsSameMappings() { AnalyticsContext copy = analyticsContext.unmodifiableCopy(); assertThat(copy) .hasSameSizeAs(analyticsContext) .isNotSameAs(analyticsContext) .isEqualTo(analyticsContext); for (Map.Entry<String, Object> entry : analyticsContext.entrySet()) { assertThat(copy).contains(MapEntry.entry(entry.getKey(), entry.getValue())); } }
@Test public void logoutClearsTraitsAndUpdatesContext() { analyticsContext.setTraits(new Traits().putAge(20).putAvatar("bar")); analytics.logout(); verify(traitsCache).delete(); verify(traitsCache) .set( argThat( new TypeSafeMatcher<Traits>() { @Override protected boolean matchesSafely(Traits traits) { return !isNullOrEmpty(traits.anonymousId()); } @Override public void describeTo(Description description) {} })); assertThat(analyticsContext.traits()).hasSize(1).containsKey("anonymousId"); }
@Test public void create() { analyticsContext = AnalyticsContext.create(RuntimeEnvironment.application, traits); assertThat(analyticsContext) // .containsKey("app") // .containsKey("device") // .containsKey("library") // .containsEntry("locale", "en-US") // .containsKey("network") // .containsKey("os") // .containsKey("screen") .containsEntry("userAgent", "undefined") // .containsKey("timezone") // value depends on where the tests are run .containsKey("traits"); assertThat(analyticsContext.getValueMap("app")) // .containsEntry("name", "com.segment.analytics.core.tests") .containsEntry("version", BuildConfig.VERSION_NAME) .containsEntry("namespace", "com.segment.analytics.core.tests") .containsEntry("build", BuildConfig.VERSION_CODE); assertThat(analyticsContext.getValueMap("device")) // .containsEntry("id", "unknown") .containsEntry("manufacturer", "unknown") .containsEntry("model", "unknown") .containsEntry("name", "unknown"); assertThat(analyticsContext.getValueMap("library")) // .containsEntry("name", "analytics-android") .containsEntry("version", BuildConfig.VERSION_NAME); // TODO: mock network state? assertThat(analyticsContext.getValueMap("network")).isEmpty(); assertThat(analyticsContext.getValueMap("os")) // .containsEntry("name", "Android") // .containsEntry("version", "unknown"); assertThat(analyticsContext.getValueMap("screen")) // .containsEntry("density", 1.5f) // .containsEntry("width", 480) // .containsEntry("height", 800); }
@Test public void identifyUpdatesCache() { analytics.identify("foo", new Traits().putValue("bar", "qaz"), null); assertThat(traits) .contains(MapEntry.entry("userId", "foo")) .contains(MapEntry.entry("bar", "qaz")); assertThat(analyticsContext.traits()) .contains(MapEntry.entry("userId", "foo")) .contains(MapEntry.entry("bar", "qaz")); verify(traitsCache).set(traits); verify(integration) .identify( argThat( new NoDescriptionMatcher<IdentifyPayload>() { @Override protected boolean matchesSafely(IdentifyPayload item) { // Exercises a bug where payloads didn't pick up userId in identify correctly. // https://github.com/segmentio/analytics-android/issues/169 return item.userId().equals("foo"); } })); }