Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

[馃泚] Adding new project properties #705

Merged
merged 3 commits into from Jan 8, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions app/src/main/java/com/kickstarter/libs/Koala.java
Expand Up @@ -96,11 +96,11 @@ public void trackProjectShow(final @NonNull Project project, final @Nullable Ref
final Map<String, Object> properties = KoalaUtils.projectProperties(project, this.client.loggedInUser());

if (intentRefTag != null) {
properties.put("ref_tag", intentRefTag.tag());
properties.put("session_ref_tag", intentRefTag.tag());
}

if (cookieRefTag != null) {
properties.put("referrer_credit", cookieRefTag.tag());
properties.put("session_referrer_credit", cookieRefTag.tag());
}

this.client.track(KoalaEvent.PROJECT_PAGE, properties);
Expand Down
64 changes: 26 additions & 38 deletions app/src/main/java/com/kickstarter/libs/utils/KoalaUtils.java
@@ -1,7 +1,6 @@
package com.kickstarter.libs.utils;

import com.kickstarter.models.Activity;
import com.kickstarter.models.Backing;
import com.kickstarter.models.Category;
import com.kickstarter.models.Location;
import com.kickstarter.models.Project;
Expand Down Expand Up @@ -116,56 +115,45 @@ private KoalaUtils() {}
final Map<String, Object> properties = new HashMap<String, Object>() {
{
put("backers_count", project.backersCount());
final Category category = project.category();
if (category != null) {
if (category.isRoot()) {
put("category", category.name());
} else {
put("category", category.parent().name());
put("subcategory", category.name());
}
}
put("comments_count", project.commentsCount());
put("country", project.country());
put("duration", Math.round(ProjectUtils.timeInSecondsOfDuration(project)));
put("creator_uid", project.creator().id());
put("currency", project.currency());
put("current_pledge_amount", project.pledged());
put("current_pledge_amount_usd", project.pledged() * project.staticUsdRate());
put("deadline", project.deadline() != null ? project.deadline().getMillis() / 1000 : null);
put("duration", Math.round(ProjectUtils.timeInSecondsOfDuration(project)));
put("goal", project.goal());
put("goal_usd", project.goal() * project.staticUsdRate());
put("has_video", project.video() != null);
put("hours_remaining", (int) Math.ceil(ProjectUtils.timeInSecondsUntilDeadline(project) / 60.0f / 60.0f));
put("is_repeat_creator", IntegerUtils.intValueOrZero(project.creator().createdProjectsCount()) >= 2);
put("launched_at", project.launchedAt() != null ? project.launchedAt().getMillis() / 1000 : null);
put("location", project.location() != null ? project.location().name() : null);
put("name", project.name());
put("percent_raised", project.percentageFunded() / 100.0f);
put("pid", project.id());
put("pledged", project.pledged());
put("prelaunch_activated", BooleanUtils.isTrue(project.prelaunchActivated()));
put("rewards_count", project.hasRewards() ? project.rewards().size() : null);
put("state", project.state());
put("update_count", project.updatesCount());

final Category category = project.category();
if (category != null) {
put("category", category.name());
final Category parent = category.parent();
if (parent != null) {
put("parent_category", parent.name());
}
}

final Location location = project.location();
if (location != null) {
put("location", location.name());
}
put("static_usd_rate", project.staticUsdRate());
put("updates_count", project.updatesCount());
put("user_is_project_creator", ProjectUtils.userIsCreator(project, loggedInUser));
put("user_is_backer", project.isBacking());
put("user_has_watched", project.isStarred());
}
};

final Map<String, Object> prefixedMap = MapUtils.prefixKeys(properties, prefix);

prefixedMap.putAll(userProperties(project.creator(), "creator_"));

if (loggedInUser != null) {
prefixedMap.put("user_is_project_creator", ProjectUtils.userIsCreator(project, loggedInUser));
prefixedMap.put("user_is_backer", project.isBacking());
prefixedMap.put("user_has_starred", project.isStarred());

final Backing backing = project.backing();
if (backing != null) {
final Backing.PaymentSource paymentSource = backing.paymentSource();
if (paymentSource != null) {
prefixedMap.put("payment_method", paymentSource.paymentType());
}
prefixedMap.put("pledge_total", backing.amount());
}
}

return prefixedMap;
return MapUtils.prefixKeys(properties, prefix);
}

