From efde8a31f9cd56a985c0d294e8f1acbbd65c2bf5 Mon Sep 17 00:00:00 2001 From: Ravi Khadiwala Date: Mon, 8 Sep 2025 15:11:15 -0500 Subject: [PATCH] Missing Money.nanos should be treated as 0 --- .../SubscriptionCurrencyUtil.java | 4 ++- .../SubscriptionCurrencyUtilTest.java | 32 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 service/src/test/java/org/whispersystems/textsecuregcm/subscriptions/SubscriptionCurrencyUtilTest.java diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/subscriptions/SubscriptionCurrencyUtil.java b/service/src/main/java/org/whispersystems/textsecuregcm/subscriptions/SubscriptionCurrencyUtil.java index 9838be3dc..a67687576 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/subscriptions/SubscriptionCurrencyUtil.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/subscriptions/SubscriptionCurrencyUtil.java @@ -80,7 +80,9 @@ public class SubscriptionCurrencyUtil { * BigDecimal) */ static BigDecimal convertGoogleMoneyToApiAmount(final Money money) { - final BigDecimal fractionalComponent = BigDecimal.valueOf(money.getNanos()).scaleByPowerOfTen(-9); + final BigDecimal fractionalComponent = money.getNanos() == null + ? BigDecimal.ZERO + : BigDecimal.valueOf(money.getNanos()).scaleByPowerOfTen(-9); final BigDecimal amount = BigDecimal.valueOf(money.getUnits()).add(fractionalComponent); return convertConfiguredAmountToApiAmount(money.getCurrencyCode(), amount); } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/subscriptions/SubscriptionCurrencyUtilTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/subscriptions/SubscriptionCurrencyUtilTest.java new file mode 100644 index 000000000..1e250b024 --- /dev/null +++ b/service/src/test/java/org/whispersystems/textsecuregcm/subscriptions/SubscriptionCurrencyUtilTest.java @@ -0,0 +1,32 @@ +/* + * Copyright 2025 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ +package org.whispersystems.textsecuregcm.subscriptions; + +import com.google.api.services.androidpublisher.model.Money; +import org.assertj.core.api.Assertions; +import org.assertj.core.data.Percentage; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; + +import static org.junit.jupiter.api.Assertions.*; + +class SubscriptionCurrencyUtilTest { + + @Test + void convertGoogleMoneyToApiAmount() { + Money money = new Money(); + money.setCurrencyCode("USD"); + money.setUnits(4L); + + BigDecimal amt = SubscriptionCurrencyUtil.convertGoogleMoneyToApiAmount(money); + Assertions.assertThat(amt).isCloseTo(BigDecimal.valueOf(400), Percentage.withPercentage(0.0001)); + + money.setNanos(990000000); + amt = SubscriptionCurrencyUtil.convertGoogleMoneyToApiAmount(money); + Assertions.assertThat(amt).isCloseTo(BigDecimal.valueOf(499), Percentage.withPercentage(0.0001)); + + } +}