From 0c8d571a7785eee976072ef056ecfe3c3b4183cc Mon Sep 17 00:00:00 2001 From: Ujjwal Kumar Date: Fri, 25 Apr 2025 13:26:27 +0530 Subject: [PATCH] NTP-58492 | Added remarks validation (#15913) --- .../scanpay/util/UpiUriParserTest.kt | 132 ++++++++++++++++++ .../model/config/NaviPayDefaultConfig.kt | 3 +- .../scanpay/util/UpiUriParser.kt | 8 +- 3 files changed, 140 insertions(+), 3 deletions(-) create mode 100644 android/navi-pay/src/androidTest/kotlin/com/navi/pay/management/moneytransfer/scanpay/util/UpiUriParserTest.kt diff --git a/android/navi-pay/src/androidTest/kotlin/com/navi/pay/management/moneytransfer/scanpay/util/UpiUriParserTest.kt b/android/navi-pay/src/androidTest/kotlin/com/navi/pay/management/moneytransfer/scanpay/util/UpiUriParserTest.kt new file mode 100644 index 0000000000..4bdd183ceb --- /dev/null +++ b/android/navi-pay/src/androidTest/kotlin/com/navi/pay/management/moneytransfer/scanpay/util/UpiUriParserTest.kt @@ -0,0 +1,132 @@ +/* + * + * * Copyright © 2025 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.navi.pay.management.moneytransfer.scanpay.util + +import android.net.Uri +import com.navi.pay.network.testsetup.NaviPayAndroidTest +import dagger.hilt.android.testing.HiltAndroidTest +import io.mockk.every +import io.mockk.mockk +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Test + +@HiltAndroidTest +class UpiUriParserTest : NaviPayAndroidTest() { + + private lateinit var mockUri: Uri + + @Before + fun setup() { + mockUri = mockk() + } + + @Test + fun testNoteValidation_nullNote() { + every { mockUri.getQueryParameter("tn") } returns null + mockOtherRequiredParams() + + val result = mockUri.getPayeeEntity() + assertEquals("", result.note) + } + + @Test + fun testNoteValidation_validAlphanumericNote() { + every { mockUri.getQueryParameter("tn") } returns "Payment123" + mockOtherRequiredParams() + + val result = mockUri.getPayeeEntity() + assertEquals("Payment123", result.note) + } + + @Test + fun testNoteValidation_specialCharactersInNote() { + every { mockUri.getQueryParameter("tn") } returns "Payment@123#" + mockOtherRequiredParams() + + val result = mockUri.getPayeeEntity() + assertEquals("Payment123", result.note) + } + + @Test + fun testNoteValidation_validHyphenInNote() { + every { mockUri.getQueryParameter("tn") } returns "Payment-123" + mockOtherRequiredParams() + + val result = mockUri.getPayeeEntity() + assertEquals("Payment-123", result.note) + } + + @Test + fun testNoteValidation_spacesInNote() { + every { mockUri.getQueryParameter("tn") } returns " Payment 123 " + mockOtherRequiredParams() + + val result = mockUri.getPayeeEntity() + assertEquals("Payment 123", result.note) + } + + @Test + fun testNoteValidation_onlySpecialCharacters() { + every { mockUri.getQueryParameter("tn") } returns "@#$%^" + mockOtherRequiredParams() + + val result = mockUri.getPayeeEntity() + assertEquals("", result.note) + } + + private fun mockOtherRequiredParams() { + every { mockUri.getQueryParameter("pn") } returns "" + every { mockUri.getQueryParameter("pa") } returns "" + every { mockUri.getQueryParameter("am") } returns "" + every { mockUri.getQueryParameter("tid") } returns null + every { mockUri.getQueryParameter("tr") } returns null + every { mockUri.getQueryParameter("url") } returns null + every { mockUri.getQueryParameter("category") } returns null + every { mockUri.getQueryParameter("mc") } returns null + every { mockUri.getQueryParameter("mode") } returns null + every { mockUri.getQueryParameter("purpose") } returns null + every { mockUri.getQueryParameter("cu") } returns null + every { mockUri.getQueryParameter("sign") } returns null + every { mockUri.getQueryParameter("txnType") } returns null + every { mockUri.getQueryParameter("ver") } returns null + every { mockUri.getQueryParameter("mam") } returns null + every { mockUri.getQueryParameter("orgId") } returns null + every { mockUri.getQueryParameter("mid") } returns null + every { mockUri.getQueryParameter("msid") } returns null + every { mockUri.getQueryParameter("mtid") } returns null + every { mockUri.getQueryParameter("cc") } returns null + every { mockUri.getQueryParameter("enTips") } returns null + every { mockUri.getQueryParameter("gstBrkUp") } returns null + every { mockUri.getQueryParameter("bAm") } returns null + every { mockUri.getQueryParameter("bCurr") } returns null + every { mockUri.getQueryParameter("qrMedium") } returns null + every { mockUri.getQueryParameter("invoiceNo") } returns null + every { mockUri.getQueryParameter("invoiceDate") } returns null + every { mockUri.getQueryParameter("invoiceName") } returns null + every { mockUri.getQueryParameter("QRexpire") } returns null + every { mockUri.getQueryParameter("QRts") } returns null + every { mockUri.getQueryParameter("split") } returns null + every { mockUri.getQueryParameter("pinCode") } returns null + every { mockUri.getQueryParameter("Tier") } returns null + every { mockUri.getQueryParameter("gstIn") } returns null + every { mockUri.getQueryParameter("mn") } returns null + every { mockUri.getQueryParameter("type") } returns null + every { mockUri.getQueryParameter("validitystart") } returns null + every { mockUri.getQueryParameter("validityend") } returns null + every { mockUri.getQueryParameter("amrule") } returns null + every { mockUri.getQueryParameter("recur") } returns null + every { mockUri.getQueryParameter("recurvalue") } returns null + every { mockUri.getQueryParameter("recurtype") } returns null + every { mockUri.getQueryParameter("rev") } returns null + every { mockUri.getQueryParameter("share") } returns null + every { mockUri.getQueryParameter("block") } returns null + every { mockUri.getQueryParameter("umn") } returns null + every { mockUri.getQueryParameter("query") } returns null + } +} diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/common/model/config/NaviPayDefaultConfig.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/common/model/config/NaviPayDefaultConfig.kt index ec56950311..8d0226e0c7 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/common/model/config/NaviPayDefaultConfig.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/common/model/config/NaviPayDefaultConfig.kt @@ -147,8 +147,7 @@ data class ConfigMessage( "Maximum payment limit is ₹2,000 when you upload a QR from your gallery.", @SerializedName("invalidAmountGenericMessage") val invalidAmountGenericMessage: String = "Invalid amount", - @SerializedName("sendMoneyDefaultRemarks") - val sendMoneyDefaultRemarks: String = "Paid via Navi", + @SerializedName("sendMoneyDefaultRemarks") val sendMoneyDefaultRemarks: String = "Navi UPI", @SerializedName("aadhaarConsentBottomSheetDescription") val aadhaarConsentBottomSheetDescription: String = "I hereby give my consent to {{BANK_NAME}} to collect & use my Aadhaar number for Aadhaar based authentication for the purpose of providing me UPI based payment facilities. I understand that my Aadhaar number shall be used solely for authenticating my identity through Aadhaar Authentication System for the purpose stated above.", diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/management/moneytransfer/scanpay/util/UpiUriParser.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/management/moneytransfer/scanpay/util/UpiUriParser.kt index 6b3fcc1969..f36af72953 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/management/moneytransfer/scanpay/util/UpiUriParser.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/management/moneytransfer/scanpay/util/UpiUriParser.kt @@ -24,6 +24,7 @@ import com.navi.pay.utils.DEFAULT_UPI_MODE import com.navi.pay.utils.DEFAULT_UPI_PURPOSE import com.navi.pay.utils.NAVI_PAY_INTENT_HOST_LIST import com.navi.pay.utils.NAVI_PAY_INTENT_SCHEME_LIST +import com.navi.pay.utils.NOTES_REGEX import com.navi.pay.utils.isAmountValidForSendMoney import javax.inject.Inject @@ -124,7 +125,7 @@ fun Uri.getPayeeEntity(isVerifiedVpa: Boolean = false): PayeeEntity { name = getQueryParameter("pn") ?: "", vpa = getQueryParameter("pa") ?: "", amount = amount, - note = getQueryParameter("tn") ?: "", + note = getValidatedNote(getQueryParameter("tn")), transactionId = getQueryParameter("tid"), transactionReference = getQueryParameter("tr"), refUrl = getQueryParameter("url"), @@ -179,6 +180,11 @@ fun Uri.getPayeeEntity(isVerifiedVpa: Boolean = false): PayeeEntity { ) } +private fun getValidatedNote(notes: String?): String { + if (notes == null) return "" + return notes.filter { char -> NOTES_REGEX.matches(char.toString()) }.trim() +} + private fun parseSplitDetailsFromString(split: String?): List? { if (split.isNullOrEmpty()) {