public static @NonNull Map<String, Object> activityProperties(final @NonNull Activity activity, final @Nullable User loggedInUser) {
Expand Down
Expand Up @@ -150,8 +150,8 @@ public static int photoHeightFromWidthRatio(final int width) {
new Duration(new DateTime(), project.deadline()).getStandardSeconds());
}

public static boolean userIsCreator(final @NonNull Project project, final @NonNull User user) {
return project.creator().id() == user.id();
public static boolean userIsCreator(final @NonNull Project project, final @Nullable User user) {
return user == null ? false : project.creator().id() == user.id();
}

public static boolean isUSUserViewingNonUSProject(final @NonNull String userCountry, final @NonNull String projectCountry) {
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/kickstarter/models/Project.java
Expand Up @@ -57,7 +57,7 @@ public abstract class Project implements Parcelable, Relay {
public abstract @Nullable Boolean staffPick();
public abstract @State String state();
public abstract @Nullable DateTime stateChangedAt();
public abstract @Nullable Float staticUsdRate();
public abstract Float staticUsdRate();
public abstract @Nullable Integer unreadMessagesCount();
public abstract @Nullable Integer unseenActivityCount();
public abstract @Nullable Integer updatesCount();
Expand Down
76 changes: 44 additions & 32 deletions app/src/test/java/com/kickstarter/libs/KoalaTest.kt
Expand Up @@ -3,6 +3,7 @@ package com.kickstarter.libs
import com.kickstarter.KSRobolectricTestCase
import com.kickstarter.mock.MockCurrentConfig
import com.kickstarter.mock.factories.*
import com.kickstarter.models.Project
import com.kickstarter.models.User
import com.kickstarter.services.DiscoveryParams
import org.joda.time.DateTime
Expand Down Expand Up @@ -156,7 +157,7 @@ class KoalaTest : KSRobolectricTestCase() {
koala.trackProjectShow(project, RefTag.discovery(), RefTag.recommended())

assertDefaultProperties(null)
assertProjectProperties()
assertProjectProperties(project)
this.koalaTest.assertValues("Project Page")
}

Expand All @@ -172,11 +173,11 @@ class KoalaTest : KSRobolectricTestCase() {
koala.trackProjectShow(project, RefTag.discovery(), RefTag.recommended())

assertDefaultProperties(user)
assertProjectProperties()
assertProjectProperties(project)
val expectedProperties = propertiesTest.value
assertEquals(false, expectedProperties["user_is_project_creator"])
assertEquals(false, expectedProperties["user_is_backer"])
assertEquals(false, expectedProperties["user_has_starred"])
assertEquals(false, expectedProperties["project_user_has_watched"])
assertEquals(false, expectedProperties["project_user_is_backer"])
assertEquals(false, expectedProperties["project_user_is_project_creator"])

this.koalaTest.assertValues("Project Page")
}
Expand All @@ -187,8 +188,10 @@ class KoalaTest : KSRobolectricTestCase() {
.toBuilder()
.id(4)
.category(CategoryFactory.ceramicsCategory())
.location(LocationFactory.unitedStates())
.commentsCount(3)
.creator(creator())
.location(LocationFactory.unitedStates())
.updatesCount(5)
.build()
val user = user()
val client = MockTrackingClient(MockCurrentUser(user), mockCurrentConfig(), false)
Expand All @@ -199,13 +202,11 @@ class KoalaTest : KSRobolectricTestCase() {
koala.trackProjectShow(project, RefTag.discovery(), RefTag.recommended())

assertDefaultProperties(user)
assertProjectProperties()
assertProjectProperties(project)
val expectedProperties = propertiesTest.value
assertEquals(false, expectedProperties["user_is_project_creator"])
assertEquals(true, expectedProperties["user_is_backer"])
assertEquals(false, expectedProperties["user_has_starred"])
assertEquals("CREDIT_CARD", expectedProperties["payment_method"])
assertEquals(10.0, expectedProperties["pledge_total"])
assertEquals(false, expectedProperties["project_user_has_watched"])
assertEquals(true, expectedProperties["project_user_is_backer"])
assertEquals(false, expectedProperties["project_user_is_project_creator"])

this.koalaTest.assertValues("Project Page")
}
Expand All @@ -222,11 +223,11 @@ class KoalaTest : KSRobolectricTestCase() {
koala.trackProjectShow(project, RefTag.discovery(), RefTag.recommended())

assertDefaultProperties(creator)
assertProjectProperties()
assertProjectProperties(project)
val expectedProperties = propertiesTest.value
assertEquals(true, expectedProperties["user_is_project_creator"])
assertEquals(false, expectedProperties["user_is_backer"])
assertEquals(false, expectedProperties["user_has_starred"])
assertEquals(false, expectedProperties["project_user_has_watched"])
assertEquals(false, expectedProperties["project_user_is_backer"])
assertEquals(true, expectedProperties["project_user_is_project_creator"])

this.koalaTest.assertValues("Project Page")
}
Expand All @@ -243,11 +244,11 @@ class KoalaTest : KSRobolectricTestCase() {
koala.trackProjectShow(project, RefTag.discovery(), RefTag.recommended())

assertDefaultProperties(user)
assertProjectProperties()
assertProjectProperties(project)
val expectedProperties = propertiesTest.value
assertEquals(false, expectedProperties["user_is_project_creator"])
assertEquals(false, expectedProperties["user_is_backer"])
assertEquals(true, expectedProperties["user_has_starred"])
assertEquals(true, expectedProperties["project_user_has_watched"])
assertEquals(false, expectedProperties["project_user_is_backer"])
assertEquals(false, expectedProperties["project_user_is_project_creator"])

this.koalaTest.assertValues("Project Page")
}
Expand Down Expand Up @@ -275,35 +276,46 @@ class KoalaTest : KSRobolectricTestCase() {
assertEquals(user != null, expectedProperties["user_logged_in"])
}

private fun assertProjectProperties() {
private fun assertProjectProperties(project: Project) {
val expectedProperties = propertiesTest.value
assertEquals(100, expectedProperties["project_backers_count"])
assertEquals("Ceramics", expectedProperties["project_subcategory"])
assertEquals("Art", expectedProperties["project_category"])
assertEquals(3, expectedProperties["project_comments_count"])
assertEquals("US", expectedProperties["project_country"])
assertEquals(3L, expectedProperties["project_creator_uid"])
assertEquals("USD", expectedProperties["project_currency"])
assertEquals(50.0, expectedProperties["project_current_pledge_amount"])
assertEquals(50.0, expectedProperties["project_current_pledge_amount_usd"])
assertEquals(project.deadline()?.millis?.let { it / 1000 }, expectedProperties["project_deadline"])
assertEquals(60 * 60 * 24 * 20, expectedProperties["project_duration"])
assertEquals(100.0, expectedProperties["project_goal"])
assertEquals(100.0, expectedProperties["project_goal_usd"])
assertEquals(true, expectedProperties["project_has_video"])
assertEquals(10 * 24, expectedProperties["project_hours_remaining"])
assertEquals(true, expectedProperties["project_is_repeat_creator"])
assertEquals(project.launchedAt()?.millis?.let { it / 1000 }, expectedProperties["project_launched_at"])
assertEquals("Brooklyn", expectedProperties["project_location"])
assertEquals(4L, expectedProperties["project_pid"])
assertEquals(50.0, expectedProperties["project_pledged"])
assertEquals("Some Name", expectedProperties["project_name"])
assertEquals(.5f, expectedProperties["project_percent_raised"])
assertEquals("Ceramics", expectedProperties["project_category"])
assertEquals("Art", expectedProperties["project_parent_category"])
assertEquals("discovery", expectedProperties["ref_tag"])
assertEquals("recommended", expectedProperties["referrer_credit"])
assertEquals(3L, expectedProperties["creator_uid"])
assertEquals(17, expectedProperties["creator_backed_projects_count"])
assertEquals(5, expectedProperties["creator_created_projects_count"])
assertEquals(2, expectedProperties["creator_starred_projects_count"])
assertEquals(4L, expectedProperties["project_pid"])
assertEquals(50.0, expectedProperties["project_current_pledge_amount"])
assertEquals(2, expectedProperties["project_rewards_count"])
assertEquals("live", expectedProperties["project_state"])
assertEquals(1.0f, expectedProperties["project_static_usd_rate"])
assertEquals(5, expectedProperties["project_updates_count"])
assertEquals("discovery", expectedProperties["session_ref_tag"])
assertEquals("recommended", expectedProperties["session_referrer_credit"])
}

private fun project() =
ProjectFactory.project().toBuilder()
.id(4)
.category(CategoryFactory.ceramicsCategory())
.location(LocationFactory.unitedStates())
.creator(creator())
.commentsCount(3)
.location(LocationFactory.unitedStates())
.updatesCount(5)
.build()

private fun creator() =
Expand Down