From d49e8eec43de89b0acef94e8c0fb5ef05507be23 Mon Sep 17 00:00:00 2001 From: Eileen McNaughton Date: Thu, 7 Oct 2021 16:58:58 +1300 Subject: [PATCH] Test & align empty token handling --- Civi/Token/TokenCompatSubscriber.php | 6 +++ .../CRM/Utils/TokenConsistencyTest.php | 39 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/Civi/Token/TokenCompatSubscriber.php b/Civi/Token/TokenCompatSubscriber.php index e145394897..33e394f3cd 100644 --- a/Civi/Token/TokenCompatSubscriber.php +++ b/Civi/Token/TokenCompatSubscriber.php @@ -60,6 +60,12 @@ class TokenCompatSubscriber implements EventSubscriberInterface { return ''; }); + // This removes the pattern used in greetings of having bits of text that + // depend on the tokens around them - ie '{first_name}{ }{last_name} + // has an extra construct '{ }' which will resolve as a space if the + // tokens on either side are resolved to 'something' + $e->string = preg_replace('/\\\\|\{(\s*)?\}/', ' ', $e->string); + if ($useSmarty) { $smartyVars = []; foreach ($e->context['smartyTokenAlias'] ?? [] as $smartyName => $tokenName) { diff --git a/tests/phpunit/CRM/Utils/TokenConsistencyTest.php b/tests/phpunit/CRM/Utils/TokenConsistencyTest.php index 679cd0b448..7e7f00c1f1 100644 --- a/tests/phpunit/CRM/Utils/TokenConsistencyTest.php +++ b/tests/phpunit/CRM/Utils/TokenConsistencyTest.php @@ -234,6 +234,45 @@ case.custom_1 :' . ' ]; } + /** + * Test tokens in 2 ways to ensure consistent handling. + * + * 1) as part of the greeting processing + * 2) via the token processor. + * + */ + public function testOddTokens(): void { + + $variants = [ + [ + 'string' => '{contact.individual_prefix}{ }{contact.first_name}{ }{contact.middle_name}{ }{contact.last_name}{ }{contact.individual_suffix}', + 'expected' => 'Mr. Anthony Anderson II', + ], + [ + 'string' => '{contact.prefix_id:label}{ }{contact.first_name}{ }{contact.middle_name}{ }{contact.last_name}{ }{contact.suffix_id:label}', + 'expected' => 'Mr. Anthony Anderson II', + ], + ]; + $tokenProcessor = new TokenProcessor(\Civi::dispatcher(), [ + 'smarty' => FALSE, + 'schema' => ['contactId'], + ]); + $contactID = $this->individualCreate(['middle_name' => '']); + $tokenProcessor->addRow(['contactId' => $contactID]); + $tokenProcessor->evaluate(); + foreach ($variants as $index => $variant) { + $tokenProcessor->addMessage($index, $variant['string'], 'text/plain'); + } + $tokenProcessor->evaluate(); + $result = $tokenProcessor->getRow(0); + foreach ($variants as $index => $variant) { + $greetingString = $variant['string']; + CRM_Utils_Token::replaceGreetingTokens($greetingString, $this->callAPISuccessGetSingle('Contact', ['id' => $contactID]), $contactID); + $this->assertEquals($variant['expected'], $greetingString); + $this->assertEquals($variant['expected'], $result->render($index)); + } + } + /** * Get the contribution recur tokens keyed by the token. * -- 2.25.1