From 78e8676e97bd4b50346915a0de012f2ab1d40f65 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Wed, 30 Sep 2026 17:32:11 +0400 Subject: [PATCH] core: name the right operation when a badge purchase fails --- src/Simplex/Chat/View.hs | 2 +- tests/Bots/BadgeService/BotTests.hs | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Simplex/Chat/View.hs b/src/Simplex/Chat/View.hs index b36a16d7b5..eb292d4b92 100644 --- a/src/Simplex/Chat/View.hs +++ b/src/Simplex/Chat/View.hs @@ -2875,7 +2875,7 @@ viewChatError isCmd logLevel testView = \case BREInvalidResponse m -> "invalid service response: " <> m BREUnknownKeyIndex -> "credential names an unknown badge key index" BRECredentialNotVerified -> "credential does not verify against configured key" - in ["cannot redeem badge code: " <> plain reason] + in ["cannot get badge: " <> plain reason] CEAgentCommandError e -> ["agent command error: " <> plain e] CEInvalidFileDescription e -> ["invalid file description: " <> plain e] CEConnectionIncognitoChangeProhibited -> ["incognito mode change prohibited"] diff --git a/tests/Bots/BadgeService/BotTests.hs b/tests/Bots/BadgeService/BotTests.hs index d3ae71dff0..80c7d625a6 100644 --- a/tests/Bots/BadgeService/BotTests.hs +++ b/tests/Bots/BadgeService/BotTests.hs @@ -315,10 +315,10 @@ testRedeemUnknownCode ps = g <- C.newRandom unknown <- randomBadgeCode g alice ##> ("/_redeem_badge_code 1 " <> codeArg unknown) - alice <## "cannot redeem badge code: badge service error: code_invalid" + alice <## "cannot get badge:badge service error: code_invalid" -- a failed check character is refused before anything leaves the device alice ##> "/_redeem_badge_code 1 SB-00000-00000-00000-00001" - alice <## "cannot redeem badge code: invalid code" + alice <## "cannot get badge:invalid code" -- sent straight to the service, past the client's own check, the two are one answer (_, redeemPriv) <- atomically $ C.generateKeyPair g :: IO (C.KeyPair 'C.Ed25519) redeemDirect alice bsLink redeemPriv (T.unpack $ badgeCodeText unknown) @@ -369,7 +369,7 @@ testRedeemSecondCode ps = alice <## "supporter badge - active" alice <##. "expires " alice ##> ("/_redeem_badge_code 1 " <> codeArg legend) - alice <## "cannot redeem badge code: badge already active" + alice <## "cannot get badge:badge already active" alice ##> "/p" showActiveUser alice "alice (Alice, * supporter)" alice ##> "/create user alisa" @@ -391,7 +391,7 @@ testRedeemSameCodeOtherProfile ps = alice ##> "/create user alisa" showActiveUser alice "alisa" alice ##> ("/_redeem_badge_code 2 " <> codeArg code) - alice <## "cannot redeem badge code: badge service error: code_used" + alice <## "cannot get badge:badge service error: code_used" alice ##> "/p" showActiveUser alice "alisa" alice ##> "/user alice" @@ -1306,7 +1306,7 @@ testRedeemUnpaidCode ps = withNewTestChatCfg ps clientCfg "alice" aliceProfile $ \alice -> do unpaid <- issueCodeAs cc BTSupporter 1 "unpaid" alice ##> ("/_redeem_badge_code 1 " <> codeArg unpaid) - alice <## "cannot redeem badge code: badge service error: payment_pending" + alice <## "cannot get badge:badge service error: payment_pending" paid <- issueCodeAs cc BTSupporter 1 "paid" alice ##> ("/_redeem_badge_code 1 " <> codeArg paid) alice <## "badge redeemed" @@ -1323,7 +1323,7 @@ testExpiredCode ps = withDB' "markCodePaid" cc (\db -> markCodePaid db (badgeCodeHash code) (addUTCTime (-60) now)) `shouldReturn` Right () alice ##> ("/_redeem_badge_code 1 " <> codeArg code) - alice <## "cannot redeem badge code: badge service error: code_expired" + alice <## "cannot get badge:badge service error: code_expired" testRedeemedBeforeTheDeadline :: HasCallStack => TestParams -> IO () testRedeemedBeforeTheDeadline ps = @@ -1377,7 +1377,7 @@ testRevokedCode ps = paid <- issueCodeAs cc BTSupporter 1 "paid" revokeCodeAs cc paid `shouldReturn` "revoked" alice ##> ("/_redeem_badge_code 1 " <> codeArg paid) - alice <## "cannot redeem badge code: badge service error: code_invalid" + alice <## "cannot get badge:badge service error: code_invalid" second <- revokeCodeAs cc paid second `shouldSatisfy` T.isInfixOf "revoked already" @@ -1575,7 +1575,7 @@ testPurchaseWithNoVerifier ps = nothingPurchased cc withNewTestChatCfg ps bsClientCfg "alice" aliceProfile $ \alice -> do alice ##> ("/_badge purchase 1 " <> paymentArg supporterPlay) - alice <## "cannot redeem badge code: badge service error: provider_not_configured" + alice <## "cannot get badge:badge service error: provider_not_configured" -- not yet rather than never, so the keys stay for the retry once a verifier is deployed rowCount (chatController alice) "badge_store_receipts" `shouldReturn` 1 @@ -1646,17 +1646,17 @@ testPurchaseStash ps = let stashes = rowCount (chatController alice) "badge_store_receipts" -- the store does not vouch for it, so the keys stashed for it can never be credited alice ##> ("/_badge purchase 1 " <> paymentArg (googlePayment "badge_supporter_01" "not-a-purchase")) - alice <## "cannot redeem badge code: badge service error: receipt_invalid" + alice <## "cannot get badge:badge service error: receipt_invalid" stashes `shouldReturn` 0 -- no store transaction to key a stash by, so nothing is stashed or sent alice ##> ("/_badge purchase 1 " <> paymentArg SPApple {jws = "not.a-jws"}) - alice <## "cannot redeem badge code: invalid store receipt" + alice <## "cannot get badge:invalid store receipt" stashes `shouldReturn` 0 nothingPurchased cc -- pending keeps the keys, and the settled purchase is credited to them, once let unsettled = "/_badge purchase 1 " <> paymentArg (googlePayment "badge_supporter_01" googlePendingToken) alice ##> unsettled - alice <## "cannot redeem badge code: badge service error: payment_pending" + alice <## "cannot get badge:badge service error: payment_pending" stashes `shouldReturn` 1 settlePending store alice ##> unsettled @@ -1673,7 +1673,7 @@ testPurchaseWhileBadgeHeld ps = code <- issueCode cc BTSupporter 1 redeemFirstBadge alice code alice ##> ("/_badge purchase 1 " <> paymentArg supporterPlay) - alice <## "cannot redeem badge code: badge already active" + alice <## "cannot get badge:badge already active" rowCount (chatController alice) "badge_store_receipts" `shouldReturn` 0 rowCount cc "sx_badge_service_payments" `shouldReturn` 0 @@ -1700,7 +1700,7 @@ testPurchaseStrandedUnderOtherProfile ps = withNewTestChatCfg ps bsClientCfg "alice" aliceProfile $ \alice -> do let unsettled userId = "/_badge purchase " <> show (userId :: Int) <> " " <> paymentArg (googlePayment "badge_supporter_01" googlePendingToken) alice ##> unsettled 1 - alice <## "cannot redeem badge code: badge service error: payment_pending" + alice <## "cannot get badge:badge service error: payment_pending" alice ##> "/create user alisa" showActiveUser alice "alisa" settlePending store @@ -1719,7 +1719,7 @@ testPurchaseDeliveredToHiddenProfile ps = withNewTestChatCfg ps bsClientCfg "alice" aliceProfile $ \alice -> do let unsettled userId = "/_badge purchase " <> show (userId :: Int) <> " " <> paymentArg (googlePayment "badge_supporter_01" googlePendingToken) alice ##> unsettled 1 - alice <## "cannot redeem badge code: badge service error: payment_pending" + alice <## "cannot get badge:badge service error: payment_pending" alice ##> "/create user alisa" showActiveUser alice "alisa" alice ##> "/_hide user 1 \"password\""