From 39152bf55ae9831655eda2524bafff932dbaf963 Mon Sep 17 00:00:00 2001 From: Heihokon Date: Mon, 2 Sep 2024 10:33:20 -0500 Subject: [PATCH] Refactor & improvement Refactor FlagshipConstant.php to add XPC_BUCKETING_WARNING constant Add VisitorCacheStatus enum refactor: Add arraysAreEqual method to Helper trait refactor: Add abstract method to update context key-value pair refactor: Update DefaultStrategy to set hasContextBeenUpdated flag refactor: Update VisitorAbstract to include hasContextBeenUpdated flag refactor: Add HelperTest for Helper trait refactor: Update BucketingManager to send context only if it has been updated refactor: Set hasContextBeenUpdated flag in DefaultStrategy's updateContext and updateContextCollection methods refactor: Update BucketingManagerTest to improve test coverage refactor: Remove unnecessary code in DefaultStrategy's updateContext and updateContextCollection methods refactor: Improve error messages in FlagshipConstant.php refactor: Update DefaultStrategy.php to improve flag activation logic refactor: Improve flag activation logic in DefaultStrategyTest.php refactor: Improve error handling and troubleshooting in BucketingManager.php Refactor VisitorAbstract to add visitorCacheStatus property and getter/setter methods Refactor StrategyAbstract to update visitor cache status and add context key-value method Refactor DefaultStrategy to log XPC warning when visitor cache is not implemented Refactor code to improve visitor cache functionality and add XPC warning logging Refactor VisitorCacheStatus enum to rename VISITOR_ID_CACHE_ONLY to VISITOR_ID_CACHE_WITH_ANONYMOUS_ID_CACHE Refactor StrategyAbstract to update visitor cache status and fix visitor cache lookup bug Refactor VisitorDelegate to call lookupVisitor() method before fetching flags Refactor DefaultStrategyTest to update visitor cache status and fix visitor cache lookup bug Refactor StrategyAbstract to remove unused method updateContextKeyValue() refactor: Add abstract method updateContextKeyValue to StrategyAbstract refactor: Update LogTrait to use mixed type for responseHeader, responseBody, and responseStatus refactor: Add allocation check for variations in BucketingManager test: Enhance DefaultStrategyTest with additional assertions and visitor cache checks refactor: Update BatchingCachingStrategyAbstract.php to improve code readability and maintainability refactor: Update BatchingCachingStrategyAbstract.php to send activate hits in batches refactor: Add constant for maximum activate hits per batch in FlagshipConstant.php refactor: Update BatchingCachingStrategyAbstract.php to send activate hits in batches --- .github/workflows/CI_COVERAGE.yml | 2 +- .github/workflows/CI_PHP_8.yml | 2 +- .gitignore | 2 + .vscode/settings.json | 12 +- composer.json | 2 +- composer.lock | 10 +- phpcs.xml | 62 + src/Api/BatchingCachingStrategyAbstract.php | 112 +- .../NoBatchingContinuousCachingStrategy.php | 54 +- src/Api/TrackingManagerAbstract.php | 5 +- src/Config/FlagshipConfig.php | 14 +- src/Decision/ApiManager.php | 37 +- src/Decision/BucketingManager.php | 96 +- src/Enum/EventCategory.php | 2 +- src/Enum/FlagshipConstant.php | 31 +- src/Enum/FlagshipContext.php | 42 +- src/Enum/TroubleshootingLabel.php | 2 +- src/Enum/VisitorCacheStatus.php | 11 + src/Flag/FSFlagCollection.php | 29 +- src/Flag/FSFlagMetadata.php | 20 +- src/Flagship.php | 12 +- src/Hit/Activate.php | 14 +- src/Hit/ActivateBatch.php | 6 +- src/Hit/Diagnostic.php | 64 +- src/Hit/Event.php | 7 +- src/Hit/HitAbstract.php | 16 +- src/Hit/HitBatch.php | 12 +- src/Model/FlagDTO.php | 22 +- src/Traits/BuildApiTrait.php | 10 +- src/Traits/Helper.php | 25 + src/Traits/LogTrait.php | 12 +- src/Utils/HttpClient.php | 10 +- src/Utils/MurmurHash.php | 16 +- src/Visitor/DefaultStrategy.php | 147 +- src/Visitor/PanicStrategy.php | 4 +- src/Visitor/StrategyAbstract.php | 169 +- src/Visitor/VisitorAbstract.php | 36 +- src/Visitor/VisitorBuilder.php | 18 +- src/Visitor/VisitorDelegate.php | 7 +- .../BatchingOnFailedCachingStrategyTest.php | 861 ++++++----- ...oBatchingContinuousCachingStrategyTest.php | 323 ++-- tests/Api/TrackingManagerTest.php | 181 ++- tests/Assets/File.php | 2 +- tests/Config/BucketingConfigTest.php | 2 +- tests/Config/FlagshipConfigTest.php | 57 +- tests/Decision/ApiManagerTest.php | 275 ++-- tests/Decision/BucketingManagerTest.php | 823 +++++----- tests/Flag/FSFlagCollectionTest.php | 26 +- tests/Flag/FlagMetadataTest.php | 40 +- tests/Flag/FlagTest.php | 49 +- tests/FlagshipTest.php | 90 +- tests/Hit/ActivateBatchTest.php | 6 +- tests/Hit/ActivateTest.php | 33 +- tests/Hit/EventTest.php | 42 +- tests/Hit/HitBatchTest.php | 17 +- tests/Hit/ItemTest.php | 32 +- tests/Hit/PageTest.php | 32 +- tests/Hit/ScreenTest.php | 28 +- tests/Hit/SegmentTest.php | 24 +- tests/Hit/TransactionTest.php | 30 +- tests/Hit/TroubleshootingTest.php | 377 ++--- tests/Hit/UsageHitTest.php | 5 +- tests/Model/FlagDTOTest.php | 24 +- tests/Model/HttpResponseTest.php | 4 +- tests/TestFunctional.php | 17 +- tests/Traits/BuildApiTraitTest.php | 10 +- tests/Traits/CommonLogManagerTraitTest.php | 2 +- tests/Traits/HelperTest.php | 58 + tests/Traits/LogTraitTest.php | 100 +- tests/Traits/Round.php | 1 - tests/Traits/ValidatorTraitTest.php | 36 +- tests/Utils/ConfigManagerTest.php | 4 +- tests/Utils/FlagshipLogManagerTest.php | 82 +- tests/Utils/HttpClientTest.php | 11 +- tests/Visitor/CampaignsData.php | 190 +-- tests/Visitor/DefaultStrategyTest.php | 1368 ++++++++++++----- tests/Visitor/NoConsentStrategyTest.php | 120 +- tests/Visitor/NotReadyStrategyTest.php | 74 +- tests/Visitor/PanicStrategyTest.php | 99 +- tests/Visitor/VisitorBuilderTest.php | 26 +- tests/Visitor/VisitorDelegateTest.php | 217 ++- tests/Visitor/VisitorTest.php | 137 +- 82 files changed, 3844 insertions(+), 3245 deletions(-) create mode 100644 phpcs.xml create mode 100644 src/Enum/VisitorCacheStatus.php create mode 100644 tests/Traits/HelperTest.php diff --git a/.github/workflows/CI_COVERAGE.yml b/.github/workflows/CI_COVERAGE.yml index 2866c931..b8bb1f70 100644 --- a/.github/workflows/CI_COVERAGE.yml +++ b/.github/workflows/CI_COVERAGE.yml @@ -2,7 +2,7 @@ name: CI PHP 8 on: push: - branches: [ main] + branches: [ main, q2] jobs: build: diff --git a/.github/workflows/CI_PHP_8.yml b/.github/workflows/CI_PHP_8.yml index b9e2a82f..c689e009 100644 --- a/.github/workflows/CI_PHP_8.yml +++ b/.github/workflows/CI_PHP_8.yml @@ -2,7 +2,7 @@ name: CI PHP 8 on: pull_request: - branches: [ main ] + branches: [ main, q2 ] jobs: build: diff --git a/.gitignore b/.gitignore index 92a1729a..98d8c720 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ bucketing.json flagship /src/Api/HIT_LOG /.phpunit.cache +demo-test.php +docker-compose.demo.yml diff --git a/.vscode/settings.json b/.vscode/settings.json index 2af03ac8..ce6abab7 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,11 @@ { - "php.version": "8.1" -} \ No newline at end of file + "php.version": "8.1", + "phpcs.executablePath": "./vendor/bin/phpcs", + "phpcs.standard": "PSR12", + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll": "always" + }, + "php-cs-fixer.executablePath": "./vendor/bin/php-cs-fixer", + "php-cs-fixer.onsave": true, +} diff --git a/composer.json b/composer.json index cbbec3fc..a49799a4 100644 --- a/composer.json +++ b/composer.json @@ -33,6 +33,6 @@ "scripts": { "test": "phpunit", "check-style": "phpcs --standard=PSR12 -n src tests", - "fix-style": "phpcbf --standard=PSR12 src tests" + "fix-style": "phpcbf --standard=phpcs.xml src tests" } } diff --git a/composer.lock b/composer.lock index b8a49bbb..c0719d09 100644 --- a/composer.lock +++ b/composer.lock @@ -1741,16 +1741,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.10.1", + "version": "3.10.2", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "8f90f7a53ce271935282967f53d0894f8f1ff877" + "reference": "86e5f5dd9a840c46810ebe5ff1885581c42a3017" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/8f90f7a53ce271935282967f53d0894f8f1ff877", - "reference": "8f90f7a53ce271935282967f53d0894f8f1ff877", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/86e5f5dd9a840c46810ebe5ff1885581c42a3017", + "reference": "86e5f5dd9a840c46810ebe5ff1885581c42a3017", "shasum": "" }, "require": { @@ -1817,7 +1817,7 @@ "type": "open_collective" } ], - "time": "2024-05-22T21:24:41+00:00" + "time": "2024-07-21T23:26:44+00:00" }, { "name": "theseer/tokenizer", diff --git a/phpcs.xml b/phpcs.xml new file mode 100644 index 00000000..f6d98641 --- /dev/null +++ b/phpcs.xml @@ -0,0 +1,62 @@ + + + PHP CodeSniffer configuration for the Flagship SDK project. + + + + + + src + tests + + + vendor + + + + 5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Api/BatchingCachingStrategyAbstract.php b/src/Api/BatchingCachingStrategyAbstract.php index e7ed794a..47ed18ee 100644 --- a/src/Api/BatchingCachingStrategyAbstract.php +++ b/src/Api/BatchingCachingStrategyAbstract.php @@ -164,10 +164,10 @@ public function hydrateActivatePoolQueue($key, Activate $hit): void public function getActivateHeaders(): array { return [ - FlagshipConstant::HEADER_X_API_KEY => $this->config->getApiKey(), + FlagshipConstant::HEADER_X_API_KEY => $this->config->getApiKey(), FlagshipConstant::HEADER_X_SDK_VERSION => FlagshipConstant::SDK_VERSION, - FlagshipConstant::HEADER_CONTENT_TYPE => FlagshipConstant::HEADER_APPLICATION_JSON, - FlagshipConstant::HEADER_X_SDK_CLIENT => FlagshipConstant::SDK_LANGUAGE, + FlagshipConstant::HEADER_CONTENT_TYPE => FlagshipConstant::HEADER_APPLICATION_JSON, + FlagshipConstant::HEADER_X_SDK_CLIENT => FlagshipConstant::SDK_LANGUAGE, ]; } @@ -298,15 +298,9 @@ protected function onVisitorExposed(Activate $activate): void } } - /** - * @return void - */ - protected function sendActivateHit(): void + protected function sendActivateHitBatch(ActivateBatch $activateBatch) { $headers = $this->getActivateHeaders(); - - $activateBatch = new ActivateBatch($this->config, $this->activatePoolQueue); - $requestBody = $activateBatch->toApiKeys(); $url = FlagshipConstant::BASE_API_URL . '/' . FlagshipConstant::URL_ACTIVATE_MODIFICATION; $now = $this->getNow(); @@ -323,7 +317,8 @@ protected function sendActivateHit(): void FlagshipConstant::HIT_SENT_SUCCESS, [ FlagshipConstant::SEND_ACTIVATE, - $this->getLogFormat(null, $url, $requestBody, $headers, $this->getNow() - $now)] + $this->getLogFormat(null, $url, $requestBody, $headers, $this->getNow() - $now), + ] ); $hitKeysToRemove = []; @@ -342,30 +337,53 @@ protected function sendActivateHit(): void $this->cacheHit($this->activatePoolQueue); $troubleshooting = new Troubleshooting(); $troubleshooting->setLabel(TroubleshootingLabel::SEND_ACTIVATE_HIT_ROUTE_ERROR) - ->setLogLevel(LogLevel::ERROR) - ->setVisitorId($this->flagshipInstanceId) - ->setFlagshipInstanceId($this->flagshipInstanceId) - ->setTraffic(100) - ->setConfig($this->config) ->setHttpRequestBody($requestBody) ->setHttpRequestHeaders($headers) ->setHttpRequestMethod("POST") ->setHttpRequestUrl($url) ->setHttpResponseBody($exception->getMessage()) ->setHttpResponseTime($this->getNow() - $now) - ; + ->setFlagshipInstanceId($this->flagshipInstanceId) + ->setLogLevel(LogLevel::ERROR) + ->setTraffic(100)->setConfig($this->config) + ->setVisitorId($this->flagshipInstanceId); + $this->addTroubleshootingHit($troubleshooting); $this->sendTroubleshootingQueue(); $this->logErrorSprintf( $this->config, FlagshipConstant::TRACKING_MANAGER, FlagshipConstant::UNEXPECTED_ERROR_OCCURRED, - [FlagshipConstant::SEND_ACTIVATE, - $this->getLogFormat($exception->getMessage(), $url, $requestBody, $headers, $this->getNow() - $now)] + [ + FlagshipConstant::SEND_ACTIVATE, + $this->getLogFormat($exception->getMessage(), $url, $requestBody, $headers, $this->getNow() - $now), + ] ); } } + /** + * @return void + */ + protected function sendActivateHit(): void + { + $filteredItems = array_filter($this->activatePoolQueue, function ($item) { + return $this->getNow() - $item->getCreatedAt() < FlagshipConstant::DEFAULT_HIT_CACHE_TIME_MS; + }); + + + if (empty($filteredItems)) { + return; + } + + $batches = array_chunk($filteredItems, FlagshipConstant::MAX_ACTIVATE_HIT_PER_BATCH); + + foreach ($batches as $batch) { + $activateBatch = new ActivateBatch($this->config, $batch); + $this->sendActivateHitBatch($activateBatch); + } + } + /** * @param string $visitorId * @return string [] @@ -440,7 +458,7 @@ public function sendBatch(): void } $header = [ - FlagshipConstant::HEADER_CONTENT_TYPE => FlagshipConstant::HEADER_APPLICATION_JSON + FlagshipConstant::HEADER_CONTENT_TYPE => FlagshipConstant::HEADER_APPLICATION_JSON, ]; $requestBody = $batchHit->toApiKeys(); @@ -458,7 +476,8 @@ public function sendBatch(): void FlagshipConstant::HIT_SENT_SUCCESS, [ FlagshipConstant::SEND_BATCH, - $this->getLogFormat(null, $url, $requestBody, $header, $this->getNow() - $now)] + $this->getLogFormat(null, $url, $requestBody, $header, $this->getNow() - $now), + ] ); $this->hitsPoolQueue = []; @@ -470,25 +489,25 @@ public function sendBatch(): void $troubleshooting = new Troubleshooting(); $troubleshooting->setLabel(TroubleshootingLabel::SEND_BATCH_HIT_ROUTE_RESPONSE_ERROR) ->setLogLevel(LogLevel::ERROR) - ->setVisitorId($this->flagshipInstanceId) ->setFlagshipInstanceId($this->flagshipInstanceId) - ->setTraffic(100) - ->setConfig($this->config) ->setHttpRequestBody($requestBody) ->setHttpRequestHeaders($header) ->setHttpRequestMethod("POST") ->setHttpRequestUrl($url) ->setHttpResponseBody($exception->getMessage()) ->setHttpResponseTime($this->getNow() - $now) - ; + ->setTraffic(100)->setConfig($this->config) + ->setVisitorId($this->flagshipInstanceId); $this->addTroubleshootingHit($troubleshooting); $this->sendTroubleshootingQueue(); $this->logErrorSprintf( $this->config, FlagshipConstant::TRACKING_MANAGER, FlagshipConstant::UNEXPECTED_ERROR_OCCURRED, - [FlagshipConstant::SEND_BATCH, - $this->getLogFormat($exception->getMessage(), $url, $requestBody, $header, $this->getNow() - $now)] + [ + FlagshipConstant::SEND_BATCH, + $this->getLogFormat($exception->getMessage(), $url, $requestBody, $header, $this->getNow() - $now), + ] ); } } @@ -510,13 +529,13 @@ public function cacheHit(array $hits): void foreach ($hits as $hit) { $hitData = [ HitCacheFields::VERSION => 1, - HitCacheFields::DATA => [ - HitCacheFields::VISITOR_ID => $hit->getVisitorId(), + HitCacheFields::DATA => [ + HitCacheFields::VISITOR_ID => $hit->getVisitorId(), HitCacheFields::ANONYMOUS_ID => $hit->getAnonymousId(), - HitCacheFields::TYPE => $hit->getType(), - HitCacheFields::CONTENT => $hit->toArray(), - HitCacheFields::TIME => $this->getNow() - ] + HitCacheFields::TYPE => $hit->getType(), + HitCacheFields::CONTENT => $hit->toArray(), + HitCacheFields::TIME => $this->getNow(), + ], ]; $data[$hit->getKey()] = $hitData; @@ -535,7 +554,10 @@ public function cacheHit(array $hits): void $this->config, FlagshipConstant::PROCESS_CACHE, FlagshipConstant::HIT_CACHE_ERROR, - ["cacheHit", $exception->getMessage()] + [ + "cacheHit", + $exception->getMessage(), + ] ); } } @@ -564,7 +586,10 @@ public function flushHits(array $hitKeys): void $this->config, FlagshipConstant::PROCESS_CACHE, FlagshipConstant::HIT_CACHE_ERROR, - ["flushHits", $exception->getMessage()] + [ + "flushHits", + $exception->getMessage(), + ] ); } } @@ -586,7 +611,10 @@ public function flushAllHits(): void $this->config, FlagshipConstant::PROCESS_CACHE, FlagshipConstant::HIT_CACHE_ERROR, - ["flushAllHits", $exception->getMessage()] + [ + "flushAllHits", + $exception->getMessage(), + ] ); } } @@ -656,8 +684,10 @@ protected function sendTroubleshooting(Troubleshooting $hit): void $this->config, FlagshipConstant::SEND_TROUBLESHOOTING, FlagshipConstant::UNEXPECTED_ERROR_OCCURRED, - [FlagshipConstant::SEND_TROUBLESHOOTING, - $this->getLogFormat($exception->getMessage(), $url, $requestBody, [], $this->getNow() - $now)] + [ + FlagshipConstant::SEND_TROUBLESHOOTING, + $this->getLogFormat($exception->getMessage(), $url, $requestBody, [], $this->getNow() - $now), + ] ); } } @@ -703,8 +733,10 @@ public function sendUsageHit(UsageHit $hit): void $this->config, FlagshipConstant::SEND_USAGE_HIT, FlagshipConstant::UNEXPECTED_ERROR_OCCURRED, - [FlagshipConstant::SEND_USAGE_HIT, - $this->getLogFormat($exception->getMessage(), $url, $requestBody, [], $this->getNow() - $now)] + [ + FlagshipConstant::SEND_USAGE_HIT, + $this->getLogFormat($exception->getMessage(), $url, $requestBody, [], $this->getNow() - $now), + ] ); } } diff --git a/src/Api/NoBatchingContinuousCachingStrategy.php b/src/Api/NoBatchingContinuousCachingStrategy.php index 6ee3e1c1..2eec3226 100644 --- a/src/Api/NoBatchingContinuousCachingStrategy.php +++ b/src/Api/NoBatchingContinuousCachingStrategy.php @@ -51,8 +51,8 @@ protected function onError(HitAbstract $hit): void protected function sendHit(HitAbstract $hit): void { $header = [ - FlagshipConstant::HEADER_CONTENT_TYPE => FlagshipConstant::HEADER_APPLICATION_JSON - ]; + FlagshipConstant::HEADER_CONTENT_TYPE => FlagshipConstant::HEADER_APPLICATION_JSON, + ]; $requestBody = $hit->toApiKeys(); $now = $this->getNow(); @@ -68,8 +68,9 @@ protected function sendHit(HitAbstract $hit): void FlagshipConstant::TRACKING_MANAGER, FlagshipConstant::HIT_SENT_SUCCESS, [ - FlagshipConstant::SEND_HIT, - $this->getLogFormat(null, $url, $requestBody, $header, $this->getNow() - $now)] + FlagshipConstant::SEND_HIT, + $this->getLogFormat(null, $url, $requestBody, $header, $this->getNow() - $now), + ] ); } catch (Exception $exception) { $this->onError($hit); @@ -77,23 +78,13 @@ protected function sendHit(HitAbstract $hit): void $this->config, FlagshipConstant::TRACKING_MANAGER, FlagshipConstant::UNEXPECTED_ERROR_OCCURRED, - [FlagshipConstant::SEND_HIT, - $this->getLogFormat($exception->getMessage(), $url, $requestBody, $header, $this->getNow() - $now)] + [ + FlagshipConstant::SEND_HIT, + $this->getLogFormat($exception->getMessage(), $url, $requestBody, $header, $this->getNow() - $now), + ] ); $troubleshooting = new Troubleshooting(); - $troubleshooting->setLabel(TroubleshootingLabel::SEND_HIT_ROUTE_ERROR) - ->setLogLevel(LogLevel::ERROR) - ->setVisitorId($this->flagshipInstanceId) - ->setFlagshipInstanceId($this->flagshipInstanceId) - ->setTraffic(100) - ->setConfig($this->config) - ->setHttpRequestBody($requestBody) - ->setHttpRequestHeaders($header) - ->setHttpRequestMethod("POST") - ->setHttpRequestUrl($url) - ->setHttpResponseBody($exception->getMessage()) - ->setHttpResponseTime($this->getNow() - $now) - ; + $troubleshooting->setLabel(TroubleshootingLabel::SEND_HIT_ROUTE_ERROR)->setLogLevel(LogLevel::ERROR)->setVisitorId($this->flagshipInstanceId)->setFlagshipInstanceId($this->flagshipInstanceId)->setTraffic(100)->setConfig($this->config)->setHttpRequestBody($requestBody)->setHttpRequestHeaders($header)->setHttpRequestMethod("POST")->setHttpRequestUrl($url)->setHttpResponseBody($exception->getMessage())->setHttpResponseTime($this->getNow() - $now); $this->addTroubleshootingHit($troubleshooting); $this->sendTroubleshootingQueue(); } @@ -126,8 +117,9 @@ public function activateFlag(Activate $hit): void FlagshipConstant::TRACKING_MANAGER, FlagshipConstant::HIT_SENT_SUCCESS, [ - FlagshipConstant::SEND_ACTIVATE, - $this->getLogFormat(null, $url, $requestBody, $headers, $this->getNow() - $now)] + FlagshipConstant::SEND_ACTIVATE, + $this->getLogFormat(null, $url, $requestBody, $headers, $this->getNow() - $now), + ] ); } catch (Exception $exception) { $this->onError($hit); @@ -135,24 +127,14 @@ public function activateFlag(Activate $hit): void $this->config, FlagshipConstant::TRACKING_MANAGER, FlagshipConstant::UNEXPECTED_ERROR_OCCURRED, - [FlagshipConstant::SEND_ACTIVATE, - $this->getLogFormat($exception->getMessage(), $url, $requestBody, $headers, $this->getNow() - $now)] + [ + FlagshipConstant::SEND_ACTIVATE, + $this->getLogFormat($exception->getMessage(), $url, $requestBody, $headers, $this->getNow() - $now), + ] ); $troubleshooting = new Troubleshooting(); - $troubleshooting->setLabel(TroubleshootingLabel::SEND_ACTIVATE_HIT_ROUTE_ERROR) - ->setLogLevel(LogLevel::ERROR) - ->setVisitorId($this->flagshipInstanceId) - ->setFlagshipInstanceId($this->flagshipInstanceId) - ->setTraffic(100) - ->setConfig($this->config) - ->setHttpRequestBody($requestBody) - ->setHttpRequestHeaders($headers) - ->setHttpRequestMethod("POST") - ->setHttpRequestUrl($url) - ->setHttpResponseBody($exception->getMessage()) - ->setHttpResponseTime($this->getNow() - $now) - ; + $troubleshooting->setLabel(TroubleshootingLabel::SEND_ACTIVATE_HIT_ROUTE_ERROR)->setLogLevel(LogLevel::ERROR)->setVisitorId($this->flagshipInstanceId)->setFlagshipInstanceId($this->flagshipInstanceId)->setTraffic(100)->setConfig($this->config)->setHttpRequestBody($requestBody)->setHttpRequestHeaders($headers)->setHttpRequestMethod("POST")->setHttpRequestUrl($url)->setHttpResponseBody($exception->getMessage())->setHttpResponseTime($this->getNow() - $now); $this->addTroubleshootingHit($troubleshooting); $this->sendTroubleshootingQueue(); } diff --git a/src/Api/TrackingManagerAbstract.php b/src/Api/TrackingManagerAbstract.php index e15a080a..c8385cc3 100644 --- a/src/Api/TrackingManagerAbstract.php +++ b/src/Api/TrackingManagerAbstract.php @@ -219,7 +219,10 @@ public function lookupHits(): void $this->config, FlagshipConstant::PROCESS_CACHE, FlagshipConstant::HIT_CACHE_ERROR, - ["lookupHits", $exception->getMessage()] + [ + "lookupHits", + $exception->getMessage(), + ] ); } } diff --git a/src/Config/FlagshipConfig.php b/src/Config/FlagshipConfig.php index 43b89356..1242b85f 100644 --- a/src/Config/FlagshipConfig.php +++ b/src/Config/FlagshipConfig.php @@ -48,7 +48,7 @@ abstract class FlagshipConfig implements JsonSerializable /** * @var LogLevel */ - private LogLevel $logLevel = LogLevel::ALL; + private LogLevel $logLevel = LogLevel::INFO; /** * @var (callable(FSSdkStatus $status): void) | null @@ -86,7 +86,7 @@ abstract class FlagshipConfig implements JsonSerializable * @param string|null $envId Environment id provided by Flagship. * @param string|null $apiKey Secure api key provided by Flagship. */ - public function __construct(string $envId = null, string $apiKey = null) + public function __construct(string|null $envId = null, string|null $apiKey = null) { $this->envId = $envId; $this->apiKey = $apiKey; @@ -335,11 +335,11 @@ public function setDisableDeveloperUsageTracking(bool $disableDeveloperUsageTrac public function jsonSerialize(): mixed { return [ - FlagshipField::FIELD_ENVIRONMENT_ID => $this->getEnvId(), - FlagshipField::FIELD_API_KEY => $this->getApiKey(), - FlagshipField::FIELD_TIMEOUT => $this->getTimeout(), - FlagshipField::FIELD_LOG_LEVEL => $this->getLogLevel() - ]; + FlagshipField::FIELD_ENVIRONMENT_ID => $this->getEnvId(), + FlagshipField::FIELD_API_KEY => $this->getApiKey(), + FlagshipField::FIELD_TIMEOUT => $this->getTimeout(), + FlagshipField::FIELD_LOG_LEVEL => $this->getLogLevel(), + ]; } public static function bucketing(string $bucketingUrl): BucketingConfig diff --git a/src/Decision/ApiManager.php b/src/Decision/ApiManager.php index 0d392267..50dc6255 100644 --- a/src/Decision/ApiManager.php +++ b/src/Decision/ApiManager.php @@ -40,22 +40,19 @@ protected function setTroubleshootingData(?array $body): void $startDate = new DateTime($troubleshooting[FlagshipField::START_DATE]); $endDate = new DateTime($troubleshooting[FlagshipField::END_DATE]); $troubleshootingData = new TroubleshootingData(); - $troubleshootingData->setStartDate($startDate) - ->setEndDate($endDate) - ->setTimezone($troubleshooting[FlagshipField::TIMEZONE]) - ->setTraffic($troubleshooting[FlagshipField::TRAFFIC]); + $troubleshootingData->setStartDate($startDate)->setEndDate($endDate)->setTimezone($troubleshooting[FlagshipField::TIMEZONE])->setTraffic($troubleshooting[FlagshipField::TRAFFIC]); $this->troubleshootingData = $troubleshootingData; } public function getCampaigns(VisitorAbstract $visitor): array|null { $postData = [ - "visitorId" => $visitor->getVisitorId(), - "anonymousId" => $visitor->getAnonymousId(), - "trigger_hit" => false, - "context" => count($visitor->getContext()) > 0 ? $visitor->getContext() : null, - "visitor_consent" => $visitor->hasConsented() - ]; + "visitorId" => $visitor->getVisitorId(), + "anonymousId" => $visitor->getAnonymousId(), + "trigger_hit" => false, + "context" => count($visitor->getContext()) > 0 ? $visitor->getContext() : null, + "visitor_consent" => $visitor->hasConsented(), + ]; $headers = $this->buildHeader($this->getConfig()->getApiKey()); $url = $this->buildDecisionApiUrl($this->getConfig()->getEnvId() . '/' . FlagshipConstant::URL_CAMPAIGNS . '?' . @@ -76,26 +73,10 @@ public function getCampaigns(VisitorAbstract $visitor): array|null return $body[FlagshipField::FIELD_CAMPAIGNS] ?? null; } catch (Exception $exception) { $visitor->setFetchStatus(new FetchFlagsStatus(FSFetchStatus::FETCH_REQUIRED, FSFetchReason::FETCH_ERROR)); - $this->logError($this->getConfig(), $exception->getMessage(), [ - FlagshipConstant::TAG => __FUNCTION__ - ]); + $this->logError($this->getConfig(), $exception->getMessage(), [FlagshipConstant::TAG => __FUNCTION__]); $troubleshooting = new Troubleshooting(); - $troubleshooting->setLabel(TroubleshootingLabel::GET_CAMPAIGNS_ROUTE_RESPONSE_ERROR) - ->setHttpRequestBody($postData) - ->setHttpRequestHeaders($headers) - ->setHttpRequestMethod("POST") - ->setHttpRequestUrl($url) - ->setHttpResponseBody($exception->getMessage()) - ->setHttpResponseTime($this->getNow() - $now) - ->setVisitorContext($visitor->getContext()) - ->setLogLevel(LogLevel::ERROR) - ->setVisitorSessionId($visitor->getInstanceId()) - ->setFlagshipInstanceId($visitor->getFlagshipInstanceId()) - ->setTraffic(100) - ->setConfig($this->getConfig()) - ->setVisitorId($visitor->getVisitorId()) - ->setAnonymousId($visitor->getAnonymousId()); + $troubleshooting->setLabel(TroubleshootingLabel::GET_CAMPAIGNS_ROUTE_RESPONSE_ERROR)->setHttpRequestBody($postData)->setHttpRequestHeaders($headers)->setHttpRequestMethod("POST")->setHttpRequestUrl($url)->setHttpResponseBody($exception->getMessage())->setHttpResponseTime($this->getNow() - $now)->setVisitorContext($visitor->getContext())->setLogLevel(LogLevel::ERROR)->setVisitorSessionId($visitor->getInstanceId())->setFlagshipInstanceId($visitor->getFlagshipInstanceId())->setTraffic(100)->setConfig($this->getConfig())->setVisitorId($visitor->getVisitorId())->setAnonymousId($visitor->getAnonymousId()); $visitor->sendTroubleshootingHit($troubleshooting); return null; } diff --git a/src/Decision/BucketingManager.php b/src/Decision/BucketingManager.php index 06c9f108..3f366579 100644 --- a/src/Decision/BucketingManager.php +++ b/src/Decision/BucketingManager.php @@ -77,10 +77,12 @@ public function __construct(HttpClientInterface $httpClient, BucketingConfig $co */ protected function sendContext(VisitorAbstract $visitor): void { - if (count($visitor->getContext()) <= self::NB_MIN_CONTEXT_KEYS || !$visitor->hasConsented()) { + if (count($visitor->getContext()) <= self::NB_MIN_CONTEXT_KEYS || !$visitor->hasConsented()|| !$visitor->getHasContextBeenUpdated()) { return; } + $visitor->setHasContextBeenUpdated(false); + $segmentHit = new Segment($visitor->getContext()); $visitor->sendHit($segmentHit); } @@ -92,14 +94,14 @@ protected function sendContext(VisitorAbstract $visitor): void protected function getThirdPartySegment(string $visitorId): array { $url = sprintf(FlagshipConstant::THIRD_PARTY_SEGMENT_URL, $this->getConfig()->getEnvId(), $visitorId); - $now = $this->getNow(); + $now = $this->getNow(); $context = []; try { $response = $this->httpClient->get($url); $content = $response->getBody(); foreach ($content as $item) { $key = $item[self::PARTNER] . "::" . $item[self::SEGMENT]; - $context[$key] = $item[self::VALUE]; + $context[$key] = $item[self::VALUE]; } $this->logDebugSprintf( $this->config, @@ -116,20 +118,24 @@ protected function getThirdPartySegment(string $visitorId): array $response->getHeaders(), $response->getBody(), $response->getStatusCode() - )] + ) + ] ); } catch (Exception $exception) { $this->logErrorSprintf( $this->getConfig(), self::GET_THIRD_PARTY_SEGMENT, FlagshipConstant::UNEXPECTED_ERROR_OCCURRED, - [self::THIRD_PARTY_SEGMENT, $this->getLogFormat( - $exception->getMessage(), - $url, - [], - [], - $this->getNow() - $now - )] + [ + self::THIRD_PARTY_SEGMENT, + $this->getLogFormat( + $exception->getMessage(), + $url, + [], + [], + $this->getNow() - $now + ), + ] ); } return $context; @@ -152,33 +158,31 @@ protected function getBucketingFile(): mixed $troubleshooting = new Troubleshooting(); $troubleshooting->setLabel(TroubleshootingLabel::SDK_BUCKETING_FILE) ->setFlagshipInstanceId($this->getFlagshipInstanceId()) - ->setVisitorId($this->getFlagshipInstanceId()) ->setTraffic(0) ->setLogLevel(LogLevel::INFO) - ->setConfig($this->getConfig()) ->setHttpRequestMethod("GET") ->setHttpRequestUrl($url) ->setHttpResponseBody($response->getBody()) ->setHttpResponseHeaders($response->getHeaders()) ->setHttpResponseCode($response->getStatusCode()) - ->setHttpResponseTime($this->getNow() - $now); + ->setHttpResponseTime($this->getNow() - $now) + ->setVisitorId($this->getFlagshipInstanceId()) + ->setConfig($this->getConfig()); $this->troubleshootingHit = $troubleshooting; return $response->getBody(); } catch (Exception $exception) { - $this->logError($this->getConfig(), $exception->getMessage(), [ - FlagshipConstant::TAG => __FUNCTION__ - ]); + $this->logError($this->getConfig(), $exception->getMessage(), [FlagshipConstant::TAG => __FUNCTION__]); $troubleshooting = new Troubleshooting(); $troubleshooting->setLabel(TroubleshootingLabel::SDK_BUCKETING_FILE_ERROR) ->setFlagshipInstanceId($this->getFlagshipInstanceId()) - ->setVisitorId($this->getFlagshipInstanceId()) - ->setTraffic(0) - ->setLogLevel(LogLevel::ERROR) - ->setConfig($this->getConfig()) ->setHttpRequestMethod("GET") ->setHttpRequestUrl($url) ->setHttpResponseBody($exception->getMessage()) - ->setHttpResponseTime($this->getNow() - $now); + ->setHttpResponseTime($this->getNow() - $now) + ->setTraffic(0) + ->setLogLevel(LogLevel::ERROR) + ->setConfig($this->getConfig()) + ->setVisitorId($this->getFlagshipInstanceId()); $this->troubleshootingHit = $troubleshooting; } return null; @@ -285,14 +289,14 @@ private function getVisitorCampaigns( $visitor ); $visitorCampaigns[] = [ - FlagshipField::FIELD_ID => $campaignId, - FlagshipField::FIELD_NANE => $campaignName, - FlagshipField::FIELD_SLUG => $slug, - FlagshipField::FIELD_VARIATION_GROUP_ID => $variationGroup[FlagshipField::FIELD_ID], - FlagshipField::FIELD_VARIATION_GROUP_NAME => $variationGroup[FlagshipField::FIELD_NANE] ?? null, - FlagshipField::FIELD_VARIATION => $variations, - FlagshipField::FIELD_CAMPAIGN_TYPE => $campaignType - ]; + FlagshipField::FIELD_ID => $campaignId, + FlagshipField::FIELD_NANE => $campaignName, + FlagshipField::FIELD_SLUG => $slug, + FlagshipField::FIELD_VARIATION_GROUP_ID => $variationGroup[FlagshipField::FIELD_ID], + FlagshipField::FIELD_VARIATION_GROUP_NAME => $variationGroup[FlagshipField::FIELD_NANE] ?? null, + FlagshipField::FIELD_VARIATION => $variations, + FlagshipField::FIELD_CAMPAIGN_TYPE => $campaignType, + ]; break; } } @@ -306,8 +310,7 @@ private function getVisitorCampaigns( */ private function getVisitorAssignmentsHistory(string $variationGroupId, VisitorAbstract $visitor): mixed { - return $visitor->visitorCache[StrategyAbstract::DATA] - [StrategyAbstract::ASSIGNMENTS_HISTORY][$variationGroupId] ?? null; + return $visitor->visitorCache[StrategyAbstract::DATA][StrategyAbstract::ASSIGNMENTS_HISTORY][$variationGroupId] ?? null; } private function findVariationById(array $variations, $key) @@ -342,28 +345,33 @@ private function getVariation(array $variationGroup, VisitorAbstract $visitor): if (!isset($variation[FlagshipField::FIELD_ALLOCATION])) { continue; } - $assignmentsVariationId = $this->getVisitorAssignmentsHistory($groupVariationId, $visitor); + $assignmentsVariationId = $this->getVisitorAssignmentsHistory($groupVariationId, $visitor); if ($assignmentsVariationId) { $newVariation = $this->findVariationById($variations, $assignmentsVariationId); if (!$newVariation) { continue; } $visitorVariation = [ - FlagshipField::FIELD_ID => $newVariation[FlagshipField::FIELD_ID], - FlagshipField::FIELD_MODIFICATIONS => $newVariation[FlagshipField::FIELD_MODIFICATIONS], - FlagshipField::FIELD_REFERENCE => !empty($newVariation[FlagshipField::FIELD_REFERENCE]), - FlagshipField::FIELD_NANE => $newVariation[FlagshipField::FIELD_NANE] ?? null - ]; + FlagshipField::FIELD_ID => $newVariation[FlagshipField::FIELD_ID], + FlagshipField::FIELD_MODIFICATIONS => $newVariation[FlagshipField::FIELD_MODIFICATIONS], + FlagshipField::FIELD_REFERENCE => !empty($newVariation[FlagshipField::FIELD_REFERENCE]), + FlagshipField::FIELD_NANE => $newVariation[FlagshipField::FIELD_NANE] ?? null, + ]; break; } + + if (!isset($variation[FlagshipField::FIELD_ALLOCATION]) || $variation[FlagshipField::FIELD_ALLOCATION] <= 0) { + continue; + } + $totalAllocation += $variation[FlagshipField::FIELD_ALLOCATION]; if ($hashAllocation < $totalAllocation) { $visitorVariation = [ - FlagshipField::FIELD_ID => $variation[FlagshipField::FIELD_ID], - FlagshipField::FIELD_MODIFICATIONS => $variation[FlagshipField::FIELD_MODIFICATIONS], - FlagshipField::FIELD_REFERENCE => !empty($variation[FlagshipField::FIELD_REFERENCE]), - FlagshipField::FIELD_NANE => $variation[FlagshipField::FIELD_NANE] ?? null - ]; + FlagshipField::FIELD_ID => $variation[FlagshipField::FIELD_ID], + FlagshipField::FIELD_MODIFICATIONS => $variation[FlagshipField::FIELD_MODIFICATIONS], + FlagshipField::FIELD_REFERENCE => !empty($variation[FlagshipField::FIELD_REFERENCE]), + FlagshipField::FIELD_NANE => $variation[FlagshipField::FIELD_NANE] ?? null, + ]; break; } } @@ -433,7 +441,7 @@ private function checkAndTargeting(array $innerTargetings, VisitorAbstract $visi break; } $isMatching = true; - continue ; + continue; } switch ($key) { diff --git a/src/Enum/EventCategory.php b/src/Enum/EventCategory.php index 0dcac344..177ca33f 100644 --- a/src/Enum/EventCategory.php +++ b/src/Enum/EventCategory.php @@ -16,4 +16,4 @@ enum EventCategory: string * Represents user engagement event category. */ case USER_ENGAGEMENT = "USER_ENGAGEMENT"; -} \ No newline at end of file +} diff --git a/src/Enum/FlagshipConstant.php b/src/Enum/FlagshipConstant.php index 6e9418d1..f964ff67 100644 --- a/src/Enum/FlagshipConstant.php +++ b/src/Enum/FlagshipConstant.php @@ -16,6 +16,8 @@ class FlagshipConstant public const DEFAULT_HIT_CACHE_TIME_MS = 14400000; + public const MAX_ACTIVATE_HIT_PER_BATCH = 100; + /** * SDK language */ @@ -52,7 +54,7 @@ class FlagshipConstant /** * SDK version */ - public const SDK_VERSION = "4.0.1"; + public const SDK_VERSION = "4.1.0"; public const GET_FLAG = 'GET_FLAG'; @@ -62,24 +64,23 @@ class FlagshipConstant public const CONTEXT_PARAM_ERROR = "params 'key' must be a non null String, and 'value' must be one of the following types : String, Number, Boolean"; - public const USER_EXPOSED_NO_FLAG_ERROR = "For the visitor '%s', no flags were found with the key '%s'. + public const USER_EXPOSED_NO_FLAG_ERROR = "For the visitor '%s', no flags were found with the key '%s'. As a result, user exposure will not be sent."; public const VISITOR_EXPOSED_VALUE_NOT_CALLED = - "Visitor '%s', the flag with the key '%s' has been exposed without calling the `getValue` method first."; + "For the visitor `%s`, assuming the getValue() method has not previously been invoked for the flag `%s`. Therefore, the exposure is canceled"; public const GET_FLAG_MISSING_ERROR = - "For the visitor '%s', no flags were found with the key '%s'. + "For the visitor '%s', no flags were found with the key '%s'. Therefore, the default value '%s' has been returned."; public const GET_FLAG_NOT_FOUND = - "For the visitor '%s', no flags were found with the key '%s'. Therefore, an empty flag has been returned."; + "For the visitor '%s', no flags were found with the key '%s'. Therefore, an empty flag has been returned."; public const NO_FLAG_METADATA = - "For the visitor '%s',no flags were found with the key '%s'. As a result, an empty metadata object is returned"; + "For the visitor '%s',no flags were found with the key '%s'. As a result, an empty metadata object is returned"; public const GET_FLAG_CAST_ERROR = - "For the visitor '%s', the flag with key '%s' has a different type compared to the default value. + "For the visitor '%s', the flag with key '%s' has a different type compared to the default value. Therefore, the default value '%s' has been returned."; public const USER_EXPOSED_CAST_ERROR = - "For the visitor '%s', the flag with key '%s' has been exposed - despite having a different type compared to the default value"; + "For the visitor `%s`, the flag with the key `%s` has a different type compared to the default value. Therefore, the exposure is interrupted"; public const DECISION_MANAGER_MISSING_ERROR = "decisionManager must not be null."; public const TRACKER_MANAGER_MISSING_ERROR = "trackerManager must not be null."; public const CURL_LIBRARY_IS_NOT_LOADED = 'curl library is not loaded'; @@ -88,15 +89,17 @@ class FlagshipConstant public const METHOD_DEACTIVATED_ERROR = "Method '%s' is deactivated while SDK status is: %s."; public const METHOD_DEACTIVATED_SEND_CONSENT_ERROR = "Send consent hit is deactivated while SDK status is: %s."; public const METHOD_DEACTIVATED_CONSENT_ERROR = - "Method '%s' is deactivated for visitor '%s': visitor did not consent."; + "Method '%s' is deactivated for visitor '%s': visitor did not consent."; public const METHOD_DEACTIVATED_BUCKETING_ERROR = "Method '%s' is deactivated on Bucketing mode."; public const FLAGSHIP_PREDEFINED_CONTEXT_ERROR = "Flagship predefined context %s must be %s"; - public const FLAGSHIP_VISITOR_NOT_AUTHENTIFICATE = "Visitor is not authentificated yet"; + public const FLAGSHIP_VISITOR_NOT_AUTHENTIFICATE = "Visitor is not authentificated yet"; public const IS_NOT_CALLABLE_ERROR = "'%s' is not callable"; //Messages Info public const SDK_STARTED_INFO = "Flagship SDK (version: %s) READY"; public const FLAGSHIP_SDK = "Flagship SDK"; + public const XPC_BUCKETING_WARNING = "Experience continuity is disabled on bucketing mode when visitor cache is not set "; + //Tag public const TAG = 'TAG'; @@ -177,12 +180,14 @@ class FlagshipConstant public const FETCH_FLAGS_STARTED = 'visitor `%s` fetchFlags process is started'; public const PROCESS_FETCHING_FLAGS = 'FETCH_FLAGS'; public const FETCH_CAMPAIGNS_SUCCESS = - 'Visitor %s, anonymousId %s with context %s has just fetched campaigns %s in %s ms'; + 'Visitor %s, anonymousId %s with context %s has just fetched campaigns %s in %s ms'; public const FETCH_CAMPAIGNS_FROM_CACHE = 'Visitor %s, anonymousId %s with context %s has just fetched campaigns from cache %s in %s ms'; public const FETCH_FLAGS_FROM_CAMPAIGNS = 'Visitor %s, anonymousId %s with context %s has just fetched flags %s from Campaigns'; public const FLAG_USER_EXPOSED = 'FLAG_USER_EXPOSED'; + + public const ADD_HIT = 'ADD HIT'; public const FLAG_VALUE = 'FLAG_VALUE'; public const GET_FLAG_VALUE = 'Visitor %s, Flag for key %s returns value %s'; public const LOG_FORMAT_MESSAGE = "message"; @@ -194,5 +199,5 @@ class FlagshipConstant public const LOG_FORMAT_DURATION = 'DURATION'; public const ANALYTIC_HIT_ALLOCATION = 1; public const FLAGSHIP_VISITOR_ALREADY_AUTHENTICATE = - "Visitor is already authenticated"; + "Visitor is already authenticated"; } diff --git a/src/Enum/FlagshipContext.php b/src/Enum/FlagshipContext.php index 93409729..ff5cf6d1 100644 --- a/src/Enum/FlagshipContext.php +++ b/src/Enum/FlagshipContext.php @@ -121,27 +121,27 @@ class FlagshipContext public const FLAGSHIP_VISITOR = 'fs_users'; private static array $predefinedContext = [ - self::DEVICE_LOCALE => "string", - self::DEVICE_TYPE => "string", - self::DEVICE_MODEL => "string", - self::LOCATION_CITY => "string", - self::LOCATION_REGION => "string", - self::LOCATION_COUNTRY => "string", - self::LOCATION_LAT => "float", - self::LOCATION_LONG => "float", - self::IP => "string", - self::OS_NAME => "string", - self::OS_VERSION_NAME => "string", - self::OS_VERSION_CODE => "float", - self::CARRIER_NAME => "string", - self::INTERNET_CONNECTION => "string", - self::APP_VERSION_NAME => "string", - self::APP_VERSION_CODE => "float", - self::INTERFACE_NAME => "string", - self::FLAGSHIP_CLIENT => "string", - self::FLAGSHIP_VERSION => "string", - self::FLAGSHIP_VISITOR => "string" - ]; + self::DEVICE_LOCALE => "string", + self::DEVICE_TYPE => "string", + self::DEVICE_MODEL => "string", + self::LOCATION_CITY => "string", + self::LOCATION_REGION => "string", + self::LOCATION_COUNTRY => "string", + self::LOCATION_LAT => "float", + self::LOCATION_LONG => "float", + self::IP => "string", + self::OS_NAME => "string", + self::OS_VERSION_NAME => "string", + self::OS_VERSION_CODE => "float", + self::CARRIER_NAME => "string", + self::INTERNET_CONNECTION => "string", + self::APP_VERSION_NAME => "string", + self::APP_VERSION_CODE => "float", + self::INTERFACE_NAME => "string", + self::FLAGSHIP_CLIENT => "string", + self::FLAGSHIP_VERSION => "string", + self::FLAGSHIP_VISITOR => "string", + ]; /** * @param $context string diff --git a/src/Enum/TroubleshootingLabel.php b/src/Enum/TroubleshootingLabel.php index 528a059c..0acd0b75 100644 --- a/src/Enum/TroubleshootingLabel.php +++ b/src/Enum/TroubleshootingLabel.php @@ -23,4 +23,4 @@ enum TroubleshootingLabel: string case SDK_CONFIG = "SDK_CONFIG"; case SEND_HIT_ROUTE_ERROR = "SEND_HIT_ROUTE_ERROR"; case FLAG_VALUE_NOT_CALLED = "FLAG_VALUE_NOT_CALLED"; -} \ No newline at end of file +} diff --git a/src/Enum/VisitorCacheStatus.php b/src/Enum/VisitorCacheStatus.php new file mode 100644 index 00000000..b16af0b4 --- /dev/null +++ b/src/Enum/VisitorCacheStatus.php @@ -0,0 +1,11 @@ +visitor->getConfig(), FlagshipConstant::GET_FLAG, FlagshipConstant::GET_FLAG_NOT_FOUND, - [$this->visitor->getVisitorId(), $key] + [ + $this->visitor->getVisitorId(), + $key, + ] ); return new FSFlag($key); } @@ -121,18 +124,18 @@ public function toJSON(): string foreach ($this->flags as $key => $flag) { $metadata = $flag->getMetadata(); $serializedData[] = [ - 'key' => $key, - 'campaignId' => $metadata->getCampaignId(), - 'campaignName' => $metadata->getCampaignName(), - 'variationGroupId' => $metadata->getVariationGroupId(), - 'variationGroupName' => $metadata->getVariationGroupName(), - 'variationId' => $metadata->getVariationId(), - 'variationName' => $metadata->getVariationName(), - 'isReference' => $metadata->isReference(), - 'campaignType' => $metadata->getCampaignType(), - 'slug' => $metadata->getSlug(), - 'hex' => $this->valueToHex(['v' => $flag->getValue(null, false)]) - ]; + 'key' => $key, + 'campaignId' => $metadata->getCampaignId(), + 'campaignName' => $metadata->getCampaignName(), + 'variationGroupId' => $metadata->getVariationGroupId(), + 'variationGroupName' => $metadata->getVariationGroupName(), + 'variationId' => $metadata->getVariationId(), + 'variationName' => $metadata->getVariationName(), + 'isReference' => $metadata->isReference(), + 'campaignType' => $metadata->getCampaignType(), + 'slug' => $metadata->getSlug(), + 'hex' => $this->valueToHex(['v' => $flag->getValue(null, false)]), + ]; } return json_encode($serializedData); } diff --git a/src/Flag/FSFlagMetadata.php b/src/Flag/FSFlagMetadata.php index 9d699fd1..fa982da8 100644 --- a/src/Flag/FSFlagMetadata.php +++ b/src/Flag/FSFlagMetadata.php @@ -175,15 +175,15 @@ public function getSlug(): ?string public function jsonSerialize(): mixed { return [ - "campaignId" => $this->getCampaignId(), - "campaignName" => $this->getCampaignName(), - "variationGroupId" => $this->getVariationGroupId(), - "variationGroupName" => $this->getVariationGroupName(), - "variationId" => $this->getVariationId(), - "variationName" => $this->getVariationName(), - "isReference" => $this->isReference(), - "campaignType" => $this->getCampaignType(), - "slug" => $this->getSlug() - ]; + "campaignId" => $this->getCampaignId(), + "campaignName" => $this->getCampaignName(), + "variationGroupId" => $this->getVariationGroupId(), + "variationGroupName" => $this->getVariationGroupName(), + "variationId" => $this->getVariationId(), + "variationName" => $this->getVariationName(), + "isReference" => $this->isReference(), + "campaignType" => $this->getCampaignType(), + "slug" => $this->getSlug(), + ]; } } diff --git a/src/Flagship.php b/src/Flagship.php index 43138a4e..8502875d 100644 --- a/src/Flagship.php +++ b/src/Flagship.php @@ -127,7 +127,11 @@ public static function start(string $envId, string $apiKey, ?FlagshipConfig $con $murmurHash = $container->get(MurmurHash::class); $decisionManager = $container->get( BucketingManager::class, - [$httpClient, $config, $murmurHash] + [ + $httpClient, + $config, + $murmurHash, + ] ); } else { $decisionManager = $container->get(ApiManager::class, [$httpClient, $config]); @@ -139,7 +143,11 @@ public static function start(string $envId, string $apiKey, ?FlagshipConfig $con $trackingManager = $container->get( TrackingManager::class, - [$config, $httpClient, $flagship->flagshipInstanceId] + [ + $config, + $httpClient, + $flagship->flagshipInstanceId, + ] ); $configManager = $container->get(ConfigManager::class, [$config, $decisionManager, $trackingManager], true); diff --git a/src/Hit/Activate.php b/src/Hit/Activate.php index d9c0a443..47cff6de 100644 --- a/src/Hit/Activate.php +++ b/src/Hit/Activate.php @@ -198,13 +198,13 @@ public function setFlagDefaultValue(float|array|bool|int|string|null $flagDefaul public function toApiKeys(): array { $apiKeys = [ - FlagshipConstant::VISITOR_ID_API_ITEM => $this->getVisitorId(), - FlagshipConstant::VARIATION_ID_API_ITEM => $this->getVariationId(), - FlagshipConstant::VARIATION_GROUP_ID_API_ITEM => $this->getVariationGroupId(), - FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $this->config->getEnvId(), - FlagshipConstant::ANONYMOUS_ID => null, - FlagshipConstant::QT_API_ITEM => round(microtime(true) * 1000) - $this->createdAt, - ]; + FlagshipConstant::VISITOR_ID_API_ITEM => $this->getVisitorId(), + FlagshipConstant::VARIATION_ID_API_ITEM => $this->getVariationId(), + FlagshipConstant::VARIATION_GROUP_ID_API_ITEM => $this->getVariationGroupId(), + FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $this->config->getEnvId(), + FlagshipConstant::ANONYMOUS_ID => null, + FlagshipConstant::QT_API_ITEM => round(microtime(true) * 1000) - $this->createdAt, + ]; if ($this->getVisitorId() && $this->getAnonymousId()) { $apiKeys[FlagshipConstant::VISITOR_ID_API_ITEM] = $this->getVisitorId(); diff --git a/src/Hit/ActivateBatch.php b/src/Hit/ActivateBatch.php index f3d668b3..d60bec1d 100644 --- a/src/Hit/ActivateBatch.php +++ b/src/Hit/ActivateBatch.php @@ -39,8 +39,8 @@ public function toApiKeys(): array $activates[] = $apiKeys; } return [ - FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $this->config->getEnvId(), - FlagshipConstant::BATCH => $activates - ]; + FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $this->config->getEnvId(), + FlagshipConstant::BATCH => $activates, + ]; } } diff --git a/src/Hit/Diagnostic.php b/src/Hit/Diagnostic.php index 78cd37a7..e83f0b70 100644 --- a/src/Hit/Diagnostic.php +++ b/src/Hit/Diagnostic.php @@ -297,11 +297,7 @@ public function __construct($type) parent::__construct($type); $this->setVersion(FlagshipConstant::TROUBLESHOOTING_VERSION); $date = $this->getCurrentDateTime(); - $this->setTimestamp($date->format('c')) - ->setTimeZone($date->getTimezone()->getName()) - ->setStackType(FlagshipConstant::SDK) - ->setStackName(FlagshipConstant::SDK_LANGUAGE) - ->setStackVersion(FlagshipConstant::SDK_VERSION); + $this->setTimestamp($date->format('c'))->setTimeZone($date->getTimezone()->getName())->setStackType(FlagshipConstant::SDK)->setStackName(FlagshipConstant::SDK_LANGUAGE)->setStackVersion(FlagshipConstant::SDK_VERSION); } /** @@ -1320,16 +1316,16 @@ public function setSdkConfigLogLevel(LogLevel $sdkConfigLogLeve): static public function toApiKeys(): array { $customVariable = [ - 'version' => $this->getVersion(), - 'logLevel' => $this->getLogLevel()->name, - 'envId' => $this->getConfig()->getEnvId(), - "timestamp" => $this->getTimestamp(), - 'timeZone' => $this->getTimeZone(), - 'label' => $this->getLabel()->value, - 'stack.type' => $this->getStackType(), - 'stack.name' => $this->getStackName(), - 'stack.version' => $this->getStackVersion() - ]; + 'version' => $this->getVersion(), + 'logLevel' => $this->getLogLevel()->name, + 'envId' => $this->getConfig()->getEnvId(), + "timestamp" => $this->getTimestamp(), + 'timeZone' => $this->getTimeZone(), + 'label' => $this->getLabel()->value, + 'stack.type' => $this->getStackType(), + 'stack.name' => $this->getStackName(), + 'stack.version' => $this->getStackVersion(), + ]; if ($this->getVisitorId() !== null) { $customVariable["visitor.visitorId"] = $this->getVisitorId(); } @@ -1374,8 +1370,7 @@ public function toApiKeys(): array } if ($this->getSdkConfigTrackingManagerConfigStrategy() !== null) { - $customVariable["sdk.config.trackingManager.strategy"] = - $this->getSdkConfigTrackingManagerConfigStrategy()->name; + $customVariable["sdk.config.trackingManager.strategy"] = $this->getSdkConfigTrackingManagerConfigStrategy()->name; } if ($this->getSdkConfigBucketingUrl() !== null) { @@ -1387,8 +1382,7 @@ public function toApiKeys(): array } if ($this->isSdkConfigUsingOnVisitorExposed() !== null) { - $customVariable["sdk.config.usingOnVisitorExposed"] = - json_encode($this->isSdkConfigUsingOnVisitorExposed()); + $customVariable["sdk.config.usingOnVisitorExposed"] = json_encode($this->isSdkConfigUsingOnVisitorExposed()); } if ($this->isSdkConfigUsingCustomHitCache() !== null) { @@ -1396,8 +1390,7 @@ public function toApiKeys(): array } if ($this->isSdkConfigUsingCustomVisitorCache() !== null) { - $customVariable["sdk.config.usingCustomVisitorCache"] = - json_encode($this->isSdkConfigUsingCustomVisitorCache()); + $customVariable["sdk.config.usingCustomVisitorCache"] = json_encode($this->isSdkConfigUsingCustomVisitorCache()); } if ($this->getHttpRequestUrl() !== null) { @@ -1443,7 +1436,7 @@ public function toApiKeys(): array if (is_array($this->getVisitorContext())) { $context = $this->getVisitorContext(); foreach ($context as $index => $item) { - $customVariable["visitor.context.[$index]"] = is_string($item) ? $item : json_encode($item); + $customVariable["visitor.context.[$index]"] = is_string($item) ? $item : json_encode($item); } } @@ -1464,14 +1457,11 @@ public function toApiKeys(): array $customVariableKey = "visitor.flags.[$key]"; $customVariableKeyMetadata = "visitor.flags.[$key].metadata"; $customVariable["$customVariableKey.key"] = $visitorFlag->getKey(); - $customVariable["$customVariableKey.value"] = is_string($visitorFlag->getValue()) ? - $visitorFlag->getValue() : - json_encode($visitorFlag->getValue()); + $customVariable["$customVariableKey.value"] = is_string($visitorFlag->getValue()) ? $visitorFlag->getValue() : json_encode($visitorFlag->getValue()); $customVariable["$customVariableKeyMetadata.variationId"] = $visitorFlag->getVariationId(); $customVariable["$customVariableKeyMetadata.variationName"] = $visitorFlag->getVariationName(); $customVariable["$customVariableKeyMetadata.variationGroupId"] = $visitorFlag->getVariationGroupId(); - $customVariable["$customVariableKeyMetadata.variationGroupName"] = - $visitorFlag->getVariationGroupName(); + $customVariable["$customVariableKeyMetadata.variationGroupName"] = $visitorFlag->getVariationGroupName(); $customVariable["$customVariableKeyMetadata.campaignId"] = $visitorFlag->getCampaignId(); $customVariable["$customVariableKeyMetadata.campaignName"] = $visitorFlag->getCampaignName(); $customVariable["$customVariableKeyMetadata.campaignType"] = $visitorFlag->getCampaignType(); @@ -1490,12 +1480,10 @@ public function toApiKeys(): array $customVariable["flag.key"] = $this->getFlagKey(); } if ($this->getFlagValue() !== null) { - $customVariable["flag.value"] = is_string($this->getFlagValue()) ? $this->getFlagValue() : - json_encode($this->getFlagValue()); + $customVariable["flag.value"] = is_string($this->getFlagValue()) ? $this->getFlagValue() : json_encode($this->getFlagValue()); } if ($this->getFlagDefault() !== null) { - $customVariable["flag.default"] = is_string($this->getFlagDefault()) ? $this->getFlagDefault() : - json_encode($this->getFlagDefault()); + $customVariable["flag.default"] = is_string($this->getFlagDefault()) ? $this->getFlagDefault() : json_encode($this->getFlagDefault()); } if ($this->isVisitorExposed() !== null) { $customVariable["flag.visitorExposed"] = json_encode($this->isVisitorExposed()); @@ -1529,17 +1517,17 @@ public function toApiKeys(): array } if ($this->getHitContent() !== null) { foreach ($this->getHitContent() as $key => $item) { - $customVariable["hit." . $key] = is_string($item) ? $item : json_encode($item); + $customVariable["hit." . $key] = is_string($item) ? $item : json_encode($item); } } return [ - FlagshipConstant::VISITOR_ID_API_ITEM => $this->visitorId, - FlagshipConstant::DS_API_ITEM => $this->getDs(), - FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $this->getConfig()->getEnvId(), - FlagshipConstant::T_API_ITEM => $this->getType()->value, - 'cv' => $customVariable - ]; + FlagshipConstant::VISITOR_ID_API_ITEM => $this->visitorId, + FlagshipConstant::DS_API_ITEM => $this->getDs(), + FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $this->getConfig()->getEnvId(), + FlagshipConstant::T_API_ITEM => $this->getType()->value, + 'cv' => $customVariable, + ]; } /** diff --git a/src/Hit/Event.php b/src/Hit/Event.php index e1deed0a..55e0617d 100644 --- a/src/Hit/Event.php +++ b/src/Hit/Event.php @@ -14,8 +14,7 @@ class Event extends HitAbstract { public const ERROR_MESSAGE = 'event category and event action are required'; - public const CATEGORY_ERROR = - "The category value must be either EventCategory::ACTION_TRACKING or EventCategory::ACTION_TRACKING"; + public const CATEGORY_ERROR = "The category value must be either EventCategory::ACTION_TRACKING or EventCategory::ACTION_TRACKING"; public const VALUE_FIELD_ERROR = 'value must be an integer and be >= 0'; public static function getClassName(): string @@ -147,9 +146,7 @@ public function setValue(?float $value): static $this->logError( $this->config, self::VALUE_FIELD_ERROR, - [ - FlagshipConstant::TAG => __FUNCTION__ - ] + [FlagshipConstant::TAG => __FUNCTION__] ); return $this; } diff --git a/src/Hit/HitAbstract.php b/src/Hit/HitAbstract.php index ad8d5c7e..f1766a39 100644 --- a/src/Hit/HitAbstract.php +++ b/src/Hit/HitAbstract.php @@ -94,7 +94,7 @@ public function __construct(HitType $type) { $this->setType($type); $this->ds = FlagshipConstant::SDK_APP; - $this->createdAt = $this->getNow(); + $this->createdAt = $this->getNow(); $this->anonymousId = null; $this->isFromCache = false; $this->userIP = null; @@ -335,13 +335,13 @@ protected function setIsFromCache(bool $isFromCache): static public function toApiKeys(): array { $data = [ - FlagshipConstant::VISITOR_ID_API_ITEM => $this->visitorId ?: $this->anonymousId, - FlagshipConstant::DS_API_ITEM => $this->getDs(), - FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $this->getConfig()->getEnvId(), - FlagshipConstant::T_API_ITEM => $this->getType()->value, - FlagshipConstant::CUSTOMER_UID => null, - FlagshipConstant::QT_API_ITEM => $this->getNow() - $this->createdAt, - ]; + FlagshipConstant::VISITOR_ID_API_ITEM => $this->visitorId ?: $this->anonymousId, + FlagshipConstant::DS_API_ITEM => $this->getDs(), + FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $this->getConfig()->getEnvId(), + FlagshipConstant::T_API_ITEM => $this->getType()->value, + FlagshipConstant::CUSTOMER_UID => null, + FlagshipConstant::QT_API_ITEM => $this->getNow() - $this->createdAt, + ]; if ($this->getUserIP() !== null) { $data[FlagshipConstant::USER_IP_API_ITEM] = $this->getUserIP(); diff --git a/src/Hit/HitBatch.php b/src/Hit/HitBatch.php index bc61894a..7bfac945 100644 --- a/src/Hit/HitBatch.php +++ b/src/Hit/HitBatch.php @@ -37,12 +37,12 @@ public function __construct(FlagshipConfig $config, array $hits) public function toApiKeys(): array { $data = [ - FlagshipConstant::DS_API_ITEM => $this->getDs(), - FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $this->getConfig()->getEnvId(), - FlagshipConstant::T_API_ITEM => $this->getType()->value, - FlagshipConstant::QT_API_ITEM => $this->getNow() - $this->createdAt, - FlagshipConstant::H_API_ITEM => [] - ]; + FlagshipConstant::DS_API_ITEM => $this->getDs(), + FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $this->getConfig()->getEnvId(), + FlagshipConstant::T_API_ITEM => $this->getType()->value, + FlagshipConstant::QT_API_ITEM => $this->getNow() - $this->createdAt, + FlagshipConstant::H_API_ITEM => [], + ]; foreach ($this->getHits() as $hit) { $hitApiKey = $hit->toApiKeys(); diff --git a/src/Model/FlagDTO.php b/src/Model/FlagDTO.php index 34300620..6b833d4d 100644 --- a/src/Model/FlagDTO.php +++ b/src/Model/FlagDTO.php @@ -264,16 +264,16 @@ public function setVariationName(string $variationName): static public function jsonSerialize(): mixed { return [ - FlagshipField::FIELD_KEY => $this->getKey(), - FlagshipField::FIELD_CAMPAIGN_ID => $this->getCampaignId(), - FlagshipField::FIELD_CAMPAIGN_NAME => $this->getCampaignName(), - FlagshipField::FIELD_VARIATION_GROUP_ID => $this->getVariationGroupId(), - FlagshipField::FIELD_VARIATION_GROUP_NAME => $this->getVariationGroupName(), - FlagshipField::FIELD_VARIATION_ID => $this->getVariationId(), - FlagshipField::FIELD_VARIATION_NAME => $this->getVariationName(), - FlagshipField::FIELD_IS_REFERENCE => $this->getIsReference(), - FlagshipField::FIELD_VALUE => $this->getValue(), - FlagshipField::FIELD_SLUG => $this->getSlug() - ]; + FlagshipField::FIELD_KEY => $this->getKey(), + FlagshipField::FIELD_CAMPAIGN_ID => $this->getCampaignId(), + FlagshipField::FIELD_CAMPAIGN_NAME => $this->getCampaignName(), + FlagshipField::FIELD_VARIATION_GROUP_ID => $this->getVariationGroupId(), + FlagshipField::FIELD_VARIATION_GROUP_NAME => $this->getVariationGroupName(), + FlagshipField::FIELD_VARIATION_ID => $this->getVariationId(), + FlagshipField::FIELD_VARIATION_NAME => $this->getVariationName(), + FlagshipField::FIELD_IS_REFERENCE => $this->getIsReference(), + FlagshipField::FIELD_VALUE => $this->getValue(), + FlagshipField::FIELD_SLUG => $this->getSlug(), + ]; } } diff --git a/src/Traits/BuildApiTrait.php b/src/Traits/BuildApiTrait.php index 75c9e997..7b64c679 100644 --- a/src/Traits/BuildApiTrait.php +++ b/src/Traits/BuildApiTrait.php @@ -15,11 +15,11 @@ trait BuildApiTrait protected function buildHeader(string $apiKey): array { return [ - FlagshipConstant::HEADER_X_API_KEY => $apiKey, - FlagshipConstant::HEADER_X_SDK_VERSION => FlagshipConstant::SDK_VERSION, - FlagshipConstant::HEADER_CONTENT_TYPE => FlagshipConstant::HEADER_APPLICATION_JSON, - FlagshipConstant::HEADER_X_SDK_CLIENT => FlagshipConstant::SDK_LANGUAGE, - ]; + FlagshipConstant::HEADER_X_API_KEY => $apiKey, + FlagshipConstant::HEADER_X_SDK_VERSION => FlagshipConstant::SDK_VERSION, + FlagshipConstant::HEADER_CONTENT_TYPE => FlagshipConstant::HEADER_APPLICATION_JSON, + FlagshipConstant::HEADER_X_SDK_CLIENT => FlagshipConstant::SDK_LANGUAGE, + ]; } /** diff --git a/src/Traits/Helper.php b/src/Traits/Helper.php index aefb2d74..7ccbe3c0 100644 --- a/src/Traits/Helper.php +++ b/src/Traits/Helper.php @@ -33,4 +33,29 @@ public function valueToHex(mixed $value): string } return $hex; } + + function arraysAreEqual(array $array1, array $array2): bool + { + if (count($array1) !== count($array2)) { + return false; + } + + foreach ($array1 as $key => $value) { + if (!array_key_exists($key, $array2)) { + return false; + } + + if (is_array($value)) { + if (!is_array($array2[$key]) || !$this->arraysAreEqual($value, $array2[$key])) { + return false; + } + } else { + if ($value !== $array2[$key]) { + return false; + } + } + } + + return true; + } } diff --git a/src/Traits/LogTrait.php b/src/Traits/LogTrait.php index 287a4b09..92080430 100644 --- a/src/Traits/LogTrait.php +++ b/src/Traits/LogTrait.php @@ -148,9 +148,9 @@ protected function logWarning(FlagshipConfig $config, string $message, array $co * @param array $requestBody * @param array $headers * @param string $duration - * @param null $responseHeader - * @param null $responseBody - * @param null $responseStatus + * @param mixed $responseHeader + * @param mixed $responseBody + * @param mixed $responseStatus * @return array */ protected function getLogFormat( @@ -180,13 +180,13 @@ protected function getLogFormat( $format[FlagshipConstant::LOG_FORMAT_DURATION] = $duration; } if ($responseHeader !== null) { - $format[FlagshipConstant::LOG_FORMAT_REQUEST_HEADERS] = $responseHeader; + $format[FlagshipConstant::LOG_FORMAT_REQUEST_HEADERS] = $responseHeader; } if ($responseBody !== null) { - $format[FlagshipConstant::LOG_FORMAT_RESPONSE_BODY] = $responseBody; + $format[FlagshipConstant::LOG_FORMAT_RESPONSE_BODY] = $responseBody; } if ($responseStatus !== null) { - $format[FlagshipConstant::LOG_FORMAT_RESPONSE_STATUS] = $responseStatus; + $format[FlagshipConstant::LOG_FORMAT_RESPONSE_STATUS] = $responseStatus; } return $format; } diff --git a/src/Utils/HttpClient.php b/src/Utils/HttpClient.php index eb0f2b46..1154dce7 100644 --- a/src/Utils/HttpClient.php +++ b/src/Utils/HttpClient.php @@ -150,11 +150,11 @@ private function exec(): HttpResponse if ($httpError || $curlErrorCode) { $message = [ - 'curlCode' => $curlErrorCode, - 'curlMessage' => $curlErrorMessage, - 'httpCode' => $httpStatusCode, - 'httpMessage' => $rawResponse - ]; + 'curlCode' => $curlErrorCode, + 'curlMessage' => $curlErrorMessage, + 'httpCode' => $httpStatusCode, + 'httpMessage' => $rawResponse, + ]; throw new Exception(json_encode($message), $curlErrorCode); } $response = $rawResponse; diff --git a/src/Utils/MurmurHash.php b/src/Utils/MurmurHash.php index 00d62d65..13bcccbc 100644 --- a/src/Utils/MurmurHash.php +++ b/src/Utils/MurmurHash.php @@ -11,9 +11,7 @@ class MurmurHash */ private function multiply(mixed $k1, mixed $constant): int { - return ((($k1 & 0xffff) * $constant) + - ((($k1 >= 0 ? $k1 >> 16 : - (($k1 & 0x7fffffff) >> 16) | 0x8000) * $constant & 0xffff) << 16)) & 0xffffffff; + return ((($k1 & 0xffff) * $constant) + ((($k1 >= 0 ? $k1 >> 16 : (($k1 & 0x7fffffff) >> 16) | 0x8000) * $constant & 0xffff) << 16)) & 0xffffffff; } /** @@ -47,21 +45,15 @@ public function murmurHash3Int32(string $source): int $h1 = $seed < 0 ? -$seed : $seed; $i = 0; for ($bytes = $keyLength - ($remainder = $keyLength & 3); $i < $bytes;) { - $k1 = $source[$i] - | ($source[++$i] << 8) - | ($source[++$i] << 16) - | ($source[++$i] << 24); + $k1 = $source[$i] | ($source[++$i] << 8) | ($source[++$i] << 16) | ($source[++$i] << 24); ++$i; $k1 = $this->multiply($k1, 0xcc9e2d51); $k1 = $this->rotateLeft($k1); $k1 = $this->multiply($k1, 0x1b873593); $h1 ^= $k1; $h1 = $h1 << 13 | ($h1 >= 0 ? $h1 >> 19 : (($h1 & 0x7fffffff) >> 19) | 0x1000); - $h1b = ((($h1 & 0xffff) * 5) + - (((($h1 >= 0 ? $h1 >> 16 : - (($h1 & 0x7fffffff) >> 16) | 0x8000) * 5) & 0xffff) << 16)) & 0xffffffff; - $h1 = ((($h1b & 0xffff) + 0x6b64) + - (((($h1b >= 0 ? $h1b >> 16 : (($h1b & 0x7fffffff) >> 16) | 0x8000) + 0xe654) & 0xffff) << 16)); + $h1b = ((($h1 & 0xffff) * 5) + (((($h1 >= 0 ? $h1 >> 16 : (($h1 & 0x7fffffff) >> 16) | 0x8000) * 5) & 0xffff) << 16)) & 0xffffffff; + $h1 = ((($h1b & 0xffff) + 0x6b64) + (((($h1b >= 0 ? $h1b >> 16 : (($h1b & 0x7fffffff) >> 16) | 0x8000) + 0xe654) & 0xffff) << 16)); } $k1 = 0; switch ($remainder) { diff --git a/src/Visitor/DefaultStrategy.php b/src/Visitor/DefaultStrategy.php index 5f7fdfae..04c5b3f9 100644 --- a/src/Visitor/DefaultStrategy.php +++ b/src/Visitor/DefaultStrategy.php @@ -37,9 +37,7 @@ public function setConsent(bool $hasConsented): void $consentHit = new Event(EventCategory::USER_ENGAGEMENT, FlagshipConstant::FS_CONSENT); $consentHit->setLabel( FlagshipConstant::SDK_LANGUAGE . ':' . ($hasConsented ? 'true' : 'false') - )->setConfig($this->getConfig()) - ->setVisitorId($this->getVisitor()->getVisitorId()) - ->setAnonymousId($this->getVisitor()->getAnonymousId()); + )->setConfig($this->getConfig())->setVisitorId($this->getVisitor()->getVisitorId())->setAnonymousId($this->getVisitor()->getAnonymousId()); $trackingManager = $this->getTrackingManager(); @@ -48,15 +46,7 @@ public function setConsent(bool $hasConsented): void $visitor = $this->getVisitor(); $troubleshooting = new Troubleshooting(); - $troubleshooting->setLabel(TroubleshootingLabel::VISITOR_SEND_HIT) - ->setLogLevel(LogLevel::INFO) - ->setTraffic($visitor->getTraffic()) - ->setFlagshipInstanceId($visitor->getFlagshipInstanceId()) - ->setVisitorSessionId($visitor->getInstanceId()) - ->setHitContent($consentHit->toApiKeys()) - ->setVisitorId($visitor->getVisitorId()) - ->setConfig($this->getConfig()) - ->setAnonymousId($visitor->getAnonymousId()); + $troubleshooting->setLabel(TroubleshootingLabel::VISITOR_SEND_HIT)->setLogLevel(LogLevel::INFO)->setTraffic($visitor->getTraffic())->setFlagshipInstanceId($visitor->getFlagshipInstanceId())->setVisitorSessionId($visitor->getInstanceId())->setHitContent($consentHit->toApiKeys())->setVisitorId($visitor->getVisitorId())->setConfig($this->getConfig())->setAnonymousId($visitor->getAnonymousId()); if ($this->getDecisionManager() && $this->getDecisionManager()->getTroubleshootingData()) { $this->sendTroubleshootingHit($troubleshooting); @@ -117,7 +107,18 @@ protected function setFetchStatus(FSFetchStatus $status, FSFetchReason $reason): */ public function updateContext(string $key, float|bool|int|string|null $value): void { + $oldContext = $this->getVisitor()->getContext(); + $this->updateContextKeyValue($key, $value); + + $newContext = $this->getVisitor()->getContext(); + + if ($this->arraysAreEqual($oldContext, $newContext)) { + return; + } + + $this->getVisitor()->setHasContextBeenUpdated(true); + $this->fetchStatusUpdateContext(); } @@ -127,7 +128,18 @@ public function updateContext(string $key, float|bool|int|string|null $value): v */ public function updateContextCollection(array $context): void { + $oldContext = $this->getVisitor()->getContext(); + $this->initialContext($context); + + $newContext = $this->getVisitor()->getContext(); + + if ($this->arraysAreEqual($oldContext, $newContext)) { + return; + } + + $this->getVisitor()->setHasContextBeenUpdated(true); + $this->fetchStatusUpdateContext(); } @@ -137,7 +149,17 @@ public function updateContextCollection(array $context): void */ public function clearContext(): void { + $oldContext = $this->getVisitor()->getContext(); + $this->getVisitor()->context = []; + + $newContext = $this->getVisitor()->getContext(); + + if ($this->arraysAreEqual($oldContext, $newContext)) { + return; + } + + $this->getVisitor()->setHasContextBeenUpdated(true); $this->fetchStatusUpdateContext(); } @@ -146,14 +168,11 @@ public function clearContext(): void * @param string $functionName * @return void */ - private function logDeactivate(string $functionName): void + private function logXpcWarning(string $functionName): void { - $this->logError( + $this->logWarning( $this->getVisitor()->getConfig(), - sprintf( - FlagshipConstant::METHOD_DEACTIVATED_BUCKETING_ERROR, - $functionName - ), + FlagshipConstant::XPC_BUCKETING_WARNING, [FlagshipConstant::TAG => $functionName] ); } @@ -164,8 +183,10 @@ private function logDeactivate(string $functionName): void */ public function authenticate(string $visitorId): void { - if ($this->getVisitor()->getConfig()->getDecisionMode() == DecisionMode::BUCKETING) { - $this->logDeactivate(__FUNCTION__); + $visitorCacheInstance = $this->getConfig()->getVisitorCacheImplementation(); + $decisionMode = $this->getConfig()->getDecisionMode(); + if ($decisionMode == DecisionMode::BUCKETING && $visitorCacheInstance === null) { + $this->logXpcWarning(__FUNCTION__); return; } @@ -193,15 +214,7 @@ public function authenticate(string $visitorId): void $this->setFetchStatus(FSFetchStatus::FETCH_REQUIRED, FSFetchReason::AUTHENTICATE); $troubleshooting = new Troubleshooting(); - $troubleshooting->setLabel(TroubleshootingLabel::VISITOR_AUTHENTICATE) - ->setLogLevel(LogLevel::INFO) - ->setVisitorSessionId($this->getVisitor()->getInstanceId()) - ->setVisitorContext($this->getVisitor()->getContext()) - ->setTraffic($this->getVisitor()->getTraffic()) - ->setFlagshipInstanceId($this->getFlagshipInstanceId()) - ->setConfig($this->getConfig()) - ->setVisitorId($this->getVisitor()->getVisitorId()) - ->setAnonymousId($this->getVisitor()->getAnonymousId()); + $troubleshooting->setLabel(TroubleshootingLabel::VISITOR_AUTHENTICATE)->setLogLevel(LogLevel::INFO)->setVisitorSessionId($this->getVisitor()->getInstanceId())->setVisitorContext($this->getVisitor()->getContext())->setTraffic($this->getVisitor()->getTraffic())->setFlagshipInstanceId($this->getFlagshipInstanceId())->setConfig($this->getConfig())->setVisitorId($this->getVisitor()->getVisitorId())->setAnonymousId($this->getVisitor()->getAnonymousId()); $this->sendTroubleshootingHit($troubleshooting); } @@ -211,8 +224,10 @@ public function authenticate(string $visitorId): void */ public function unauthenticate(): void { - if ($this->getVisitor()->getConfig()->getDecisionMode() == DecisionMode::BUCKETING) { - $this->logDeactivate(__FUNCTION__); + $visitorCacheInstance = $this->getConfig()->getVisitorCacheImplementation(); + $decisionMode = $this->getConfig()->getDecisionMode(); + if ($decisionMode == DecisionMode::BUCKETING && $visitorCacheInstance === null) { + $this->logXpcWarning(__FUNCTION__); return; } @@ -231,15 +246,7 @@ public function unauthenticate(): void $this->setFetchStatus(FSFetchStatus::FETCH_REQUIRED, FSFetchReason::UNAUTHENTICATE); $troubleshooting = new Troubleshooting(); - $troubleshooting->setLabel(TroubleshootingLabel::VISITOR_UNAUTHENTICATE) - ->setLogLevel(LogLevel::INFO) - ->setVisitorContext($this->getVisitor()->getContext()) - ->setVisitorSessionId($this->getVisitor()->getInstanceId()) - ->setFlagshipInstanceId($this->getFlagshipInstanceId()) - ->setTraffic($this->getVisitor()->getTraffic()) - ->setConfig($this->getConfig()) - ->setVisitorId($this->getVisitor()->getVisitorId()) - ->setAnonymousId($this->getVisitor()->getAnonymousId()); + $troubleshooting->setLabel(TroubleshootingLabel::VISITOR_UNAUTHENTICATE)->setLogLevel(LogLevel::INFO)->setVisitorContext($this->getVisitor()->getContext())->setVisitorSessionId($this->getVisitor()->getInstanceId())->setFlagshipInstanceId($this->getFlagshipInstanceId())->setTraffic($this->getVisitor()->getTraffic())->setConfig($this->getConfig())->setVisitorId($this->getVisitor()->getVisitorId())->setAnonymousId($this->getVisitor()->getAnonymousId()); $this->sendTroubleshootingHit($troubleshooting); } @@ -268,14 +275,14 @@ protected function fetchVisitorCampaigns(VisitorAbstract $visitor): array $campaigns = []; foreach ($data[self::CAMPAIGNS] as $item) { $campaigns[] = [ - FlagshipField::FIELD_ID => $item[FlagshipField::FIELD_CAMPAIGN_ID], + FlagshipField::FIELD_ID => $item[FlagshipField::FIELD_CAMPAIGN_ID], FlagshipField::FIELD_VARIATION_GROUP_ID => $item[FlagshipField::FIELD_VARIATION_GROUP_ID], - FlagshipField::FIELD_VARIATION => [ - FlagshipField::FIELD_ID => $item[self::CAMPAIGN_ID], - FlagshipField::FIELD_REFERENCE => $item[FlagshipField::FIELD_IS_REFERENCE], + FlagshipField::FIELD_VARIATION => [ + FlagshipField::FIELD_ID => $item[self::CAMPAIGN_ID], + FlagshipField::FIELD_REFERENCE => $item[FlagshipField::FIELD_IS_REFERENCE], FlagshipField::FIELD_MODIFICATIONS => [ FlagshipField::FIELD_CAMPAIGN_TYPE => $item[FlagshipField::FIELD_CAMPAIGN_TYPE], - FlagshipField::FIELD_VALUE => $item[self::FLAGS], + FlagshipField::FIELD_VALUE => $item[self::FLAGS], ], ], ]; @@ -413,10 +420,7 @@ public function sendHit(HitAbstract $hit): void $trackingManager = $this->getTrackingManager(); $visitor = $this->getVisitor(); - $hit->setConfig($visitor->getConfig()) - ->setVisitorId($visitor->getVisitorId()) - ->setAnonymousId($visitor->getAnonymousId()) - ->setDs(FlagshipConstant::SDK_APP); + $hit->setConfig($visitor->getConfig())->setVisitorId($visitor->getVisitorId())->setAnonymousId($visitor->getAnonymousId())->setDs(FlagshipConstant::SDK_APP); if ($hit->isReady() === false) { $this->logError( @@ -430,15 +434,7 @@ public function sendHit(HitAbstract $hit): void $trackingManager->addHit($hit); $troubleshooting = new Troubleshooting(); - $troubleshooting->setLabel(TroubleshootingLabel::VISITOR_SEND_HIT) - ->setLogLevel(LogLevel::INFO) - ->setFlagshipInstanceId($visitor->getFlagshipInstanceId()) - ->setVisitorSessionId($visitor->getInstanceId()) - ->setHitContent($hit->toApiKeys()) - ->setTraffic($visitor->getTraffic()) - ->setVisitorId($visitor->getVisitorId()) - ->setConfig($this->getConfig()) - ->setAnonymousId($visitor->getAnonymousId()); + $troubleshooting->setLabel(TroubleshootingLabel::VISITOR_SEND_HIT)->setLogLevel(LogLevel::INFO)->setFlagshipInstanceId($visitor->getFlagshipInstanceId())->setVisitorSessionId($visitor->getInstanceId())->setHitContent($hit->toApiKeys())->setTraffic($visitor->getTraffic())->setVisitorId($visitor->getVisitorId())->setConfig($this->getConfig())->setAnonymousId($visitor->getAnonymousId()); $this->sendTroubleshootingHit($troubleshooting); } @@ -464,28 +460,12 @@ protected function activateFlag(FlagDTO $flag, mixed $defaultValue = null): void $visitor = $this->getVisitor(); $activateHit = new Activate($flag->getVariationGroupId(), $flag->getVariationId()); - $activateHit - ->setFlagKey($flag->getKey()) - ->setFlagValue($flag->getValue()) - ->setFlagDefaultValue($defaultValue) - ->setVisitorContext($visitor->getContext()) - ->setFlagMetadata($flagMetadata) - ->setVisitorId($visitor->getVisitorId()) - ->setAnonymousId($visitor->getAnonymousId()) - ->setConfig($this->getConfig()); + $activateHit->setFlagKey($flag->getKey())->setFlagValue($flag->getValue())->setFlagDefaultValue($defaultValue)->setVisitorContext($visitor->getContext())->setFlagMetadata($flagMetadata)->setVisitorId($visitor->getVisitorId())->setAnonymousId($visitor->getAnonymousId())->setConfig($this->getConfig()); $this->getTrackingManager()->activateFlag($activateHit); $troubleshooting = new Troubleshooting(); - $troubleshooting->setLabel(TroubleshootingLabel::VISITOR_SEND_ACTIVATE) - ->setLogLevel(LogLevel::INFO) - ->setFlagshipInstanceId($this->getFlagshipInstanceId()) - ->setVisitorSessionId($visitor->getInstanceId()) - ->setHitContent($activateHit->toApiKeys()) - ->setTraffic($this->getVisitor()->getTraffic()) - ->setVisitorId($visitor->getVisitorId()) - ->setAnonymousId($visitor->getAnonymousId()) - ->setConfig($this->getConfig()); + $troubleshooting->setLabel(TroubleshootingLabel::VISITOR_SEND_ACTIVATE)->setLogLevel(LogLevel::INFO)->setFlagshipInstanceId($this->getFlagshipInstanceId())->setVisitorSessionId($visitor->getInstanceId())->setHitContent($activateHit->toApiKeys())->setTraffic($this->getVisitor()->getTraffic())->setVisitorId($visitor->getVisitorId())->setAnonymousId($visitor->getAnonymousId())->setConfig($this->getConfig()); $this->sendTroubleshootingHit($troubleshooting); } @@ -493,18 +473,7 @@ private function sendFlagTroubleshooting($label, $key, $defaultValue, $visitorEx { $visitor = $this->getVisitor(); $troubleshooting = new Troubleshooting(); - $troubleshooting->setLabel($label) - ->setLogLevel(LogLevel::WARNING) - ->setVisitorSessionId($visitor->getInstanceId()) - ->setFlagshipInstanceId($this->getFlagshipInstanceId()) - ->setTraffic($visitor->getTraffic()) - ->setVisitorContext($visitor->getContext()) - ->setFlagKey($key) - ->setFlagDefault($defaultValue) - ->setVisitorExposed($visitorExposed) - ->setVisitorId($visitor->getVisitorId()) - ->setAnonymousId($visitor->getAnonymousId()) - ->setConfig($this->getConfig()); + $troubleshooting->setLabel($label)->setLogLevel(LogLevel::WARNING)->setVisitorSessionId($visitor->getInstanceId())->setFlagshipInstanceId($this->getFlagshipInstanceId())->setTraffic($visitor->getTraffic())->setVisitorContext($visitor->getContext())->setFlagKey($key)->setFlagDefault($defaultValue)->setVisitorExposed($visitorExposed)->setVisitorId($visitor->getVisitorId())->setAnonymousId($visitor->getAnonymousId())->setConfig($this->getConfig()); $this->sendTroubleshootingHit($troubleshooting); } @@ -559,6 +528,7 @@ public function visitorExposed( $defaultValue, true ); + return; } if ( @@ -581,6 +551,7 @@ public function visitorExposed( $defaultValue, true ); + return; } $this->activateFlag($flag, $defaultValue); diff --git a/src/Visitor/PanicStrategy.php b/src/Visitor/PanicStrategy.php index 3c7eda85..e31e820f 100644 --- a/src/Visitor/PanicStrategy.php +++ b/src/Visitor/PanicStrategy.php @@ -70,7 +70,7 @@ public function sendHit(HitAbstract $hit): void public function getFlagValue( string $key, float|array|bool|int|string|null $defaultValue, - FlagDTO $flag = null, + FlagDTO|null $flag = null, bool $userExposed = true ): float|int|bool|array|string|null { $this->log(__FUNCTION__); @@ -83,7 +83,7 @@ public function getFlagValue( public function visitorExposed( $key, float|array|bool|int|string|null $defaultValue, - FlagDTO $flag = null, + FlagDTO|null $flag = null, bool $hasGetValueBeenCalled = false ): void { $this->log(__FUNCTION__); diff --git a/src/Visitor/StrategyAbstract.php b/src/Visitor/StrategyAbstract.php index d7ebc0ee..e70c1fca 100644 --- a/src/Visitor/StrategyAbstract.php +++ b/src/Visitor/StrategyAbstract.php @@ -4,23 +4,24 @@ use DateTime; use Exception; -use Flagship\Api\TrackingManagerAbstract; -use Flagship\Config\BucketingConfig; -use Flagship\Config\FlagshipConfig; -use Flagship\Decision\DecisionManagerAbstract; -use Flagship\Enum\FlagshipConstant; -use Flagship\Enum\FlagshipField; -use Flagship\Enum\LogLevel; -use Flagship\Enum\TroubleshootingLabel; use Flagship\Hit\UsageHit; -use Flagship\Hit\Troubleshooting; +use Flagship\Enum\LogLevel; use Flagship\Model\FlagDTO; -use Flagship\Model\TroubleshootingData; -use Flagship\Traits\HasSameTypeTrait; use Flagship\Traits\Helper; -use Flagship\Traits\ValidatorTrait; -use Flagship\Utils\ConfigManager; use Flagship\Utils\MurmurHash; +use Flagship\Enum\FlagshipField; +use Flagship\Hit\Troubleshooting; +use Flagship\Utils\ConfigManager; +use Flagship\Config\FlagshipConfig; +use Flagship\Enum\FlagshipConstant; +use Flagship\Traits\ValidatorTrait; +use Flagship\Config\BucketingConfig; +use Flagship\Enum\VisitorCacheStatus; +use Flagship\Traits\HasSameTypeTrait; +use Flagship\Enum\TroubleshootingLabel; +use Flagship\Model\TroubleshootingData; +use Flagship\Api\TrackingManagerAbstract; +use Flagship\Decision\DecisionManagerAbstract; /** * @@ -146,6 +147,8 @@ protected function getDecisionManager(): DecisionManagerAbstract return $this->getConfigManager()->getDecisionManager(); } + abstract protected function updateContextKeyValue(string $key, mixed $value): void; + /** * @throws Exception @@ -159,7 +162,7 @@ private function checkLookupVisitorDataV1(array $item): bool $data = $item[self::DATA]; $visitorId = $data[self::VISITOR_ID]; - if ($visitorId !== $this->getVisitor()->getVisitorId()) { + if ($visitorId !== $this->getVisitor()->getVisitorId() && $visitorId !== $this->getVisitor()->getAnonymousId()) { throw new Exception(sprintf( self::VISITOR_ID_MISMATCH_ERROR, $visitorId, @@ -168,12 +171,12 @@ private function checkLookupVisitorDataV1(array $item): bool } if (!isset($data[self::CAMPAIGNS])) { - return true; + return false; } $campaigns = $data[self::CAMPAIGNS]; if (!is_array($campaigns)) { - return false; + return false; } foreach ($campaigns as $item) { @@ -219,13 +222,42 @@ public function lookupVisitor(): void return; } + $visitor = $this->getVisitor(); + + $visitor->setVisitorCacheStatus(VisitorCacheStatus::NONE); + $visitorCache = $visitorCacheInstance->lookupVisitor($this->visitor->getVisitorId()); + $hasVisitorCache = is_array($visitorCache) && count($visitorCache) > 0; + + if ($hasVisitorCache) { + $visitor->setVisitorCacheStatus(VisitorCacheStatus::VISITOR_ID_CACHE); + } + + if (!$hasVisitorCache && $visitor->getAnonymousId()) { + $visitorCache = $visitorCacheInstance->lookupVisitor($this->visitor->getAnonymousId()); + if ($visitorCache) { + $visitor->setVisitorCacheStatus(VisitorCacheStatus::ANONYMOUS_ID_CACHE); + } + } + + if ($visitor->getVisitorCacheStatus() === VisitorCacheStatus::NONE) { + $visitor->visitorCache = []; + return; + } if (!$this->checkLookupVisitorData($visitorCache)) { throw new Exception(self::LOOKUP_VISITOR_JSON_OBJECT_ERROR); } - $this->getVisitor()->visitorCache = $visitorCache; + $visitor->visitorCache = $visitorCache; + + + if ($visitor->getVisitorCacheStatus() === VisitorCacheStatus::VISITOR_ID_CACHE && $visitor->getAnonymousId()) { + $visitorCache = $visitorCacheInstance->lookupVisitor($this->visitor->getAnonymousId()); + if (is_array($visitorCache) && count($visitorCache) > 0) { + $visitor->setVisitorCacheStatus(VisitorCacheStatus::VISITOR_ID_CACHE_WITH_ANONYMOUS_ID_CACHE); + } + } } catch (Exception $exception) { $this->logError($this->getConfig(), $exception->getMessage(), [FlagshipConstant::TAG => __FUNCTION__]); } @@ -250,19 +282,18 @@ public function cacheVisitor(): void foreach ($visitor->campaigns as $campaign) { $variation = $campaign[FlagshipField::FIELD_VARIATION]; $modifications = $variation[FlagshipField::FIELD_MODIFICATIONS]; - $assignmentsHistory[$campaign[FlagshipField::FIELD_VARIATION_GROUP_ID]] = - $variation[FlagshipField::FIELD_ID]; + $assignmentsHistory[$campaign[FlagshipField::FIELD_VARIATION_GROUP_ID]] = $variation[FlagshipField::FIELD_ID]; $campaigns[] = [ - FlagshipField::FIELD_CAMPAIGN_ID => $campaign[FlagshipField::FIELD_ID], - FlagshipField::FIELD_SLUG => $campaign[FlagshipField::FIELD_SLUG] ?? null, - FlagshipField::FIELD_VARIATION_GROUP_ID => $campaign[FlagshipField::FIELD_VARIATION_GROUP_ID], - FlagshipField::FIELD_VARIATION_ID => $variation[FlagshipField::FIELD_ID], - FlagshipField::FIELD_IS_REFERENCE => $variation[FlagshipField::FIELD_REFERENCE], - FlagshipField::FIELD_CAMPAIGN_TYPE => $modifications[FlagshipField::FIELD_CAMPAIGN_TYPE], - self::ACTIVATED => false, - self::FLAGS => $modifications[FlagshipField::FIELD_VALUE], - ]; + FlagshipField::FIELD_CAMPAIGN_ID => $campaign[FlagshipField::FIELD_ID], + FlagshipField::FIELD_SLUG => $campaign[FlagshipField::FIELD_SLUG] ?? null, + FlagshipField::FIELD_VARIATION_GROUP_ID => $campaign[FlagshipField::FIELD_VARIATION_GROUP_ID], + FlagshipField::FIELD_VARIATION_ID => $variation[FlagshipField::FIELD_ID], + FlagshipField::FIELD_IS_REFERENCE => $variation[FlagshipField::FIELD_REFERENCE], + FlagshipField::FIELD_CAMPAIGN_TYPE => $modifications[FlagshipField::FIELD_CAMPAIGN_TYPE], + self::ACTIVATED => false, + self::FLAGS => $modifications[FlagshipField::FIELD_VALUE], + ]; } if ( @@ -279,23 +310,39 @@ public function cacheVisitor(): void } $data = [ - self::VERSION => self::CURRENT_VERSION, - self::DATA => [ - self::VISITOR_ID => $visitor->getVisitorId(), - self::ANONYMOUS_ID => $visitor->getAnonymousId(), - self::CONSENT => $visitor->hasConsented(), - self::CONTEXT => $visitor->getContext(), - self::CAMPAIGNS => $campaigns, - self::ASSIGNMENTS_HISTORY => $assignmentsHistory, - ], - ]; + self::VERSION => self::CURRENT_VERSION, + self::DATA => [ + self::VISITOR_ID => $visitor->getVisitorId(), + self::ANONYMOUS_ID => $visitor->getAnonymousId(), + self::CONSENT => $visitor->hasConsented(), + self::CONTEXT => $visitor->getContext(), + self::CAMPAIGNS => $campaigns, + self::ASSIGNMENTS_HISTORY => $assignmentsHistory, + ], + ]; $visitorCacheInstance->cacheVisitor($visitor->getVisitorId(), $data); + if ($visitor->getAnonymousId() && ($visitor->getVisitorCacheStatus() === VisitorCacheStatus::NONE || + $visitor->getVisitorCacheStatus() === VisitorCacheStatus::VISITOR_ID_CACHE)) { + $anonymousData = [ + self::VERSION => self::CURRENT_VERSION, + self::DATA => [ + self::VISITOR_ID => $visitor->getAnonymousId(), + self::ANONYMOUS_ID => null, + self::CONSENT => $visitor->hasConsented(), + self::CONTEXT => $visitor->getContext(), + self::CAMPAIGNS => $campaigns, + self::ASSIGNMENTS_HISTORY => $assignmentsHistory, + ], + ]; + $visitorCacheInstance->cacheVisitor($visitor->getAnonymousId(), $anonymousData); + } + $visitor->visitorCache = $data; } catch (Exception $exception) { $this->logError($this->getConfig(), $exception->getMessage(), [FlagshipConstant::TAG => __FUNCTION__]); - }//end try + } //end try } @@ -351,21 +398,7 @@ public function sendSdkConfigAnalyticHit(): void $fetchThirdPartyData = $config->getFetchThirdPartyData(); } $analytic = new UsageHit(); - $analytic->setLabel(TroubleshootingLabel::SDK_CONFIG) - ->setLogLevel(LogLevel::INFO) - ->setSdkConfigMode($config->getDecisionMode()) - ->setSdkConfigLogLevel($config->getLogLevel()) - ->setSdkConfigTimeout($config->getTimeout()) - ->setSdkConfigTrackingManagerConfigStrategy($config->getCacheStrategy()) - ->setSdkConfigBucketingUrl($bucketingUrl) - ->setSdkConfigFetchThirdPartyData($fetchThirdPartyData) - ->setSdkConfigUsingOnVisitorExposed(!!$config->getOnVisitorExposed()) - ->setSdkConfigUsingCustomHitCache(!!$config->getHitCacheImplementation()) - ->setSdkConfigUsingCustomVisitorCache(!!$config->getVisitorCacheImplementation()) - ->setSdkStatus($visitor->getSdkStatus()) - ->setFlagshipInstanceId($this->getFlagshipInstanceId()) - ->setVisitorId($this->getFlagshipInstanceId()) - ->setConfig($config); + $analytic->setLabel(TroubleshootingLabel::SDK_CONFIG)->setLogLevel(LogLevel::INFO)->setSdkConfigMode($config->getDecisionMode())->setSdkConfigLogLevel($config->getLogLevel())->setSdkConfigTimeout($config->getTimeout())->setSdkConfigTrackingManagerConfigStrategy($config->getCacheStrategy())->setSdkConfigBucketingUrl($bucketingUrl)->setSdkConfigFetchThirdPartyData($fetchThirdPartyData)->setSdkConfigUsingOnVisitorExposed(!!$config->getOnVisitorExposed())->setSdkConfigUsingCustomHitCache(!!$config->getHitCacheImplementation())->setSdkConfigUsingCustomVisitorCache(!!$config->getVisitorCacheImplementation())->setSdkStatus($visitor->getSdkStatus())->setFlagshipInstanceId($this->getFlagshipInstanceId())->setVisitorId($this->getFlagshipInstanceId())->setConfig($config); $this->getTrackingManager()->addUsageHit($analytic); } @@ -404,32 +437,7 @@ public function sendFetchFlagsTroubleshooting( $visitor->setTraffic($traffic); $troubleshootingHit = new Troubleshooting(); - $troubleshootingHit->setLabel(TroubleshootingLabel::VISITOR_FETCH_CAMPAIGNS) - ->setLogLevel(LogLevel::INFO) - ->setVisitorSessionId($visitor->getInstanceId()) - ->setFlagshipInstanceId($visitor->getFlagshipInstanceId()) - ->setTraffic($traffic) - ->setVisitorAssignmentHistory($assignmentHistory) - ->setVisitorContext($visitor->getContext()) - ->setSdkStatus($visitor->getSdkStatus()) - ->setVisitorCampaigns($campaigns) - ->setFlagshipInstanceId($this->getFlagshipInstanceId()) - ->setVisitorFlags($flagsDTO) - ->setVisitorConsent($visitor->hasConsented()) - ->setVisitorIsAuthenticated(!!$visitor->getAnonymousId()) - ->setHttpResponseTime(($this->getNow() - $now)) - ->setSdkConfigMode($config->getDecisionMode()) - ->setSdkConfigLogLevel($config->getLogLevel()) - ->setSdkConfigTimeout($config->getTimeout()) - ->setSdkConfigBucketingUrl($bucketingUrl) - ->setSdkConfigFetchThirdPartyData($fetchThirdPartyData) - ->setSdkConfigUsingOnVisitorExposed(!!$config->getOnVisitorExposed()) - ->setSdkConfigUsingCustomHitCache(!!$config->getHitCacheImplementation()) - ->setSdkConfigUsingCustomVisitorCache(!!$config->getVisitorCacheImplementation()) - ->setSdkConfigTrackingManagerConfigStrategy($config->getCacheStrategy()) - ->setVisitorId($visitor->getVisitorId()) - ->setAnonymousId($visitor->getAnonymousId()) - ->setConfig($config); + $troubleshootingHit->setLabel(TroubleshootingLabel::VISITOR_FETCH_CAMPAIGNS)->setLogLevel(LogLevel::INFO)->setVisitorSessionId($visitor->getInstanceId())->setFlagshipInstanceId($visitor->getFlagshipInstanceId())->setTraffic($traffic)->setVisitorAssignmentHistory($assignmentHistory)->setVisitorContext($visitor->getContext())->setSdkStatus($visitor->getSdkStatus())->setVisitorCampaigns($campaigns)->setFlagshipInstanceId($this->getFlagshipInstanceId())->setVisitorFlags($flagsDTO)->setVisitorConsent($visitor->hasConsented())->setVisitorIsAuthenticated(!!$visitor->getAnonymousId())->setHttpResponseTime(($this->getNow() - $now))->setSdkConfigMode($config->getDecisionMode())->setSdkConfigLogLevel($config->getLogLevel())->setSdkConfigTimeout($config->getTimeout())->setSdkConfigBucketingUrl($bucketingUrl)->setSdkConfigFetchThirdPartyData($fetchThirdPartyData)->setSdkConfigUsingOnVisitorExposed(!!$config->getOnVisitorExposed())->setSdkConfigUsingCustomHitCache(!!$config->getHitCacheImplementation())->setSdkConfigUsingCustomVisitorCache(!!$config->getVisitorCacheImplementation())->setSdkConfigTrackingManagerConfigStrategy($config->getCacheStrategy())->setVisitorId($visitor->getVisitorId())->setAnonymousId($visitor->getAnonymousId())->setConfig($config); $this->sendTroubleshootingHit($troubleshootingHit); } @@ -454,4 +462,5 @@ public function initialContext(array $context): void $this->updateContextKeyValue($itemKey, $item); } } + } diff --git a/src/Visitor/VisitorAbstract.php b/src/Visitor/VisitorAbstract.php index b24a963e..c7b3a9ef 100644 --- a/src/Visitor/VisitorAbstract.php +++ b/src/Visitor/VisitorAbstract.php @@ -15,6 +15,7 @@ use Flagship\Traits\ValidatorTrait; use Flagship\Utils\ContainerInterface; use Flagship\Model\FetchFlagsStatusInterface; +use Flagship\Enum\visitorCacheStatus; abstract class VisitorAbstract implements VisitorInterface, JsonSerializable, VisitorFlagInterface { @@ -107,6 +108,33 @@ abstract class VisitorAbstract implements VisitorInterface, JsonSerializable, Vi */ protected FetchFlagsStatusInterface $fetchStatus; + protected bool $hasContextBeenUpdated = true; + + public function setHasContextBeenUpdated(bool $hasContextBeenUpdated): static + { + $this->hasContextBeenUpdated = $hasContextBeenUpdated; + return $this; + } + + public function getHasContextBeenUpdated(): bool + { + return $this->hasContextBeenUpdated; + } + + protected visitorCacheStatus $visitorCacheStatus; + + public function getVisitorCacheStatus(): visitorCacheStatus + { + return $this->visitorCacheStatus; + } + + public function setVisitorCacheStatus(visitorCacheStatus $visitorCacheStatus): static + { + $this->visitorCacheStatus = $visitorCacheStatus; + return $this; + } + protected array $deDuplicationCache = []; + /** * @return callable */ @@ -432,9 +460,9 @@ public function sendTroubleshootingHit(Troubleshooting $hit): void public function jsonSerialize(): mixed { return [ - 'visitorId' => $this->getVisitorId(), - 'context' => $this->getContext(), - 'hasConsent' => $this->hasConsented(), - ]; + 'visitorId' => $this->getVisitorId(), + 'context' => $this->getContext(), + 'hasConsent' => $this->hasConsented(), + ]; } } diff --git a/src/Visitor/VisitorBuilder.php b/src/Visitor/VisitorBuilder.php index ac436f53..d3468b8e 100644 --- a/src/Visitor/VisitorBuilder.php +++ b/src/Visitor/VisitorBuilder.php @@ -136,15 +136,15 @@ public function setOnFetchFlagsStatusChanged(callable $onFetchFlagsStatusChanged public function build(): VisitorInterface { $visitorDelegate = $this->dependencyIContainer->get(VisitorDelegate::class, [ - $this->dependencyIContainer, - $this->configManager, - $this->visitorId, - $this->isAuthenticated, - $this->context, - $this->hasConsented, - $this->flagshipInstance, - $this->onFetchFlagsStatusChanged - ], true); + $this->dependencyIContainer, + $this->configManager, + $this->visitorId, + $this->isAuthenticated, + $this->context, + $this->hasConsented, + $this->flagshipInstance, + $this->onFetchFlagsStatusChanged, + ], true); $visitorDelegate->setFlagshipInstanceId($this->flagshipInstance); diff --git a/src/Visitor/VisitorDelegate.php b/src/Visitor/VisitorDelegate.php index 6c7563e8..ad90e545 100644 --- a/src/Visitor/VisitorDelegate.php +++ b/src/Visitor/VisitorDelegate.php @@ -61,7 +61,6 @@ public function __construct( } $this->setConsent($hasConsented); - $this->getStrategy()->lookupVisitor(); $this->setFetchStatus(new FetchFlagsStatus(FSFetchStatus::FETCH_REQUIRED, FSFetchReason::VISITOR_CREATED)); } @@ -128,6 +127,7 @@ public function sendHit(HitAbstract $hit): void public function fetchFlags(): void { + $this->getStrategy()->lookupVisitor(); $this->getStrategy()->fetchFlags(); $this->getStrategy()->cacheVisitor(); } @@ -181,7 +181,10 @@ public function getFlag(string $key): FSFlagInterface $this->getConfig(), FlagshipConstant::GET_FLAG, $this->flagSyncStatusMessage($fetchFlagsStatus->getReason()), - [$this->getVisitorId(), $key] + [ + $this->getVisitorId(), + $key, + ] ); } return new FSFlag($key, $this); diff --git a/tests/Api/BatchingOnFailedCachingStrategyTest.php b/tests/Api/BatchingOnFailedCachingStrategyTest.php index 0b5ff150..f0a1eedc 100644 --- a/tests/Api/BatchingOnFailedCachingStrategyTest.php +++ b/tests/Api/BatchingOnFailedCachingStrategyTest.php @@ -8,28 +8,29 @@ use DateTime; use Exception; -use Flagship\Config\DecisionApiConfig; -use Flagship\Enum\EventCategory; -use Flagship\Enum\FlagshipConstant; -use Flagship\Enum\HitCacheFields; -use Flagship\Enum\LogLevel; -use Flagship\Enum\TroubleshootingLabel; -use Flagship\Flag\FSFlagMetadata; +use Flagship\Hit\Page; +use Flagship\Hit\Event; +use Flagship\Hit\Screen; use Flagship\Hit\Activate; -use Flagship\Hit\ActivateBatch; +use Flagship\Hit\HitBatch; use Flagship\Hit\UsageHit; -use Flagship\Hit\Event; +use Flagship\Enum\LogLevel; use Flagship\Hit\HitAbstract; -use Flagship\Hit\HitBatch; -use Flagship\Hit\Page; -use Flagship\Hit\Screen; -use Flagship\Hit\Troubleshooting; +use Flagship\Traits\LogTrait; +use Flagship\Hit\ActivateBatch; use Flagship\Model\ExposedFlag; +use PHPUnit\Framework\TestCase; +use Flagship\Enum\EventCategory; +use Flagship\Enum\HitCacheFields; +use Flagship\Flag\FSFlagMetadata; +use Flagship\Hit\Troubleshooting; use Flagship\Model\ExposedVisitor; +use Flagship\Enum\FlagshipConstant; +use Flagship\Config\DecisionApiConfig; +use Flagship\Enum\TroubleshootingLabel; use Flagship\Model\TroubleshootingData; -use Flagship\Traits\LogTrait; use Flagship\Utils\HttpClientInterface; -use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\MockObject\MockObject; class BatchingOnFailedCachingStrategyTest extends TestCase { @@ -56,10 +57,10 @@ public function testGeneralMethods() //Test getActivateHeaders $activateHeaders = [ - FlagshipConstant::HEADER_X_API_KEY => $config->getApiKey(), + FlagshipConstant::HEADER_X_API_KEY => $config->getApiKey(), FlagshipConstant::HEADER_X_SDK_VERSION => FlagshipConstant::SDK_VERSION, - FlagshipConstant::HEADER_CONTENT_TYPE => FlagshipConstant::HEADER_APPLICATION_JSON, - FlagshipConstant::HEADER_X_SDK_CLIENT => FlagshipConstant::SDK_LANGUAGE, + FlagshipConstant::HEADER_CONTENT_TYPE => FlagshipConstant::HEADER_APPLICATION_JSON, + FlagshipConstant::HEADER_X_SDK_CLIENT => FlagshipConstant::SDK_LANGUAGE, ]; $this->assertSame($activateHeaders, $strategy->getActivateHeaders()); @@ -81,21 +82,26 @@ public function testAddHit() $strategy = $this->getMockForAbstractClass( BatchingOnFailedCachingStrategy::class, - [$config, $httpClientMock], + [ + $config, + $httpClientMock, + ], "", true, true, true, - ["cacheHit","flushHits","flushAllHits"] + [ + "cacheHit", + "flushHits", + "flushAllHits", + ] ); $strategy->expects($this->never())->method("cacheHit"); - $strategy->expects($this->never()) - ->method("flushAllHits"); + $strategy->expects($this->never())->method("flushAllHits"); - $strategy->expects($this->once()) - ->method("flushHits")->with([$page3Key, $activate3Key]); + $strategy->expects($this->once())->method("flushHits")->with([$page3Key, $activate3Key]); $page = new Page("http://localhost"); @@ -109,17 +115,17 @@ public function testAddHit() $strategy->addHit($page2); $contentPage3 = [ - 'pageUrl' => 'page1', - 'visitorId' => $visitorId, - 'ds' => 'APP', - 'type' => "PAGEVIEW", - 'anonymousId' => null, - 'userIP' => null, + 'pageUrl' => 'page1', + 'visitorId' => $visitorId, + 'ds' => 'APP', + 'type' => "PAGEVIEW", + 'anonymousId' => null, + 'userIP' => null, 'pageResolution' => null, - 'locale' => null, - 'sessionNumber' => null, - 'key' => $page3Key, - 'createdAt' => 1676542078047, + 'locale' => null, + 'sessionNumber' => null, + 'key' => $page3Key, + 'createdAt' => 1676542078047, ]; $page3 = HitAbstract::hydrate(Page::getClassName(), $contentPage3); @@ -139,17 +145,17 @@ public function testAddHit() $contentActivate = [ 'variationGroupId' => 'cagt08da51hg0787cns0', - 'variationId' => 'cagt08da51hg0787cnt0', - 'visitorId' => $visitorId, - 'ds' => 'APP', - 'type' => 'ACTIVATE', - 'anonymousId' => null, - 'userIP' => null, - 'pageResolution' => null, - 'locale' => null, - 'sessionNumber' => null, - 'key' => $activate3Key, - 'createdAt' => 1676542078044, + 'variationId' => 'cagt08da51hg0787cnt0', + 'visitorId' => $visitorId, + 'ds' => 'APP', + 'type' => 'ACTIVATE', + 'anonymousId' => null, + 'userIP' => null, + 'pageResolution' => null, + 'locale' => null, + 'sessionNumber' => null, + 'key' => $activate3Key, + 'createdAt' => 1676542078044, ]; $activate3 = HitAbstract::hydrate(Activate::getClassName(), $contentActivate); @@ -198,7 +204,7 @@ public function testAddHit() $this->assertContains($activate2, $strategy->getActivatePoolQueue()); $this->assertCount(1, $strategy->getActivatePoolQueue()); -// //Test consent hit false when no hits for visitorId exist HitsPoolQueue + // //Test consent hit false when no hits for visitorId exist HitsPoolQueue $strategy->addHit($consentHit); $this->assertCount(4, $strategy->getHitsPoolQueue()); @@ -223,14 +229,25 @@ public function testSendActivateHit() $activate2 = new Activate("varGrId", "VarId"); $activate2->setConfig($config)->setVisitorId($visitorId); + /** + * @var BatchingOnFailedCachingStrategy|MockObject $strategy + */ $strategy = $this->getMockForAbstractClass( - "Flagship\Api\BatchingOnFailedCachingStrategy", - [$config, $httpClientMock], + BatchingOnFailedCachingStrategy::class, + [ + $config, + $httpClientMock, + ], "", true, true, true, - ["flushHits","logDebugSprintf","cacheHit", "getNow"] + [ + "flushHits", + "logDebugSprintf", + "cacheHit", + "getNow", + ] ); $strategy->activateFlag($activate); @@ -240,17 +257,17 @@ public function testSendActivateHit() $contentActivate = [ 'variationGroupId' => 'cagt08da51hg0787cns0', - 'variationId' => 'cagt08da51hg0787cnt0', - 'visitorId' => $visitorId, - 'ds' => 'APP', - 'type' => 'ACTIVATE', - 'anonymousId' => null, - 'userIP' => null, - 'pageResolution' => null, - 'locale' => null, - 'sessionNumber' => null, - 'key' => $activate3Key, - 'createdAt' => 1676542078044, + 'variationId' => 'cagt08da51hg0787cnt0', + 'visitorId' => $visitorId, + 'ds' => 'APP', + 'type' => 'ACTIVATE', + 'anonymousId' => null, + 'userIP' => null, + 'pageResolution' => null, + 'locale' => null, + 'sessionNumber' => null, + 'key' => $activate3Key, + 'createdAt' => 1676542078044, ]; $activate3 = HitAbstract::hydrate(Activate::getClassName(), $contentActivate); @@ -262,15 +279,11 @@ public function testSendActivateHit() $requestBody = $activateBatch->toApiKeys(); - $httpClientMock->expects($this->once())->method("post") - ->with($url, [], $requestBody); + $httpClientMock->expects($this->once())->method("post")->with($url, [], $requestBody); $headers = $strategy->getActivateHeaders(); - $strategy - ->expects($this->exactly(1)) - ->method("flushHits") - ->with([$activate3Key]); + $strategy->expects($this->exactly(1))->method("flushHits")->with([$activate3Key]); $logMessage = $this->getLogFormat( null, @@ -280,13 +293,15 @@ public function testSendActivateHit() 0 ); - $strategy->expects($this->once())->method("logDebugSprintf") - ->with( - $config, - FlagshipConstant::TRACKING_MANAGER, - FlagshipConstant::HIT_SENT_SUCCESS, - [FlagshipConstant::SEND_ACTIVATE, $logMessage ] - ); + $strategy->expects($this->once())->method("logDebugSprintf")->with( + $config, + FlagshipConstant::TRACKING_MANAGER, + FlagshipConstant::HIT_SENT_SUCCESS, + [ + FlagshipConstant::SEND_ACTIVATE, + $logMessage, + ] + ); $this->assertCount(3, $strategy->getActivatePoolQueue()); @@ -295,6 +310,61 @@ public function testSendActivateHit() $this->assertCount(0, $strategy->getActivatePoolQueue()); } + public function testSendActivateBatch() + { + $config = new DecisionApiConfig(); + $visitorId = "visitorId"; + + $httpClientMock = $this->getMockForAbstractClass(HttpClientInterface::class); + + $url = FlagshipConstant::BASE_API_URL . '/' . FlagshipConstant::URL_ACTIVATE_MODIFICATION; + + /** + * @var BatchingOnFailedCachingStrategy|MockObject $strategy + */ + $strategy = $this->getMockForAbstractClass( + BatchingOnFailedCachingStrategy::class, + [ + $config, + $httpClientMock, + ], + "", + true, + true, + true, + [ + "flushHits", + "logDebugSprintf", + "cacheHit", + "getNow", + ] + ); + + $activates = []; + + for ($i = 0; $i < 300; $i++) { + $activate = new Activate("varGrId", "VarId"); + $activate->setConfig($config)->setVisitorId($visitorId); + $strategy->activateFlag($activate); + $activates[] = $activate; + } + + $chunkedActivates = array_chunk($activates, FlagshipConstant::MAX_ACTIVATE_HIT_PER_BATCH); + $baches = []; + + foreach ($chunkedActivates as $chunk) { + $baches[] = (new ActivateBatch($config, $chunk))->toApiKeys(); + } + + $httpClientMock->expects($this->exactly(3))->method("post")->with($url, [], $this->logicalOr( + $baches[0], + $baches[1], + $baches[2] + )); + + $strategy->sendBatch(); + } + public function testOnUserExposed() { $config = new DecisionApiConfig(); @@ -330,13 +400,7 @@ public function testOnUserExposed() $variationName1 ); - $activate->setConfig($config) - ->setVisitorId($visitorId) - ->setVisitorContext($context) - ->setFlagKey($flagKey1) - ->setFlagValue($flagValue1) - ->setFlagDefaultValue($flagDefaultValue1) - ->setFlagMetadata($flagMetadata1); + $activate->setConfig($config)->setVisitorId($visitorId)->setVisitorContext($context)->setFlagKey($flagKey1)->setFlagValue($flagValue1)->setFlagDefaultValue($flagDefaultValue1)->setFlagMetadata($flagMetadata1); $variationGroupId2 = "variationGroupId2"; $variationGroupName2 = "variationGroupName2"; @@ -361,22 +425,24 @@ public function testOnUserExposed() ); $activate2 = new Activate($variationGroupId2, $variationId2); - $activate2->setConfig($config) - ->setVisitorId($visitorId) - ->setVisitorContext($context) - ->setFlagKey($flagKey2) - ->setFlagValue($flagValue2) - ->setFlagDefaultValue($flagDefaultValue2) - ->setFlagMetadata($flagMetadata2); + $activate2->setConfig($config)->setVisitorId($visitorId)->setVisitorContext($context)->setFlagKey($flagKey2)->setFlagValue($flagValue2)->setFlagDefaultValue($flagDefaultValue2)->setFlagMetadata($flagMetadata2); $strategy = $this->getMockForAbstractClass( "Flagship\Api\BatchingOnFailedCachingStrategy", - [$config, $httpClientMock], + [ + $config, + $httpClientMock, + ], "", true, true, true, - ["flushHits","logDebugSprintf","cacheHit", "logErrorSprintf"] + [ + "flushHits", + "logDebugSprintf", + "cacheHit", + "logErrorSprintf", + ] ); $strategy->activateFlag($activate); @@ -386,8 +452,7 @@ public function testOnUserExposed() $requestBody = $activateBatch->toApiKeys(); - $httpClientMock->expects($this->once())->method("post") - ->with($url, [], $requestBody); + $httpClientMock->expects($this->once())->method("post")->with($url, [], $requestBody); $check1 = false; $check2 = false; @@ -416,10 +481,10 @@ public function testOnUserExposed() $check1 = $exposedUser->getId() === $visitorId && $exposedUser->getAnonymousId() === null && $exposedUser->getContext() === $context && - $exposedFlag->getValue() === $flagValue1 && - $exposedFlag->getKey() === $flagKey1 && - $exposedFlag->getMetadata() === $flagMetadata1 && - $exposedFlag->getDefaultValue() === $flagDefaultValue1; + $exposedFlag->getValue() === $flagValue1 && + $exposedFlag->getKey() === $flagKey1 && + $exposedFlag->getMetadata() === $flagMetadata1 && + $exposedFlag->getDefaultValue() === $flagDefaultValue1; } else { $check2 = $exposedUser->getId() === $visitorId && $exposedUser->getAnonymousId() === null && @@ -427,7 +492,7 @@ public function testOnUserExposed() $exposedFlag->getValue() === $flagValue2 && $exposedFlag->getKey() === $flagKey2 && $exposedFlag->getMetadata() === $flagMetadata2 && - $exposedFlag->getDefaultValue() === $flagDefaultValue2; + $exposedFlag->getDefaultValue() === $flagDefaultValue2; } }); @@ -476,12 +541,7 @@ public function testOnUserExposedError() $variationName1 ); - $activate->setConfig($config) - ->setVisitorId($visitorId) - ->setVisitorContext($context) - ->setFlagKey($flagKey1) - ->setFlagValue($flagValue1) - ->setFlagMetadata($flagMetadata1); + $activate->setConfig($config)->setVisitorId($visitorId)->setVisitorContext($context)->setFlagKey($flagKey1)->setFlagValue($flagValue1)->setFlagMetadata($flagMetadata1); $variationGroupId2 = "variationGroupId2"; $variationId2 = "variationId2"; @@ -505,21 +565,24 @@ public function testOnUserExposedError() ); $activate2 = new Activate($variationGroupId2, $variationId2); - $activate2->setConfig($config) - ->setVisitorId($visitorId) - ->setVisitorContext($context) - ->setFlagKey($flagKey2) - ->setFlagValue($flagValue2) - ->setFlagMetadata($flagMetadata2); + $activate2->setConfig($config)->setVisitorId($visitorId)->setVisitorContext($context)->setFlagKey($flagKey2)->setFlagValue($flagValue2)->setFlagMetadata($flagMetadata2); $strategy = $this->getMockForAbstractClass( "Flagship\Api\BatchingOnFailedCachingStrategy", - [$config, $httpClientMock], + [ + $config, + $httpClientMock, + ], "", true, true, true, - ["flushHits","logDebugSprintf","cacheHit", "logErrorSprintf"] + [ + "flushHits", + "logDebugSprintf", + "cacheHit", + "logErrorSprintf", + ] ); $strategy->activateFlag($activate); @@ -529,20 +592,18 @@ public function testOnUserExposedError() $requestBody = $activateBatch->toApiKeys(); - $httpClientMock->expects($this->once())->method("post") - ->with($url, [], $requestBody); + $httpClientMock->expects($this->once())->method("post")->with($url, [], $requestBody); $count = 0; $config->setOnVisitorExposed(function () - use (&$count) { + use (&$count) { $exceptionMessage = "Message error"; $count++; throw new Exception($exceptionMessage); }); - $strategy->expects($this->exactly(2)) - ->method("logErrorSprintf"); + $strategy->expects($this->exactly(2))->method("logErrorSprintf"); $this->assertCount(2, $strategy->getActivatePoolQueue()); @@ -571,12 +632,21 @@ public function testSendActivateHitFailed() $strategy = $this->getMockForAbstractClass( "Flagship\Api\BatchingOnFailedCachingStrategy", - [$config, $httpClientMock, "instanceId"], + [ + $config, + $httpClientMock, + "instanceId", + ], "", true, true, true, - ["flushHits","logErrorSprintf","cacheHit", "getNow"] + [ + "flushHits", + "logErrorSprintf", + "cacheHit", + "getNow", + ] ); $strategy->activateFlag($activate); @@ -587,17 +657,11 @@ public function testSendActivateHitFailed() $requestBody = $activateBatch->toApiKeys(); $exception = new Exception("activate error"); - $httpClientMock->expects($this->once())->method("post") - ->with($url, [], $requestBody)->willThrowException($exception); + $httpClientMock->expects($this->once())->method("post")->with($url, [], $requestBody)->willThrowException($exception); - $strategy - ->expects($this->never()) - ->method("flushHits"); + $strategy->expects($this->never())->method("flushHits"); - $strategy - ->expects($this->once()) - ->method("cacheHit") - ->with($this->countOf(2)); + $strategy->expects($this->once())->method("cacheHit")->with($this->countOf(2)); $logMessage = $this->getLogFormat( $exception->getMessage(), @@ -607,13 +671,15 @@ public function testSendActivateHitFailed() 0 ); - $strategy->expects($this->once())->method("logErrorSprintf") - ->with( - $config, - FlagshipConstant::TRACKING_MANAGER, - FlagshipConstant::UNEXPECTED_ERROR_OCCURRED, - [FlagshipConstant::SEND_ACTIVATE, $logMessage ] - ); + $strategy->expects($this->once())->method("logErrorSprintf")->with( + $config, + FlagshipConstant::TRACKING_MANAGER, + FlagshipConstant::UNEXPECTED_ERROR_OCCURRED, + [ + FlagshipConstant::SEND_ACTIVATE, + $logMessage, + ] + ); $this->assertCount(2, $strategy->getActivatePoolQueue()); @@ -640,12 +706,22 @@ public function testSendBatch() $strategy = $this->getMockForAbstractClass( "Flagship\Api\BatchingOnFailedCachingStrategy", - [$config, $httpClientMock, "instanceId"], + [ + $config, + $httpClientMock, + "instanceId", + ], "", true, true, true, - ["flushHits","logDebugSprintf","cacheHit","flushAllHits", "getNow"] + [ + "flushHits", + "logDebugSprintf", + "cacheHit", + "flushAllHits", + "getNow", + ] ); $strategy->addHit($page); @@ -653,17 +729,17 @@ public function testSendBatch() $page3Key = "$visitorId:b1b48180-0d72-410d-8e9b-44ee90dfafc6"; $contentPage3 = [ - 'pageUrl' => 'page1', - 'visitorId' => $visitorId, - 'ds' => 'APP', - 'type' => "PAGEVIEW", - 'anonymousId' => null, - 'userIP' => null, + 'pageUrl' => 'page1', + 'visitorId' => $visitorId, + 'ds' => 'APP', + 'type' => "PAGEVIEW", + 'anonymousId' => null, + 'userIP' => null, 'pageResolution' => null, - 'locale' => null, - 'sessionNumber' => null, - 'key' => $page3Key, - 'createdAt' => 1676542078047, + 'locale' => null, + 'sessionNumber' => null, + 'key' => $page3Key, + 'createdAt' => 1676542078047, ]; $page3 = HitAbstract::hydrate(Page::getClassName(), $contentPage3); @@ -677,26 +753,18 @@ public function testSendBatch() $requestBody = $batchHit->toApiKeys(); - $httpClientMock->expects($this->once())->method("post") - ->with($url, [], $requestBody); + $httpClientMock->expects($this->once())->method("post")->with($url, [], $requestBody); $headers = [FlagshipConstant::HEADER_CONTENT_TYPE => FlagshipConstant::HEADER_APPLICATION_JSON]; $httpClientMock->expects($this->once())->method('setHeaders')->with($headers); $httpClientMock->expects($this->once())->method("setTimeout")->with($config->getTimeout()); - $strategy - ->expects($this->exactly(1)) - ->method("flushHits")->with([$page3Key]); + $strategy->expects($this->exactly(1))->method("flushHits")->with([$page3Key]); - $strategy - ->expects($this->never()) - ->method("flushAllHits"); + $strategy->expects($this->never())->method("flushAllHits"); - $strategy - ->expects($this->never()) - ->method("cacheHit") - ->with([]); + $strategy->expects($this->never())->method("cacheHit")->with([]); $logMessage = $this->getLogFormat( null, @@ -706,13 +774,15 @@ public function testSendBatch() 0 ); - $strategy->expects($this->once())->method("logDebugSprintf") - ->with( - $config, - FlagshipConstant::TRACKING_MANAGER, - FlagshipConstant::HIT_SENT_SUCCESS, - [FlagshipConstant::SEND_BATCH, $logMessage ] - ); + $strategy->expects($this->once())->method("logDebugSprintf")->with( + $config, + FlagshipConstant::TRACKING_MANAGER, + FlagshipConstant::HIT_SENT_SUCCESS, + [ + FlagshipConstant::SEND_BATCH, + $logMessage, + ] + ); $this->assertCount(3, $strategy->getHitsPoolQueue()); $strategy->sendBatch(); @@ -736,12 +806,22 @@ public function testSendBatchFailed() $strategy = $this->getMockForAbstractClass( "Flagship\Api\BatchingOnFailedCachingStrategy", - [$config, $httpClientMock, "instanceId"], + [ + $config, + $httpClientMock, + "instanceId", + ], "", true, true, true, - ["flushHits","logErrorSprintf","cacheHit","flushAllHits", "getNow"] + [ + "flushHits", + "logErrorSprintf", + "cacheHit", + "flushAllHits", + "getNow", + ] ); $strategy->addHit($page); @@ -753,22 +833,15 @@ public function testSendBatchFailed() $requestBody = $batchHit->toApiKeys(); $exception = new Exception("batch error"); - $httpClientMock->expects($this->once())->method("post") - ->with($url, [], $requestBody)->willThrowException($exception); + $httpClientMock->expects($this->once())->method("post")->with($url, [], $requestBody)->willThrowException($exception); $headers = [FlagshipConstant::HEADER_CONTENT_TYPE => FlagshipConstant::HEADER_APPLICATION_JSON]; - $strategy - ->expects($this->never()) - ->method("flushHits"); + $strategy->expects($this->never())->method("flushHits"); - $strategy - ->expects($this->once()) - ->method("cacheHit")->with($this->countOf(2)); + $strategy->expects($this->once())->method("cacheHit")->with($this->countOf(2)); - $strategy - ->expects($this->never()) - ->method("flushAllHits"); + $strategy->expects($this->never())->method("flushAllHits"); $logMessage = $this->getLogFormat( $exception->getMessage(), @@ -778,13 +851,15 @@ public function testSendBatchFailed() 0 ); - $strategy->expects($this->once())->method("logErrorSprintf") - ->with( - $config, - FlagshipConstant::TRACKING_MANAGER, - FlagshipConstant::UNEXPECTED_ERROR_OCCURRED, - [FlagshipConstant::SEND_BATCH, $logMessage ] - ); + $strategy->expects($this->once())->method("logErrorSprintf")->with( + $config, + FlagshipConstant::TRACKING_MANAGER, + FlagshipConstant::UNEXPECTED_ERROR_OCCURRED, + [ + FlagshipConstant::SEND_BATCH, + $logMessage, + ] + ); $this->assertCount(2, $strategy->getHitsPoolQueue()); $strategy->sendBatch(); @@ -800,7 +875,7 @@ public function testSendBatchWithExpiredHit() $url = FlagshipConstant::HIT_EVENT_URL; - \Flagship\Traits\Round::$returnValue = FlagshipConstant::DEFAULT_HIT_CACHE_TIME_MS ; + \Flagship\Traits\Round::$returnValue = FlagshipConstant::DEFAULT_HIT_CACHE_TIME_MS; $page = new Page("https://myurl.com"); $page->setConfig($config)->setVisitorId($visitorId); @@ -813,15 +888,23 @@ public function testSendBatchWithExpiredHit() $strategy = $this->getMockForAbstractClass( "Flagship\Api\BatchingOnFailedCachingStrategy", - [$config, $httpClientMock], + [ + $config, + $httpClientMock, + ], "", true, true, true, - ["flushHits","logErrorSprintf","cacheHit", "flushAllHits"] + [ + "flushHits", + "logErrorSprintf", + "cacheHit", + "flushAllHits", + ] ); - \Flagship\Traits\Round::$returnValue = FlagshipConstant::DEFAULT_HIT_CACHE_TIME_MS ; + \Flagship\Traits\Round::$returnValue = FlagshipConstant::DEFAULT_HIT_CACHE_TIME_MS; $strategy->addHit($page); $strategy->addHit($screen); @@ -838,20 +921,13 @@ public function testSendBatchWithExpiredHit() $requestBody = $batchHit->toApiKeys(); - $httpClientMock->expects($this->once())->method("post") - ->with($url, [], $requestBody); + $httpClientMock->expects($this->once())->method("post")->with($url, [], $requestBody); - $strategy - ->expects($this->exactly(0)) - ->method("flushHits"); + $strategy->expects($this->exactly(0))->method("flushHits"); - $strategy - ->expects($this->never()) - ->method("cacheHit"); + $strategy->expects($this->never())->method("cacheHit"); - $strategy - ->expects($this->never()) - ->method("flushAllHits"); + $strategy->expects($this->never())->method("flushAllHits"); $this->assertCount(2, $strategy->getHitsPoolQueue()); @@ -871,26 +947,34 @@ public function testFlushHits() $strategy = $this->getMockForAbstractClass( "Flagship\Api\BatchingOnFailedCachingStrategy", - [$config, $httpClientMock], + [ + $config, + $httpClientMock, + ], "", true, true, true, - ["logDebugSprintf","cacheHit"] + [ + "logDebugSprintf", + "cacheHit", + ] ); - $keyToRemove = ["key1","key2","key3"]; + $keyToRemove = [ + "key1", + "key2", + "key3", + ]; - $strategy->expects($this->once())->method("logDebugSprintf") - ->with( - $config, - FlagshipConstant::PROCESS_CACHE, - FlagshipConstant::HIT_DATA_FLUSHED, - [$keyToRemove] - ); + $strategy->expects($this->once())->method("logDebugSprintf")->with( + $config, + FlagshipConstant::PROCESS_CACHE, + FlagshipConstant::HIT_DATA_FLUSHED, + [$keyToRemove] + ); - $hitCacheImplementationMock->expects($this->exactly(1)) - ->method("flushHits")->with($keyToRemove); + $hitCacheImplementationMock->expects($this->exactly(1))->method("flushHits")->with($keyToRemove); $strategy->flushHits($keyToRemove); @@ -920,7 +1004,10 @@ public function testFlushHitsFailed() $strategy = $this->getMockForAbstractClass( "Flagship\Api\BatchingOnFailedCachingStrategy", - [$config, $httpClientMock], + [ + $config, + $httpClientMock, + ], "", true, true, @@ -928,21 +1015,25 @@ public function testFlushHitsFailed() ["logErrorSprintf"] ); - $keyToRemove = ["key1","key2","key3"]; + $keyToRemove = [ + "key1", + "key2", + "key3", + ]; $exception = new Exception("flushHits error"); - $strategy->expects($this->once())->method("logErrorSprintf") - ->with( - $config, - FlagshipConstant::PROCESS_CACHE, - FlagshipConstant::HIT_CACHE_ERROR, - ["flushHits", $exception->getMessage()] - ); + $strategy->expects($this->once())->method("logErrorSprintf")->with( + $config, + FlagshipConstant::PROCESS_CACHE, + FlagshipConstant::HIT_CACHE_ERROR, + [ + "flushHits", + $exception->getMessage(), + ] + ); - $hitCacheImplementationMock->expects($this->exactly(1)) - ->method("flushHits")->with($keyToRemove) - ->willThrowException($exception); + $hitCacheImplementationMock->expects($this->exactly(1))->method("flushHits")->with($keyToRemove)->willThrowException($exception); $strategy->flushHits($keyToRemove); } @@ -960,7 +1051,10 @@ public function testFlushAllHits() $strategy = $this->getMockForAbstractClass( "Flagship\Api\BatchingOnFailedCachingStrategy", - [$config, $httpClientMock], + [ + $config, + $httpClientMock, + ], "", true, true, @@ -968,15 +1062,13 @@ public function testFlushAllHits() ["logDebugSprintf"] ); - $strategy->expects($this->once())->method("logDebugSprintf") - ->with( - $config, - FlagshipConstant::PROCESS_CACHE, - FlagshipConstant::ALL_HITS_FLUSHED - ); + $strategy->expects($this->once())->method("logDebugSprintf")->with( + $config, + FlagshipConstant::PROCESS_CACHE, + FlagshipConstant::ALL_HITS_FLUSHED + ); - $hitCacheImplementationMock->expects($this->exactly(1)) - ->method("flushAllHits"); + $hitCacheImplementationMock->expects($this->exactly(1))->method("flushAllHits"); $strategy->flushAllHits(); @@ -996,7 +1088,10 @@ public function testFlushAllHitsFailed() $strategy = $this->getMockForAbstractClass( "Flagship\Api\BatchingOnFailedCachingStrategy", - [$config, $httpClientMock], + [ + $config, + $httpClientMock, + ], "", true, true, @@ -1006,16 +1101,17 @@ public function testFlushAllHitsFailed() $exception = new Exception("flushHits error"); - $strategy->expects($this->exactly(1))->method('logErrorSprintf') - ->with( - $config, - FlagshipConstant::PROCESS_CACHE, - FlagshipConstant::HIT_CACHE_ERROR, - ["flushAllHits", $exception->getMessage()] - ); + $strategy->expects($this->exactly(1))->method('logErrorSprintf')->with( + $config, + FlagshipConstant::PROCESS_CACHE, + FlagshipConstant::HIT_CACHE_ERROR, + [ + "flushAllHits", + $exception->getMessage(), + ] + ); - $hitCacheImplementationMock->expects($this->exactly(1)) - ->method("flushAllHits")->willThrowException($exception); + $hitCacheImplementationMock->expects($this->exactly(1))->method("flushAllHits")->willThrowException($exception); $strategy->flushAllHits(); } @@ -1032,12 +1128,18 @@ public function testCacheHit() $strategy = $this->getMockForAbstractClass( "Flagship\Api\BatchingOnFailedCachingStrategy", - [$config, $httpClientMock], + [ + $config, + $httpClientMock, + ], "", true, true, true, - ["logDebugSprintf", "getNow"] + [ + "logDebugSprintf", + "getNow", + ] ); $visitorId = "visitorId"; @@ -1050,28 +1152,26 @@ public function testCacheHit() $hitData = [ HitCacheFields::VERSION => 1, - HitCacheFields::DATA => [ - HitCacheFields::VISITOR_ID => $activate->getVisitorId(), + HitCacheFields::DATA => [ + HitCacheFields::VISITOR_ID => $activate->getVisitorId(), HitCacheFields::ANONYMOUS_ID => $activate->getAnonymousId(), - HitCacheFields::TYPE => $activate->getType(), - HitCacheFields::CONTENT => $activate->toArray(), - HitCacheFields::TIME => 0 - ] + HitCacheFields::TYPE => $activate->getType(), + HitCacheFields::CONTENT => $activate->toArray(), + HitCacheFields::TIME => 0, + ], ]; $data = []; $data[$key] = $hitData; - $strategy->expects($this->once())->method("logDebugSprintf") - ->with( - $config, - FlagshipConstant::PROCESS_CACHE, - FlagshipConstant::HIT_CACHE_SAVED, - [$data] - ); + $strategy->expects($this->once())->method("logDebugSprintf")->with( + $config, + FlagshipConstant::PROCESS_CACHE, + FlagshipConstant::HIT_CACHE_SAVED, + [$data] + ); - $hitCacheImplementationMock->expects($this->exactly(1)) - ->method("cacheHit")->with($data); + $hitCacheImplementationMock->expects($this->exactly(1))->method("cacheHit")->with($data); $strategy->cacheHit([$activate]); @@ -1091,7 +1191,10 @@ public function testCacheHitFailed() $strategy = $this->getMockForAbstractClass( "Flagship\Api\BatchingOnFailedCachingStrategy", - [$config, $httpClientMock], + [ + $config, + $httpClientMock, + ], "", true, true, @@ -1107,13 +1210,13 @@ public function testCacheHitFailed() $hitData = [ HitCacheFields::VERSION => 1, - HitCacheFields::DATA => [ - HitCacheFields::VISITOR_ID => $activate->getVisitorId(), + HitCacheFields::DATA => [ + HitCacheFields::VISITOR_ID => $activate->getVisitorId(), HitCacheFields::ANONYMOUS_ID => $activate->getAnonymousId(), - HitCacheFields::TYPE => $activate->getType(), - HitCacheFields::CONTENT => $activate->toArray(), - HitCacheFields::TIME => 0 - ] + HitCacheFields::TYPE => $activate->getType(), + HitCacheFields::CONTENT => $activate->toArray(), + HitCacheFields::TIME => 0, + ], ]; $data = []; @@ -1121,16 +1224,17 @@ public function testCacheHitFailed() $exception = new Exception("Cache error"); - $strategy->expects($this->once())->method("logErrorSprintf") - ->with( - $config, - FlagshipConstant::PROCESS_CACHE, - FlagshipConstant::HIT_CACHE_ERROR, - ["cacheHit", $exception->getMessage()] - ); + $strategy->expects($this->once())->method("logErrorSprintf")->with( + $config, + FlagshipConstant::PROCESS_CACHE, + FlagshipConstant::HIT_CACHE_ERROR, + [ + "cacheHit", + $exception->getMessage(), + ] + ); - $hitCacheImplementationMock->expects($this->exactly(1)) - ->method("cacheHit")->with($data)->willThrowException($exception); + $hitCacheImplementationMock->expects($this->exactly(1))->method("cacheHit")->with($data)->willThrowException($exception); $strategy->cacheHit([$activate]); } @@ -1144,7 +1248,10 @@ public function testAddTroubleshootingHit() $strategy = $this->getMockForAbstractClass( "Flagship\Api\BatchingOnFailedCachingStrategy", - [$config, $httpClientMock], + [ + $config, + $httpClientMock, + ], "", true, true, @@ -1152,27 +1259,17 @@ public function testAddTroubleshootingHit() ["isTroubleshootingActivated"] ); - $strategy->expects($this->exactly(4)) - ->method("isTroubleshootingActivated") - ->willReturnOnConsecutiveCalls(true, true, true, false); + $strategy->expects($this->exactly(4))->method("isTroubleshootingActivated")->willReturnOnConsecutiveCalls(true, true, true, false); $startDatetime = new DateTime("2023-04-13T09:33:38.049Z"); $endDatetime = new DateTime("2023-04-13T10:03:38.049Z"); $troubleshootingData = new TroubleshootingData(); - $troubleshootingData->setStartDate($startDatetime) - ->setEndDate($endDatetime) - ->setTraffic(100); + $troubleshootingData->setStartDate($startDatetime)->setEndDate($endDatetime)->setTraffic(100); $strategy->setTroubleshootingData($troubleshootingData); $troubleshooting = new Troubleshooting(); - $troubleshooting->setConfig($config) - ->setVisitorId($visitorId) - ->setLogLevel(LogLevel::ALL) - ->setLabel(TroubleshootingLabel::VISITOR_SEND_HIT) - ->setVisitorSessionId("visitorSessionId") - ->setFlagshipInstanceId("flagshipInstanceId") - ->setTraffic(100); + $troubleshooting->setConfig($config)->setVisitorId($visitorId)->setLogLevel(LogLevel::ALL)->setLabel(TroubleshootingLabel::VISITOR_SEND_HIT)->setVisitorSessionId("visitorSessionId")->setFlagshipInstanceId("flagshipInstanceId")->setTraffic(100); $strategy->addTroubleshootingHit($troubleshooting); @@ -1180,13 +1277,7 @@ public function testAddTroubleshootingHit() $this->assertCount(1, $troubleshootingQueue); $troubleshooting2 = new Troubleshooting(); - $troubleshooting2->setConfig($config) - ->setVisitorId($visitorId) - ->setLogLevel(LogLevel::ALL) - ->setLabel(TroubleshootingLabel::VISITOR_SEND_HIT) - ->setVisitorSessionId("visitorSessionId") - ->setFlagshipInstanceId("flagshipInstanceId") - ->setTraffic(50); + $troubleshooting2->setConfig($config)->setVisitorId($visitorId)->setLogLevel(LogLevel::ALL)->setLabel(TroubleshootingLabel::VISITOR_SEND_HIT)->setVisitorSessionId("visitorSessionId")->setFlagshipInstanceId("flagshipInstanceId")->setTraffic(50); $strategy->addTroubleshootingHit($troubleshooting2); @@ -1196,9 +1287,7 @@ public function testAddTroubleshootingHit() $troubleshootingData->setTraffic(49); $troubleshooting3 = new Troubleshooting(); - $troubleshooting3->setConfig($config) - ->setVisitorId($visitorId) - ->setTraffic(50); + $troubleshooting3->setConfig($config)->setVisitorId($visitorId)->setTraffic(50); $strategy->addTroubleshootingHit($troubleshooting3); @@ -1206,13 +1295,7 @@ public function testAddTroubleshootingHit() $this->assertCount(2, $troubleshootingQueue); $troubleshooting4 = new Troubleshooting(); - $troubleshooting4->setConfig($config) - ->setVisitorId($visitorId) - ->setLogLevel(LogLevel::ALL) - ->setLabel(TroubleshootingLabel::VISITOR_SEND_HIT) - ->setVisitorSessionId("visitorSessionId") - ->setFlagshipInstanceId("flagshipInstanceId") - ->setTraffic(50); + $troubleshooting4->setConfig($config)->setVisitorId($visitorId)->setLogLevel(LogLevel::ALL)->setLabel(TroubleshootingLabel::VISITOR_SEND_HIT)->setVisitorSessionId("visitorSessionId")->setFlagshipInstanceId("flagshipInstanceId")->setTraffic(50); $strategy->addTroubleshootingHit($troubleshooting4); @@ -1237,7 +1320,10 @@ public function testSendTroubleshootingQueue() $strategy = $this->getMockForAbstractClass( "Flagship\Api\BatchingOnFailedCachingStrategy", - [$config, $httpClientMock], + [ + $config, + $httpClientMock, + ], "", true, true, @@ -1247,42 +1333,27 @@ public function testSendTroubleshootingQueue() - $strategy->expects($this->exactly(4)) - ->method("isTroubleshootingActivated") - ->willReturn(true, true, true, false); + $strategy->expects($this->exactly(4))->method("isTroubleshootingActivated")->willReturn(true, true, true, false); $match = $this->exactly(2); - $httpClientMock->expects($match) - ->method('post') - ->with($this->callback(function ($url) use ($match) { - $troubleshootingUrl = FlagshipConstant::TROUBLESHOOTING_HIT_URL; - return $url === $troubleshootingUrl; - })); + $httpClientMock->expects($match)->method('post')->with($this->callback(function ($url) use ($match) { + $troubleshootingUrl = FlagshipConstant::TROUBLESHOOTING_HIT_URL; + return $url === $troubleshootingUrl; + })); $startDatetime = new DateTime("2023-04-13T09:33:38.049Z"); $endDatetime = new DateTime("2023-04-13T10:03:38.049Z"); $troubleshootingData = new TroubleshootingData(); - $troubleshootingData->setStartDate($startDatetime) - ->setEndDate($endDatetime)->setTraffic(100); + $troubleshootingData->setStartDate($startDatetime)->setEndDate($endDatetime)->setTraffic(100); $strategy->setTroubleshootingData($troubleshootingData); $troubleshooting = new Troubleshooting(); - $troubleshooting->setConfig($config) - ->setLogLevel(LogLevel::ALL) - ->setLabel(TroubleshootingLabel::VISITOR_SEND_HIT) - ->setVisitorSessionId("visitorSessionId") - ->setFlagshipInstanceId("flagshipInstanceId") - ->setVisitorId($visitorId)->setTraffic(100); + $troubleshooting->setConfig($config)->setLogLevel(LogLevel::ALL)->setLabel(TroubleshootingLabel::VISITOR_SEND_HIT)->setVisitorSessionId("visitorSessionId")->setFlagshipInstanceId("flagshipInstanceId")->setVisitorId($visitorId)->setTraffic(100); $troubleshooting2 = new Troubleshooting(); - $troubleshooting2->setConfig($config) - ->setLogLevel(LogLevel::ALL) - ->setLabel(TroubleshootingLabel::VISITOR_SEND_HIT) - ->setVisitorSessionId("visitorSessionId") - ->setFlagshipInstanceId("flagshipInstanceId") - ->setVisitorId($visitorId)->setTraffic(100); + $troubleshooting2->setConfig($config)->setLogLevel(LogLevel::ALL)->setLabel(TroubleshootingLabel::VISITOR_SEND_HIT)->setVisitorSessionId("visitorSessionId")->setFlagshipInstanceId("flagshipInstanceId")->setVisitorId($visitorId)->setTraffic(100); $strategy->addTroubleshootingHit($troubleshooting); $strategy->addTroubleshootingHit($troubleshooting2); @@ -1310,42 +1381,37 @@ public function testSendTroubleshootingQueueFailed() $strategy = $this->getMockForAbstractClass( "Flagship\Api\BatchingOnFailedCachingStrategy", - [$config, $httpClientMock], + [ + $config, + $httpClientMock, + ], "", true, true, true, - ["isTroubleshootingActivated", "logErrorSprintf"] + [ + "isTroubleshootingActivated", + "logErrorSprintf", + ] ); - $strategy->expects($this->exactly(2)) - ->method("isTroubleshootingActivated") - ->willReturn(true); + $strategy->expects($this->exactly(2))->method("isTroubleshootingActivated")->willReturn(true); - $strategy->expects($this->exactly(1)) - ->method("logErrorSprintf"); + $strategy->expects($this->exactly(1))->method("logErrorSprintf"); $exception = new Exception("Error"); - $httpClientMock->expects($this->exactly(1)) - ->method('post')->willThrowException($exception); + $httpClientMock->expects($this->exactly(1))->method('post')->willThrowException($exception); $startDatetime = new DateTime("2023-04-13T09:33:38.049Z"); $endDatetime = new DateTime("2023-04-13T10:03:38.049Z"); $troubleshootingData = new TroubleshootingData(); - $troubleshootingData->setStartDate($startDatetime) - ->setEndDate($endDatetime)->setTraffic(100); + $troubleshootingData->setStartDate($startDatetime)->setEndDate($endDatetime)->setTraffic(100); $strategy->setTroubleshootingData($troubleshootingData); $troubleshooting = new Troubleshooting(); - $troubleshooting->setConfig($config) - ->setLogLevel(LogLevel::ALL) - ->setLabel(TroubleshootingLabel::VISITOR_SEND_HIT) - ->setVisitorSessionId("visitorSessionId") - ->setFlagshipInstanceId("flagshipInstanceId") - ->setVisitorId($visitorId) - ->setTraffic(100); + $troubleshooting->setConfig($config)->setLogLevel(LogLevel::ALL)->setLabel(TroubleshootingLabel::VISITOR_SEND_HIT)->setVisitorSessionId("visitorSessionId")->setFlagshipInstanceId("flagshipInstanceId")->setVisitorId($visitorId)->setTraffic(100); $strategy->addTroubleshootingHit($troubleshooting); @@ -1368,27 +1434,32 @@ public function testIsTroubleshootingActivated() $strategy = $this->getMockForAbstractClass( "Flagship\Api\BatchingOnFailedCachingStrategy", - [$config, $httpClientMock], + [ + $config, + $httpClientMock, + ], "", true, true, true, - ["logErrorSprintf", "getNow"] + [ + "logErrorSprintf", + "getNow", + ] ); //No troubleshooting data is given $check = $strategy->isTroubleshootingActivated(); $this->assertFalse($check); -// //Test troubleshooting data + // //Test troubleshooting data - $strategy->expects($this->exactly(3))->method("getNow") - ->willReturnOnConsecutiveCalls( - (new DateTime("2023-04-13T09:32:38.049Z"))->getTimestamp() * 1000, - (new DateTime("2023-04-13T10:03:39.049Z"))->getTimestamp() * 1000, - (new DateTime("2023-04-13T09:40:38.049Z"))->getTimestamp() * 1000 - ); -// + $strategy->expects($this->exactly(3))->method("getNow")->willReturnOnConsecutiveCalls( + (new DateTime("2023-04-13T09:32:38.049Z"))->getTimestamp() * 1000, + (new DateTime("2023-04-13T10:03:39.049Z"))->getTimestamp() * 1000, + (new DateTime("2023-04-13T09:40:38.049Z"))->getTimestamp() * 1000 + ); + // //Test troubleshooting not start $startDatetime = new DateTime("2023-04-13T09:33:38.049Z"); $troubleshootingData = new TroubleshootingData(); @@ -1401,8 +1472,7 @@ public function testIsTroubleshootingActivated() //Test troubleshooting is finished $endDatetime = new DateTime("2023-04-13T10:03:38.049Z"); $troubleshootingData = new TroubleshootingData(); - $troubleshootingData->setStartDate($startDatetime) - ->setEndDate($endDatetime); + $troubleshootingData->setStartDate($startDatetime)->setEndDate($endDatetime); $strategy->setTroubleshootingData($troubleshootingData); $check = $strategy->isTroubleshootingActivated(); @@ -1412,8 +1482,7 @@ public function testIsTroubleshootingActivated() $startDatetime = new DateTime("2023-04-13T09:33:38.049Z"); $endDatetime = new DateTime("2023-04-13T10:03:38.049Z"); $troubleshootingData = new TroubleshootingData(); - $troubleshootingData->setStartDate($startDatetime) - ->setEndDate($endDatetime); + $troubleshootingData->setStartDate($startDatetime)->setEndDate($endDatetime); $strategy->setTroubleshootingData($troubleshootingData); @@ -1426,6 +1495,9 @@ public function testAddUsageHit() $config = new DecisionApiConfig(); $visitorId = "visitorId"; + /** + * @var HttpClientInterface|MockObject $httpClientMock + */ $httpClientMock = $this->getMockForAbstractClass('Flagship\Utils\HttpClientInterface'); $strategy = new BatchingOnFailedCachingStrategy($config, $httpClientMock); @@ -1467,9 +1539,15 @@ public function testSendUsageHitQueue() $httpClientMock = $this->getMockForAbstractClass('Flagship\Utils\HttpClientInterface'); + /** + * @var BatchingOnFailedCachingStrategy|MockObject $strategy + */ $strategy = $this->getMockForAbstractClass( "Flagship\Api\BatchingOnFailedCachingStrategy", - [$config, $httpClientMock], + [ + $config, + $httpClientMock, + ], "", true, true, @@ -1503,14 +1581,13 @@ public function testSendUsageHitQueue() $strategy->addUsageHit($usageHit2); $matcher = $this->exactly(2); - $strategy->expects($matcher)->method('sendUsageHit') - ->with($this->callback(function ($hit) use ($matcher, $usageHit, $usageHit2) { - return match ($matcher->getInvocationCount()) { - 1 => $hit === $usageHit, - 2 => $hit === $usageHit2, - default => false, - }; - })); + $strategy->expects($matcher)->method('sendUsageHit')->with($this->callback(function ($hit) use ($matcher, $usageHit, $usageHit2) { + return match ($matcher->getInvocationCount()) { + 1 => $hit === $usageHit, + 2 => $hit === $usageHit2, + default => false, + }; + })); $strategy->sendUsageHitQueue(); $usageHitQueue = $strategy->getUsageHitQueue(); @@ -1535,9 +1612,15 @@ public function testSendUsageHit() ["post"] ); + /** + * @var BatchingOnFailedCachingStrategy|MockObject $strategy + */ $strategy = $this->getMockForAbstractClass( "Flagship\Api\BatchingOnFailedCachingStrategy", - [$config, $httpClientMock], + [ + $config, + $httpClientMock, + ], "", true, true, @@ -1548,18 +1631,15 @@ public function testSendUsageHit() $match = $this->exactly(1); - $httpClientMock->expects($match) - ->method('post') - ->with($this->callback(function ($url) use ($match) { - $troubleshootingUrl = FlagshipConstant::ANALYTICS_HIT_URL; - return $url === $troubleshootingUrl; - }), $this->callback(function () use ($match) { - return true; - })); + $httpClientMock->expects($match)->method('post')->with($this->callback(function ($url) use ($match) { + $troubleshootingUrl = FlagshipConstant::ANALYTICS_HIT_URL; + return $url === $troubleshootingUrl; + }), $this->callback(function () use ($match) { + return true; + })); $analytic = new UsageHit(); - $analytic - ->setLogLevel(LogLevel::ALL) + $analytic->setLogLevel(LogLevel::ALL) ->setLabel(TroubleshootingLabel::VISITOR_SEND_HIT) ->setVisitorSessionId("visitorSessionId") ->setFlagshipInstanceId("flagshipInstanceId") @@ -1586,7 +1666,10 @@ public function testSendUsageHitFailed() $strategy = $this->getMockForAbstractClass( "Flagship\Api\BatchingOnFailedCachingStrategy", - [$config, $httpClientMock], + [ + $config, + $httpClientMock, + ], "", true, true, @@ -1598,18 +1681,10 @@ public function testSendUsageHitFailed() $match = $this->exactly(1); $exception = new Exception("Error"); - $httpClientMock->expects($match) - ->method('post') - ->willThrowException($exception); + $httpClientMock->expects($match)->method('post')->willThrowException($exception); $analytic = new UsageHit(); - $analytic - ->setLogLevel(LogLevel::ALL) - ->setLabel(TroubleshootingLabel::VISITOR_SEND_HIT) - ->setVisitorSessionId("visitorSessionId") - ->setFlagshipInstanceId("flagshipInstanceId") - ->setVisitorId($visitorId) - ->setConfig($config); + $analytic->setLogLevel(LogLevel::ALL)->setLabel(TroubleshootingLabel::VISITOR_SEND_HIT)->setVisitorSessionId("visitorSessionId")->setFlagshipInstanceId("flagshipInstanceId")->setVisitorId($visitorId)->setConfig($config); $strategy->sendUsageHit($analytic); } diff --git a/tests/Api/NoBatchingContinuousCachingStrategyTest.php b/tests/Api/NoBatchingContinuousCachingStrategyTest.php index ecd22bf5..17f1d350 100644 --- a/tests/Api/NoBatchingContinuousCachingStrategyTest.php +++ b/tests/Api/NoBatchingContinuousCachingStrategyTest.php @@ -29,12 +29,19 @@ public function testAddHit() $strategy = $this->getMockForAbstractClass( "Flagship\Api\NoBatchingContinuousCachingStrategy", - [$config, $httpClientMock], + [ + $config, + $httpClientMock, + ], "", true, true, true, - ["cacheHit","flushHits","logDebugSprintf"] + [ + "cacheHit", + "flushHits", + "logDebugSprintf", + ] ); $strategy->expects($this->never())->method("cacheHit"); @@ -58,24 +65,23 @@ public function testAddHit() $url = FlagshipConstant::HIT_EVENT_URL; - $httpClientMock->expects($this->exactly(3))->method("post") - ->with( - $this->logicalOr( - $url, - $url, - $url - ), - $this->logicalOr( - [], - [], - [] - ), - $this->logicalOr( - $requestBody, - $requestBody2, - $requestBody3 - ) - ); + $httpClientMock->expects($this->exactly(3))->method("post")->with( + $this->logicalOr( + $url, + $url, + $url + ), + $this->logicalOr( + [], + [], + [] + ), + $this->logicalOr( + $requestBody, + $requestBody2, + $requestBody3 + ) + ); $headers = [FlagshipConstant::HEADER_CONTENT_TYPE => FlagshipConstant::HEADER_APPLICATION_JSON]; @@ -105,29 +111,37 @@ public function testAddHit() 0 ); - $strategy->expects($this->exactly(3))->method("logDebugSprintf") - ->with( - $this->logicalOr( - $config, - $config, - $config - ), - $this->logicalOr( - FlagshipConstant::TRACKING_MANAGER, - FlagshipConstant::TRACKING_MANAGER, - FlagshipConstant::TRACKING_MANAGER - ), - $this->logicalOr( - FlagshipConstant::HIT_SENT_SUCCESS, - FlagshipConstant::HIT_SENT_SUCCESS, - FlagshipConstant::HIT_SENT_SUCCESS - ), - $this->logicalOr( - [FlagshipConstant::SEND_HIT, $logMessage ], - [FlagshipConstant::SEND_HIT, $logMessage1 ], - [FlagshipConstant::SEND_HIT, $logMessage2 ] - ) - ); + $strategy->expects($this->exactly(3))->method("logDebugSprintf")->with( + $this->logicalOr( + $config, + $config, + $config + ), + $this->logicalOr( + FlagshipConstant::TRACKING_MANAGER, + FlagshipConstant::TRACKING_MANAGER, + FlagshipConstant::TRACKING_MANAGER + ), + $this->logicalOr( + FlagshipConstant::HIT_SENT_SUCCESS, + FlagshipConstant::HIT_SENT_SUCCESS, + FlagshipConstant::HIT_SENT_SUCCESS + ), + $this->logicalOr( + [ + FlagshipConstant::SEND_HIT, + $logMessage, + ], + [ + FlagshipConstant::SEND_HIT, + $logMessage1, + ], + [ + FlagshipConstant::SEND_HIT, + $logMessage2, + ] + ) + ); $this->assertCount(0, $strategy->getHitsPoolQueue()); $this->assertCount(0, $strategy->getActivatePoolQueue()); @@ -151,12 +165,22 @@ public function testAddHitFailed() $strategy = $this->getMockForAbstractClass( "Flagship\Api\NoBatchingContinuousCachingStrategy", - [$config, $httpClientMock, "instanceId"], + [ + $config, + $httpClientMock, + "instanceId", + ], "", true, true, true, - ["cacheHit","flushHits","logErrorSprintf", "addTroubleshootingHit", "sendTroubleshootingQueue"] + [ + "cacheHit", + "flushHits", + "logErrorSprintf", + "addTroubleshootingHit", + "sendTroubleshootingQueue", + ] ); $strategy->expects($this->never())->method("flushHits"); @@ -172,12 +196,11 @@ public function testAddHitFailed() $exception = new Exception("error"); - $httpClientMock->expects($this->exactly(1))->method("post") - ->with( - $url, - [], - $requestBody - )->willThrowException($exception); + $httpClientMock->expects($this->exactly(1))->method("post")->with( + $url, + [], + $requestBody + )->willThrowException($exception); $headers = [FlagshipConstant::HEADER_CONTENT_TYPE => FlagshipConstant::HEADER_APPLICATION_JSON]; @@ -192,13 +215,15 @@ public function testAddHitFailed() 0 ); - $strategy->expects($this->once())->method("logErrorSprintf") - ->with( - $config, - FlagshipConstant::TRACKING_MANAGER, - FlagshipConstant::UNEXPECTED_ERROR_OCCURRED, - [FlagshipConstant::SEND_HIT, $logMessage ] - ); + $strategy->expects($this->once())->method("logErrorSprintf")->with( + $config, + FlagshipConstant::TRACKING_MANAGER, + FlagshipConstant::UNEXPECTED_ERROR_OCCURRED, + [ + FlagshipConstant::SEND_HIT, + $logMessage, + ] + ); $strategy->expects($this->once())->method("addTroubleshootingHit"); $strategy->expects($this->once())->method("sendTroubleshootingQueue"); @@ -222,12 +247,18 @@ public function testAddHitConsent() $strategy = $this->getMockForAbstractClass( "Flagship\Api\NoBatchingContinuousCachingStrategy", - [$config, $httpClientMock], + [ + $config, + $httpClientMock, + ], "", true, true, true, - ["cacheHit","flushHits"] + [ + "cacheHit", + "flushHits", + ] ); $strategy->expects($this->never())->method("cacheHit"); @@ -235,8 +266,7 @@ public function testAddHitConsent() $key1 = "$visitorId:key1"; $key2 = "$visitorId:key2"; - $strategy->expects($this->once()) - ->method("flushHits")->with([$page3Key]); + $strategy->expects($this->once())->method("flushHits")->with([$page3Key]); $page = new Page("http://localhost"); $page->setConfig($config)->setVisitorId($visitorId)->setKey($key1); @@ -248,18 +278,18 @@ public function testAddHitConsent() $strategy->hydrateHitsPoolQueue($key2, $page2); $contentPage3 = [ - 'pageUrl' => 'page1', - 'visitorId' => $visitorId, - 'ds' => 'APP', - 'type' => 'PAGEVIEW', - 'anonymousId' => null, - 'userIP' => null, - 'pageResolution' => null, - 'locale' => null, - 'sessionNumber' => null, - 'key' => $page3Key, - 'createdAt' => 1676542078047, - ]; + 'pageUrl' => 'page1', + 'visitorId' => $visitorId, + 'ds' => 'APP', + 'type' => 'PAGEVIEW', + 'anonymousId' => null, + 'userIP' => null, + 'pageResolution' => null, + 'locale' => null, + 'sessionNumber' => null, + 'key' => $page3Key, + 'createdAt' => 1676542078047, + ]; $page3 = HitAbstract::hydrate(Page::getClassName(), $contentPage3); @@ -276,12 +306,11 @@ public function testAddHitConsent() $url = FlagshipConstant::HIT_EVENT_URL; - $httpClientMock->expects($this->exactly(2))->method("post") - ->with( - $url, - [], - $requestBody3 - ); + $httpClientMock->expects($this->exactly(2))->method("post")->with( + $url, + [], + $requestBody3 + ); $headers = [FlagshipConstant::HEADER_CONTENT_TYPE => FlagshipConstant::HEADER_APPLICATION_JSON]; @@ -307,12 +336,19 @@ public function testActivateFlag() $strategy = $this->getMockForAbstractClass( "Flagship\Api\NoBatchingContinuousCachingStrategy", - [$config, $httpClientMock], + [ + $config, + $httpClientMock, + ], "", true, true, true, - ["cacheHit","flushHits","logDebugSprintf"] + [ + "cacheHit", + "flushHits", + "logDebugSprintf", + ] ); $strategy->expects($this->never())->method("cacheHit"); @@ -333,21 +369,20 @@ public function testActivateFlag() $url = FlagshipConstant::BASE_API_URL . '/' . FlagshipConstant::URL_ACTIVATE_MODIFICATION; - $httpClientMock->expects($this->exactly(2))->method("post") - ->with( - $this->logicalOr( - $url, - $url - ), - $this->logicalOr( - [], - [] - ), - $this->logicalOr( - $requestBody, - $requestBody2 - ) - ); + $httpClientMock->expects($this->exactly(2))->method("post")->with( + $this->logicalOr( + $url, + $url + ), + $this->logicalOr( + [], + [] + ), + $this->logicalOr( + $requestBody, + $requestBody2 + ) + ); $headers = $strategy->getActivateHeaders(); @@ -369,25 +404,30 @@ public function testActivateFlag() 0 ); - $strategy->expects($this->exactly(2))->method("logDebugSprintf") - ->with( - $this->logicalOr( - $config, - $config - ), - $this->logicalOr( - FlagshipConstant::TRACKING_MANAGER, - FlagshipConstant::TRACKING_MANAGER - ), - $this->logicalOr( - FlagshipConstant::HIT_SENT_SUCCESS, - FlagshipConstant::HIT_SENT_SUCCESS - ), - $this->logicalOr( - [FlagshipConstant::SEND_ACTIVATE, $logMessage ], - [FlagshipConstant::SEND_ACTIVATE, $logMessage1 ] - ) - ); + $strategy->expects($this->exactly(2))->method("logDebugSprintf")->with( + $this->logicalOr( + $config, + $config + ), + $this->logicalOr( + FlagshipConstant::TRACKING_MANAGER, + FlagshipConstant::TRACKING_MANAGER + ), + $this->logicalOr( + FlagshipConstant::HIT_SENT_SUCCESS, + FlagshipConstant::HIT_SENT_SUCCESS + ), + $this->logicalOr( + [ + FlagshipConstant::SEND_ACTIVATE, + $logMessage, + ], + [ + FlagshipConstant::SEND_ACTIVATE, + $logMessage1, + ] + ) + ); $this->assertCount(0, $strategy->getHitsPoolQueue()); $this->assertCount(0, $strategy->getActivatePoolQueue()); @@ -408,12 +448,22 @@ public function testActivateFlagFailed() $strategy = $this->getMockForAbstractClass( "Flagship\Api\NoBatchingContinuousCachingStrategy", - [$config, $httpClientMock, "instanceId"], + [ + $config, + $httpClientMock, + "instanceId", + ], "", true, true, true, - ["cacheHit","flushHits","logErrorSprintf", "addTroubleshootingHit", "sendTroubleshootingQueue"] + [ + "cacheHit", + "flushHits", + "logErrorSprintf", + "addTroubleshootingHit", + "sendTroubleshootingQueue", + ] ); $strategy->expects($this->never())->method("flushHits"); @@ -430,12 +480,11 @@ public function testActivateFlagFailed() $exception = new Exception("error"); - $httpClientMock->expects($this->exactly(1))->method("post") - ->with( - $url, - [], - $requestBody - )->willThrowException($exception); + $httpClientMock->expects($this->exactly(1))->method("post")->with( + $url, + [], + $requestBody + )->willThrowException($exception); $headers = $strategy->getActivateHeaders(); @@ -450,13 +499,15 @@ public function testActivateFlagFailed() 0 ); - $strategy->expects($this->exactly(1))->method("logErrorSprintf") - ->with( - $config, - FlagshipConstant::TRACKING_MANAGER, - FlagshipConstant::UNEXPECTED_ERROR_OCCURRED, - [FlagshipConstant::SEND_ACTIVATE, $logMessage ] - ); + $strategy->expects($this->exactly(1))->method("logErrorSprintf")->with( + $config, + FlagshipConstant::TRACKING_MANAGER, + FlagshipConstant::UNEXPECTED_ERROR_OCCURRED, + [ + FlagshipConstant::SEND_ACTIVATE, + $logMessage, + ] + ); $strategy->expects($this->once())->method("addTroubleshootingHit"); $strategy->expects($this->once())->method("sendTroubleshootingQueue"); @@ -478,7 +529,10 @@ public function testAddTroubleshootingHit() $strategy = $this->getMockForAbstractClass( "Flagship\Api\NoBatchingContinuousCachingStrategy", - [$config, $httpClientMock], + [ + $config, + $httpClientMock, + ], "", true, false, @@ -503,7 +557,10 @@ public function testAddUsageHit() $strategy = $this->getMockForAbstractClass( "Flagship\Api\NoBatchingContinuousCachingStrategy", - [$config, $httpClientMock], + [ + $config, + $httpClientMock, + ], "", true, false, diff --git a/tests/Api/TrackingManagerTest.php b/tests/Api/TrackingManagerTest.php index 3173f547..b544cad1 100644 --- a/tests/Api/TrackingManagerTest.php +++ b/tests/Api/TrackingManagerTest.php @@ -65,60 +65,59 @@ public function testCommonMethod() $BatchingCachingStrategyMock = $this->getMockForAbstractClass( "Flagship\Api\BatchingCachingStrategyAbstract", - [$config, $httpClient], + [ + $config, + $httpClient, + ], "", true, true, true, [ - "addHit", - "activateFlag", - "sendBatch", - "sendTroubleshootingQueue", - "addTroubleshootingHit", - "setTroubleshootingData", - "getTroubleshootingData", - "addUsageHit" + "addHit", + "activateFlag", + "sendBatch", + "sendTroubleshootingQueue", + "addTroubleshootingHit", + "setTroubleshootingData", + "getTroubleshootingData", + "addUsageHit", ] ); $trackingManager = $this->getMockForAbstractClass( "Flagship\Api\TrackingManager", - [$config, $httpClient], + [ + $config, + $httpClient, + ], "", true, true, true, - ["getStrategy", "lookupHits"] + [ + "getStrategy", + "lookupHits", + ] ); - $trackingManager->expects($this->exactly(7)) - ->method("getStrategy") - ->willReturn($BatchingCachingStrategyMock); + $trackingManager->expects($this->exactly(7))->method("getStrategy")->willReturn($BatchingCachingStrategyMock); - $BatchingCachingStrategyMock->expects($this->once()) - ->method("addHit"); + $BatchingCachingStrategyMock->expects($this->once())->method("addHit"); - $BatchingCachingStrategyMock->expects($this->once()) - ->method("setTroubleshootingData"); + $BatchingCachingStrategyMock->expects($this->once())->method("setTroubleshootingData"); - $BatchingCachingStrategyMock->expects($this->once()) - ->method("getTroubleshootingData"); + $BatchingCachingStrategyMock->expects($this->once())->method("getTroubleshootingData"); - $BatchingCachingStrategyMock->expects($this->once()) - ->method("activateFlag"); + $BatchingCachingStrategyMock->expects($this->once())->method("activateFlag"); - $BatchingCachingStrategyMock->expects($this->once()) - ->method("addTroubleshootingHit"); + $BatchingCachingStrategyMock->expects($this->once())->method("addTroubleshootingHit"); - $BatchingCachingStrategyMock->expects($this->once()) - ->method("sendBatch"); + $BatchingCachingStrategyMock->expects($this->once())->method("sendBatch"); - $BatchingCachingStrategyMock->expects($this->once()) - ->method("sendTroubleshootingQueue"); + $BatchingCachingStrategyMock->expects($this->once())->method("sendTroubleshootingQueue"); - $BatchingCachingStrategyMock->expects($this->once()) - ->method("addUsageHit"); + $BatchingCachingStrategyMock->expects($this->once())->method("addUsageHit"); $page = new Page("http://localhost"); $page->setConfig($config); @@ -151,12 +150,18 @@ public function testLookupHits() $trackingManager = $this->getMockForAbstractClass( "Flagship\Api\TrackingManager", - [$config, $httpClient], + [ + $config, + $httpClient, + ], "", true, true, true, - ["logDebugSprintf","logErrorSprintf"] + [ + "logDebugSprintf", + "logErrorSprintf", + ] ); $config->setHitCacheImplementation($hitCacheImplementationMock); @@ -187,59 +192,65 @@ public function testLookupHits() /** * @var $hits HitAbstract[] */ - $hits = [$event, $item, $page, $screen, $segment, $activate, $transaction]; + $hits = [ + $event, + $item, + $page, + $screen, + $segment, + $activate, + $transaction, + ]; $data = []; foreach ($hits as $hit) { $hitData = [ - HitCacheFields::VERSION => 1, - HitCacheFields::DATA => [ - HitCacheFields::VISITOR_ID => $hit->getVisitorId(), - HitCacheFields::ANONYMOUS_ID => $hit->getAnonymousId(), - HitCacheFields::TYPE => $hit->getType()->value, - HitCacheFields::CONTENT => $hit->toArray(), - HitCacheFields::TIME => \round(microtime(true) * 1000) - ] - ]; + HitCacheFields::VERSION => 1, + HitCacheFields::DATA => [ + HitCacheFields::VISITOR_ID => $hit->getVisitorId(), + HitCacheFields::ANONYMOUS_ID => $hit->getAnonymousId(), + HitCacheFields::TYPE => $hit->getType()->value, + HitCacheFields::CONTENT => $hit->toArray(), + HitCacheFields::TIME => \round(microtime(true) * 1000), + ], + ]; $data[$hit->getKey()] = $hitData; } $data["$visitorId:key8"] = [ - HitCacheFields::VERSION => 1, - HitCacheFields::DATA => [ - HitCacheFields::VISITOR_ID => $page->getVisitorId(), - HitCacheFields::ANONYMOUS_ID => $page->getAnonymousId(), - HitCacheFields::TYPE => $page->getType()->value, - HitCacheFields::CONTENT => $page->toArray(), - HitCacheFields::TIME => (new DateTime("2020/01/01"))->format("Uv") - ] - ]; + HitCacheFields::VERSION => 1, + HitCacheFields::DATA => [ + HitCacheFields::VISITOR_ID => $page->getVisitorId(), + HitCacheFields::ANONYMOUS_ID => $page->getAnonymousId(), + HitCacheFields::TYPE => $page->getType()->value, + HitCacheFields::CONTENT => $page->toArray(), + HitCacheFields::TIME => (new DateTime("2020/01/01"))->format("Uv"), + ], + ]; $data["$visitorId:key9"] = [ - HitCacheFields::VERSION => 1, - HitCacheFields::DATA => [ - HitCacheFields::VISITOR_ID => $page->getVisitorId(), - HitCacheFields::ANONYMOUS_ID => $page->getAnonymousId(), - HitCacheFields::TYPE => "unknown", - HitCacheFields::CONTENT => $page->toArray(), - HitCacheFields::TIME => \round(microtime(true) * 1000) - ] - ]; + HitCacheFields::VERSION => 1, + HitCacheFields::DATA => [ + HitCacheFields::VISITOR_ID => $page->getVisitorId(), + HitCacheFields::ANONYMOUS_ID => $page->getAnonymousId(), + HitCacheFields::TYPE => "unknown", + HitCacheFields::CONTENT => $page->toArray(), + HitCacheFields::TIME => \round(microtime(true) * 1000), + ], + ]; $key10 = "$visitorId:key10"; $data[$key10] = [ - HitCacheFields::DATA => [ - HitCacheFields::VISITOR_ID => $page->getVisitorId(), - HitCacheFields::ANONYMOUS_ID => $page->getAnonymousId(), - HitCacheFields::TYPE => "unknown", - HitCacheFields::CONTENT => $page->toArray(), - HitCacheFields::TIME => \round(microtime(true) * 1000) - ] - ]; + HitCacheFields::DATA => [ + HitCacheFields::VISITOR_ID => $page->getVisitorId(), + HitCacheFields::ANONYMOUS_ID => $page->getAnonymousId(), + HitCacheFields::TYPE => "unknown", + HitCacheFields::CONTENT => $page->toArray(), + HitCacheFields::TIME => \round(microtime(true) * 1000), + ], + ]; - $hitCacheImplementationMock->expects($this->exactly(2)) - ->method("lookupHits") - ->willReturnOnConsecutiveCalls($data, []); + $hitCacheImplementationMock->expects($this->exactly(2))->method("lookupHits")->willReturnOnConsecutiveCalls($data, []); Round::$returnValue = \round(microtime(true) * 1000); @@ -262,7 +273,10 @@ public function testLookupHitsFailed() $trackingManager = $this->getMockForAbstractClass( "Flagship\Api\TrackingManager", - [$config, $httpClient], + [ + $config, + $httpClient, + ], "", true, true, @@ -274,18 +288,17 @@ public function testLookupHitsFailed() $exception = new Exception("error"); - $hitCacheImplementationMock->expects($this->exactly(1)) - ->method("lookupHits") - ->willThrowException($exception); - - $trackingManager->expects($this->once()) - ->method("logErrorSprintf") - ->with( - $config, - FlagshipConstant::PROCESS_CACHE, - FlagshipConstant::HIT_CACHE_ERROR, - ["lookupHits", $exception->getMessage()] - ); + $hitCacheImplementationMock->expects($this->exactly(1))->method("lookupHits")->willThrowException($exception); + + $trackingManager->expects($this->once())->method("logErrorSprintf")->with( + $config, + FlagshipConstant::PROCESS_CACHE, + FlagshipConstant::HIT_CACHE_ERROR, + [ + "lookupHits", + $exception->getMessage(), + ] + ); $trackingManager->lookupHits(); } diff --git a/tests/Assets/File.php b/tests/Assets/File.php index 0cf8e3e6..0d123d8e 100644 --- a/tests/Assets/File.php +++ b/tests/Assets/File.php @@ -40,7 +40,7 @@ function file_put_contents($filename, $data) function fwrite($stream, $data) { - File::$fwriteData = $data; + File::$fwriteData = $data; } function mkdir($directory, $permissions = 0777, $recursive = false) diff --git a/tests/Config/BucketingConfigTest.php b/tests/Config/BucketingConfigTest.php index 40e8c018..a44f8d47 100644 --- a/tests/Config/BucketingConfigTest.php +++ b/tests/Config/BucketingConfigTest.php @@ -29,7 +29,7 @@ public function testJson() FlagshipField::FIELD_ENVIRONMENT_ID => null, FlagshipField::FIELD_API_KEY => null, FlagshipField::FIELD_TIMEOUT => 2000, - FlagshipField::FIELD_LOG_LEVEL => LogLevel::ALL, + FlagshipField::FIELD_LOG_LEVEL => LogLevel::INFO, FlagshipField::FIELD_BUCKETING_URL => $bucketingUrl ]; diff --git a/tests/Config/FlagshipConfigTest.php b/tests/Config/FlagshipConfigTest.php index 372f34ac..acef1825 100644 --- a/tests/Config/FlagshipConfigTest.php +++ b/tests/Config/FlagshipConfigTest.php @@ -2,20 +2,24 @@ namespace Flagship\Config; -use Flagship\Enum\CacheStrategy; -use Flagship\Enum\DecisionMode; -use Flagship\Enum\FlagshipConstant; -use Flagship\Enum\FlagshipField; -use Flagship\Enum\LogLevel; +use ReflectionException; use Flagship\Utils\Utils; +use Flagship\Enum\LogLevel; +use Psr\Log\LoggerInterface; +use Flagship\Enum\DecisionMode; use PHPUnit\Framework\TestCase; -use ReflectionException; +use Flagship\Enum\CacheStrategy; +use Flagship\Enum\FlagshipField; +use Flagship\Enum\FlagshipConstant; +use Flagship\Cache\IHitCacheImplementation; +use PHPUnit\Framework\MockObject\MockObject; +use Flagship\Cache\IVisitorCacheImplementation; class FlagshipConfigTest extends TestCase { public function configData(): array { - return ['envId' => 'env_value','apiKey' => 'key_value']; + return ['envId' => 'env_value', 'apiKey' => 'key_value']; } @@ -40,7 +44,7 @@ public function testSetLogLevel() $apiKey = "apiKey"; $config = new DecisionApiConfig($envId, $apiKey); - $this->assertSame(LogLevel::ALL, $config->getLogLevel()); + $this->assertSame(LogLevel::INFO, $config->getLogLevel()); $config->setLogLevel(LogLevel::ERROR); $this->assertSame(LogLevel::ERROR, $config->getLogLevel()); @@ -76,6 +80,17 @@ public function testDecisionMode() } + public function testSetDisableDeveloperUsageTracking() + { + $configData = $this->configData(); + $config = new DecisionApiConfig($configData['envId'], $configData['apiKey']); + $this->assertFalse($config->disableDeveloperUsageTracking()); + + $config->setDisableDeveloperUsageTracking(true); + $this->assertTrue($config->disableDeveloperUsageTracking()); + } + + public function testConstruct() { $configData = $this->configData(); @@ -89,11 +104,17 @@ public function testConstruct() $config->setCacheStrategy(CacheStrategy::NO_BATCHING_AND_CACHING_ON_FAILURE); $this->assertSame(CacheStrategy::NO_BATCHING_AND_CACHING_ON_FAILURE, $config->getCacheStrategy()); + /** + * @var IVisitorCacheImplementation|MockObject $visitorCacheImplementation + */ $visitorCacheImplementation = $this->getMockForAbstractClass("Flagship\Cache\IVisitorCacheImplementation"); $config->setVisitorCacheImplementation($visitorCacheImplementation); $this->assertSame($visitorCacheImplementation, $config->getVisitorCacheImplementation()); + /** + * @var IHitCacheImplementation|MockObject $hitCacheImplementation + */ $hitCacheImplementation = $this->getMockForAbstractClass("Flagship\Cache\IHitCacheImplementation"); $config->setHitCacheImplementation($hitCacheImplementation); @@ -117,6 +138,9 @@ public function testSetDecisionMode() public function testSetStatusChangedCallback() { + /** + * @var LoggerInterface|MockObject $logManagerMock + */ $logManagerMock = $this->getMockForAbstractClass('Psr\Log\LoggerInterface'); $config = new DecisionApiConfig(); @@ -125,8 +149,7 @@ public function testSetStatusChangedCallback() $this->assertNull($config->getOnSdkStatusChanged()); - $callable = function () { - }; + $callable = function () {}; $config->setOnSdkStatusChanged($callable); $this->assertSame($callable, $config->getOnSdkStatusChanged()); @@ -134,6 +157,9 @@ public function testSetStatusChangedCallback() public function testSetOnVisitorExposure() { + /** + * @var LoggerInterface|MockObject $logManagerMock + */ $logManagerMock = $this->getMockForAbstractClass('Psr\Log\LoggerInterface'); $config = new DecisionApiConfig(); @@ -142,8 +168,7 @@ public function testSetOnVisitorExposure() $this->assertNull($config->getOnVisitorExposed()); - $callable = function () { - }; + $callable = function () {}; $config->setOnVisitorExposed($callable); $this->assertSame($callable, $config->getOnVisitorExposed()); @@ -155,7 +180,7 @@ public function testJson() FlagshipField::FIELD_ENVIRONMENT_ID => 'envId', FlagshipField::FIELD_API_KEY => "apiKey", FlagshipField::FIELD_TIMEOUT => 2000, - FlagshipField::FIELD_LOG_LEVEL => LogLevel::ALL, + FlagshipField::FIELD_LOG_LEVEL => LogLevel::INFO, ]; $config = new DecisionApiConfig($data['environmentId'], $data['apiKey']); @@ -165,8 +190,14 @@ public function testJson() json_encode($data), json_encode($config) ); + + /** + * @var LoggerInterface|MockObject $logManager + */ $logManager = $this->getMockForAbstractClass("Psr\Log\LoggerInterface"); + $config->setLogManager($logManager); + $this->assertSame($logManager, $config->getLogManager()); } diff --git a/tests/Decision/ApiManagerTest.php b/tests/Decision/ApiManagerTest.php index 62fa6a11..622c2eba 100644 --- a/tests/Decision/ApiManagerTest.php +++ b/tests/Decision/ApiManagerTest.php @@ -57,73 +57,72 @@ public function testGetCampaignModifications() ); $modificationValue1 = [ - "background" => "bleu ciel", - "btnColor" => "#EE3300", - "borderColor" => null, //test modification null - 'isVip' => false, //test modification false - 'firstConnect' => true - ]; + "background" => "bleu ciel", + "btnColor" => "#EE3300", + "borderColor" => null, //test modification null + 'isVip' => false, //test modification false + 'firstConnect' => true, + ]; $modificationValue2 = [ - "key" => "variation 2", - "key2" => 1, - "key3" => 3, - "key4" => 4, - "key5" => '' //test modification empty - ]; + "key" => "variation 2", + "key2" => 1, + "key3" => 3, + "key4" => 4, + "key5" => '',//test modification empty + ]; $modificationValue3 = [ - 'key' => 'variation 3', - 'key2' => 3 - ]; + 'key' => 'variation 3', + 'key2' => 3, + ]; $mergeModification = array_merge($modificationValue1, $modificationValue2); $campaigns = [ - [ - "id" => "c1e3t1nvfu1ncqfcdco0", - "variationGroupId" => "c1e3t1nvfu1ncqfcdcp0", - "variation" => [ - "id" => "c1e3t1nvfu1ncqfcdcq0", - "modifications" => [ - "type" => "FLAG", - "value" => $modificationValue1 - ], - "reference" => false] - ], - [ - "id" => "c20j8bk3fk9hdphqtd1g", - "variationGroupId" => "c20j8bk3fk9hdphqtd2g", - "variation" => [ - "id" => "c20j9lgbcahhf2mvhbf0", - "modifications" => [ - "type" => "JSON", - "value" => $modificationValue2 - ], - "reference" => true - ] - ], - [ - "id" => "c20j8bksdfk9hdphqtd1g", - "variationGroupId" => "c2sf8bk3fk9hdphqtd2g", - "variation" => [ - "id" => "c20j9lrfcahhf2mvhbf0", - "modifications" => [ - "type" => "JSON", - "value" => $modificationValue3 - ], - "reference" => true - ] - ] - ]; + [ + "id" => "c1e3t1nvfu1ncqfcdco0", + "variationGroupId" => "c1e3t1nvfu1ncqfcdcp0", + "variation" => [ + "id" => "c1e3t1nvfu1ncqfcdcq0", + "modifications" => [ + "type" => "FLAG", + "value" => $modificationValue1, + ], + "reference" => false, + ], + ], + [ + "id" => "c20j8bk3fk9hdphqtd1g", + "variationGroupId" => "c20j8bk3fk9hdphqtd2g", + "variation" => [ + "id" => "c20j9lgbcahhf2mvhbf0", + "modifications" => [ + "type" => "JSON", + "value" => $modificationValue2, + ], + "reference" => true, + ], + ], + [ + "id" => "c20j8bksdfk9hdphqtd1g", + "variationGroupId" => "c2sf8bk3fk9hdphqtd2g", + "variation" => [ + "id" => "c20j9lrfcahhf2mvhbf0", + "modifications" => [ + "type" => "JSON", + "value" => $modificationValue3, + ], + "reference" => true, + ], + ], + ]; $visitorId = "visitorId"; $body = [ - "visitorId" => $visitorId, - "campaigns" => $campaigns - ]; + "visitorId" => $visitorId, + "campaigns" => $campaigns, + ]; - $httpPost = $httpClientMock->expects($this->exactly(2)) - ->method('post') - ->willReturn(new HttpResponse(204, $body)); + $httpPost = $httpClientMock->expects($this->exactly(2))->method('post')->willReturn(new HttpResponse(204, $body)); $config = new DecisionApiConfig("env_id", "apiKey"); $manager = new ApiManager($httpClientMock, $config); @@ -139,38 +138,37 @@ public function testGetCampaignModifications() $visitor = new VisitorDelegate(new Container(), $configManager, $visitorId, false, [], true); $postData = [ - "visitorId" => $visitor->getVisitorId(), - "anonymousId" => $visitor->getAnonymousId(), - "trigger_hit" => false, - "context" => count($visitor->getContext()) > 0 ? $visitor->getContext() : null, - "visitor_consent" => $visitor->hasConsented() - ]; + "visitorId" => $visitor->getVisitorId(), + "anonymousId" => $visitor->getAnonymousId(), + "trigger_hit" => false, + "context" => count($visitor->getContext()) > 0 ? $visitor->getContext() : null, + "visitor_consent" => $visitor->hasConsented(), + ]; $url = FlagshipConstant::BASE_API_URL . '/' . $config->getEnvId() . '/' . FlagshipConstant::URL_CAMPAIGNS . '?' . FlagshipConstant::EXPOSE_ALL_KEYS . '=true&extras[]=accountSettings'; - $httpPost - ->with( - $this->logicalOr( - $this->equalTo($url), - $this->equalTo($url) - ), - $this->logicalOr( - $this->equalTo([]), - $this->equalTo([]) - ), - $this->logicalOr( - $this->equalTo($postData), - $this->equalTo([ - "visitorId" => $visitor->getVisitorId(), - "anonymousId" => $visitor->getAnonymousId(), - "trigger_hit" => false, - "context" => count($visitor->getContext()) > 0 ? $visitor->getContext() : null, - "visitor_consent" => false - ]) - ) - ); + $httpPost->with( + $this->logicalOr( + $this->equalTo($url), + $this->equalTo($url) + ), + $this->logicalOr( + $this->equalTo([]), + $this->equalTo([]) + ), + $this->logicalOr( + $this->equalTo($postData), + $this->equalTo([ + "visitorId" => $visitor->getVisitorId(), + "anonymousId" => $visitor->getAnonymousId(), + "trigger_hit" => false, + "context" => count($visitor->getContext()) > 0 ? $visitor->getContext() : null, + "visitor_consent" => false, + ]) + ) + ); $modifications = $manager->getCampaignFlags($visitor); @@ -204,10 +202,10 @@ public function testGetCampaignModificationsWithPanicMode() $visitorId = "visitorId"; $body = [ - "visitorId" => $visitorId, - "campaigns" => [], - "panic" => true - ]; + "visitorId" => $visitorId, + "campaigns" => [], + "panic" => true, + ]; $httpClientMock->method('post')->willReturn(new HttpResponse(204, $body)); @@ -252,57 +250,58 @@ public function testGetCampaignModificationsWithSomeFailed() $httpClientMock = $this->getMockForAbstractClass('Flagship\Utils\HttpClientInterface', ['post'], "", false); $modificationValue = [ - "background" => "bleu ciel", - "btnColor" => "#EE3300", - "borderColor" => null, - 'isVip' => false, - 'firstConnect' => true, - '' => 'hello world' //Test with invalid key - ]; + "background" => "bleu ciel", + "btnColor" => "#EE3300", + "borderColor" => null, + 'isVip' => false, + 'firstConnect' => true, + '' => 'hello world',//Test with invalid key + ]; $campaigns = [ - [ - "id" => "c1e3t1nvfu1ncqfcdco0", - "variationGroupId" => "c1e3t1nvfu1ncqfcdcp0", - "variation" => [ - "id" => "c1e3t1nvfu1ncqfcdcq0", - "modifications" => [ //Test modification without Value + [ + "id" => "c1e3t1nvfu1ncqfcdco0", + "variationGroupId" => "c1e3t1nvfu1ncqfcdcp0", + "variation" => [ + "id" => "c1e3t1nvfu1ncqfcdcq0", + "modifications" => [ //Test modification without Value "type" => "FLAG", - ], - "reference" => false] - ], - [ - "id" => "c20j8bk3fk9hdphqtd1g", - "variationGroupId" => "c20j8bk3fk9hdphqtd2g", - "variation" => [ //Test Variation without modification - "id" => "c20j9lgbcahhf2mvhbf0", - "reference" => true - ] - ], - [ // Test Campaign without variation - "id" => "c20j8bksdfk9hdphqtd1g", - "variationGroupId" => "c2sf8bk3fk9hdphqtd2g", - - ], - [ - "id" => "c20j8bksdfk9hdphqtd1g", - "variationGroupId" => "c2sf8bk3fk9hdphqtd2g", - "variation" => [ - "id" => "c20j9lrfcahhf2mvhbf0", - "modifications" => [ - "type" => "JSON", - "value" => $modificationValue - ], - "reference" => true - ] - ] - ]; + ], + "reference" => false, + ], + ], + [ + "id" => "c20j8bk3fk9hdphqtd1g", + "variationGroupId" => "c20j8bk3fk9hdphqtd2g", + "variation" => [ //Test Variation without modification + "id" => "c20j9lgbcahhf2mvhbf0", + "reference" => true, + ], + ], + [ // Test Campaign without variation + "id" => "c20j8bksdfk9hdphqtd1g", + "variationGroupId" => "c2sf8bk3fk9hdphqtd2g", + + ], + [ + "id" => "c20j8bksdfk9hdphqtd1g", + "variationGroupId" => "c2sf8bk3fk9hdphqtd2g", + "variation" => [ + "id" => "c20j9lrfcahhf2mvhbf0", + "modifications" => [ + "type" => "JSON", + "value" => $modificationValue, + ], + "reference" => true, + ], + ], + ]; $visitorId = "visitorId"; $body = [ - "visitorId" => $visitorId, - "campaigns" => $campaigns - ]; + "visitorId" => $visitorId, + "campaigns" => $campaigns, + ]; $httpClientMock->method('post')->willReturn(new HttpResponse(204, $body)); @@ -349,8 +348,7 @@ public function testGetCampaignThrowException() //Mock method curl->post to throw Exception $errorMessage = "{'message': 'Forbidden'}"; - $httpClientMock->method('post') - ->willThrowException(new Exception($errorMessage, 403)); + $httpClientMock->method('post')->willThrowException(new Exception($errorMessage, 403)); $config = new DecisionApiConfig("env_id", "api_key"); @@ -373,10 +371,9 @@ public function testGetCampaignThrowException() $visitor = new VisitorDelegate(new Container(), $configManager, 'visitor_id', false, ['age' => 15], true); - $logManagerStub->expects($this->once())->method('error') - ->with( - $errorMessage - ); + $logManagerStub->expects($this->once())->method('error')->with( + $errorMessage + ); $value = $apiManager->getCampaigns($visitor); diff --git a/tests/Decision/BucketingManagerTest.php b/tests/Decision/BucketingManagerTest.php index f50a4eef..3b83f12c 100644 --- a/tests/Decision/BucketingManagerTest.php +++ b/tests/Decision/BucketingManagerTest.php @@ -4,21 +4,23 @@ use DateTime; use Exception; -use Flagship\Config\BucketingConfig; -use Flagship\Enum\FlagshipConstant; -use Flagship\Enum\FlagshipField; -use Flagship\Enum\TroubleshootingLabel; -use Flagship\Model\HttpResponse; -use Flagship\Utils\ConfigManager; +use ReflectionException; +use Flagship\Utils\Utils; +use Psr\Log\LoggerInterface; use Flagship\Utils\Container; use Flagship\Utils\HttpClient; use Flagship\Utils\MurmurHash; -use Flagship\Utils\Utils; +use PHPUnit\Framework\TestCase; +use Flagship\Enum\FlagshipField; +use Flagship\Model\HttpResponse; +use Flagship\Utils\ConfigManager; +use Flagship\Enum\FlagshipConstant; +use Flagship\Config\BucketingConfig; use Flagship\Visitor\DefaultStrategy; use Flagship\Visitor\VisitorDelegate; use Flagship\Visitor\StrategyAbstract; -use PHPUnit\Framework\TestCase; -use ReflectionException; +use Flagship\Enum\TroubleshootingLabel; +use PHPUnit\Framework\MockObject\MockObject; class BucketingManagerTest extends TestCase { @@ -35,32 +37,22 @@ public function testGetCampaignModification() $bucketingManager->setFlagshipInstanceId("flagship_instance_id"); $bucketingManager->setTrackingManager($trackingManagerMock); $visitorId = "visitor_1"; - $visitorContext = [ - "age" => 20 - ]; + $visitorContext = ["age" => 20]; $container = new Container(); - $configManager = $this->getMockBuilder(ConfigManager::class) - ->disableOriginalConstructor() - ->getMock(); + $configManager = $this->getMockBuilder(ConfigManager::class)->disableOriginalConstructor()->getMock(); $configManager->setConfig($config); - $visitor = $this->getMockBuilder(VisitorDelegate::class) - ->setConstructorArgs([$container, $configManager, $visitorId, false, $visitorContext, true]) - ->onlyMethods(["sendHit"]) - ->getMock(); + $visitor = $this->getMockBuilder(VisitorDelegate::class)->setConstructorArgs([$container, $configManager, $visitorId, false, $visitorContext, true])->onlyMethods(["sendHit"])->getMock(); $bucketingFile = \file_get_contents(__DIR__ . '/bucketing.json'); - $httpClientMock->expects($this->exactly(6)) - ->method('get') - ->with($bucketingUrl) - ->willReturnOnConsecutiveCalls( - new HttpResponse(204, null), - new HttpResponse(204, json_decode('{"panic": true}', true)), - new HttpResponse(204, json_decode('{}', true)), - new HttpResponse(204, json_decode('{"campaigns":[{}]}', true)), - new HttpResponse(204, json_decode('{"notExistKey": false}', true)), - new HttpResponse(204, json_decode($bucketingFile, true)) - ); + $httpClientMock->expects($this->exactly(6))->method('get')->with($bucketingUrl)->willReturnOnConsecutiveCalls( + new HttpResponse(204, null), + new HttpResponse(204, json_decode('{"panic": true}', true)), + new HttpResponse(204, json_decode('{}', true)), + new HttpResponse(204, json_decode('{"campaigns":[{}]}', true)), + new HttpResponse(204, json_decode('{"notExistKey": false}', true)), + new HttpResponse(204, json_decode($bucketingFile, true)) + ); //Test File not exist $campaigns = $bucketingManager->getCampaignFlags($visitor); @@ -79,27 +71,27 @@ public function testGetCampaignModification() //Test campaign[FIELD_VARIATION_GROUPS] - $campaigns = $bucketingManager->getCampaignFlags($visitor); + $campaigns = $bucketingManager->getCampaignFlags($visitor); - $this->assertCount(0, $campaigns); + $this->assertCount(0, $campaigns); - // + // - $campaigns = $bucketingManager->getCampaignFlags($visitor); + $campaigns = $bucketingManager->getCampaignFlags($visitor); - $this->assertCount(0, $campaigns); + $this->assertCount(0, $campaigns); - // - $campaigns = $bucketingManager->getCampaignFlags($visitor); + // + $campaigns = $bucketingManager->getCampaignFlags($visitor); - $this->assertCount(6, $campaigns); + $this->assertCount(6, $campaigns); - //test invalid bucketing file url + //test invalid bucketing file url - $config->setSyncAgentUrl(""); - $campaigns = $bucketingManager->getCampaignFlags($visitor); + $config->setSyncAgentUrl(""); + $campaigns = $bucketingManager->getCampaignFlags($visitor); - $this->assertCount(0, $campaigns); + $this->assertCount(0, $campaigns); } /** @@ -118,44 +110,30 @@ public function testGetTroubleshootingData() $bucketingManager->setFlagshipInstanceId("flagship_instance_id"); $bucketingManager->setTrackingManager($trackingManagerMock); $visitorId = "visitor_1"; - $visitorContext = [ - "age" => 20 - ]; + $visitorContext = ["age" => 20]; $container = new Container(); - $configManager = $this->getMockBuilder(ConfigManager::class) - ->disableOriginalConstructor() - ->getMock(); + $configManager = $this->getMockBuilder(ConfigManager::class)->disableOriginalConstructor()->getMock(); - $visitor = $this->getMockBuilder(VisitorDelegate::class) - ->setConstructorArgs([$container, $configManager, $visitorId, false, $visitorContext, true]) - ->onlyMethods(["sendHit"]) - ->getMock(); + $visitor = $this->getMockBuilder(VisitorDelegate::class)->setConstructorArgs([$container, $configManager, $visitorId, false, $visitorContext, true])->onlyMethods(["sendHit"])->getMock(); $bucketingFile = \file_get_contents(__DIR__ . '/bucketing.json'); $bucketingContent = json_decode($bucketingFile, true); $troubleshooting = [ - "startDate" => "2023-04-13T09:33:38.049Z", - "endDate" => "2023-04-13T10:03:38.049Z", - "timezone" => "Europe/Paris", - "traffic" => 40 - ]; - $bucketingContent["accountSettings"] = [ - "troubleshooting" => $troubleshooting - ]; + "startDate" => "2023-04-13T09:33:38.049Z", + "endDate" => "2023-04-13T10:03:38.049Z", + "timezone" => "Europe/Paris", + "traffic" => 40, + ]; + $bucketingContent["accountSettings"] = ["troubleshooting" => $troubleshooting]; $matcher = $this->exactly(1); - $trackingManagerMock->expects($matcher) - ->method('addTroubleshootingHit') - ->with($this->callback(function ($param) use ($matcher) { + $trackingManagerMock->expects($matcher)->method('addTroubleshootingHit')->with($this->callback(function ($param) use ($matcher) { return $param->getLabel() === TroubleshootingLabel::SDK_BUCKETING_FILE; - })); + })); - $httpClientMock->expects($this->exactly(1)) - ->method('get') - ->with($bucketingUrl) - ->willReturnOnConsecutiveCalls( - new HttpResponse(204, $bucketingContent) - ); + $httpClientMock->expects($this->exactly(1))->method('get')->with($bucketingUrl)->willReturnOnConsecutiveCalls( + new HttpResponse(204, $bucketingContent) + ); $bucketingManager->getCampaignFlags($visitor); @@ -171,7 +149,7 @@ public function testGetTroubleshootingData() public function testSendContext() { $logManagerStub = $this->getMockForAbstractClass( - 'Psr\Log\LoggerInterface', + LoggerInterface::class, ['error'], '', false @@ -179,7 +157,10 @@ public function testSendContext() $httpClientMock = $this->getMockForAbstractClass( 'Flagship\Utils\HttpClientInterface', - ['post', 'get'], + [ + 'post', + 'get', + ], "", false ); @@ -199,7 +180,7 @@ public function testSendContext() $containerGetMethod = function ($arg1, $arg2) { - return new DefaultStrategy($arg2[0]); + return new DefaultStrategy($arg2[0]); }; $containerMock->method('get')->will($this->returnCallback($containerGetMethod)); @@ -208,13 +189,13 @@ public function testSendContext() $visitorId = "visitor_1"; $visitorContext = [ - "age" => 20, - "sdk_osName" => PHP_OS, - "sdk_deviceType" => "server", - FlagshipConstant::FS_CLIENT => FlagshipConstant::SDK_LANGUAGE, - FlagshipConstant::FS_VERSION => FlagshipConstant::SDK_VERSION, - FlagshipConstant::FS_USERS => $visitorId, - ]; + "age" => 20, + "sdk_osName" => PHP_OS, + "sdk_deviceType" => "server", + FlagshipConstant::FS_CLIENT => FlagshipConstant::SDK_LANGUAGE, + FlagshipConstant::FS_VERSION => FlagshipConstant::SDK_VERSION, + FlagshipConstant::FS_USERS => $visitorId, + ]; $bucketingUrl = "http:127.0.0.1:3000"; @@ -227,22 +208,38 @@ public function testSendContext() $bucketingManager->setTrackingManager($trackingManagerMock); + /** + * @var MockObject|ConfigManager $configManager + */ $configManager = $this->getMockBuilder(ConfigManager::class) ->disableOriginalConstructor() ->getMock(); + $configManager->setConfig($config)->setTrackingManager($trackerManager); + + + /** + * @var MockObject|VisitorDelegate $visitor + */ $visitor = $this->getMockBuilder(VisitorDelegate::class) ->setConstructorArgs([$containerMock, $configManager, $visitorId, false, $visitorContext, true]) ->onlyMethods(["sendHit"]) ->getMock(); - $httpClientMock->expects($this->exactly(2)) + $httpClientMock->expects($this->exactly(4)) ->method('get') ->willReturn( new HttpResponse(204, json_decode('{"campaigns":[{}]}', true)) ); - $visitor->expects($this->exactly(1))->method("sendHit"); + $visitor->expects($this->exactly(2))->method("sendHit"); + + $bucketingManager->getCampaignFlags($visitor); + + $bucketingManager->getCampaignFlags($visitor); + + $visitor->updateContext("new_context", "new_value"); + $bucketingManager->getCampaignFlags($visitor); @@ -264,9 +261,7 @@ public function testGetVariation() $visitorId = "123456"; $container = new Container(); - $configManager = $this->getMockBuilder(ConfigManager::class) - ->disableOriginalConstructor() - ->getMock(); + $configManager = $this->getMockBuilder(ConfigManager::class)->disableOriginalConstructor()->getMock(); $configManager->setConfig($config); $visitor = new VisitorDelegate($container, $configManager, $visitorId, false, [], true); @@ -279,59 +274,137 @@ public function testGetVariation() //Test key id in variationGroup $variations = [ - [ - "id" => "c20j8bk3fk9hdphqtd30", - "name" => "variation1", - "modifications" => [ - "type" => "HTML", - "value" => [ - "my_html" => "
\n

Original

\n
" - ] - ], - "allocation" => 34, - "reference" => true - ], - [ - "id" => "c20j8bk3fk9hdphqtd3g", - "name" => "variation2", - "modifications" => [ - "type" => "HTML", - "value" => [ - "my_html" => "
\n

variation 1

\n
" - ] - ], - "allocation" => 33 - ], - [ - "id" => "c20j9lgbcahhf2mvhbf0", - "name" => "variation3", - "modifications" => [ - "type" => "HTML", - "value" => [ - "my_html" => "
\n

variation 2

\n
" - ] - ], - "allocation" => 33 - ] - ]; + [ + "id" => "c20j8bk3fk9hdphqtd30", + "name" => "variation1", + "modifications" => [ + "type" => "HTML", + "value" => ["my_html" => "
\n

Original

\n
"], + ], + "allocation" => 34, + "reference" => true, + ], + [ + "id" => "c20j8bk3fk9hdphqtd3g", + "name" => "variation2", + "modifications" => [ + "type" => "HTML", + "value" => ["my_html" => "
\n

variation 1

\n
"], + ], + "allocation" => 33, + ], + [ + "id" => "c20j9lgbcahhf2mvhbf0", + "name" => "variation3", + "modifications" => [ + "type" => "HTML", + "value" => ["my_html" => "
\n

variation 2

\n
"], + ], + "allocation" => 33, + ], + ]; $variationGroups = [ - FlagshipField::FIELD_ID => "9273BKSDJtoto", - FlagshipField::FIELD_VARIATIONS => $variations, - FlagshipField::FIELD_NANE => "varGroupName" - ]; + FlagshipField::FIELD_ID => "9273BKSDJtoto", + FlagshipField::FIELD_VARIATIONS => $variations, + FlagshipField::FIELD_NANE => "varGroupName", + ]; $variation = $getVariationMethod->invoke($bucketingManager, $variationGroups, $visitor); $this->assertSame($variations[0]['id'], $variation['id']); $variationGroups = [ - FlagshipField::FIELD_ID => "vgidéééà", - FlagshipField::FIELD_VARIATIONS => $variations - ]; + FlagshipField::FIELD_ID => "vgidéééà", + FlagshipField::FIELD_VARIATIONS => $variations, + ]; $visitorId = 'ëééééé'; $visitor->setVisitorId($visitorId); $variation = $getVariationMethod->invoke($bucketingManager, $variationGroups, $visitor); $this->assertSame($variations[2]['id'], $variation['id']); //Test realloc + $realloCvariations = [ + [ + "id" => "c20j8bk3fk9hdphqtd30", + "name" => "variation1", + "modifications" => [ + "type" => "HTML", + "value" => ["my_html" => "
\n

Original

\n
"], + ], + "allocation" => 100, + "reference" => true, + ], + [ + "id" => "c20j8bk3fk9hdphqtd3g", + "name" => "variation2", + "modifications" => [ + "type" => "HTML", + "value" => ["my_html" => "
\n

variation 1

\n
"], + ], + "allocation" => 0, + ], + [ + "id" => "c20j9lgbcahhf2mvhbf0", + "name" => "variation2", + "modifications" => [ + "type" => "HTML", + "value" => ["my_html" => "
\n

variation 2

\n
"], + ], + "allocation" => 0, + ], + ]; + + + $variationGroups = [ + FlagshipField::FIELD_ID => "9273BKSDJtoto", + FlagshipField::FIELD_VARIATIONS => $realloCvariations, + ]; + $assignmentsHistory = ["9273BKSDJtoto" => "c20j9lgbcahhf2mvhbf0"]; + $visitorCache = [ + StrategyAbstract::VERSION => 1, + StrategyAbstract::DATA => [StrategyAbstract::ASSIGNMENTS_HISTORY => $assignmentsHistory], + ]; + + $visitor->visitorCache = $visitorCache; + + $variation = $getVariationMethod->invoke($bucketingManager, $variationGroups, $visitor); + + $this->assertSame($realloCvariations[2]['id'], $variation['id']); + + //Test deleted variation + + $reallovariations = [ + [ + "id" => "c20j8bk3fk9hdphqtd30", + "modifications" => [ + "type" => "HTML", + "value" => ["my_html" => "
\n

Original

\n
"], + ], + "allocation" => 50, + "reference" => true, + ], + [ + "id" => "c20j8bk3fk9hdphqtd3g", + "modifications" => [ + "type" => "HTML", + "value" => ["my_html" => "
\n

variation 1

\n
"], + ], + "allocation" => 50, + ], + ]; + + + $variationGroups = [ + FlagshipField::FIELD_ID => "9273BKSDJtoto", + FlagshipField::FIELD_VARIATIONS => $reallovariations, + ]; + + + $visitor->visitorCache = $visitorCache; + + $variation = $getVariationMethod->invoke($bucketingManager, $variationGroups, $visitor); + + $this->assertCount(0, $variation); + + // $realloCvariations = [ [ "id" => "c20j8bk3fk9hdphqtd30", @@ -342,7 +415,7 @@ public function testGetVariation() "my_html" => "
\n

Original

\n
" ] ], - "allocation" => 100, + "allocation" => 0, "reference" => true ], [ @@ -365,7 +438,7 @@ public function testGetVariation() "my_html" => "
\n

variation 2

\n
" ] ], - "allocation" => 0 + "allocation" => 100 ] ]; @@ -374,7 +447,7 @@ public function testGetVariation() FlagshipField::FIELD_ID => "9273BKSDJtoto", FlagshipField::FIELD_VARIATIONS => $realloCvariations ]; - $assignmentsHistory = ["9273BKSDJtoto" => "c20j9lgbcahhf2mvhbf0"]; + $assignmentsHistory = []; $visitorCache = [ StrategyAbstract::VERSION => 1, StrategyAbstract::DATA => [ @@ -386,46 +459,9 @@ public function testGetVariation() $variation = $getVariationMethod->invoke($bucketingManager, $variationGroups, $visitor); + $this->assertNotSame($realloCvariations[0]['id'], $variation['id']); + $this->assertNotSame($realloCvariations[1]['id'], $variation['id']); $this->assertSame($realloCvariations[2]['id'], $variation['id']); - - //Test deleted variation - - $reallovariations = [ - [ - "id" => "c20j8bk3fk9hdphqtd30", - "modifications" => [ - "type" => "HTML", - "value" => [ - "my_html" => "
\n

Original

\n
" - ] - ], - "allocation" => 50, - "reference" => true - ], - [ - "id" => "c20j8bk3fk9hdphqtd3g", - "modifications" => [ - "type" => "HTML", - "value" => [ - "my_html" => "
\n

variation 1

\n
" - ] - ], - "allocation" => 50 - ] - ]; - - - $variationGroups = [ - FlagshipField::FIELD_ID => "9273BKSDJtoto", - FlagshipField::FIELD_VARIATIONS => $reallovariations - ]; - - - $visitor->visitorCache = $visitorCache; - - $variation = $getVariationMethod->invoke($bucketingManager, $variationGroups, $visitor); - - $this->assertCount(0, $variation); } /** @@ -438,13 +474,9 @@ public function testIsMatchTargeting() $config = new BucketingConfig($bucketingUrl); $bucketingManager = new BucketingManager(new HttpClient(), $config, $murmurhash); $visitorId = "visitor_3"; - $visitorContext = [ - "age" => 20 - ]; + $visitorContext = ["age" => 20]; $container = new Container(); - $configManager = $this->getMockBuilder(ConfigManager::class) - ->disableOriginalConstructor() - ->getMock(); + $configManager = $this->getMockBuilder(ConfigManager::class)->disableOriginalConstructor()->getMock(); $configManager->setConfig($config); $visitor = new VisitorDelegate($container, $configManager, $visitorId, false, $visitorContext, true); @@ -458,42 +490,38 @@ public function testIsMatchTargeting() //Test key targetingGroups in targeting $variationGroup = [ - FlagshipField::FIELD_TARGETING => [ - - ] + FlagshipField::FIELD_TARGETING => [] ]; $output = $isMatchTargetingMethod->invoke($bucketingManager, $variationGroup, $visitor); $this->assertFalse($output); //Test key targetings in targetingGroups $variationGroup = [ - FlagshipField::FIELD_TARGETING => [ - FlagshipField::FIELD_TARGETING_GROUPS => [ - [] - ] - ] - ]; + FlagshipField::FIELD_TARGETING => [ + FlagshipField::FIELD_TARGETING_GROUPS => [ + [], + ], + ], + ]; $output = $isMatchTargetingMethod->invoke($bucketingManager, $variationGroup, $visitor); $this->assertFalse($output); //Test not matching targetings $targetings = [ - "key" => "age", - "operator" => "EQUALS", - 'value' => 21 - ]; + "key" => "age", + "operator" => "EQUALS", + 'value' => 21, + ]; $variationGroup = [ - FlagshipField::FIELD_TARGETING => [ - FlagshipField::FIELD_TARGETING_GROUPS => [ - [ - FlagshipField::FIELD_TARGETINGS => [ - $targetings - ] - ] - ] - ] - ]; + FlagshipField::FIELD_TARGETING => [ + FlagshipField::FIELD_TARGETING_GROUPS => [ + [ + FlagshipField::FIELD_TARGETINGS => [$targetings], + ], + ], + ], + ]; $output = $isMatchTargetingMethod->invoke($bucketingManager, $variationGroup, $visitor); $this->assertFalse($output); @@ -501,22 +529,20 @@ public function testIsMatchTargeting() //Test matching targetings $targetings2 = [ - "key" => "age", - "operator" => "EQUALS", - 'value' => 20 - ]; + "key" => "age", + "operator" => "EQUALS", + 'value' => 20, + ]; $variationGroup = [ - FlagshipField::FIELD_TARGETING => [ - FlagshipField::FIELD_TARGETING_GROUPS => [ - [ - FlagshipField::FIELD_TARGETINGS => [ - $targetings2 - ] - ] - ] - ] - ]; + FlagshipField::FIELD_TARGETING => [ + FlagshipField::FIELD_TARGETING_GROUPS => [ + [ + FlagshipField::FIELD_TARGETINGS => [$targetings2], + ], + ], + ], + ]; $output = $isMatchTargetingMethod->invoke($bucketingManager, $variationGroup, $visitor); $this->assertTrue($output); @@ -525,38 +551,32 @@ public function testIsMatchTargeting() //Test Many targetingGroups with one match $targetings2 = [ - "key" => "age", - "operator" => "EQUALS", - 'value' => 22 - ]; + "key" => "age", + "operator" => "EQUALS", + 'value' => 22, + ]; $targetingAllUsers = [ - "key" => "fs_all_users", - "operator" => "EQUALS", - 'value' => '' - ]; + "key" => "fs_all_users", + "operator" => "EQUALS", + 'value' => '', + ]; $variationGroup = [ - FlagshipField::FIELD_TARGETING => [ - FlagshipField::FIELD_TARGETING_GROUPS => [ - [ - FlagshipField::FIELD_TARGETINGS => [ - $targetings - ] - ], - [ - FlagshipField::FIELD_TARGETINGS => [ - $targetings2 - ] - ], - [ - FlagshipField::FIELD_TARGETINGS => [ - $targetingAllUsers - ] - ] - ] - ] - ]; + FlagshipField::FIELD_TARGETING => [ + FlagshipField::FIELD_TARGETING_GROUPS => [ + [ + FlagshipField::FIELD_TARGETINGS => [$targetings], + ], + [ + FlagshipField::FIELD_TARGETINGS => [$targetings2], + ], + [ + FlagshipField::FIELD_TARGETINGS => [$targetingAllUsers], + ], + ], + ], + ]; $output = $isMatchTargetingMethod->invoke($bucketingManager, $variationGroup, $visitor); $this->assertTrue($output); @@ -564,26 +584,20 @@ public function testIsMatchTargeting() //Test Many targetingGroups with all false $variationGroup = [ - FlagshipField::FIELD_TARGETING => [ - FlagshipField::FIELD_TARGETING_GROUPS => [ - [ - FlagshipField::FIELD_TARGETINGS => [ - $targetings - ] - ], - [ - FlagshipField::FIELD_TARGETINGS => [ - $targetings2 - ] - ], - [ - FlagshipField::FIELD_TARGETINGS => [ - $targetings2 - ] - ] - ] - ] - ]; + FlagshipField::FIELD_TARGETING => [ + FlagshipField::FIELD_TARGETING_GROUPS => [ + [ + FlagshipField::FIELD_TARGETINGS => [$targetings], + ], + [ + FlagshipField::FIELD_TARGETINGS => [$targetings2], + ], + [ + FlagshipField::FIELD_TARGETINGS => [$targetings2], + ], + ], + ], + ]; $output = $isMatchTargetingMethod->invoke($bucketingManager, $variationGroup, $visitor); $this->assertFalse($output); @@ -599,13 +613,9 @@ public function testCheckAndTargeting() $config = new BucketingConfig($bucketingUrl); $bucketingManager = new BucketingManager(new HttpClient(), $config, $murmurhash); $visitorId = "visitor_3"; - $visitorContext = [ - "age" => 20 - ]; + $visitorContext = ["age" => 20]; $container = new Container(); - $configManager = $this->getMockBuilder(ConfigManager::class) - ->disableOriginalConstructor() - ->getMock(); + $configManager = $this->getMockBuilder(ConfigManager::class)->disableOriginalConstructor()->getMock(); $configManager->setConfig($config); $visitor = new VisitorDelegate($container, $configManager, $visitorId, false, $visitorContext, true); @@ -613,17 +623,17 @@ public function testCheckAndTargeting() //test key = fs_all_users $targetingAllUsers = [ - "key" => "fs_all_users", - "operator" => "EQUALS", - 'value' => '' - ]; + "key" => "fs_all_users", + "operator" => "EQUALS", + 'value' => '', + ]; $innerTargetings = [$targetingAllUsers]; $output = $checkAndTargetingMethod->invoke($bucketingManager, $innerTargetings, $visitor); $this->assertTrue($output); //test key = fs_all_users and not match key - $innerTargetings = [$targetingAllUsers,[ + $innerTargetings = [$targetingAllUsers, [ "key" => "anyValue", "operator" => "EQUALS", 'value' => '' @@ -633,7 +643,7 @@ public function testCheckAndTargeting() //Test operator EXISTS when context doesn't exist - $innerTargetingsExists = [$targetingAllUsers,[ + $innerTargetingsExists = [$targetingAllUsers, [ "operator" => "EXISTS", "key" => "mixpanel::city", "value" => true, @@ -650,7 +660,7 @@ public function testCheckAndTargeting() //Test operator NOT_EXISTS when context exists - $innerTargetingsExists = [$targetingAllUsers,[ + $innerTargetingsExists = [$targetingAllUsers, [ "operator" => "NOT_EXISTS", "key" => "mixpanel::city", "value" => true, @@ -662,7 +672,7 @@ public function testCheckAndTargeting() //Test operator NOT_EXISTS when context doesn't exist - $innerTargetingsExists = [$targetingAllUsers,[ + $innerTargetingsExists = [$targetingAllUsers, [ "operator" => "NOT_EXISTS", "key" => "mixpanel::genre", "value" => true, @@ -673,10 +683,10 @@ public function testCheckAndTargeting() //test key = fs_users $targetingFsUsers = [ - "key" => "fs_users", - "operator" => "EQUALS", - 'value' => $visitorId - ]; + "key" => "fs_users", + "operator" => "EQUALS", + 'value' => $visitorId, + ]; $innerTargetings = [$targetingFsUsers]; $output = $checkAndTargetingMethod->invoke($bucketingManager, $innerTargetings, $visitor); @@ -684,10 +694,10 @@ public function testCheckAndTargeting() //test key not match context $targetingKeyContext = [ - "key" => "anyKey", - "operator" => "EQUALS", - 'value' => "anyValue" - ]; + "key" => "anyKey", + "operator" => "EQUALS", + 'value' => "anyValue", + ]; $innerTargetings = [$targetingKeyContext]; $output = $checkAndTargetingMethod->invoke($bucketingManager, $innerTargetings, $visitor); @@ -695,10 +705,10 @@ public function testCheckAndTargeting() //test key match context $targetingKeyContext = [ - "key" => "age", - "operator" => "EQUALS", - 'value' => 20 - ]; + "key" => "age", + "operator" => "EQUALS", + 'value' => 20, + ]; $innerTargetings = [$targetingKeyContext]; $output = $checkAndTargetingMethod->invoke($bucketingManager, $innerTargetings, $visitor); @@ -706,10 +716,10 @@ public function testCheckAndTargeting() //test key match context with different value $targetingKeyContext2 = [ - "key" => "age", - "operator" => "EQUALS", - 'value' => 21 - ]; + "key" => "age", + "operator" => "EQUALS", + 'value' => 21, + ]; $innerTargetings = [$targetingKeyContext2]; $output = $checkAndTargetingMethod->invoke($bucketingManager, $innerTargetings, $visitor); @@ -717,12 +727,20 @@ public function testCheckAndTargeting() //And logic //All true - $innerTargetings = [$targetingAllUsers, $targetingFsUsers, $targetingKeyContext]; + $innerTargetings = [ + $targetingAllUsers, + $targetingFsUsers, + $targetingKeyContext, + ]; $output = $checkAndTargetingMethod->invoke($bucketingManager, $innerTargetings, $visitor); $this->assertTrue($output); //Test one false - $innerTargetings = [$targetingAllUsers, $targetingFsUsers, $targetingKeyContext2]; + $innerTargetings = [ + $targetingAllUsers, + $targetingFsUsers, + $targetingKeyContext2, + ]; $output = $checkAndTargetingMethod->invoke($bucketingManager, $innerTargetings, $visitor); $this->assertFalse($output); } @@ -737,9 +755,7 @@ public function testOperator() $config = new BucketingConfig($bucketingUrl); $bucketingManager = new BucketingManager(new HttpClient(), $config, $murmurhash); - $configManager = $this->getMockBuilder(ConfigManager::class) - ->disableOriginalConstructor() - ->getMock(); + $configManager = $this->getMockBuilder(ConfigManager::class)->disableOriginalConstructor()->getMock(); $configManager->setConfig($config); $testOperatorMethod = Utils::getMethod(BucketingManager::class, "testOperator"); @@ -765,7 +781,7 @@ public function testOperator() $this->assertTrue($output); - $targetingValue = [5,1,2,3]; + $targetingValue = [5, 1, 2, 3]; $output = $testOperatorMethod->invoke($bucketingManager, 'EQUALS', $contextValue, $targetingValue); $this->assertTrue($output); @@ -778,7 +794,7 @@ public function testOperator() $this->assertTrue($output); - $targetingValue = [6,1,2,3]; + $targetingValue = [6, 1, 2, 3]; $output = $testOperatorMethod->invoke($bucketingManager, 'NOT_EQUALS', $contextValue, $targetingValue); $this->assertTrue($output); @@ -794,7 +810,7 @@ public function testOperator() $output = $testOperatorMethod->invoke($bucketingManager, 'NOT_EQUALS', $contextValue, $targetingValue); $this->assertFalse($output); - $targetingValue = [1,2,3,5,6]; + $targetingValue = [1, 2, 3, 5, 6]; $output = $testOperatorMethod->invoke($bucketingManager, 'NOT_EQUALS', $contextValue, $targetingValue); $this->assertFalse($output); @@ -802,19 +818,34 @@ public function testOperator() //Test contextValue not contains targetingValue - $targetingValue = [8, 7, 4, 1]; + $targetingValue = [ + 8, + 7, + 4, + 1, + ]; $output = $testOperatorMethod->invoke($bucketingManager, 'CONTAINS', $contextValue, $targetingValue); $this->assertFalse($output); //Test contextValue contains targetingValue - $targetingValue = [8, 7, 5, 1]; + $targetingValue = [ + 8, + 7, + 5, + 1, + ]; $output = $testOperatorMethod->invoke($bucketingManager, 'CONTAINS', $contextValue, $targetingValue); $this->assertTrue($output); //Test contextValue contains targetingValue $contextValue = "nopq_hij"; - $targetingValue = ["abc", "dfg", "hij", "klm"]; + $targetingValue = [ + "abc", + "dfg", + "hij", + "klm", + ]; $output = $testOperatorMethod->invoke($bucketingManager, 'CONTAINS', $contextValue, $targetingValue); $this->assertTrue($output); @@ -834,19 +865,34 @@ public function testOperator() //Test contextValue not contains targetingValue $contextValue = 5; - $targetingValue = [8, 7, 4, 1]; + $targetingValue = [ + 8, + 7, + 4, + 1, + ]; $output = $testOperatorMethod->invoke($bucketingManager, 'NOT_CONTAINS', $contextValue, $targetingValue); $this->assertTrue($output); //Test contextValue contains targetingValue - $targetingValue = [8, 7, 5, 1]; + $targetingValue = [ + 8, + 7, + 5, + 1, + ]; $output = $testOperatorMethod->invoke($bucketingManager, 'NOT_CONTAINS', $contextValue, $targetingValue); $this->assertFalse($output); //Test contextValue contains targetingValue $contextValue = "nopq_hij"; - $targetingValue = ["abc", "dfg", "hij", "klm"]; + $targetingValue = [ + "abc", + "dfg", + "hij", + "klm", + ]; $output = $testOperatorMethod->invoke($bucketingManager, 'NOT_CONTAINS', $contextValue, $targetingValue); $this->assertFalse($output); @@ -1059,7 +1105,10 @@ public function testGetThirdPartySegment() false, false, true, - ['post', 'get'] + [ + 'post', + 'get', + ] ); $logManagerStub = $this->getMockForAbstractClass( @@ -1077,89 +1126,77 @@ public function testGetThirdPartySegment() $bucketingUrl = "127.0.0.1:3000"; $murmurhash = new MurmurHash(); $config = new BucketingConfig($bucketingUrl); - $config->setEnvId("env_id") - ->setFetchThirdPartyData(true) - ->setLogManager($logManagerStub); + $config->setEnvId("env_id")->setFetchThirdPartyData(true)->setLogManager($logManagerStub); $bucketingManager = new BucketingManager($httpClientMock, $config, $murmurhash); $bucketingManager->setFlagshipInstanceId("instance_id"); $bucketingManager->setTrackingManager($trackingManagerMock); $visitorId = "visitor_1"; - $visitorContext = [ - "age" => 20 - ]; + $visitorContext = ["age" => 20]; $container = new Container(); - $configManager = $this->getMockBuilder(ConfigManager::class) - ->disableOriginalConstructor() - ->getMock(); + $configManager = $this->getMockBuilder(ConfigManager::class)->disableOriginalConstructor()->getMock(); $configManager->setConfig($config); - $visitor = $this->getMockBuilder(VisitorDelegate::class) - ->setConstructorArgs([$container, $configManager, $visitorId, false, $visitorContext, true]) - ->onlyMethods(["sendHit"]) - ->getMock(); + $visitor = $this->getMockBuilder(VisitorDelegate::class)->setConstructorArgs([$container, $configManager, $visitorId, false, $visitorContext, true])->onlyMethods(["sendHit"])->getMock(); $segments = [ - [ - 'visitor_id' => 'wonderful_visitor_1', - 'segment' => 'gender', - 'value' => '', - 'expiration' => 1689771307, - 'partner' => 'facebook', - ], - [ - 'visitor_id' => 'wonderful_visitor_1', - 'segment' => 'generation', - 'value' => '', - 'expiration' => 1689771307, - 'partner' => 'facebook', - ], - [ - 'visitor_id' => 'wonderful_visitor_1', - 'segment' => 'city', - 'value' => 'london', - 'expiration' => 1689771117, - 'partner' => 'mixpanel', - ], - [ - 'visitor_id' => 'wonderful_visitor_1', - 'segment' => 'device', - 'value' => 'firefox', - 'expiration' => 1689771117, - 'partner' => 'mixpanel', - ], - [ - 'visitor_id' => 'wonderful_visitor_1', - 'segment' => 'gender', - 'value' => 'female', - 'expiration' => 1689771007, - 'partner' => 'segmentio', - ], - [ - 'visitor_id' => 'wonderful_visitor_1', - 'segment' => 'generation', - 'value' => 'gen-z', - 'expiration' => 1689771007, - 'partner' => 'segmentio', - ], - ]; + [ + 'visitor_id' => 'wonderful_visitor_1', + 'segment' => 'gender', + 'value' => '', + 'expiration' => 1689771307, + 'partner' => 'facebook', + ], + [ + 'visitor_id' => 'wonderful_visitor_1', + 'segment' => 'generation', + 'value' => '', + 'expiration' => 1689771307, + 'partner' => 'facebook', + ], + [ + 'visitor_id' => 'wonderful_visitor_1', + 'segment' => 'city', + 'value' => 'london', + 'expiration' => 1689771117, + 'partner' => 'mixpanel', + ], + [ + 'visitor_id' => 'wonderful_visitor_1', + 'segment' => 'device', + 'value' => 'firefox', + 'expiration' => 1689771117, + 'partner' => 'mixpanel', + ], + [ + 'visitor_id' => 'wonderful_visitor_1', + 'segment' => 'gender', + 'value' => 'female', + 'expiration' => 1689771007, + 'partner' => 'segmentio', + ], + [ + 'visitor_id' => 'wonderful_visitor_1', + 'segment' => 'generation', + 'value' => 'gen-z', + 'expiration' => 1689771007, + 'partner' => 'segmentio', + ], + ]; $segmentUrl = sprintf(FlagshipConstant::THIRD_PARTY_SEGMENT_URL, $config->getEnvId(), $visitorId); $campaigns = ["campaigns" => []]; $matcher = $this->exactly(2); - $httpClientMock->expects($matcher) - ->method("get") - ->with( - $this->logicalOr( - $this->equalTo($bucketingUrl), - $this->equalTo($segmentUrl) - ), - $this->equalTo([]) - ) - ->willReturnOnConsecutiveCalls(new HttpResponse(200, $campaigns, []), new HttpResponse(200, $segments, [])); + $httpClientMock->expects($matcher)->method("get")->with( + $this->logicalOr( + $this->equalTo($bucketingUrl), + $this->equalTo($segmentUrl) + ), + $this->equalTo([]) + )->willReturnOnConsecutiveCalls(new HttpResponse(200, $campaigns, []), new HttpResponse(200, $segments, [])); $bucketingManager->getCampaigns($visitor); $context = $visitor->getContext(); @@ -1180,7 +1217,10 @@ public function testGetThirdPartySegmentException() false, false, true, - ['post', 'get'] + [ + 'post', + 'get', + ] ); $logManagerStub = $this->getMockForAbstractClass( @@ -1198,47 +1238,36 @@ public function testGetThirdPartySegmentException() $bucketingUrl = "127.0.0.1:3000"; $murmurhash = new MurmurHash(); $config = new BucketingConfig($bucketingUrl); - $config->setEnvId("env_id") - ->setFetchThirdPartyData(true); + $config->setEnvId("env_id")->setFetchThirdPartyData(true); $bucketingManager = new BucketingManager($httpClientMock, $config, $murmurhash); $bucketingManager->setTrackingManager($trackingManagerMock); $bucketingManager->setFlagshipInstanceId("instance_id"); $visitorId = "visitor_1"; - $visitorContext = [ - "age" => 20 - ]; + $visitorContext = ["age" => 20]; $container = new Container(); - $configManager = $this->getMockBuilder(ConfigManager::class) - ->disableOriginalConstructor() - ->getMock(); + $configManager = $this->getMockBuilder(ConfigManager::class)->disableOriginalConstructor()->getMock(); $configManager->setConfig($config); - $visitor = $this->getMockBuilder(VisitorDelegate::class) - ->setConstructorArgs([$container, $configManager, $visitorId, false, $visitorContext, true]) - ->onlyMethods(["sendHit"]) - ->getMock(); + $visitor = $this->getMockBuilder(VisitorDelegate::class)->setConstructorArgs([$container, $configManager, $visitorId, false, $visitorContext, true])->onlyMethods(["sendHit"])->getMock(); $segmentUrl = sprintf(FlagshipConstant::THIRD_PARTY_SEGMENT_URL, $config->getEnvId(), $visitorId); $campaigns = ["campaigns" => []]; $matcher = $this->exactly(2); - $httpClientMock->expects($matcher) - ->method("get") - ->with( - $this->logicalOr( - $this->equalTo($bucketingUrl), - $this->equalTo($segmentUrl) - ), - $this->equalTo([]) - ) - ->willReturnOnConsecutiveCalls( - new HttpResponse(200, $campaigns, []), - $this->throwException(new Exception("error")) - ); + $httpClientMock->expects($matcher)->method("get")->with( + $this->logicalOr( + $this->equalTo($bucketingUrl), + $this->equalTo($segmentUrl) + ), + $this->equalTo([]) + )->willReturnOnConsecutiveCalls( + new HttpResponse(200, $campaigns, []), + $this->throwException(new Exception("error")) + ); $config->setLogManager($logManagerStub); diff --git a/tests/Flag/FSFlagCollectionTest.php b/tests/Flag/FSFlagCollectionTest.php index bfcae826..ef08ac23 100644 --- a/tests/Flag/FSFlagCollectionTest.php +++ b/tests/Flag/FSFlagCollectionTest.php @@ -10,9 +10,7 @@ class FSFlagCollectionTest extends TestCase { public function testFlagCollection() { - $visitor = $this->getMockBuilder('Flagship\Visitor\VisitorAbstract') - ->disableOriginalConstructor() - ->getMock(); + $visitor = $this->getMockBuilder('Flagship\Visitor\VisitorAbstract')->disableOriginalConstructor()->getMock(); $visitor->method("getConfig")->willReturn(new DecisionApiConfig()); @@ -23,16 +21,7 @@ public function testFlagCollection() $key1 = "key1"; $key2 = "key2"; $flagDTO = new FlagDTO(); - $flagDTO->setIsReference(true) - ->setVariationId("variationId") - ->setVariationName("variationName") - ->setVariationGroupId('varGroupId') - ->setVariationGroupName("variationGroupName") - ->setCampaignId("campaignId") - ->setCampaignName("campaignName") - ->setKey($key1)->setValue($value1) - ->setSlug("slug") - ->setCampaignType("ab"); + $flagDTO->setIsReference(true)->setVariationId("variationId")->setVariationName("variationName")->setVariationGroupId('varGroupId')->setVariationGroupName("variationGroupName")->setCampaignId("campaignId")->setCampaignName("campaignName")->setKey($key1)->setValue($value1)->setSlug("slug")->setCampaignType("ab"); $flagMetadata1 = new FSFlagMetadata( $flagDTO->getCampaignId(), @@ -47,16 +36,7 @@ public function testFlagCollection() ); $flagDTO2 = new FlagDTO(); - $flagDTO2->setIsReference(true) - ->setVariationId("variationId") - ->setVariationName("variationName") - ->setVariationGroupId('varGroupId') - ->setVariationGroupName("variationGroupName") - ->setCampaignId("campaignId") - ->setCampaignName("campaignName") - ->setKey($key2)->setValue($value2) - ->setSlug("slug") - ->setCampaignType("ab"); + $flagDTO2->setIsReference(true)->setVariationId("variationId")->setVariationName("variationName")->setVariationGroupId('varGroupId')->setVariationGroupName("variationGroupName")->setCampaignId("campaignId")->setCampaignName("campaignName")->setKey($key2)->setValue($value2)->setSlug("slug")->setCampaignType("ab"); $flagMetadata2 = new FSFlagMetadata( $flagDTO2->getCampaignId(), diff --git a/tests/Flag/FlagMetadataTest.php b/tests/Flag/FlagMetadataTest.php index b24e8b84..184e10b4 100644 --- a/tests/Flag/FlagMetadataTest.php +++ b/tests/Flag/FlagMetadataTest.php @@ -40,29 +40,29 @@ public function testConstruct() $this->assertSame($metadata->getVariationName(), $variationName); $metadataJson = json_encode([ - "campaignId" => $campaignId, - "campaignName" => $campaignName, - "variationGroupId" => $variationGroupId, - "variationGroupName" => $variationGroupName, - "variationId" => $variationId, - "variationName" => $variationName, - "isReference" => $isReferenceId, - "campaignType" => $campaignType, - "slug" => $slug - ]); + "campaignId" => $campaignId, + "campaignName" => $campaignName, + "variationGroupId" => $variationGroupId, + "variationGroupName" => $variationGroupName, + "variationId" => $variationId, + "variationName" => $variationName, + "isReference" => $isReferenceId, + "campaignType" => $campaignType, + "slug" => $slug, + ]); $this->assertJsonStringEqualsJsonString(json_encode($metadata), $metadataJson); $metadataJson = json_encode([ - "campaignId" => "", - "campaignName" => "", - "variationGroupId" => "", - "variationGroupName" => '', - "variationId" => "", - "variationName" => "", - "isReference" => false, - "campaignType" => "", - "slug" => "" - ]); + "campaignId" => "", + "campaignName" => "", + "variationGroupId" => "", + "variationGroupName" => '', + "variationId" => "", + "variationName" => "", + "isReference" => false, + "campaignType" => "", + "slug" => "", + ]); $this->assertJsonStringEqualsJsonString(json_encode(FSFlagMetadata::getEmpty()), $metadataJson); } diff --git a/tests/Flag/FlagTest.php b/tests/Flag/FlagTest.php index b5714db9..98edce26 100644 --- a/tests/Flag/FlagTest.php +++ b/tests/Flag/FlagTest.php @@ -16,16 +16,7 @@ public function testFlag() $key = "key"; $defaultValue = "DefaultValue"; $flagDTO = new FlagDTO(); - $flagDTO->setIsReference(true) - ->setVariationId("variationId") - ->setVariationName("variationName") - ->setVariationGroupId('varGroupId') - ->setVariationGroupName("variationGroupName") - ->setCampaignId("campaignId") - ->setCampaignName("campaignName") - ->setKey($key)->setValue("value") - ->setSlug("slug") - ->setCampaignType("ab"); + $flagDTO->setIsReference(true)->setVariationId("variationId")->setVariationName("variationName")->setVariationGroupId('varGroupId')->setVariationGroupName("variationGroupName")->setCampaignId("campaignId")->setCampaignName("campaignName")->setKey($key)->setValue("value")->setSlug("slug")->setCampaignType("ab"); $metadata = new FSFlagMetadata( $flagDTO->getCampaignId(), @@ -45,25 +36,29 @@ public function testFlag() false, false, true, - ['getFlagValue', 'userExposed', 'getFlagMetadata', 'getFlagsDTO'], + [ + 'getFlagValue', + 'userExposed', + 'getFlagMetadata', + 'getFlagsDTO', + ], '', ); $visitorDelegateMock->method("getFlagsDTO")->willReturn([$flagDTO]); - $visitorDelegateMock->expects($this->exactly(2))->method('getFlagValue') - ->with( - $this->logicalOr( - $key, - $key - ), - $defaultValue, - $flagDTO, - $this->logicalOr( - true, - false - ) - )->willReturn($flagDTO->getValue()); + $visitorDelegateMock->expects($this->exactly(2))->method('getFlagValue')->with( + $this->logicalOr( + $key, + $key + ), + $defaultValue, + $flagDTO, + $this->logicalOr( + true, + false + ) + )->willReturn($flagDTO->getValue()); $flag = new FSFlag($key, $visitorDelegateMock); @@ -117,7 +112,11 @@ public function testFlagNull() $visitorDelegateMock = $this->getMockForAbstractClass( 'Flagship\Visitor\VisitorAbstract', - ['getFlagValue', 'userExposed', 'getFlagMetadata'], + [ + 'getFlagValue', + 'userExposed', + 'getFlagMetadata', + ], '', false ); diff --git a/tests/FlagshipTest.php b/tests/FlagshipTest.php index 69fa7b64..80e72c2e 100644 --- a/tests/FlagshipTest.php +++ b/tests/FlagshipTest.php @@ -40,7 +40,10 @@ public function __construct($name = null, array $data = array(), $dataName = '') false, true, true, - ['error', 'info'] + [ + 'error', + 'info', + ] ); } @@ -182,12 +185,11 @@ public function testStartWithLog() $flagshipMock->method('getContainer')->willReturn($this->containerInitialization()); - $flagshipMock->expects($this->once())->method('logInfo') - ->with( - $config, - sprintf(FlagshipConstant::SDK_STARTED_INFO, FlagshipConstant::SDK_VERSION), - [FlagshipConstant::TAG => FlagshipConstant::TAG_INITIALIZATION] - ); + $flagshipMock->expects($this->once())->method('logInfo')->with( + $config, + sprintf(FlagshipConstant::SDK_STARTED_INFO, FlagshipConstant::SDK_VERSION), + [FlagshipConstant::TAG => FlagshipConstant::TAG_INITIALIZATION] + ); $flagshipMock->expects($this->never())->method('logError'); @@ -248,9 +250,7 @@ public function testStartFailedWithLog() $config->setLogManager($logManager); - $flagshipMock = $this->getMockBuilder('Flagship\Flagship') - ->onlyMethods(['logInfo', 'logError', 'getContainer']) - ->disableOriginalConstructor()->getMock(); + $flagshipMock = $this->getMockBuilder('Flagship\Flagship')->onlyMethods(['logInfo', 'logError', 'getContainer'])->disableOriginalConstructor()->getMock(); $instanceMethod = Utils::getMethod("Flagship\Flagship", 'getInstance'); $instance = $instanceMethod->invoke(null); @@ -259,12 +259,11 @@ public function testStartFailedWithLog() $flagshipMock->method('getContainer')->willReturn($this->containerInitialization()); - $flagshipMock->expects($this->once())->method('logError') - ->with( - $config, - FlagshipConstant::INITIALIZATION_PARAM_ERROR, - [FlagshipConstant::TAG => FlagshipConstant::TAG_INITIALIZATION] - ); + $flagshipMock->expects($this->once())->method('logError')->with( + $config, + FlagshipConstant::INITIALIZATION_PARAM_ERROR, + [FlagshipConstant::TAG => FlagshipConstant::TAG_INITIALIZATION] + ); $flagshipMock->expects($this->never())->method('logInfo'); Flagship::start($envId, $apiKey, $config); @@ -288,9 +287,7 @@ public function testStartFailedThrowException() $config->setLogManager($logManager); - $flagshipMock = $this->getMockBuilder('Flagship\Flagship') - ->onlyMethods(['logInfo', 'logError', 'getContainer','setConfigManager']) - ->disableOriginalConstructor()->getMock(); + $flagshipMock = $this->getMockBuilder('Flagship\Flagship')->onlyMethods(['logInfo', 'logError', 'getContainer', 'setConfigManager'])->disableOriginalConstructor()->getMock(); $instanceMethod = Utils::getMethod("Flagship\Flagship", 'getInstance'); $instance = $instanceMethod->invoke(null); @@ -302,12 +299,11 @@ public function testStartFailedThrowException() $flagshipMock->method('getContainer')->willReturn($this->containerInitialization()); $flagshipMock->method('setConfigManager')->willThrowException($exception); - $flagshipMock->expects($this->once())->method('logError') - ->with( - $config, - $exception->getMessage(), - [FlagshipConstant::TAG => FlagshipConstant::TAG_INITIALIZATION] - ); + $flagshipMock->expects($this->once())->method('logError')->with( + $config, + $exception->getMessage(), + [FlagshipConstant::TAG => FlagshipConstant::TAG_INITIALIZATION] + ); $flagshipMock->expects($this->never())->method('logInfo'); Flagship::start($envId, $apiKey, $config); @@ -363,9 +359,7 @@ public function testStatusCallback() }; $config->setLogLevel(LogLevel::ALL); - $config->expects($this->exactly(1)) - ->method("getOnSdkStatusChanged") - ->willReturn($callable); + $config->expects($this->exactly(1))->method("getOnSdkStatusChanged")->willReturn($callable); Flagship::start('envId', 'apiKey', $config); } @@ -382,19 +376,18 @@ public function testGetPanicModeStatus() $visitorId = "visitorId"; $body = [ - "visitorId" => $visitorId, - "campaigns" => [], - "panic" => true - ]; - - $httpClientMock->expects($this->exactly(2))->method('post') - ->willReturnOnConsecutiveCalls( - new HttpResponse(204, $body), - new HttpResponse(204, [ - "visitorId" => $visitorId, - "campaigns" => [], - ]) - ); + "visitorId" => $visitorId, + "campaigns" => [], + "panic" => true, + ]; + + $httpClientMock->expects($this->exactly(2))->method('post')->willReturnOnConsecutiveCalls( + new HttpResponse(204, $body), + new HttpResponse(204, [ + "visitorId" => $visitorId, + "campaigns" => [], + ]) + ); $apiManager = new ApiManager($httpClientMock, $config); @@ -423,8 +416,7 @@ public function testGetPanicModeStatus() 'Flagship\Utils\Container' )->onlyMethods(['get'])->disableOriginalConstructor()->getMock(); - $containerMock->method('get') - ->will($this->returnCallback($containerGetMethod)); + $containerMock->method('get')->will($this->returnCallback($containerGetMethod)); $instanceMethod = Utils::getMethod("Flagship\Flagship", 'getInstance'); $instance = $instanceMethod->invoke(null); @@ -464,8 +456,7 @@ public function testClose() $flagshipMock = $this->getMockBuilder( 'Flagship\Flagship' - )->onlyMethods(['logInfo', 'logError', 'getContainer', "getConfigManager"]) - ->disableOriginalConstructor()->getMock(); + )->onlyMethods(['logInfo', 'logError', 'getContainer', "getConfigManager"])->disableOriginalConstructor()->getMock(); $trackingManagerMock = $this->getMockForAbstractClass( @@ -495,8 +486,7 @@ public function testClose() $trackingManagerMock->expects($this->once())->method("sendBatch"); - $flagshipMock->expects($this->exactly(1))->method("getConfigManager") - ->willReturn($configManagerMock); + $flagshipMock->expects($this->exactly(1))->method("getConfigManager")->willReturn($configManagerMock); Flagship::Close(); } @@ -516,16 +506,14 @@ public function testCloseNull() $flagshipMock = $this->getMockBuilder( 'Flagship\Flagship' - )->onlyMethods(['logInfo', 'logError', 'getContainer', "getConfigManager"]) - ->disableOriginalConstructor()->getMock(); + )->onlyMethods(['logInfo', 'logError', 'getContainer', "getConfigManager"])->disableOriginalConstructor()->getMock(); $instanceMethod = Utils::getMethod("Flagship\Flagship", 'getInstance'); $instance = $instanceMethod->invoke(null); Utils::setPrivateProperty($instance, 'instance', $flagshipMock); - $flagshipMock->expects($this->once())->method("getConfigManager") - ->willReturn(null); + $flagshipMock->expects($this->once())->method("getConfigManager")->willReturn(null); Flagship::Close(); } diff --git a/tests/Hit/ActivateBatchTest.php b/tests/Hit/ActivateBatchTest.php index 790bbd20..c7865df3 100644 --- a/tests/Hit/ActivateBatchTest.php +++ b/tests/Hit/ActivateBatchTest.php @@ -27,8 +27,8 @@ public function testToApiKeys() unset($apiKeys[FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM]); $this->assertSame([ - FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $config->getEnvId(), - FlagshipConstant::BATCH => [$apiKeys] - ], $activateBatch->toApiKeys()); + FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $config->getEnvId(), + FlagshipConstant::BATCH => [$apiKeys], + ], $activateBatch->toApiKeys()); } } diff --git a/tests/Hit/ActivateTest.php b/tests/Hit/ActivateTest.php index 18c56c4a..a07a9ade 100644 --- a/tests/Hit/ActivateTest.php +++ b/tests/Hit/ActivateTest.php @@ -50,13 +50,13 @@ public function testTestConstruct() $this->assertSame($variationGroupId, $activate->getVariationGroupId()); $apiKeys = [ - FlagshipConstant::VISITOR_ID_API_ITEM => $visitorId, - FlagshipConstant::VARIATION_ID_API_ITEM => $variationId, - FlagshipConstant::VARIATION_GROUP_ID_API_ITEM => $variationGroupId, - FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $envId, - FlagshipConstant::ANONYMOUS_ID => null, - FlagshipConstant::QT_API_ITEM => 0, - ]; + FlagshipConstant::VISITOR_ID_API_ITEM => $visitorId, + FlagshipConstant::VARIATION_ID_API_ITEM => $variationId, + FlagshipConstant::VARIATION_GROUP_ID_API_ITEM => $variationGroupId, + FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $envId, + FlagshipConstant::ANONYMOUS_ID => null, + FlagshipConstant::QT_API_ITEM => 0, + ]; $this->assertSame($apiKeys, $activate->toApiKeys()); @@ -64,13 +64,13 @@ public function testTestConstruct() $activate->setAnonymousId($anonymousId); $apiKeys = [ - FlagshipConstant::VISITOR_ID_API_ITEM => $visitorId, - FlagshipConstant::VARIATION_ID_API_ITEM => $variationId, - FlagshipConstant::VARIATION_GROUP_ID_API_ITEM => $variationGroupId, - FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $envId, - FlagshipConstant::ANONYMOUS_ID => $anonymousId, - FlagshipConstant::QT_API_ITEM => 0, - ]; + FlagshipConstant::VISITOR_ID_API_ITEM => $visitorId, + FlagshipConstant::VARIATION_ID_API_ITEM => $variationId, + FlagshipConstant::VARIATION_GROUP_ID_API_ITEM => $variationGroupId, + FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $envId, + FlagshipConstant::ANONYMOUS_ID => $anonymousId, + FlagshipConstant::QT_API_ITEM => 0, + ]; $this->assertSame($apiKeys, $activate->toApiKeys()); @@ -78,10 +78,7 @@ public function testTestConstruct() $this->assertSame(Activate::ERROR_MESSAGE, $activate->getErrorMessage()); - $activate->setFlagKey($flagKey) - ->setFlagValue($flagValue) - ->setFlagMetadata($flagMetadata) - ->setVisitorContext($visitorContext); + $activate->setFlagKey($flagKey)->setFlagValue($flagValue)->setFlagMetadata($flagMetadata)->setVisitorContext($visitorContext); $this->assertSame($flagKey, $activate->getFlagKey()); $this->assertSame($flagValue, $activate->getFlagValue()); diff --git a/tests/Hit/EventTest.php b/tests/Hit/EventTest.php index ca3ae812..202021a3 100644 --- a/tests/Hit/EventTest.php +++ b/tests/Hit/EventTest.php @@ -28,30 +28,24 @@ public function testConstruct() $sessionNumber = 1; $eventArray = [ - FlagshipConstant::VISITOR_ID_API_ITEM => $visitorId, - FlagshipConstant::DS_API_ITEM => FlagshipConstant::SDK_APP, - FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $envId, - FlagshipConstant::T_API_ITEM => HitType::EVENT->value, - FlagshipConstant::CUSTOMER_UID => null, - FlagshipConstant::QT_API_ITEM => 0.0, - FlagshipConstant::USER_IP_API_ITEM => $userIp, - FlagshipConstant::SCREEN_RESOLUTION_API_ITEM => $screenResolution, - FlagshipConstant::USER_LANGUAGE => $userLanguage, - FlagshipConstant::SESSION_NUMBER => $sessionNumber, - FlagshipConstant::EVENT_CATEGORY_API_ITEM => $eventCategory, - FlagshipConstant::EVENT_ACTION_API_ITEM => $eventAction, - ]; + FlagshipConstant::VISITOR_ID_API_ITEM => $visitorId, + FlagshipConstant::DS_API_ITEM => FlagshipConstant::SDK_APP, + FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $envId, + FlagshipConstant::T_API_ITEM => HitType::EVENT->value, + FlagshipConstant::CUSTOMER_UID => null, + FlagshipConstant::QT_API_ITEM => 0.0, + FlagshipConstant::USER_IP_API_ITEM => $userIp, + FlagshipConstant::SCREEN_RESOLUTION_API_ITEM => $screenResolution, + FlagshipConstant::USER_LANGUAGE => $userLanguage, + FlagshipConstant::SESSION_NUMBER => $sessionNumber, + FlagshipConstant::EVENT_CATEGORY_API_ITEM => $eventCategory, + FlagshipConstant::EVENT_ACTION_API_ITEM => $eventAction, + ]; $event = new Event($eventCategory, $eventAction); $config = new DecisionApiConfig(); $config->setEnvId($envId); - $event->setConfig($config) - ->setVisitorId($visitorId) - ->setDs(FlagshipConstant::SDK_APP) - ->setLocale($userLanguage) - ->setUserIP($userIp) - ->setScreenResolution($screenResolution) - ->setSessionNumber($sessionNumber); + $event->setConfig($config)->setVisitorId($visitorId)->setDs(FlagshipConstant::SDK_APP)->setLocale($userLanguage)->setUserIP($userIp)->setScreenResolution($screenResolution)->setSessionNumber($sessionNumber); $this->assertSame($eventArray, $event->toApiKeys()); @@ -109,9 +103,7 @@ public function testIsReady() $eventCategory = EventCategory::ACTION_TRACKING; $event = new Event($eventCategory, $eventAction); - $event->setConfig($config) - ->setVisitorId('visitorId') - ->setDs(FlagshipConstant::SDK_APP); + $event->setConfig($config)->setVisitorId('visitorId')->setDs(FlagshipConstant::SDK_APP); $this->assertFalse($event->isReady()); @@ -120,9 +112,7 @@ public function testIsReady() //Test with require HitAbstract fields and require Transaction fields $eventAction = "ItemName"; $event = new Event($eventCategory, $eventAction); - $event->setConfig($config) - ->setVisitorId('visitorId') - ->setDs(FlagshipConstant::SDK_APP); + $event->setConfig($config)->setVisitorId('visitorId')->setDs(FlagshipConstant::SDK_APP); $this->assertTrue($event->isReady()); } diff --git a/tests/Hit/HitBatchTest.php b/tests/Hit/HitBatchTest.php index e058a149..007e8b9a 100644 --- a/tests/Hit/HitBatchTest.php +++ b/tests/Hit/HitBatchTest.php @@ -19,17 +19,20 @@ public function testToApiKeys() $screen = new Screen("home"); $screen->setConfig($config)->setVisitorId($visitorId); - $hits = [$page, $screen]; + $hits = [ + $page, + $screen, + ]; $batch = new HitBatch($config, [$page, $screen]); $data = [ - FlagshipConstant::DS_API_ITEM => FlagshipConstant::SDK_APP, - FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $config->getEnvId(), - FlagshipConstant::T_API_ITEM => "BATCH", - FlagshipConstant::QT_API_ITEM => 0.0, - FlagshipConstant::H_API_ITEM => [] - ]; + FlagshipConstant::DS_API_ITEM => FlagshipConstant::SDK_APP, + FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $config->getEnvId(), + FlagshipConstant::T_API_ITEM => "BATCH", + FlagshipConstant::QT_API_ITEM => 0.0, + FlagshipConstant::H_API_ITEM => [], + ]; foreach ($hits as $hit) { $hitApiKey = $hit->toApiKeys(); diff --git a/tests/Hit/ItemTest.php b/tests/Hit/ItemTest.php index f34e219e..f4e65ff1 100644 --- a/tests/Hit/ItemTest.php +++ b/tests/Hit/ItemTest.php @@ -23,23 +23,21 @@ public function testConstruct() $itemCategory = "category 1"; $itemArray = [ - FlagshipConstant::VISITOR_ID_API_ITEM => $visitorId, - FlagshipConstant::DS_API_ITEM => FlagshipConstant::SDK_APP, - FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $envId, - FlagshipConstant::T_API_ITEM => HitType::ITEM->value, - FlagshipConstant::CUSTOMER_UID => null, - FlagshipConstant::QT_API_ITEM => 0.0, - FlagshipConstant::TID_API_ITEM => $transactionId, - FlagshipConstant::IN_API_ITEM => $itemName, - FlagshipConstant::IC_API_ITEM => $itemCode - ]; + FlagshipConstant::VISITOR_ID_API_ITEM => $visitorId, + FlagshipConstant::DS_API_ITEM => FlagshipConstant::SDK_APP, + FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $envId, + FlagshipConstant::T_API_ITEM => HitType::ITEM->value, + FlagshipConstant::CUSTOMER_UID => null, + FlagshipConstant::QT_API_ITEM => 0.0, + FlagshipConstant::TID_API_ITEM => $transactionId, + FlagshipConstant::IN_API_ITEM => $itemName, + FlagshipConstant::IC_API_ITEM => $itemCode, + ]; $item = new Item($transactionId, $itemName, $itemCode); $config = new DecisionApiConfig($envId); - $item->setVisitorId($visitorId) - ->setConfig($config) - ->setDs(FlagshipConstant::SDK_APP); + $item->setVisitorId($visitorId)->setConfig($config)->setDs(FlagshipConstant::SDK_APP); $this->assertSame($itemArray, $item->toApiKeys()); @@ -95,9 +93,7 @@ public function testIsReady() $itemName = ""; $item = new Item($transactionId, $itemName, $itemCode); - $item->setConfig($config) - ->setVisitorId('visitorId') - ->setDs(FlagshipConstant::SDK_APP); + $item->setConfig($config)->setVisitorId('visitorId')->setDs(FlagshipConstant::SDK_APP); $this->assertFalse($item->isReady()); $this->assertSame(Item::ERROR_MESSAGE, $item->getErrorMessage()); @@ -105,9 +101,7 @@ public function testIsReady() //Test with require HitAbstract fields and require Item fields $itemName = "ItemName"; $item = new Item($transactionId, $itemName, $itemCode); - $item->setConfig($config) - ->setVisitorId('visitorId') - ->setDs(FlagshipConstant::SDK_APP); + $item->setConfig($config)->setVisitorId('visitorId')->setDs(FlagshipConstant::SDK_APP); $this->assertTrue($item->isReady()); } diff --git a/tests/Hit/PageTest.php b/tests/Hit/PageTest.php index 18c7c43d..8b485512 100644 --- a/tests/Hit/PageTest.php +++ b/tests/Hit/PageTest.php @@ -20,19 +20,17 @@ public function testConstruct() $page = new Page($pageUrl); $config = new DecisionApiConfig($envId); - $page->setConfig($config) - ->setDs(FlagshipConstant::SDK_APP) - ->setVisitorId($visitorId); + $page->setConfig($config)->setDs(FlagshipConstant::SDK_APP)->setVisitorId($visitorId); $screenArray = [ - FlagshipConstant::VISITOR_ID_API_ITEM => $visitorId, - FlagshipConstant::DS_API_ITEM => FlagshipConstant::SDK_APP, - FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $envId, - FlagshipConstant::T_API_ITEM => HitType::PAGE_VIEW->value, - FlagshipConstant::CUSTOMER_UID => null, - FlagshipConstant::QT_API_ITEM => 0.0, - FlagshipConstant::DL_API_ITEM => $pageUrl - ]; + FlagshipConstant::VISITOR_ID_API_ITEM => $visitorId, + FlagshipConstant::DS_API_ITEM => FlagshipConstant::SDK_APP, + FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $envId, + FlagshipConstant::T_API_ITEM => HitType::PAGE_VIEW->value, + FlagshipConstant::CUSTOMER_UID => null, + FlagshipConstant::QT_API_ITEM => 0.0, + FlagshipConstant::DL_API_ITEM => $pageUrl, + ]; $this->assertSame($screenArray, $page->toApiKeys()); } @@ -49,17 +47,13 @@ public function testIsReady() $config = new DecisionApiConfig('envId'); - $page->setConfig($config) - ->setVisitorId('visitorId') - ->setDs(FlagshipConstant::SDK_APP); + $page->setConfig($config)->setVisitorId('visitorId')->setDs(FlagshipConstant::SDK_APP); //Test isReady Test with require HitAbstract fields and with empty pageUrl $pageUrl = ""; $page = new Page($pageUrl); - $page->setConfig($config) - ->setVisitorId('visitorId') - ->setDs(FlagshipConstant::SDK_APP); + $page->setConfig($config)->setVisitorId('visitorId')->setDs(FlagshipConstant::SDK_APP); $this->assertFalse($page->isReady()); @@ -68,9 +62,7 @@ public function testIsReady() //Test with require HitAbstract fields and require Page fields $pageUrl = "https://localhost"; $page = new Page($pageUrl); - $page->setConfig($config) - ->setVisitorId('visitorId') - ->setDs(FlagshipConstant::SDK_APP); + $page->setConfig($config)->setVisitorId('visitorId')->setDs(FlagshipConstant::SDK_APP); $this->assertTrue($page->isReady()); } diff --git a/tests/Hit/ScreenTest.php b/tests/Hit/ScreenTest.php index 9d21d6a0..0abdd790 100644 --- a/tests/Hit/ScreenTest.php +++ b/tests/Hit/ScreenTest.php @@ -19,19 +19,17 @@ public function testConstruct() $config = new DecisionApiConfig($envId); $screen = new Screen($screenName); - $screen->setConfig($config) - ->setDs(FlagshipConstant::SDK_APP) - ->setVisitorId($visitorId); + $screen->setConfig($config)->setDs(FlagshipConstant::SDK_APP)->setVisitorId($visitorId); $screenArray = [ - FlagshipConstant::VISITOR_ID_API_ITEM => $visitorId, - FlagshipConstant::DS_API_ITEM => FlagshipConstant::SDK_APP, - FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $envId, - FlagshipConstant::T_API_ITEM => HitType::SCREEN_VIEW->value, - FlagshipConstant::CUSTOMER_UID => null, - FlagshipConstant::QT_API_ITEM => 0.0, - FlagshipConstant::DL_API_ITEM => $screenName - ]; + FlagshipConstant::VISITOR_ID_API_ITEM => $visitorId, + FlagshipConstant::DS_API_ITEM => FlagshipConstant::SDK_APP, + FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $envId, + FlagshipConstant::T_API_ITEM => HitType::SCREEN_VIEW->value, + FlagshipConstant::CUSTOMER_UID => null, + FlagshipConstant::QT_API_ITEM => 0.0, + FlagshipConstant::DL_API_ITEM => $screenName, + ]; $this->assertSame($screenArray, $screen->toApiKeys()); } @@ -49,9 +47,7 @@ public function testIsReady() $screenName = ""; $screen = new Screen($screenName); $config = new DecisionApiConfig('envId'); - $screen->setConfig($config) - ->setVisitorId('visitorId') - ->setDs(FlagshipConstant::SDK_APP); + $screen->setConfig($config)->setVisitorId('visitorId')->setDs(FlagshipConstant::SDK_APP); $this->assertFalse($screen->isReady()); @@ -61,9 +57,7 @@ public function testIsReady() $screenName = "screenName"; $screen = new Screen($screenName); - $screen->setConfig($config) - ->setVisitorId('visitorId') - ->setDs(FlagshipConstant::SDK_APP); + $screen->setConfig($config)->setVisitorId('visitorId')->setDs(FlagshipConstant::SDK_APP); $this->assertTrue($screen->isReady()); } } diff --git a/tests/Hit/SegmentTest.php b/tests/Hit/SegmentTest.php index 96ac3ad5..517cc651 100644 --- a/tests/Hit/SegmentTest.php +++ b/tests/Hit/SegmentTest.php @@ -15,10 +15,10 @@ public function testConstructor() $visitorId = "visitorId"; $context = [ - "key1" => "value1", - "key2" => 1, - "key3" => true - ]; + "key1" => "value1", + "key2" => 1, + "key3" => true, + ]; $config = new DecisionApiConfig($envId); @@ -30,14 +30,14 @@ public function testConstructor() $this->assertSame($context, $segment->getSl()); $segmentArray = [ - FlagshipConstant::VISITOR_ID_API_ITEM => $visitorId, - FlagshipConstant::DS_API_ITEM => FlagshipConstant::SDK_APP, - FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $envId, - FlagshipConstant::T_API_ITEM => HitType::SEGMENT->value, - FlagshipConstant::CUSTOMER_UID => null, - FlagshipConstant::QT_API_ITEM => 0.0, - FlagshipConstant::SL_API_ITEM => $context - ]; + FlagshipConstant::VISITOR_ID_API_ITEM => $visitorId, + FlagshipConstant::DS_API_ITEM => FlagshipConstant::SDK_APP, + FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $envId, + FlagshipConstant::T_API_ITEM => HitType::SEGMENT->value, + FlagshipConstant::CUSTOMER_UID => null, + FlagshipConstant::QT_API_ITEM => 0.0, + FlagshipConstant::SL_API_ITEM => $context, + ]; $this->assertSame($segmentArray, $segment->toApiKeys()); diff --git a/tests/Hit/TransactionTest.php b/tests/Hit/TransactionTest.php index 14513828..1b035641 100644 --- a/tests/Hit/TransactionTest.php +++ b/tests/Hit/TransactionTest.php @@ -35,15 +35,15 @@ public function testConstruct() $transaction->setVisitorId($visitorId)->setDs($ds)->setConfig($config); $transactionArray = [ - FlagshipConstant::VISITOR_ID_API_ITEM => $visitorId, - FlagshipConstant::DS_API_ITEM => $ds, - FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $envId, - FlagshipConstant::T_API_ITEM => HitType::TRANSACTION->value, - FlagshipConstant::CUSTOMER_UID => null, - FlagshipConstant::QT_API_ITEM => 0.0, - FlagshipConstant::TID_API_ITEM => $transactionId, - FlagshipConstant::TA_API_ITEM => $transactionAffiliation - ]; + FlagshipConstant::VISITOR_ID_API_ITEM => $visitorId, + FlagshipConstant::DS_API_ITEM => $ds, + FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $envId, + FlagshipConstant::T_API_ITEM => HitType::TRANSACTION->value, + FlagshipConstant::CUSTOMER_UID => null, + FlagshipConstant::QT_API_ITEM => 0.0, + FlagshipConstant::TID_API_ITEM => $transactionId, + FlagshipConstant::TA_API_ITEM => $transactionAffiliation, + ]; $taxesAmount = 76.0; $transaction->setTaxes($taxesAmount); @@ -110,18 +110,14 @@ public function testIsReady() //Test with require HitAbstract fields and with null transactionId $config = new DecisionApiConfig('envId'); - $transaction->setConfig($config) - ->setVisitorId('visitorId') - ->setDs(FlagshipConstant::SDK_APP); + $transaction->setConfig($config)->setVisitorId('visitorId')->setDs(FlagshipConstant::SDK_APP); //Test isReady with require HitAbstract fields and with empty transactionAffiliation $transactionAffiliation = ""; $transaction = new Transaction($transactionId, $transactionAffiliation); - $transaction->setConfig($config) - ->setVisitorId('visitorId') - ->setDs(FlagshipConstant::SDK_APP); + $transaction->setConfig($config)->setVisitorId('visitorId')->setDs(FlagshipConstant::SDK_APP); $this->assertFalse($transaction->isReady()); @@ -131,9 +127,7 @@ public function testIsReady() $transactionAffiliation = "ItemName"; $transaction = new Transaction($transactionId, $transactionAffiliation); - $transaction->setConfig($config) - ->setVisitorId('visitorId') - ->setDs(FlagshipConstant::SDK_APP); + $transaction->setConfig($config)->setVisitorId('visitorId')->setDs(FlagshipConstant::SDK_APP); $this->assertTrue($transaction->isReady()); } diff --git a/tests/Hit/TroubleshootingTest.php b/tests/Hit/TroubleshootingTest.php index 9b5168dd..265ad61b 100644 --- a/tests/Hit/TroubleshootingTest.php +++ b/tests/Hit/TroubleshootingTest.php @@ -34,212 +34,132 @@ public function testConstruct() $cacheStrategy = CacheStrategy::BATCHING_AND_CACHING_ON_FAILURE; $httpRequestUrl = "https://localhost"; $httpRequestMethod = "GET"; - $httpRequestHeaders = [ - "key" => "value" - ]; - $httpRequestBody = [ - "key" => "value" - ]; + $httpRequestHeaders = ["key" => "value"]; + $httpRequestBody = ["key" => "value"]; $httpResponseUrl = "https://localhost"; $httpResponseMethod = "GET"; - $httpResponseHeaders = [ - "key" => "value" - ]; + $httpResponseHeaders = ["key" => "value"]; $httpResponseTime = 1; $httpResponseCode = 200; - $httpResponseBody = [ - 'key' => "value" - ]; + $httpResponseBody = ['key' => "value"]; $visitorContext = [ - "key1" => "value1", - "key2" => "value2" - ]; + "key1" => "value1", + "key2" => "value2", + ]; $visitorAssignmentHistory = [ - "key1" => "value1", - "key2" => "value2" - ]; + "key1" => "value1", + "key2" => "value2", + ]; $flagDto = new FlagDTO(); - $flagDto->setKey("key") - ->setValue("value") - ->setCampaignId("campaignId") - ->setCampaignType("ab") - ->setCampaignName("campaignName") - ->setVariationId("varId") - ->setVariationName("variationName") - ->setVariationGroupId("varGroupId") - ->setIsReference(false) - ->setSlug("slug") - ->setVariationGroupName("varGroupName"); + $flagDto->setKey("key")->setValue("value")->setCampaignId("campaignId")->setCampaignType("ab")->setCampaignName("campaignName")->setVariationId("varId")->setVariationName("variationName")->setVariationGroupId("varGroupId")->setIsReference(false)->setSlug("slug")->setVariationGroupName("varGroupName"); $flagDto2 = new FlagDTO(); - $flagDto2->setKey("key2") - ->setValue([]) - ->setCampaignId("campaignId") - ->setCampaignType("ab") - ->setCampaignName("campaignName") - ->setVariationId("varId") - ->setVariationName("variationName") - ->setVariationGroupId("varGroupId") - ->setIsReference(false) - ->setVariationGroupName("varGroupName"); + $flagDto2->setKey("key2")->setValue([])->setCampaignId("campaignId")->setCampaignType("ab")->setCampaignName("campaignName")->setVariationId("varId")->setVariationName("variationName")->setVariationGroupId("varGroupId")->setIsReference(false)->setVariationGroupName("varGroupName"); $visitorFlag = [ - $flagDto, - $flagDto2 - ]; + $flagDto, + $flagDto2, + ]; $activateHit = new Activate("varGroupId", "varId"); - $activateHit->setConfig($config) - ->setVisitorId($visitorId); + $activateHit->setConfig($config)->setVisitorId($visitorId); $sdkConfigBucketingUrl = 'http://localhost'; - $troubleshooting->setVisitorId($visitorId) - ->setAnonymousId($anonymousId) - ->setConfig($config) - ->setLogLevel(LogLevel::INFO) - ->setLabel(TroubleshootingLabel::VISITOR_FETCH_CAMPAIGNS) - ->setFlagshipInstanceId($flagshipInstanceId) - ->setVisitorSessionId($visitorInstanceId) - ->setStackOriginName($stackOriginName) - ->setStackOriginVersion($stackOriginVersion) - ->setSdkStatus($sdkStatus) - ->setSdkConfigMode($sdkConfigMode) - ->setSdkConfigLogLevel($config->getLogLevel()) - ->setSdkConfigCustomLogManager(true) - ->setSdkConfigCustomCacheManager(true) - ->setSdkConfigStatusListener(false) - ->setSdkConfigBucketingUrl($sdkConfigBucketingUrl) - ->setSdkConfigUsingCustomHitCache(true) - ->setSdkConfigUsingOnVisitorExposed(true) - ->setSdkConfigUsingCustomVisitorCache(true) - ->setSdkConfigFetchThirdPartyData(true) - ->setSdkConfigTimeout($config->getTimeout()) - ->setSdkConfigTrackingManagerConfigStrategy($cacheStrategy) - ->setHttpRequestUrl($httpRequestUrl) - ->setHttpRequestMethod($httpRequestMethod) - ->setHttpRequestHeaders($httpRequestHeaders) - ->setHttpRequestBody($httpRequestBody) - ->setHttpResponseUrl($httpResponseUrl) - ->setHttpResponseMethod($httpResponseMethod) - ->setHttpResponseHeaders($httpResponseHeaders) - ->setHttpResponseTime($httpResponseTime) - ->setHttpResponseCode($httpResponseCode) - ->setHttpResponseBody($httpResponseBody) - ->setVisitorConsent(true) - ->setVisitorContext($visitorContext) - ->setVisitorAssignmentHistory($visitorAssignmentHistory) - ->setVisitorFlags($visitorFlag) - ->setVisitorIsAuthenticated(true) - ->setVisitorCampaigns([]) - ->setFlagKey($flagDto->getKey()) - ->setFlagValue($flagDto->getValue()) - ->setFlagMetadataCampaignIsReference($flagDto->getIsReference()) - ->setFlagMetadataVariationId($flagDto->getVariationId()) - ->setFlagMetadataVariationName($flagDto->getVariationName()) - ->setFlagMetadataVariationGroupId($flagDto->getVariationGroupId()) - ->setFlagMetadataVariationGroupName($flagDto->getVariationGroupName()) - ->setFlagMetadataCampaignId($flagDto->getCampaignId()) - ->setFlagMetadataCampaignName($flagDto->getCampaignName()) - ->setFlagMetadataCampaignType($flagDto->getCampaignType()) - ->setFlagDefault("default") - ->setFlagMetadataCampaignSlug($flagDto->getSlug()) - ->setVisitorExposed(true) - ->setHitContent($activateHit->toApiKeys()) - ; + $troubleshooting->setVisitorId($visitorId)->setAnonymousId($anonymousId)->setConfig($config)->setLogLevel(LogLevel::INFO)->setLabel(TroubleshootingLabel::VISITOR_FETCH_CAMPAIGNS)->setFlagshipInstanceId($flagshipInstanceId)->setVisitorSessionId($visitorInstanceId)->setStackOriginName($stackOriginName)->setStackOriginVersion($stackOriginVersion)->setSdkStatus($sdkStatus)->setSdkConfigMode($sdkConfigMode)->setSdkConfigLogLevel($config->getLogLevel())->setSdkConfigCustomLogManager(true)->setSdkConfigCustomCacheManager(true)->setSdkConfigStatusListener(false)->setSdkConfigBucketingUrl($sdkConfigBucketingUrl)->setSdkConfigUsingCustomHitCache(true)->setSdkConfigUsingOnVisitorExposed(true)->setSdkConfigUsingCustomVisitorCache(true)->setSdkConfigFetchThirdPartyData(true)->setSdkConfigTimeout($config->getTimeout())->setSdkConfigTrackingManagerConfigStrategy($cacheStrategy)->setHttpRequestUrl($httpRequestUrl)->setHttpRequestMethod($httpRequestMethod)->setHttpRequestHeaders($httpRequestHeaders)->setHttpRequestBody($httpRequestBody)->setHttpResponseUrl($httpResponseUrl)->setHttpResponseMethod($httpResponseMethod)->setHttpResponseHeaders($httpResponseHeaders)->setHttpResponseTime($httpResponseTime)->setHttpResponseCode($httpResponseCode)->setHttpResponseBody($httpResponseBody)->setVisitorConsent(true)->setVisitorContext($visitorContext)->setVisitorAssignmentHistory($visitorAssignmentHistory)->setVisitorFlags($visitorFlag)->setVisitorIsAuthenticated(true)->setVisitorCampaigns([])->setFlagKey($flagDto->getKey())->setFlagValue($flagDto->getValue())->setFlagMetadataCampaignIsReference($flagDto->getIsReference())->setFlagMetadataVariationId($flagDto->getVariationId())->setFlagMetadataVariationName($flagDto->getVariationName())->setFlagMetadataVariationGroupId($flagDto->getVariationGroupId())->setFlagMetadataVariationGroupName($flagDto->getVariationGroupName())->setFlagMetadataCampaignId($flagDto->getCampaignId())->setFlagMetadataCampaignName($flagDto->getCampaignName())->setFlagMetadataCampaignType($flagDto->getCampaignType())->setFlagDefault("default")->setFlagMetadataCampaignSlug($flagDto->getSlug())->setVisitorExposed(true)->setHitContent($activateHit->toApiKeys()); $customVariable = [ - 'version' => FlagshipConstant::TROUBLESHOOTING_VERSION, - 'logLevel' => LogLevel::INFO->name, - 'envId' => $config->getEnvId(), - 'timeZone' => (new DateTime())->getTimezone()->getName(), - 'label' => TroubleshootingLabel::VISITOR_FETCH_CAMPAIGNS->value, - 'stack.type' => FlagshipConstant::SDK, - 'stack.name' => FlagshipConstant::SDK_LANGUAGE, - 'stack.version' => FlagshipConstant::SDK_VERSION, - 'visitor.visitorId' => $visitorId, - 'visitor.anonymousId' => $anonymousId, - 'visitor.sessionId' => $visitorInstanceId, - 'flagshipInstanceId' => $flagshipInstanceId, - 'stack.origin.name' => $stackOriginName, - 'stack.origin.version' => $stackOriginVersion, - 'sdk.status' => $sdkStatus->name, - 'sdk.config.logLevel' => $config->getLogLevel()->name, - 'sdk.config.mode' => $sdkConfigMode->name, - 'sdk.config.customLogManager' => 'true', - 'sdk.config.customCacheManager' => 'true', - 'sdk.config.custom.StatusListener' => 'false', - 'sdk.config.timeout' => (string) $config->getTimeout(), - 'sdk.config.trackingManager.strategy' => $cacheStrategy->name, - 'sdk.config.bucketingUrl' => $sdkConfigBucketingUrl, - 'sdk.config.fetchThirdPartyData' => 'true', - 'sdk.config.usingOnVisitorExposed' => 'true', - 'sdk.config.usingCustomHitCache' => 'true', - 'sdk.config.usingCustomVisitorCache' => 'true', - 'http.request.url' => $httpRequestUrl, - 'http.request.method' => $httpRequestMethod, - 'http.request.headers' => json_encode($httpRequestHeaders), - 'http.request.body' => json_encode($httpRequestBody), - 'http.response.url' => $httpResponseUrl, - 'http.response.method' => $httpResponseMethod, - 'http.response.headers' => json_encode($httpResponseHeaders), - 'http.response.code' => (string)$httpResponseCode, - "http.response.body" => json_encode($httpResponseBody), - 'http.response.time' => (string)$httpResponseTime, - 'visitor.context.[key1]' => 'value1', - 'visitor.context.[key2]' => 'value2', - 'visitor.consent' => 'true', - 'visitor.assignments.key1' => 'value1', - 'visitor.assignments.key2' => 'value2', - 'visitor.flags.[key].key' => $flagDto->getKey(), - 'visitor.flags.[key].value' => $flagDto->getValue(), - 'visitor.flags.[key].metadata.variationId' => $flagDto->getVariationId(), - 'visitor.flags.[key].metadata.variationName' => $flagDto->getVariationName(), - 'visitor.flags.[key].metadata.variationGroupId' => $flagDto->getVariationGroupId(), - 'visitor.flags.[key].metadata.variationGroupName' => $flagDto->getVariationGroupName(), - 'visitor.flags.[key].metadata.campaignId' => $flagDto->getCampaignId(), - 'visitor.flags.[key].metadata.campaignName' => $flagDto->getCampaignName(), - 'visitor.flags.[key].metadata.campaignType' => $flagDto->getCampaignType(), - 'visitor.flags.[key].metadata.slug' => $flagDto->getSlug(), - 'visitor.flags.[key].metadata.isReference' => json_encode($flagDto->getIsReference()), - 'visitor.flags.[key2].key' => $flagDto2->getKey(), - 'visitor.flags.[key2].value' => json_encode($flagDto2->getValue()), - 'visitor.flags.[key2].metadata.variationId' => $flagDto2->getVariationId(), - 'visitor.flags.[key2].metadata.variationName' => $flagDto2->getVariationName(), - 'visitor.flags.[key2].metadata.variationGroupId' => $flagDto2->getVariationGroupId(), - 'visitor.flags.[key2].metadata.variationGroupName' => $flagDto2->getVariationGroupName(), - 'visitor.flags.[key2].metadata.campaignId' => $flagDto2->getCampaignId(), - 'visitor.flags.[key2].metadata.campaignName' => $flagDto2->getCampaignName(), - 'visitor.flags.[key2].metadata.campaignType' => $flagDto2->getCampaignType(), - 'visitor.flags.[key2].metadata.slug' => '', - 'visitor.flags.[key2].metadata.isReference' => json_encode($flagDto2->getIsReference()), - 'visitor.isAuthenticated' => 'true', - 'visitor.campaigns' => '[]', - 'flag.key' => $flagDto->getKey(), - 'flag.value' => $flagDto->getValue(), - 'flag.default' => "default", - 'flag.visitorExposed' => "true", - 'flag.metadata.campaignId' => $flagDto->getCampaignId(), - 'flag.metadata.campaignName' => $flagDto->getCampaignName(), - 'flag.metadata.variationGroupId' => $flagDto->getVariationGroupId(), - 'flag.metadata.variationGroupName' => $flagDto->getVariationGroupName(), - 'flag.metadata.variationId' => $flagDto->getVariationId(), - 'flag.metadata.variationName' => $flagDto->getVariationName(), - 'flag.metadata.campaignSlug' => $flagDto->getSlug(), - 'flag.metadata.campaignType' => $flagDto->getCampaignType(), - 'flag.metadata.isReference' => json_encode($flagDto->getIsReference()), - ]; + 'version' => FlagshipConstant::TROUBLESHOOTING_VERSION, + 'logLevel' => LogLevel::INFO->name, + 'envId' => $config->getEnvId(), + 'timeZone' => (new DateTime())->getTimezone()->getName(), + 'label' => TroubleshootingLabel::VISITOR_FETCH_CAMPAIGNS->value, + 'stack.type' => FlagshipConstant::SDK, + 'stack.name' => FlagshipConstant::SDK_LANGUAGE, + 'stack.version' => FlagshipConstant::SDK_VERSION, + 'visitor.visitorId' => $visitorId, + 'visitor.anonymousId' => $anonymousId, + 'visitor.sessionId' => $visitorInstanceId, + 'flagshipInstanceId' => $flagshipInstanceId, + 'stack.origin.name' => $stackOriginName, + 'stack.origin.version' => $stackOriginVersion, + 'sdk.status' => $sdkStatus->name, + 'sdk.config.logLevel' => $config->getLogLevel()->name, + 'sdk.config.mode' => $sdkConfigMode->name, + 'sdk.config.customLogManager' => 'true', + 'sdk.config.customCacheManager' => 'true', + 'sdk.config.custom.StatusListener' => 'false', + 'sdk.config.timeout' => (string) $config->getTimeout(), + 'sdk.config.trackingManager.strategy' => $cacheStrategy->name, + 'sdk.config.bucketingUrl' => $sdkConfigBucketingUrl, + 'sdk.config.fetchThirdPartyData' => 'true', + 'sdk.config.usingOnVisitorExposed' => 'true', + 'sdk.config.usingCustomHitCache' => 'true', + 'sdk.config.usingCustomVisitorCache' => 'true', + 'http.request.url' => $httpRequestUrl, + 'http.request.method' => $httpRequestMethod, + 'http.request.headers' => json_encode($httpRequestHeaders), + 'http.request.body' => json_encode($httpRequestBody), + 'http.response.url' => $httpResponseUrl, + 'http.response.method' => $httpResponseMethod, + 'http.response.headers' => json_encode($httpResponseHeaders), + 'http.response.code' => (string)$httpResponseCode, + "http.response.body" => json_encode($httpResponseBody), + 'http.response.time' => (string)$httpResponseTime, + 'visitor.context.[key1]' => 'value1', + 'visitor.context.[key2]' => 'value2', + 'visitor.consent' => 'true', + 'visitor.assignments.key1' => 'value1', + 'visitor.assignments.key2' => 'value2', + 'visitor.flags.[key].key' => $flagDto->getKey(), + 'visitor.flags.[key].value' => $flagDto->getValue(), + 'visitor.flags.[key].metadata.variationId' => $flagDto->getVariationId(), + 'visitor.flags.[key].metadata.variationName' => $flagDto->getVariationName(), + 'visitor.flags.[key].metadata.variationGroupId' => $flagDto->getVariationGroupId(), + 'visitor.flags.[key].metadata.variationGroupName' => $flagDto->getVariationGroupName(), + 'visitor.flags.[key].metadata.campaignId' => $flagDto->getCampaignId(), + 'visitor.flags.[key].metadata.campaignName' => $flagDto->getCampaignName(), + 'visitor.flags.[key].metadata.campaignType' => $flagDto->getCampaignType(), + 'visitor.flags.[key].metadata.slug' => $flagDto->getSlug(), + 'visitor.flags.[key].metadata.isReference' => json_encode($flagDto->getIsReference()), + 'visitor.flags.[key2].key' => $flagDto2->getKey(), + 'visitor.flags.[key2].value' => json_encode($flagDto2->getValue()), + 'visitor.flags.[key2].metadata.variationId' => $flagDto2->getVariationId(), + 'visitor.flags.[key2].metadata.variationName' => $flagDto2->getVariationName(), + 'visitor.flags.[key2].metadata.variationGroupId' => $flagDto2->getVariationGroupId(), + 'visitor.flags.[key2].metadata.variationGroupName' => $flagDto2->getVariationGroupName(), + 'visitor.flags.[key2].metadata.campaignId' => $flagDto2->getCampaignId(), + 'visitor.flags.[key2].metadata.campaignName' => $flagDto2->getCampaignName(), + 'visitor.flags.[key2].metadata.campaignType' => $flagDto2->getCampaignType(), + 'visitor.flags.[key2].metadata.slug' => '', + 'visitor.flags.[key2].metadata.isReference' => json_encode($flagDto2->getIsReference()), + 'visitor.isAuthenticated' => 'true', + 'visitor.campaigns' => '[]', + 'flag.key' => $flagDto->getKey(), + 'flag.value' => $flagDto->getValue(), + 'flag.default' => "default", + 'flag.visitorExposed' => "true", + 'flag.metadata.campaignId' => $flagDto->getCampaignId(), + 'flag.metadata.campaignName' => $flagDto->getCampaignName(), + 'flag.metadata.variationGroupId' => $flagDto->getVariationGroupId(), + 'flag.metadata.variationGroupName' => $flagDto->getVariationGroupName(), + 'flag.metadata.variationId' => $flagDto->getVariationId(), + 'flag.metadata.variationName' => $flagDto->getVariationName(), + 'flag.metadata.campaignSlug' => $flagDto->getSlug(), + 'flag.metadata.campaignType' => $flagDto->getCampaignType(), + 'flag.metadata.isReference' => json_encode($flagDto->getIsReference()), + ]; foreach ($activateHit->toApiKeys() as $key => $item) { - $customVariable["hit." . $key] = is_string($item) ? $item : json_encode($item); + $customVariable["hit." . $key] = is_string($item) ? $item : json_encode($item); } $expectedApiKey = [ - FlagshipConstant::VISITOR_ID_API_ITEM => $visitorId, - FlagshipConstant::DS_API_ITEM => FlagshipConstant::SDK_APP, - FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $config->getEnvId(), - FlagshipConstant::T_API_ITEM => HitType::TROUBLESHOOTING->value, - 'cv' => $customVariable - ]; + FlagshipConstant::VISITOR_ID_API_ITEM => $visitorId, + FlagshipConstant::DS_API_ITEM => FlagshipConstant::SDK_APP, + FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $config->getEnvId(), + FlagshipConstant::T_API_ITEM => HitType::TROUBLESHOOTING->value, + 'cv' => $customVariable, + ]; $apiKey = $troubleshooting->toApiKeys(); unset($apiKey['cv']['timestamp']); @@ -247,71 +167,44 @@ public function testConstruct() $flagDto = new FlagDTO(); - $flagDto->setKey("key") - ->setValue([]) - ->setCampaignId("campaignId") - ->setCampaignType("ab") - ->setCampaignName("campaignName") - ->setVariationId("varId") - ->setVariationName("variationName") - ->setVariationGroupId("varGroupId") - ->setIsReference(false) - ->setSlug("slug") - ->setVariationGroupName("varGroupName"); + $flagDto->setKey("key")->setValue([])->setCampaignId("campaignId")->setCampaignType("ab")->setCampaignName("campaignName")->setVariationId("varId")->setVariationName("variationName")->setVariationGroupId("varGroupId")->setIsReference(false)->setSlug("slug")->setVariationGroupName("varGroupName"); $troubleshooting = new Troubleshooting(); - $troubleshooting->setVisitorId($visitorId) - ->setAnonymousId($anonymousId) - ->setConfig($config) - ->setLogLevel(LogLevel::INFO) - ->setLabel(TroubleshootingLabel::VISITOR_FETCH_CAMPAIGNS) - ->setFlagshipInstanceId($flagshipInstanceId) - ->setVisitorSessionId($visitorInstanceId) - ->setFlagKey($flagDto->getKey()) - ->setFlagValue($flagDto->getValue()) - ->setFlagMetadataCampaignIsReference($flagDto->getIsReference()) - ->setFlagMetadataVariationId($flagDto->getVariationId()) - ->setFlagMetadataVariationGroupId($flagDto->getVariationGroupId()) - ->setFlagMetadataCampaignId($flagDto->getCampaignId()) - ->setFlagMetadataCampaignType($flagDto->getCampaignType()) - ->setFlagDefault([]) - ->setFlagMetadataCampaignSlug($flagDto->getSlug()) - ->setVisitorExposed(true) - ; + $troubleshooting->setVisitorId($visitorId)->setAnonymousId($anonymousId)->setConfig($config)->setLogLevel(LogLevel::INFO)->setLabel(TroubleshootingLabel::VISITOR_FETCH_CAMPAIGNS)->setFlagshipInstanceId($flagshipInstanceId)->setVisitorSessionId($visitorInstanceId)->setFlagKey($flagDto->getKey())->setFlagValue($flagDto->getValue())->setFlagMetadataCampaignIsReference($flagDto->getIsReference())->setFlagMetadataVariationId($flagDto->getVariationId())->setFlagMetadataVariationGroupId($flagDto->getVariationGroupId())->setFlagMetadataCampaignId($flagDto->getCampaignId())->setFlagMetadataCampaignType($flagDto->getCampaignType())->setFlagDefault([])->setFlagMetadataCampaignSlug($flagDto->getSlug())->setVisitorExposed(true); $customVariable = [ - 'version' => FlagshipConstant::TROUBLESHOOTING_VERSION, - 'logLevel' => LogLevel::INFO->name, - 'envId' => $config->getEnvId(), - 'timeZone' => (new DateTime())->getTimezone()->getName(), - 'label' => TroubleshootingLabel::VISITOR_FETCH_CAMPAIGNS->value, - 'stack.type' => FlagshipConstant::SDK, - 'stack.name' => FlagshipConstant::SDK_LANGUAGE, - 'stack.version' => FlagshipConstant::SDK_VERSION, - 'visitor.visitorId' => $visitorId, - 'visitor.anonymousId' => $anonymousId, - 'visitor.sessionId' => $visitorInstanceId, - 'flagshipInstanceId' => $flagshipInstanceId, - 'flag.key' => $flagDto->getKey(), - 'flag.value' => json_encode($flagDto->getValue()), - 'flag.default' => json_encode([]), - 'flag.visitorExposed' => "true", - 'flag.metadata.campaignId' => $flagDto->getCampaignId(), - 'flag.metadata.variationGroupId' => $flagDto->getVariationGroupId(), - 'flag.metadata.variationId' => $flagDto->getVariationId(), - 'flag.metadata.campaignSlug' => $flagDto->getSlug(), - 'flag.metadata.campaignType' => $flagDto->getCampaignType(), - 'flag.metadata.isReference' => json_encode($flagDto->getIsReference()) - ]; + 'version' => FlagshipConstant::TROUBLESHOOTING_VERSION, + 'logLevel' => LogLevel::INFO->name, + 'envId' => $config->getEnvId(), + 'timeZone' => (new DateTime())->getTimezone()->getName(), + 'label' => TroubleshootingLabel::VISITOR_FETCH_CAMPAIGNS->value, + 'stack.type' => FlagshipConstant::SDK, + 'stack.name' => FlagshipConstant::SDK_LANGUAGE, + 'stack.version' => FlagshipConstant::SDK_VERSION, + 'visitor.visitorId' => $visitorId, + 'visitor.anonymousId' => $anonymousId, + 'visitor.sessionId' => $visitorInstanceId, + 'flagshipInstanceId' => $flagshipInstanceId, + 'flag.key' => $flagDto->getKey(), + 'flag.value' => json_encode($flagDto->getValue()), + 'flag.default' => json_encode([]), + 'flag.visitorExposed' => "true", + 'flag.metadata.campaignId' => $flagDto->getCampaignId(), + 'flag.metadata.variationGroupId' => $flagDto->getVariationGroupId(), + 'flag.metadata.variationId' => $flagDto->getVariationId(), + 'flag.metadata.campaignSlug' => $flagDto->getSlug(), + 'flag.metadata.campaignType' => $flagDto->getCampaignType(), + 'flag.metadata.isReference' => json_encode($flagDto->getIsReference()), + ]; $expectedApiKey = [ - FlagshipConstant::VISITOR_ID_API_ITEM => $visitorId, - FlagshipConstant::DS_API_ITEM => FlagshipConstant::SDK_APP, - FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $config->getEnvId(), - FlagshipConstant::T_API_ITEM => HitType::TROUBLESHOOTING->value, - 'cv' => $customVariable - ]; + FlagshipConstant::VISITOR_ID_API_ITEM => $visitorId, + FlagshipConstant::DS_API_ITEM => FlagshipConstant::SDK_APP, + FlagshipConstant::CUSTOMER_ENV_ID_API_ITEM => $config->getEnvId(), + FlagshipConstant::T_API_ITEM => HitType::TROUBLESHOOTING->value, + 'cv' => $customVariable, + ]; $apiKey = $troubleshooting->toApiKeys(); diff --git a/tests/Hit/UsageHitTest.php b/tests/Hit/UsageHitTest.php index 732de212..60275917 100644 --- a/tests/Hit/UsageHitTest.php +++ b/tests/Hit/UsageHitTest.php @@ -14,10 +14,7 @@ public function testToApiKeys() { $config = new DecisionApiConfig(); $analyticHit = new UsageHit(); - $analyticHit->setVisitorId("visitor") - ->setLogLevel(LogLevel::INFO) - ->setLabel(TroubleshootingLabel::FLAG_VALUE_NOT_CALLED) - ->setConfig($config); + $analyticHit->setVisitorId("visitor")->setLogLevel(LogLevel::INFO)->setLabel(TroubleshootingLabel::FLAG_VALUE_NOT_CALLED)->setConfig($config); $this->assertSame('USAGE', $analyticHit->toApiKeys()['t']); } diff --git a/tests/Model/FlagDTOTest.php b/tests/Model/FlagDTOTest.php index dc5a7499..b8753407 100644 --- a/tests/Model/FlagDTOTest.php +++ b/tests/Model/FlagDTOTest.php @@ -42,18 +42,18 @@ public function testModificationInstance() $this->assertSame($variationId, $flagDTO->getVariationId()); - $arrayToJson = [ - FlagshipField::FIELD_KEY => $flagDTO->getKey(), - FlagshipField::FIELD_CAMPAIGN_ID => $flagDTO->getCampaignId(), - FlagshipField::FIELD_CAMPAIGN_NAME => $flagDTO->getCampaignName(), - FlagshipField::FIELD_VARIATION_GROUP_ID => $flagDTO->getVariationGroupId(), - FlagshipField::FIELD_VARIATION_GROUP_NAME => $flagDTO->getVariationGroupName(), - FlagshipField::FIELD_VARIATION_ID => $flagDTO->getVariationId(), - FlagshipField::FIELD_VARIATION_NAME => $flagDTO->getVariationName(), - FlagshipField::FIELD_IS_REFERENCE => $flagDTO->getIsReference(), - FlagshipField::FIELD_VALUE => $flagDTO->getValue(), - FlagshipField::FIELD_SLUG => $flagDTO->getSlug() - ]; + $arrayToJson = [ + FlagshipField::FIELD_KEY => $flagDTO->getKey(), + FlagshipField::FIELD_CAMPAIGN_ID => $flagDTO->getCampaignId(), + FlagshipField::FIELD_CAMPAIGN_NAME => $flagDTO->getCampaignName(), + FlagshipField::FIELD_VARIATION_GROUP_ID => $flagDTO->getVariationGroupId(), + FlagshipField::FIELD_VARIATION_GROUP_NAME => $flagDTO->getVariationGroupName(), + FlagshipField::FIELD_VARIATION_ID => $flagDTO->getVariationId(), + FlagshipField::FIELD_VARIATION_NAME => $flagDTO->getVariationName(), + FlagshipField::FIELD_IS_REFERENCE => $flagDTO->getIsReference(), + FlagshipField::FIELD_VALUE => $flagDTO->getValue(), + FlagshipField::FIELD_SLUG => $flagDTO->getSlug(), + ]; $this->assertJsonStringEqualsJsonString(json_encode($arrayToJson), json_encode($flagDTO)); } diff --git a/tests/Model/HttpResponseTest.php b/tests/Model/HttpResponseTest.php index ed878925..966c0899 100644 --- a/tests/Model/HttpResponseTest.php +++ b/tests/Model/HttpResponseTest.php @@ -12,9 +12,7 @@ public function testConstruct() { $statusCode = 200; $body = 'Body'; - $headers = [ - "accept" => "application/json" - ]; + $headers = ["accept" => "application/json"]; $httpResponse = new HttpResponse($statusCode, $body, $headers); $this->assertSame($statusCode, $httpResponse->getStatusCode()); diff --git a/tests/TestFunctional.php b/tests/TestFunctional.php index 5404535e..97adb333 100644 --- a/tests/TestFunctional.php +++ b/tests/TestFunctional.php @@ -12,26 +12,21 @@ $envId = getenv('FS_ENV_ID'); $apiKey = getenv('FS_API_KEY'); -Flagship::start($envId, $apiKey, DecisionApiConfig::decisionApi() - ->setCacheStrategy(CacheStrategy::BATCHING_AND_CACHING_ON_FAILURE)); +Flagship::start($envId, $apiKey, DecisionApiConfig::decisionApi()->setCacheStrategy(CacheStrategy::BATCHING_AND_CACHING_ON_FAILURE)); -$visitor = Flagship::newVisitor("visitor-1", true) - ->setContext(['ci-test' => true, 'test-ab' => true]) - ->build(); +$visitor = Flagship::newVisitor("visitor-1", true)->setContext(['ci-test' => true, 'test-ab' => true])->build(); $visitor->fetchFlags(); $defaultValue = 'default-value'; -$flag = $visitor->getFlag('ci_flag_1', ); +$flag = $visitor->getFlag('ci_flag_1',); $flagValue = $flag->getValue($defaultValue); TestCase::assertSame($defaultValue, $flagValue); TestCase::assertSame('Test-campaign ab', $flag->getMetadata()->getCampaignName()); //Test 2 -$visitor = Flagship::newVisitor("visitor-2", true) - ->setContext(['ci-test' => true, 'test-ab' => true]) - ->build(); +$visitor = Flagship::newVisitor("visitor-2", true)->setContext(['ci-test' => true, 'test-ab' => true])->build(); $visitor->fetchFlags(); @@ -42,9 +37,7 @@ TestCase::assertSame('Test-campaign ab', $flag->getMetadata()->getCampaignName()); //Test 3 -$visitor = Flagship::newVisitor("visitor-6", true) - ->setContext(['ci-test' => false, 'test-ab' => true]) - ->build(); +$visitor = Flagship::newVisitor("visitor-6", true)->setContext(['ci-test' => false, 'test-ab' => true])->build(); $visitor->fetchFlags(); diff --git a/tests/Traits/BuildApiTraitTest.php b/tests/Traits/BuildApiTraitTest.php index a7e6c107..7751492d 100644 --- a/tests/Traits/BuildApiTraitTest.php +++ b/tests/Traits/BuildApiTraitTest.php @@ -30,11 +30,11 @@ public function testBuildHeader() $headers = $buildHeader->invokeArgs($buildApiTraitMock, [$apiKey]); $headerArray = [ - FlagshipConstant::HEADER_X_API_KEY => $apiKey, - FlagshipConstant::HEADER_X_SDK_VERSION => FlagshipConstant::SDK_VERSION, - FlagshipConstant::HEADER_CONTENT_TYPE => FlagshipConstant::HEADER_APPLICATION_JSON, - FlagshipConstant::HEADER_X_SDK_CLIENT => FlagshipConstant::SDK_LANGUAGE, - ]; + FlagshipConstant::HEADER_X_API_KEY => $apiKey, + FlagshipConstant::HEADER_X_SDK_VERSION => FlagshipConstant::SDK_VERSION, + FlagshipConstant::HEADER_CONTENT_TYPE => FlagshipConstant::HEADER_APPLICATION_JSON, + FlagshipConstant::HEADER_X_SDK_CLIENT => FlagshipConstant::SDK_LANGUAGE, + ]; $this->assertSame($headerArray, $headers); diff --git a/tests/Traits/CommonLogManagerTraitTest.php b/tests/Traits/CommonLogManagerTraitTest.php index 7db6c666..2113a236 100644 --- a/tests/Traits/CommonLogManagerTraitTest.php +++ b/tests/Traits/CommonLogManagerTraitTest.php @@ -9,7 +9,7 @@ class CommonLogManagerTraitTest extends TestCase public function testGetDateTime() { $logManagerTraitMock = $this->getMockForTrait("Flagship\Traits\CommonLogManagerTrait"); - $value = $logManagerTraitMock->getDateTime(); + $value = $logManagerTraitMock->getDateTime(); $this->assertMatchesRegularExpression("/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+/", $value); } } diff --git a/tests/Traits/HelperTest.php b/tests/Traits/HelperTest.php new file mode 100644 index 00000000..71d8039d --- /dev/null +++ b/tests/Traits/HelperTest.php @@ -0,0 +1,58 @@ +getNow(); + $this->assertIsFloat($now); + } + + public function testGetCurrentDateTime() + { + $dateTime = $this->getCurrentDateTime(); + $this->assertInstanceOf(DateTime::class, $dateTime); + } + + public function testValueToHex() + { + $value = ["v" => "value2"]; + $expectedHex = "7b2276223a2276616c756532227d"; + $this->assertSame($expectedHex, $this->valueToHex($value)); + } + + public function testArraysAreEqual() + { + $array1 = ["key1" => "value1", "key2" => "value2"]; + $array2 = ["key1" => "value1", "key2" => "value2"]; + $this->assertTrue($this->arraysAreEqual($array1, $array2)); + + $array1 = ["key1" => "value1", "key2" => "value2"]; + $array2 = ["key1" => "value1", "key2" => "differentValue"]; + $this->assertFalse($this->arraysAreEqual($array1, $array2)); + + $array1 = ["key1" => "value1", "key2" => ["subKey" => "subValue"]]; + $array2 = ["key1" => "value1", "key2" => ["subKey" => "subValue"]]; + $this->assertTrue($this->arraysAreEqual($array1, $array2)); + + $array1 = ["key1" => "value1", "key2" => ["subKey" => "subValue"]]; + $array2 = ["key1" => "value1", "key2" => ["subKey" => "differentSubValue"]]; + $this->assertFalse($this->arraysAreEqual($array1, $array2)); + + $array1 = ["key1" => "value1", "key2" => ["subKey" => "subValue"]]; + $array2 = ["key1" => "value1", "key2" => ["subKey" => "subValue", "extraKey" => "extraValue"]]; + $this->assertFalse($this->arraysAreEqual($array1, $array2)); + + $array1 = ["key1" => "value1", "key2" => ["subKey2" => "subValue"]]; + $array2 = ["key1" => "value1", "key2" => ["subKey" => "subValue"]]; + $this->assertFalse($this->arraysAreEqual($array1, $array2)); + } +} \ No newline at end of file diff --git a/tests/Traits/LogTraitTest.php b/tests/Traits/LogTraitTest.php index 9ffe60fd..977dbdc6 100644 --- a/tests/Traits/LogTraitTest.php +++ b/tests/Traits/LogTraitTest.php @@ -21,11 +21,10 @@ public function testLoginError() $message = "hello"; $context = ['exception' => 'hello Exception']; - $logManagerMock->expects($this->exactly(3))->method('error') - ->with( - $message, - $context - ); + $logManagerMock->expects($this->exactly(3))->method('error')->with( + $message, + $context + ); $config = new DecisionApiConfig(); $config->setLogManager($logManagerMock); @@ -60,11 +59,10 @@ public function testLogErrorSprintf() $tag = __FUNCTION__; $context = [FlagshipConstant::TAG => $tag]; - $logManagerMock->expects($this->exactly(2))->method('error') - ->with( - $message, - $context - ); + $logManagerMock->expects($this->exactly(2))->method('error')->with( + $message, + $context + ); $config = new DecisionApiConfig(); $config->setLogManager($logManagerMock); @@ -92,11 +90,10 @@ public function testLoginInfo() $message = "hello"; $context = ['exception' => 'hello Exception']; - $logManagerMock->expects($this->exactly(3))->method('info') - ->with( - $message, - $context - ); + $logManagerMock->expects($this->exactly(3))->method('info')->with( + $message, + $context + ); $config = new DecisionApiConfig(); $config->setLogManager($logManagerMock); @@ -130,11 +127,10 @@ public function testLogInfoSprintf() $tag = __FUNCTION__; $context = [FlagshipConstant::TAG => $tag]; - $logManagerMock->expects($this->exactly(2))->method('info') - ->with( - $message, - $context - ); + $logManagerMock->expects($this->exactly(2))->method('info')->with( + $message, + $context + ); $config = new DecisionApiConfig(); $config->setLogManager($logManagerMock); @@ -161,11 +157,10 @@ public function testWarning() $message = "hello"; $context = ['exception' => 'hello Exception']; - $logManagerMock->expects($this->exactly(3))->method('warning') - ->with( - $message, - $context - ); + $logManagerMock->expects($this->exactly(3))->method('warning')->with( + $message, + $context + ); $config = new DecisionApiConfig(); $config->setLogManager($logManagerMock); @@ -199,11 +194,10 @@ public function testWarningSprintf() $tag = __FUNCTION__; $context = [FlagshipConstant::TAG => $tag]; - $logManagerMock->expects($this->exactly(2))->method('warning') - ->with( - $message, - $context - ); + $logManagerMock->expects($this->exactly(2))->method('warning')->with( + $message, + $context + ); $config = new DecisionApiConfig(); $config->setLogManager($logManagerMock); @@ -230,13 +224,13 @@ public function testLogDebug() $message = "hello"; $context = ['exception' => 'hello Exception']; - $logManagerMock->expects($this->exactly(2))->method('debug') - ->with( - $message, - $context - ); + $logManagerMock->expects($this->exactly(2))->method('debug')->with( + $message, + $context + ); $config = new DecisionApiConfig(); + $config->setLogLevel(LogLevel::DEBUG); $config->setLogManager($logManagerMock); $logDebug = Utils::getMethod($logTraitMock, "logDebug"); @@ -259,18 +253,24 @@ public function testLogDebugSprintf() $message = "hello %s %s"; $tag = __FUNCTION__; - $args = ["there", ["key" => "value"]]; + $args = [ + "there", + ["key" => "value"], + ]; $context = [FlagshipConstant::TAG => $tag]; - $logArgs = [$args[0], json_encode($args[1])]; + $logArgs = [ + $args[0], + json_encode($args[1]), + ]; - $logManagerMock->expects($this->exactly(2))->method('debug') - ->with( - vsprintf($message, $logArgs), - $context - ); + $logManagerMock->expects($this->exactly(2))->method('debug')->with( + vsprintf($message, $logArgs), + $context + ); $config = new DecisionApiConfig(); + $config->setLogLevel(LogLevel::DEBUG); $config->setLogManager($logManagerMock); $logError = Utils::getMethod($logTraitMock, "logDebugSprintf"); @@ -295,19 +295,17 @@ public function testGetLogFormat() $message = "message"; $url = "http://localhost"; - $requestBody = [ - "key" => "value" - ]; + $requestBody = ["key" => "value"]; $headers = ["key" => "value"]; $duration = 300; $value = $getLogFormat->invokeArgs($logTraitMock, [$message, $url, $requestBody, $headers, $duration]); $expectedValue = [ - FlagshipConstant::LOG_FORMAT_MESSAGE => $message, - FlagshipConstant::LOG_FORMAT_URL => $url, - FlagshipConstant::LOG_FORMAT_REQUEST_BODY => $requestBody, - FlagshipConstant::LOG_FORMAT_REQUEST_HEADERS => $headers, - FlagshipConstant::LOG_FORMAT_DURATION => $duration - ]; + FlagshipConstant::LOG_FORMAT_MESSAGE => $message, + FlagshipConstant::LOG_FORMAT_URL => $url, + FlagshipConstant::LOG_FORMAT_REQUEST_BODY => $requestBody, + FlagshipConstant::LOG_FORMAT_REQUEST_HEADERS => $headers, + FlagshipConstant::LOG_FORMAT_DURATION => $duration, + ]; $this->assertSame($expectedValue, $value); } diff --git a/tests/Traits/Round.php b/tests/Traits/Round.php index 2aa90a5f..0f945a7c 100644 --- a/tests/Traits/Round.php +++ b/tests/Traits/Round.php @@ -1,6 +1,5 @@ setLogManager($logManagerStub); $value = "linux"; - $check = $checkFlagshipContext->invokeArgs($validatorTraitMock, ['item',$value, $config]); + $check = $checkFlagshipContext->invokeArgs($validatorTraitMock, ['item', $value, $config]); $this->assertNull($check); $sdk = FlagshipConstant::FLAGSHIP_SDK; - $logManagerStub->expects($this->once())->method('error') - ->with( - sprintf( - FlagshipConstant::FLAGSHIP_PREDEFINED_CONTEXT_ERROR, - "sdk_osName", - "string" - ) - ); + $logManagerStub->expects($this->once())->method('error')->with( + sprintf( + FlagshipConstant::FLAGSHIP_PREDEFINED_CONTEXT_ERROR, + "sdk_osName", + "string" + ) + ); $value = 1; $check = $checkFlagshipContext->invokeArgs( $validatorTraitMock, - [FlagshipContext::OS_NAME,$value, $config] + [ + FlagshipContext::OS_NAME, + $value, + $config, + ] ); $this->assertFalse($check); $value = "mac"; $check = $checkFlagshipContext->invokeArgs( $validatorTraitMock, - [FlagshipContext::OS_NAME,$value, $config] + [ + FlagshipContext::OS_NAME, + $value, + $config, + ] ); $this->assertTrue($check); } @@ -216,10 +223,9 @@ public function testIsNumeric() $this->assertTrue($isNumeric->invokeArgs($validatorTraitMock, [1, $itemName, $config])); $sdk = FlagshipConstant::FLAGSHIP_SDK; - $logManagerStub->expects($this->once())->method('error') - ->with( - sprintf(FlagshipConstant::TYPE_ERROR, $itemName, 'numeric') - ); + $logManagerStub->expects($this->once())->method('error')->with( + sprintf(FlagshipConstant::TYPE_ERROR, $itemName, 'numeric') + ); $this->assertFalse($isNumeric->invokeArgs($validatorTraitMock, ["abc", $itemName, $config])); } diff --git a/tests/Utils/ConfigManagerTest.php b/tests/Utils/ConfigManagerTest.php index 8fa532f3..d74874c3 100644 --- a/tests/Utils/ConfigManagerTest.php +++ b/tests/Utils/ConfigManagerTest.php @@ -11,8 +11,8 @@ class ConfigManagerTest extends TestCase { public function testInstance() { - $config = new DecisionApiConfig(); - $decisionManager = new ApiManager(new HttpClient(), $config); + $config = new DecisionApiConfig(); + $decisionManager = new ApiManager(new HttpClient(), $config); $trackingManager = new TrackingManager($config, new HttpClient()); $configManager = new ConfigManager($config, $decisionManager, $trackingManager); diff --git a/tests/Utils/FlagshipLogManagerTest.php b/tests/Utils/FlagshipLogManagerTest.php index a07ed9f6..82c685b3 100644 --- a/tests/Utils/FlagshipLogManagerTest.php +++ b/tests/Utils/FlagshipLogManagerTest.php @@ -15,9 +15,13 @@ public function contextDataProvider(): array { return [ - 'flagshipSdk' => FlagshipConstant::FLAGSHIP_SDK, - 'context' => ['process' => 'testError', 'context2' => 'value 2'], - 'contextString' => '[process => testError, context2 => value 2]' ]; + 'flagshipSdk' => FlagshipConstant::FLAGSHIP_SDK, + 'context' => [ + 'process' => 'testError', + 'context2' => 'value 2', + ], + 'contextString' => '[process => testError, context2 => value 2]', + ]; } public function getMessageError($formatDate, $level, $message, $tag): string @@ -30,13 +34,9 @@ public function testError() { $data = $this->contextDataProvider(); $message = 'Test Error'; - $logManager = $this->getMockBuilder(FlagshipLogManager8::class) - ->onlyMethods(["getDateTime"]) - ->getMock(); + $logManager = $this->getMockBuilder(FlagshipLogManager8::class)->onlyMethods(["getDateTime"])->getMock(); $formatDate = "2023-02-15 11:08:10.455"; - $logManager->expects($this->once()) - ->method("getDateTime") - ->willReturn($formatDate); + $logManager->expects($this->once())->method("getDateTime")->willReturn($formatDate); $logManager->error($message, $data['context']); $level = LogLevel::ERROR; @@ -49,13 +49,9 @@ public function testInfo() { $data = $this->contextDataProvider(); $message = 'Test info'; - $logManager = $this->getMockBuilder(FlagshipLogManager8::class) - ->onlyMethods(["getDateTime"]) - ->getMock(); + $logManager = $this->getMockBuilder(FlagshipLogManager8::class)->onlyMethods(["getDateTime"])->getMock(); $formatDate = "2023-02-15 11:08:10.455"; - $logManager->expects($this->once()) - ->method("getDateTime") - ->willReturn($formatDate); + $logManager->expects($this->once())->method("getDateTime")->willReturn($formatDate); $logManager->info($message, $data['context']); $level = LogLevel::INFO; $messageError = $this->getMessageError($formatDate, $level, $message, $data['contextString']); @@ -66,13 +62,9 @@ public function testAlert() { $data = $this->contextDataProvider(); $message = 'Test Error'; - $logManager = $this->getMockBuilder(FlagshipLogManager8::class) - ->onlyMethods(["getDateTime"]) - ->getMock(); + $logManager = $this->getMockBuilder(FlagshipLogManager8::class)->onlyMethods(["getDateTime"])->getMock(); $formatDate = "2023-02-15 11:08:10.455"; - $logManager->expects($this->once()) - ->method("getDateTime") - ->willReturn($formatDate); + $logManager->expects($this->once())->method("getDateTime")->willReturn($formatDate); $logManager->alert($message, $data['context']); $level = LogLevel::ALERT; $messageError = $this->getMessageError($formatDate, $level, $message, $data['contextString']); @@ -83,13 +75,9 @@ public function testEmergency() { $data = $this->contextDataProvider(); $message = 'Test Error'; - $logManager = $this->getMockBuilder(FlagshipLogManager8::class) - ->onlyMethods(["getDateTime"]) - ->getMock(); + $logManager = $this->getMockBuilder(FlagshipLogManager8::class)->onlyMethods(["getDateTime"])->getMock(); $formatDate = "2023-02-15 11:08:10.455"; - $logManager->expects($this->once()) - ->method("getDateTime") - ->willReturn($formatDate); + $logManager->expects($this->once())->method("getDateTime")->willReturn($formatDate); $logManager->emergency($message, $data['context']); $level = LogLevel::EMERGENCY; $messageError = $this->getMessageError($formatDate, $level, $message, $data['contextString']); @@ -101,13 +89,9 @@ public function testLog() { $data = $this->contextDataProvider(); $message = 'Test Error'; - $logManager = $this->getMockBuilder(FlagshipLogManager8::class) - ->onlyMethods(["getDateTime"]) - ->getMock(); + $logManager = $this->getMockBuilder(FlagshipLogManager8::class)->onlyMethods(["getDateTime"])->getMock(); $formatDate = "2023-02-15 11:08:10.455"; - $logManager->expects($this->once()) - ->method("getDateTime") - ->willReturn($formatDate); + $logManager->expects($this->once())->method("getDateTime")->willReturn($formatDate); $level = LogLevel::EMERGENCY; $logManager->log($level, $message, $data['context']); $messageError = $this->getMessageError($formatDate, $level, $message, $data['contextString']); @@ -119,13 +103,9 @@ public function testWarning() { $data = $this->contextDataProvider(); $message = 'Test Error'; - $logManager = $this->getMockBuilder(FlagshipLogManager8::class) - ->onlyMethods(["getDateTime"]) - ->getMock(); + $logManager = $this->getMockBuilder(FlagshipLogManager8::class)->onlyMethods(["getDateTime"])->getMock(); $formatDate = "2023-02-15 11:08:10.455"; - $logManager->expects($this->once()) - ->method("getDateTime") - ->willReturn($formatDate); + $logManager->expects($this->once())->method("getDateTime")->willReturn($formatDate); $logManager->warning($message, $data['context']); $level = LogLevel::WARNING; $messageError = $this->getMessageError($formatDate, $level, $message, $data['contextString']); @@ -136,13 +116,9 @@ public function testCritical() { $data = $this->contextDataProvider(); $message = 'Test Error'; - $logManager = $this->getMockBuilder(FlagshipLogManager8::class) - ->onlyMethods(["getDateTime"]) - ->getMock(); + $logManager = $this->getMockBuilder(FlagshipLogManager8::class)->onlyMethods(["getDateTime"])->getMock(); $formatDate = "2023-02-15 11:08:10.455"; - $logManager->expects($this->once()) - ->method("getDateTime") - ->willReturn($formatDate); + $logManager->expects($this->once())->method("getDateTime")->willReturn($formatDate); $logManager->critical($message, $data['context']); $level = LogLevel::CRITICAL; $messageError = $this->getMessageError($formatDate, $level, $message, $data['contextString']); @@ -153,13 +129,9 @@ public function testNotice() { $data = $this->contextDataProvider(); $message = 'Test Notice'; - $logManager = $this->getMockBuilder(FlagshipLogManager8::class) - ->onlyMethods(["getDateTime"]) - ->getMock(); + $logManager = $this->getMockBuilder(FlagshipLogManager8::class)->onlyMethods(["getDateTime"])->getMock(); $formatDate = "2023-02-15 11:08:10.455"; - $logManager->expects($this->once()) - ->method("getDateTime") - ->willReturn($formatDate); + $logManager->expects($this->once())->method("getDateTime")->willReturn($formatDate); $logManager->notice($message, $data['context']); $level = LogLevel::NOTICE; $messageError = $this->getMessageError($formatDate, $level, $message, $data['contextString']); @@ -171,13 +143,9 @@ public function testDebug() { $data = $this->contextDataProvider(); $message = 'Test Debug'; - $logManager = $this->getMockBuilder(FlagshipLogManager8::class) - ->onlyMethods(["getDateTime"]) - ->getMock(); + $logManager = $this->getMockBuilder(FlagshipLogManager8::class)->onlyMethods(["getDateTime"])->getMock(); $formatDate = "2023-02-15 11:08:10.455"; - $logManager->expects($this->once()) - ->method("getDateTime") - ->willReturn($formatDate); + $logManager->expects($this->once())->method("getDateTime")->willReturn($formatDate); $logManager->debug($message, $data['context']); $level = LogLevel::DEBUG; $messageError = $this->getMessageError($formatDate, $level, $message, $data['contextString']); diff --git a/tests/Utils/HttpClientTest.php b/tests/Utils/HttpClientTest.php index 00d4290b..98e51805 100644 --- a/tests/Utils/HttpClientTest.php +++ b/tests/Utils/HttpClientTest.php @@ -49,11 +49,12 @@ public function testBuildUrl() $versionSDkKey . '=' . $versionSDkValue; $urlBuild = $buildMethod->invokeArgs( $client, - [$urlOriginal, - [ - $visitoKey => $visitorid, - $versionSDkKey => $versionSDkValue - ] + [ + $urlOriginal, + [ + $visitoKey => $visitorid, + $versionSDkKey => $versionSDkValue, + ], ] ); $this->assertEquals($urlExpected, $urlBuild); diff --git a/tests/Visitor/CampaignsData.php b/tests/Visitor/CampaignsData.php index bad1176c..58740c99 100644 --- a/tests/Visitor/CampaignsData.php +++ b/tests/Visitor/CampaignsData.php @@ -9,140 +9,80 @@ trait CampaignsData public function campaignsModifications() { return [ - (new FlagDTO()) - ->setKey('Number') - ->setValue(5) - ->setIsReference(false) - ->setVariationGroupId('c8pimlr7n0ig3a0pt2jg') - ->setCampaignId('c8pimlr7n0ig3a0pt2ig') - ->setVariationId('c8pimlr7n0ig3a0pt2kg') - ->setSlug("campaign_1") - ->setCampaignType("ab"), - (new FlagDTO()) - ->setKey('isBool') - ->setValue(false) - ->setIsReference(false) - ->setVariationGroupId('c8pimlr7n0ig3a0pt2jg') - ->setCampaignId('c8pimlr7n0ig3a0pt2ig') - ->setVariationId('c8pimlr7n0ig3a0pt2kg') - ->setSlug("campaign_1") - ->setCampaignType("ab"), - (new FlagDTO()) - ->setKey('background') - ->setValue('EE3300') - ->setIsReference(false) - ->setVariationGroupId('c8pimlr7n0ig3a0pt2jg') - ->setCampaignId('c8pimlr7n0ig3a0pt2ig') - ->setVariationId('c8pimlr7n0ig3a0pt2kg') - ->setSlug("campaign_1") - ->setCampaignType("ab"), - (new FlagDTO()) - ->setKey('borderColor') - ->setValue('blue') - ->setIsReference(false) - ->setVariationGroupId('c8pimlr7n0ig3a0pt2jg') - ->setCampaignId('c8pimlr7n0ig3a0pt2ig') - ->setVariationId('c8pimlr7n0ig3a0pt2kg') - ->setSlug("campaign_1") - ->setCampaignType("ab"), - (new FlagDTO()) - ->setKey('Null') - ->setValue(null) - ->setIsReference(false) - ->setVariationGroupId('c8pimlr7n0ig3a0pt2jg') - ->setCampaignId('c8pimlr7n0ig3a0pt2ig') - ->setVariationId('c8pimlr7n0ig3a0pt2kg') - ->setSlug("campaign_1") - ->setCampaignType("ab"), - (new FlagDTO()) - ->setKey('Empty') - ->setValue("") - ->setIsReference(false) - ->setVariationGroupId('c8pimlr7n0ig3a0pt2jg') - ->setCampaignId('c8pimlr7n0ig3a0pt2ig') - ->setVariationId('c8pimlr7n0ig3a0pt2kg') - ->setSlug("campaign_1") - ->setCampaignType("ab"), - (new FlagDTO()) - ->setKey('php') - ->setValue("value2") - ->setIsReference(false) - ->setVariationGroupId('c7q1lmuru9u05agq3apg') - ->setCampaignId('c7q1lmuru9u05agq3aog') - ->setVariationId('c7q1m8p172r04gs741og') - ->setSlug("campaign_2") - ->setCampaignType("ab"), - ]; + (new FlagDTO())->setKey('Number')->setValue(5)->setIsReference(false)->setVariationGroupId('c8pimlr7n0ig3a0pt2jg')->setCampaignId('c8pimlr7n0ig3a0pt2ig')->setVariationId('c8pimlr7n0ig3a0pt2kg')->setSlug("campaign_1")->setCampaignType("ab"), + (new FlagDTO())->setKey('isBool')->setValue(false)->setIsReference(false)->setVariationGroupId('c8pimlr7n0ig3a0pt2jg')->setCampaignId('c8pimlr7n0ig3a0pt2ig')->setVariationId('c8pimlr7n0ig3a0pt2kg')->setSlug("campaign_1")->setCampaignType("ab"), + (new FlagDTO())->setKey('background')->setValue('EE3300')->setIsReference(false)->setVariationGroupId('c8pimlr7n0ig3a0pt2jg')->setCampaignId('c8pimlr7n0ig3a0pt2ig')->setVariationId('c8pimlr7n0ig3a0pt2kg')->setSlug("campaign_1")->setCampaignType("ab"), + (new FlagDTO())->setKey('borderColor')->setValue('blue')->setIsReference(false)->setVariationGroupId('c8pimlr7n0ig3a0pt2jg')->setCampaignId('c8pimlr7n0ig3a0pt2ig')->setVariationId('c8pimlr7n0ig3a0pt2kg')->setSlug("campaign_1")->setCampaignType("ab"), + (new FlagDTO())->setKey('Null')->setValue(null)->setIsReference(false)->setVariationGroupId('c8pimlr7n0ig3a0pt2jg')->setCampaignId('c8pimlr7n0ig3a0pt2ig')->setVariationId('c8pimlr7n0ig3a0pt2kg')->setSlug("campaign_1")->setCampaignType("ab"), + (new FlagDTO())->setKey('Empty')->setValue("")->setIsReference(false)->setVariationGroupId('c8pimlr7n0ig3a0pt2jg')->setCampaignId('c8pimlr7n0ig3a0pt2ig')->setVariationId('c8pimlr7n0ig3a0pt2kg')->setSlug("campaign_1")->setCampaignType("ab"), + (new FlagDTO())->setKey('php')->setValue("value2")->setIsReference(false)->setVariationGroupId('c7q1lmuru9u05agq3apg')->setCampaignId('c7q1lmuru9u05agq3aog')->setVariationId('c7q1m8p172r04gs741og')->setSlug("campaign_2")->setCampaignType("ab"), + ]; } public function campaigns() { return [ - "visitorId" => "", - "campaigns" => [ - [ - "id" => "c8pimlr7n0ig3a0pt2ig", - "slug" => "campaign_1", - "type" => "ab", - "variationGroupId" => "c8pimlr7n0ig3a0pt2jg", - "variation" => [ - "id" => "c8pimlr7n0ig3a0pt2kg", - "modifications" => [ - "type" => "FLAG", - "value" => [ - "Number" => 5, - "isBool" => false, - "background" => "EE3300", - "borderColor" => "blue", - "Null" => null, - "Empty" => "" - ] - ], - "reference" => false - ] - ], - [ - "id" => "c7q1lmuru9u05agq3aog", - "slug" => "campaign_2", - "type" => "ab", - "variationGroupId" => "c7q1lmuru9u05agq3apg", - "variation" => [ - "id" => "c7q1m8p172r04gs741og", - "modifications" => [ - "type" => "FLAG", - "value" => [ - "php" => "value2" - ] - ], - "reference" => false - ] - ] - ] - ]; + "visitorId" => "", + "campaigns" => [ + [ + "id" => "c8pimlr7n0ig3a0pt2ig", + "slug" => "campaign_1", + "type" => "ab", + "variationGroupId" => "c8pimlr7n0ig3a0pt2jg", + "variation" => [ + "id" => "c8pimlr7n0ig3a0pt2kg", + "modifications" => [ + "type" => "FLAG", + "value" => [ + "Number" => 5, + "isBool" => false, + "background" => "EE3300", + "borderColor" => "blue", + "Null" => null, + "Empty" => "", + ], + ], + "reference" => false, + ], + ], + [ + "id" => "c7q1lmuru9u05agq3aog", + "slug" => "campaign_2", + "type" => "ab", + "variationGroupId" => "c7q1lmuru9u05agq3apg", + "variation" => [ + "id" => "c7q1m8p172r04gs741og", + "modifications" => [ + "type" => "FLAG", + "value" => ["php" => "value2"], + ], + "reference" => false, + ], + ], + ], + ]; } public function campaigns2() { return [ - "visitorId" => "", - "campaigns" => [ - [ - "id" => "c69sir3q6mc0ggqin8ag", - "slug" => "campaign_3", - "type" => "toggle", - "variationGroupId" => "c69sir3q6mc0ggqin8bg", - "variation" => [ - "id" => "c69sir3q6mc0ggqin8c0", - "modifications" => [ - "type" => "FLAG", - "value" => [ - "myAwesomeFeature" => 10 - ] - ], - "reference" => false - ] - ] - ] - ]; + "visitorId" => "", + "campaigns" => [ + [ + "id" => "c69sir3q6mc0ggqin8ag", + "slug" => "campaign_3", + "type" => "toggle", + "variationGroupId" => "c69sir3q6mc0ggqin8bg", + "variation" => [ + "id" => "c69sir3q6mc0ggqin8c0", + "modifications" => [ + "type" => "FLAG", + "value" => ["myAwesomeFeature" => 10], + ], + "reference" => false, + ], + ], + ], + ]; } } diff --git a/tests/Visitor/DefaultStrategyTest.php b/tests/Visitor/DefaultStrategyTest.php index adeb65b6..5af535e7 100644 --- a/tests/Visitor/DefaultStrategyTest.php +++ b/tests/Visitor/DefaultStrategyTest.php @@ -8,34 +8,40 @@ use DateTime; use Exception; -use Flagship\Config\BucketingConfig; -use Flagship\Config\DecisionApiConfig; -use Flagship\Decision\ApiManager; -use Flagship\Enum\EventCategory; -use Flagship\Enum\FlagshipConstant; -use Flagship\Enum\FlagshipContext; -use Flagship\Enum\FlagshipField; -use Flagship\Enum\FSFetchReason; -use Flagship\Enum\FSFetchStatus; -use Flagship\Enum\HitType; -use Flagship\Enum\LogLevel; -use Flagship\Enum\TroubleshootingLabel; -use Flagship\Flag\FSFlagMetadata; -use Flagship\Hit\Activate; -use Flagship\Hit\UsageHit; -use Flagship\Hit\Event; use Flagship\Hit\Item; use Flagship\Hit\Page; +use Flagship\Hit\Event; use Flagship\Hit\Screen; -use Flagship\Hit\Transaction; +use Flagship\Enum\HitType; +use Flagship\Hit\Activate; +use Flagship\Hit\UsageHit; +use Flagship\Enum\LogLevel; use Flagship\Model\FlagDTO; -use Flagship\Model\HttpResponse; -use Flagship\Utils\ConfigManager; +use Psr\Log\LoggerInterface; +use Flagship\Hit\Transaction; use Flagship\Utils\Container; use Flagship\Utils\HttpClient; use Flagship\Utils\MurmurHash; use PHPUnit\Framework\TestCase; -use Psr\Log\LoggerInterface; +use Flagship\Enum\EventCategory; +use Flagship\Enum\FlagshipField; +use Flagship\Enum\FSFetchReason; +use Flagship\Enum\FSFetchStatus; +use Flagship\Model\HttpResponse; +use Flagship\Decision\ApiManager; +use Flagship\Flag\FSFlagMetadata; +use Flagship\Utils\ConfigManager; +use Flagship\Enum\FlagshipContext; +use Flagship\Enum\FlagshipConstant; +use Flagship\Config\BucketingConfig; +use Flagship\Enum\VisitorCacheStatus; +use Flagship\Config\DecisionApiConfig; +use Flagship\Utils\ContainerInterface; +use Flagship\Enum\TroubleshootingLabel; +use Flagship\Utils\HttpClientInterface; +use Flagship\Api\TrackingManagerAbstract; +use PHPUnit\Framework\MockObject\MockObject; +use Flagship\Cache\IVisitorCacheImplementation; class DefaultStrategyTest extends TestCase @@ -48,55 +54,21 @@ class DefaultStrategyTest extends TestCase public function modifications(): array { return [ - (new FlagDTO()) - ->setKey('background') - ->setValue('EE3300') - ->setIsReference(false) - ->setVariationGroupId('c1e3t1nvfu1ncqfcdcp0') - ->setCampaignId('c1e3t1nvfu1ncqfcdco0') - ->setVariationId('c1e3t1nvfu1ncqfcdcq0'), - (new FlagDTO()) - ->setKey('borderColor') - ->setValue('blue') - ->setIsReference(false) - ->setVariationGroupId('c1e3t1sddfu1ncqfcdcp0') - ->setCampaignId('c1slf3t1nvfu1ncqfcdcfd') - ->setVariationId('cleo3t1nvfu1ncqfcdcsdf'), - (new FlagDTO()) - ->setKey('Null') - ->setValue(null) - ->setIsReference(false) - ->setVariationGroupId('c1e3t1sddfu1ncqfcdcp0') - ->setCampaignId('c1slf3t1nvfu1ncqfcdcfd') - ->setVariationId('cleo3t1nvfu1ncqfcdcsdf'), - (new FlagDTO()) - ->setKey('Empty') - ->setValue("") - ->setIsReference(false) - ->setVariationGroupId('c1e3t1sddfu1ncqfcdcp0') - ->setCampaignId('c1slf3t1nvfu1ncqfcdcfd') - ->setVariationId('cleo3t1nvfu1ncqfcdcsdf'), - (new FlagDTO()) - ->setKey('isBool') - ->setValue(false) - ->setIsReference(false) - ->setVariationGroupId('c1e3t1sddfu1ncqfcdcp0') - ->setCampaignId('c1slf3t1nvfu1ncqfcdcfd') - ->setVariationId('cleo3t1nvfu1ncqfcdcsdf'), - (new FlagDTO()) - ->setKey('Number') - ->setValue(5) - ->setIsReference(false) - ->setVariationGroupId('c1e3t1sddfu1ncqfcdcp0') - ->setCampaignId('c1slf3t1nvfu1ncqfcdcfd') - ->setVariationId('cleo3t1nvfu1ncqfcdcsdf'), - ]; + (new FlagDTO())->setKey('background')->setValue('EE3300')->setIsReference(false)->setVariationGroupId('c1e3t1nvfu1ncqfcdcp0')->setCampaignId('c1e3t1nvfu1ncqfcdco0')->setVariationId('c1e3t1nvfu1ncqfcdcq0'), + (new FlagDTO())->setKey('borderColor')->setValue('blue')->setIsReference(false)->setVariationGroupId('c1e3t1sddfu1ncqfcdcp0')->setCampaignId('c1slf3t1nvfu1ncqfcdcfd')->setVariationId('cleo3t1nvfu1ncqfcdcsdf'), + (new FlagDTO())->setKey('Null')->setValue(null)->setIsReference(false)->setVariationGroupId('c1e3t1sddfu1ncqfcdcp0')->setCampaignId('c1slf3t1nvfu1ncqfcdcfd')->setVariationId('cleo3t1nvfu1ncqfcdcsdf'), + (new FlagDTO())->setKey('Empty')->setValue("")->setIsReference(false)->setVariationGroupId('c1e3t1sddfu1ncqfcdcp0')->setCampaignId('c1slf3t1nvfu1ncqfcdcfd')->setVariationId('cleo3t1nvfu1ncqfcdcsdf'), + (new FlagDTO())->setKey('isBool')->setValue(false)->setIsReference(false)->setVariationGroupId('c1e3t1sddfu1ncqfcdcp0')->setCampaignId('c1slf3t1nvfu1ncqfcdcfd')->setVariationId('cleo3t1nvfu1ncqfcdcsdf'), + (new FlagDTO())->setKey('Number')->setValue(5)->setIsReference(false)->setVariationGroupId('c1e3t1sddfu1ncqfcdcp0')->setCampaignId('c1slf3t1nvfu1ncqfcdcfd')->setVariationId('cleo3t1nvfu1ncqfcdcsdf'), + ]; } public function testUpdateContext() { - //Mock logManger + /** + * @var LoggerInterface|MockObject $logManagerStub + */ $logManagerStub = $this->getMockForAbstractClass( 'Psr\Log\LoggerInterface', [], @@ -112,13 +84,20 @@ public function testUpdateContext() $visitorId = "visitor_id"; $visitorContext = [ - 'name' => 'visitor_name', - 'age' => 25 - ]; + 'name' => 'visitor_name', + 'age' => 25, + ]; + /** + * @var ApiManager|MockObject $decisionManager + */ $decisionManager = $this->getMockBuilder(ApiManager::class) ->disableOriginalConstructor() ->getMock(); + + /** + * @var TrackingManagerAbstract|MockObject $trackingManager + */ $trackingManager = $this->getMockForAbstractClass( 'Flagship\Api\TrackingManagerAbstract', ['sendHit'], @@ -204,16 +183,25 @@ public function testUpdateContext() public function testUpdateContextCollection() { - $configData = ['envId' => 'env_value', 'apiKey' => 'key_value']; + $configData = [ + 'envId' => 'env_value', + 'apiKey' => 'key_value', + ]; $config = new DecisionApiConfig($configData['envId'], $configData['apiKey']); $visitorId = "visitor_id"; $visitorContext = [ 'name' => 'visitor_name', 'age' => 25 ]; + /** + * @var ApiManager|MockObject $decisionManager + */ $decisionManager = $this->getMockBuilder(ApiManager::class) ->disableOriginalConstructor() ->getMock(); + /** + * @var TrackingManagerAbstract|MockObject $trackingManager + */ $trackingManager = $this->getMockForAbstractClass( 'Flagship\Api\TrackingManagerAbstract', ['sendHit'], @@ -227,17 +215,15 @@ public function testUpdateContextCollection() $defaultStrategy = new DefaultStrategy($visitor); $newVisitorContext = [ - 'vip' => true, - 'gender' => 'F' - ]; + 'vip' => true, + 'gender' => 'F', + ]; $defaultStrategy->updateContextCollection($newVisitorContext); $this->assertCount(8, $visitor->getContext()); //Test without Key - $newVisitorContext = [ - 'vip' - ]; + $newVisitorContext = ['vip']; $defaultStrategy->updateContextCollection($newVisitorContext); $this->assertCount(8, $visitor->getContext()); @@ -247,13 +233,19 @@ public function testClearContext() { $visitorId = "visitor_id"; $visitorContext = [ - 'name' => 'visitor_name', - 'age' => 25 - ]; + 'name' => 'visitor_name', + 'age' => 25, + ]; $config = new DecisionApiConfig('envId', 'apiKey'); + /** + * @var ApiManager|MockObject $decisionManager + */ $decisionManager = $this->getMockBuilder(ApiManager::class) ->disableOriginalConstructor() ->getMock(); + /** + * @var TrackingManagerAbstract|MockObject $trackingManager + */ $trackingManager = $this->getMockForAbstractClass( 'Flagship\Api\TrackingManagerAbstract', ['sendHit'], @@ -271,11 +263,22 @@ public function testClearContext() $defaultStrategy->clearContext(); $this->assertCount(0, $visitor->getContext()); + $this->assertSame(FSFetchReason::UPDATE_CONTEXT, $visitor->getFetchStatus()->getReason()); + $this->assertSame(FSFetchStatus::FETCH_REQUIRED, $visitor->getFetchStatus()->getStatus()); + $this->assertTrue($visitor->getHasContextBeenUpdated()); + + //Test clearContext with empty context + $visitor->setHasContextBeenUpdated(false); + $defaultStrategy->clearContext(); + $this->assertCount(0, $visitor->getContext()); + $this->assertFalse($visitor->getHasContextBeenUpdated()); } public function testAuthenticate() { - //Mock logManger + /** + * @var LoggerInterface|MockObject $logManagerStub + */ $logManagerStub = $this->getMockForAbstractClass( LoggerInterface::class, [], @@ -283,9 +286,95 @@ public function testAuthenticate() true, true, true, - ['error'] + ['error', 'warning'] + ); + + /** + * @var TrackingManagerAbstract|MockObject $trackerManager + */ + $trackerManager = $this->getMockForAbstractClass( + 'Flagship\Api\TrackingManagerAbstract', + ['sendConsentHit'], + '', + false ); + $visitorId = "visitor_id"; + $visitorContext = [ + 'name' => 'visitor_name', + 'age' => 25, + ]; + + $config = new DecisionApiConfig('envId', 'apiKey'); + $config->setLogManager($logManagerStub); + + /** + * @var ApiManager|MockObject $decisionManager + */ + $decisionManager = $this->getMockBuilder(ApiManager::class) + ->disableOriginalConstructor() + ->getMock(); + + $configManager = new ConfigManager($config, $decisionManager, $trackerManager); + + $visitor = new VisitorDelegate(new Container(), $configManager, $visitorId, false, $visitorContext, true); + + $authenticateName = "authenticate"; + $logManagerStub->expects($this->exactly(2))->method('error')->with( + $this->logicalOr( + sprintf( + FlagshipConstant::VISITOR_ID_ERROR, + $authenticateName + ), + sprintf( + FlagshipConstant::FLAGSHIP_VISITOR_ALREADY_AUTHENTICATE, + $authenticateName + ) + ), + [FlagshipConstant::TAG => $authenticateName] + ); + + //Test authenticate with null visitorId + + $defaultStrategy = new DefaultStrategy($visitor); + + //Test authenticate with "" visitorId + $defaultStrategy->authenticate(""); + $this->assertNull($visitor->getAnonymousId()); + $this->assertSame($visitorId, $visitor->getVisitorId()); + + $newVisitorId = "new_visitor_id"; + $defaultStrategy->authenticate($newVisitorId); + $this->assertSame($visitorId, $visitor->getAnonymousId()); + $this->assertSame($newVisitorId, $visitor->getVisitorId()); + $this->assertSame(FSFetchReason::AUTHENTICATE, $visitor->getFetchStatus()->getReason()); + $this->assertSame(FSFetchStatus::FETCH_REQUIRED, $visitor->getFetchStatus()->getStatus()); + + // + $newVisitorId2 = "new_visitor_id_2"; + $defaultStrategy->authenticate($newVisitorId2); + $this->assertSame($visitorId, $visitor->getAnonymousId()); + $this->assertSame($newVisitorId, $visitor->getVisitorId()); + } + + public function testAuthenticateBucketingMode() + { + /** + * @var LoggerInterface|MockObject $logManagerStub + */ + $logManagerStub = $this->getMockForAbstractClass( + LoggerInterface::class, + [], + "", + true, + true, + true, + ['error', 'warning'] + ); + + /** + * @var TrackingManagerAbstract|MockObject $trackerManager + */ $trackerManager = $this->getMockForAbstractClass( 'Flagship\Api\TrackingManagerAbstract', ['sendConsentHit'], @@ -299,9 +388,22 @@ public function testAuthenticate() 'age' => 25 ]; - $config = new DecisionApiConfig('envId', 'apiKey'); + /** + * @var IVisitorCacheImplementation|MockObject $visitorCache + */ + $visitorCache = $this->getMockForAbstractClass( + IVisitorCacheImplementation::class, + [], + '', + false + ); + + $config = new BucketingConfig('http:127.0.0.1:3000', 'envId', 'apiKey'); $config->setLogManager($logManagerStub); + /** + * @var ApiManager|MockObject $decisionManager + */ $decisionManager = $this->getMockBuilder(ApiManager::class) ->disableOriginalConstructor() ->getMock(); @@ -311,22 +413,15 @@ public function testAuthenticate() $visitor = new VisitorDelegate(new Container(), $configManager, $visitorId, false, $visitorContext, true); $authenticateName = "authenticate"; - $logManagerStub->expects($this->exactly(3)) - ->method('error') + + $logManagerStub->expects($this->exactly(1)) + ->method('warning') ->with( $this->logicalOr( sprintf( - FlagshipConstant::VISITOR_ID_ERROR, + FlagshipConstant::XPC_BUCKETING_WARNING, $authenticateName ), - sprintf( - FlagshipConstant::FLAGSHIP_VISITOR_ALREADY_AUTHENTICATE, - $authenticateName - ), - sprintf( - FlagshipConstant::METHOD_DEACTIVATED_BUCKETING_ERROR, - $authenticateName - ) ), [FlagshipConstant::TAG => $authenticateName] ); @@ -335,10 +430,9 @@ public function testAuthenticate() $defaultStrategy = new DefaultStrategy($visitor); - //Test authenticate with "" visitorId - $defaultStrategy->authenticate(""); - $this->assertNull($visitor->getAnonymousId()); - $this->assertSame($visitorId, $visitor->getVisitorId()); + $defaultStrategy->authenticate("new_visitor_id_xpc"); + + $config->setVisitorCacheImplementation($visitorCache); $newVisitorId = "new_visitor_id"; $defaultStrategy->authenticate($newVisitorId); @@ -352,18 +446,13 @@ public function testAuthenticate() $defaultStrategy->authenticate($newVisitorId2); $this->assertSame($visitorId, $visitor->getAnonymousId()); $this->assertSame($newVisitorId, $visitor->getVisitorId()); - - //Test with bucketing mode - $newVisitorId2 = "new_visitor_id"; - $visitor->setConfig((new BucketingConfig("http:127.0.0.1:3000"))->setLogManager($logManagerStub)); - $defaultStrategy->authenticate($newVisitorId2); - $this->assertSame($visitorId, $visitor->getAnonymousId()); - $this->assertSame($newVisitorId, $visitor->getVisitorId()); } public function testUnauthenticate() { - //Mock logManger + /** + * @var LoggerInterface|MockObject $logManagerStub + */ $logManagerStub = $this->getMockForAbstractClass( 'Psr\Log\LoggerInterface', [], @@ -374,6 +463,9 @@ public function testUnauthenticate() ['error'] ); + /** + * @var TrackingManagerAbstract|MockObject $trackerManager + */ $trackerManager = $this->getMockForAbstractClass( 'Flagship\Api\TrackingManagerAbstract', ['sendConsentHit'], @@ -388,6 +480,9 @@ public function testUnauthenticate() $config = new DecisionApiConfig('envId', 'apiKey'); $config->setLogManager($logManagerStub); + /** + * @var ApiManager|MockObject $decisionManager + */ $decisionManager = $this->getMockBuilder(ApiManager::class) ->disableOriginalConstructor() ->getMock(); @@ -396,30 +491,107 @@ public function testUnauthenticate() $visitor = new VisitorDelegate(new Container(), $configManager, $visitorId, false, [], true); - $visitor->setConfig((new BucketingConfig("http://127.0.0.1:3000"))->setLogManager($logManagerStub)); + $config->setLogManager($logManagerStub); + $visitor->setConfig($config); + // $visitor->setConfig((new BucketingConfig("http://127.0.0.1:3000"))->setLogManager($logManagerStub)); $unauthenticateName = "unauthenticate"; - $logManagerStub->expects($this->exactly(2)) + $logManagerStub->expects($this->exactly(1)) ->method('error') ->with( $this->logicalOr( - sprintf( - FlagshipConstant::METHOD_DEACTIVATED_BUCKETING_ERROR, - $unauthenticateName - ), FlagshipConstant::FLAGSHIP_VISITOR_NOT_AUTHENTIFICATE ), - [FlagshipConstant::TAG => $unauthenticateName] - ); + [FlagshipConstant::TAG => $unauthenticateName] + ); $defaultStrategy = new DefaultStrategy($visitor); $defaultStrategy->unauthenticate(); - //Test Visitor not authenticate yet + //Test valid data + $newVisitorId = "newVisitorId"; + $defaultStrategy->authenticate($newVisitorId); + + $anonymous = $visitor->getAnonymousId(); + $defaultStrategy->unauthenticate(); + $this->assertNull($visitor->getAnonymousId()); + $this->assertSame($anonymous, $visitor->getVisitorId()); + $this->assertSame(FSFetchReason::UNAUTHENTICATE, $visitor->getFetchStatus()->getReason()); + $this->assertSame(FSFetchStatus::FETCH_REQUIRED, $visitor->getFetchStatus()->getStatus()); + } + + public function testUnauthenticateBucketingMode() + { + /** + * @var LoggerInterface|MockObject $logManagerStub + */ + $logManagerStub = $this->getMockForAbstractClass( + 'Psr\Log\LoggerInterface', + [], + "", + true, + true, + true, + ['error', 'warning'] + ); + + /** + * @var TrackingManagerAbstract|MockObject $trackerManager + */ + $trackerManager = $this->getMockForAbstractClass( + 'Flagship\Api\TrackingManagerAbstract', + ['sendConsentHit'], + '', + false + ); + + /** + * @var IVisitorCacheImplementation|MockObject $visitorCache + */ + $visitorCache = $this->getMockForAbstractClass( + IVisitorCacheImplementation::class, + [], + '', + false + ); + + + $visitorId = "visitor_id"; + + $config = new BucketingConfig("http://127.0.0.1:3000", 'envId', 'apiKey'); + $config->setLogManager($logManagerStub); + + /** + * @var ApiManager|MockObject $decisionManager + */ + $decisionManager = $this->getMockBuilder(ApiManager::class) + ->disableOriginalConstructor() + ->getMock(); + + $configManager = new ConfigManager($config, $decisionManager, $trackerManager); + + $visitor = new VisitorDelegate(new Container(), $configManager, $visitorId, false, [], true); + $config->setLogManager($logManagerStub); $visitor->setConfig($config); + + $unauthenticateName = "unauthenticate"; + + $logManagerStub->expects($this->exactly(1)) + ->method('warning') + ->with( + $this->logicalOr( + FlagshipConstant::XPC_BUCKETING_WARNING + ), + [FlagshipConstant::TAG => $unauthenticateName] + ); + + + $defaultStrategy = new DefaultStrategy($visitor); $defaultStrategy->unauthenticate(); + $config->setVisitorCacheImplementation($visitorCache); + //Test valid data $newVisitorId = "newVisitorId"; $defaultStrategy->authenticate($newVisitorId); @@ -467,8 +639,7 @@ public function testFetchFlags() $configManager = new ConfigManager($config, $decisionManager, $trackerManager); - $configManager->setDecisionManager($decisionManager) - ->setTrackingManager($trackingManagerMock); + $configManager->setDecisionManager($decisionManager)->setTrackingManager($trackingManagerMock); $visitor = new VisitorDelegate(new Container(), $configManager, "visitorId", false, [], true); @@ -500,52 +671,51 @@ public function testFetchFlagsTroubleshootingData() false, false, true, - ["setTroubleshootingData", "addTroubleshootingHit"] + [ + "setTroubleshootingData", + "addTroubleshootingHit", + ] ); $decisionManager = new ApiManager($httpClientMock, $config); $httpResponseBody = $this->campaigns(); $troubleshootingData = [ - "startDate" => "2023-04-13T09:33:38.049Z", - "endDate" => "2023-04-13T10:03:38.049Z", - "timezone" => "Europe/Paris", - "traffic" => 40 - ]; + "startDate" => "2023-04-13T09:33:38.049Z", + "endDate" => "2023-04-13T10:03:38.049Z", + "timezone" => "Europe/Paris", + "traffic" => 40, + ]; $httpResponseBody["extras"] = [ - "accountSettings" => [ - "@type" => "type.googleapis.com/flagship.protobuf.AccountSettings", - "enabledXPC" => false, - "enabled1V1T" => false, - "troubleshooting" => $troubleshootingData - ] - ]; + "accountSettings" => [ + "@type" => "type.googleapis.com/flagship.protobuf.AccountSettings", + "enabledXPC" => false, + "enabled1V1T" => false, + "troubleshooting" => $troubleshootingData, + ], + ]; - $httpClientMock->expects($this->exactly(3))->method("post") - ->willReturn(new HttpResponse(200, $httpResponseBody)); + $httpClientMock->expects($this->exactly(3))->method("post")->willReturn(new HttpResponse(200, $httpResponseBody)); - $trackingManagerMock->expects($this->exactly(3))->method("setTroubleshootingData") - ->with($this->callback(function ($param) use ($troubleshootingData) { + $trackingManagerMock->expects($this->exactly(3))->method("setTroubleshootingData")->with($this->callback(function ($param) use ($troubleshootingData) { $startDate = new DateTime($troubleshootingData['startDate']); $endDate = new DateTime($troubleshootingData['endDate']); return $param->getTraffic() === $troubleshootingData['traffic'] && $param->getTimezone() === $troubleshootingData['timezone'] && $param->getStartDate()->getTimestamp() === $startDate->getTimestamp() && $param->getEndDate()->getTimestamp() === $endDate->getTimestamp(); - })); + })); $matcher = $this->exactly(6); - $trackingManagerMock->expects($matcher) - ->method("addTroubleshootingHit") - ->with( - $this->logicalOr( - $this->callback(function ($param) { + $trackingManagerMock->expects($matcher)->method("addTroubleshootingHit")->with( + $this->logicalOr( + $this->callback(function ($param) { return $param->getLabel() === TroubleshootingLabel::VISITOR_FETCH_CAMPAIGNS || $param->getLabel() === TroubleshootingLabel::VISITOR_SEND_HIT; - }) - ) - ); + }) + ) + ); $configManager = new ConfigManager($config, $decisionManager, $trackingManagerMock); @@ -598,9 +768,15 @@ public function testFetchFlagsTroubleshootingData() public function testSendHit() { $config = new DecisionApiConfig(); + /** + * @var MockObject|TrackingManagerAbstract $trackerManagerMock + */ $trackerManagerMock = $this->getMockForAbstractClass( 'Flagship\Api\TrackingManagerAbstract', - [$config, new HttpClient()], + [ + $config, + new HttpClient(), + ], '', true, true, @@ -640,11 +816,9 @@ public function testSendHit() $item = new Item($transitionId, $itemName, $itemCode); - $trackerManagerMock->expects($this->exactly(5)) - ->method('addHit') - ->with( - $this->logicalOr($page, $screen, $transition, $event, $item) - ); + $trackerManagerMock->expects($this->exactly(5))->method('addHit')->with( + $this->logicalOr($page, $screen, $transition, $event, $item) + ); //Test type page $defaultStrategy->sendHit($page); @@ -693,7 +867,10 @@ public function testSendHitWithLog() $config = new DecisionApiConfig(); $trackerManagerMock = $this->getMockForAbstractClass( 'Flagship\Api\TrackingManagerAbstract', - [$config, new HttpClient()], + [ + $config, + new HttpClient(), + ], '', true, true, @@ -728,21 +905,21 @@ public function testSendHitWithLog() $page = new Page(""); - $logManagerMock->expects($this->exactly(1)) - ->method('error') - ->with( - $page->getErrorMessage(), - [FlagshipConstant::TAG => FlagshipConstant::TAG_SEND_HIT] - ); + $logManagerMock->expects($this->exactly(1))->method('error')->with( + $page->getErrorMessage(), + [FlagshipConstant::TAG => FlagshipConstant::TAG_SEND_HIT] + ); - $trackerManagerMock->expects($this->never()) - ->method('sendHit'); + $trackerManagerMock->expects($this->never())->method('sendHit'); $defaultStrategy->sendHit($page); } public function testUserExposed() { + /** + * @var LoggerInterface|MockObject $logManagerStub + */ $logManagerStub = $this->getMockForAbstractClass( 'Psr\Log\LoggerInterface', [], @@ -750,16 +927,24 @@ public function testUserExposed() true, true, true, - ['error', 'info'] + [ + 'error', + 'info', + ] ); $config = new DecisionApiConfig('envId', 'apiKey'); $config->setLogManager($logManagerStub); - + /** + * @var MockObject|TrackingManagerAbstract $trackerManagerStub + */ $trackerManagerStub = $this->getMockForAbstractClass( 'Flagship\Api\TrackingManagerAbstract', - [$config, new HttpClient()], + [ + $config, + new HttpClient(), + ], '', true, true, @@ -777,17 +962,7 @@ public function testUserExposed() $key = "key"; $flagDTO = new FlagDTO(); - $flagDTO->setKey($key) - ->setCampaignId("campaignId") - ->setVariationGroupId("variationGroupId") - ->setVariationId("variationId") - ->setIsReference(false) - ->setCampaignType("campaignType") - ->setSlug("slug") - ->setCampaignName("campaignName") - ->setVariationGroupName("variationGroupName") - ->setVariationName("variationName") - ->setValue("value"); + $flagDTO->setKey($key)->setCampaignId("campaignId")->setVariationGroupId("variationGroupId")->setVariationId("variationId")->setIsReference(false)->setCampaignType("campaignType")->setSlug("slug")->setCampaignName("campaignName")->setVariationGroupName("variationGroupName")->setVariationName("variationName")->setValue("value"); $defaultValue = "default"; $flagMetadata = new FSFlagMetadata( @@ -803,16 +978,9 @@ public function testUserExposed() ); $activate = new Activate($flagDTO->getVariationGroupId(), $flagDTO->getVariationId()); - $activate - ->setFlagKey($flagDTO->getKey()) - ->setFlagValue($flagDTO->getValue()) - ->setFlagDefaultValue($defaultValue) - ->setFlagMetadata($flagMetadata) - ->setVisitorContext($visitor->getContext()) - ->setVisitorId($visitor->getVisitorId()) - ->setConfig($config); - - $trackerManagerStub->expects($this->exactly(4)) + $activate->setFlagKey($flagDTO->getKey())->setFlagValue($flagDTO->getValue())->setFlagDefaultValue($defaultValue)->setFlagMetadata($flagMetadata)->setVisitorContext($visitor->getContext())->setVisitorId($visitor->getVisitorId())->setConfig($config); + + $trackerManagerStub->expects($this->exactly(2)) ->method('activateFlag') ->with($activate); @@ -825,31 +993,32 @@ public function testUserExposed() $functionName = FlagshipConstant::FLAG_USER_EXPOSED; - $logManagerStub->expects($this->exactly(3))->method('info') - ->with( - $this->logicalOr( - sprintf( - FlagshipConstant::USER_EXPOSED_NO_FLAG_ERROR, - $visitor->getVisitorId(), - $key - ), - sprintf( - FlagshipConstant::USER_EXPOSED_CAST_ERROR, - $visitor->getVisitorId(), - $key - ), - sprintf( - FlagshipConstant::VISITOR_EXPOSED_VALUE_NOT_CALLED, - $visitor->getVisitorId(), - $key - ) + $logManagerStub->expects($this->exactly(3))->method('info')->with( + $this->logicalOr( + sprintf( + FlagshipConstant::USER_EXPOSED_NO_FLAG_ERROR, + $visitor->getVisitorId(), + $key ), - [FlagshipConstant::TAG => $functionName] - ); + sprintf( + FlagshipConstant::USER_EXPOSED_CAST_ERROR, + $visitor->getVisitorId(), + $key + ), + sprintf( + FlagshipConstant::VISITOR_EXPOSED_VALUE_NOT_CALLED, + $visitor->getVisitorId(), + $key + ) + ), + [FlagshipConstant::TAG => $functionName] + ); + //Test flag null $activate->setFlagDefaultValue($defaultValue); $defaultStrategy->visitorExposed($key, $defaultValue, null, true); + //Test flag with different type $activate->setFlagDefaultValue(false); $defaultStrategy->visitorExposed($key, false, $flagDTO, true); @@ -867,7 +1036,10 @@ public function testGetFlagValue() true, true, true, - ['error', 'info'] + [ + 'error', + 'info', + ] ); $config = new DecisionApiConfig('envId', 'apiKey'); @@ -876,7 +1048,10 @@ public function testGetFlagValue() $trackerManagerStub = $this->getMockForAbstractClass( 'Flagship\Api\TrackingManagerAbstract', - [$config, new HttpClient()], + [ + $config, + new HttpClient(), + ], '', true, true, @@ -895,17 +1070,7 @@ public function testGetFlagValue() $key = "key"; $defaultValue = "defaultValue"; $flagDTO = new FlagDTO(); - $flagDTO->setKey($key) - ->setCampaignId("campaignId") - ->setVariationGroupId("variationGroupId") - ->setVariationId("variationId") - ->setIsReference(false) - ->setCampaignType("campaignType") - ->setSlug("slug") - ->setCampaignName("campaignName") - ->setVariationGroupName("variationGroupName") - ->setVariationName("variationName") - ->setValue("value"); + $flagDTO->setKey($key)->setCampaignId("campaignId")->setVariationGroupId("variationGroupId")->setVariationId("variationId")->setIsReference(false)->setCampaignType("campaignType")->setSlug("slug")->setCampaignName("campaignName")->setVariationGroupName("variationGroupName")->setVariationName("variationName")->setValue("value"); $flagMetadata = new FSFlagMetadata( $flagDTO->getCampaignId(), @@ -920,18 +1085,9 @@ public function testGetFlagValue() ); $activate = new Activate($flagDTO->getVariationGroupId(), $flagDTO->getVariationId()); - $activate - ->setFlagKey($flagDTO->getKey()) - ->setFlagValue($flagDTO->getValue()) - ->setFlagDefaultValue($defaultValue) - ->setFlagMetadata($flagMetadata) - ->setVisitorContext($visitor->getContext()) - ->setVisitorId($visitor->getVisitorId()) - ->setConfig($config); - - $trackerManagerStub->expects($this->exactly(4)) - ->method('activateFlag') - ->with($activate); + $activate->setFlagKey($flagDTO->getKey())->setFlagValue($flagDTO->getValue())->setFlagDefaultValue($defaultValue)->setFlagMetadata($flagMetadata)->setVisitorContext($visitor->getContext())->setVisitorId($visitor->getVisitorId())->setConfig($config); + + $trackerManagerStub->expects($this->exactly(4))->method('activateFlag')->with($activate); $value = $defaultStrategy->getFlagValue($key, $defaultValue, $flagDTO); $this->assertEquals($value, $flagDTO->getValue()); @@ -980,7 +1136,10 @@ public function testGetFlagMetadata() true, true, true, - ['error', 'info'] + [ + 'error', + 'info', + ] ); $trackingManagerMock = $this->getMockForAbstractClass( @@ -990,7 +1149,10 @@ public function testGetFlagMetadata() false, false, true, - ["setTroubleshootingData", "addTroubleshootingHit"] + [ + "setTroubleshootingData", + "addTroubleshootingHit", + ] ); $config = new DecisionApiConfig('envId', 'apiKey'); @@ -1027,17 +1189,7 @@ public function testGetFlagMetadata() ); $flagDTO = new FlagDTO(); - $flagDTO->setKey($key) - ->setValue("value") - ->setCampaignId($campaignId) - ->setVariationGroupId($varGroupId) - ->setVariationId($varId) - ->setIsReference($isReference) - ->setCampaignType($campaignType) - ->setSlug($slug) - ->setCampaignName($campaignName) - ->setVariationGroupName($varGrpName) - ->setVariationName($varName); + $flagDTO->setKey($key)->setValue("value")->setCampaignId($campaignId)->setVariationGroupId($varGroupId)->setVariationId($varId)->setIsReference($isReference)->setCampaignType($campaignType)->setSlug($slug)->setCampaignName($campaignName)->setVariationGroupName($varGrpName)->setVariationName($varName); $metadataValue = $defaultStrategy->getFlagMetadata($key, $flagDTO); $this->assertEquals($metadata, $metadataValue); @@ -1053,18 +1205,24 @@ public function testLookupVisitor() $visitorId = "visitor_id"; $visitorContext = [ - 'name' => 'visitor_name', - 'age' => 25 - ]; + 'name' => 'visitor_name', + 'age' => 25, + ]; + /** + * @var LoggerInterface|MockObject $logManagerStub + */ $logManagerStub = $this->getMockForAbstractClass( - 'Psr\Log\LoggerInterface', + LoggerInterface::class, [], "", true, true, true, - ['error', 'info'] + [ + 'error', + 'info', + ] ); $config->setLogManager($logManagerStub); @@ -1079,10 +1237,16 @@ public function testLookupVisitor() ['lookupVisitor'] ); + /** + * @var ApiManager|MockObject $apiManager + */ $apiManager = $this->getMockBuilder(ApiManager::class) ->disableOriginalConstructor() ->getMock(); + /** + * @var TrackingManagerAbstract|MockObject $trackingManagerMock + */ $trackingManagerMock = $this->getMockForAbstractClass( 'Flagship\Api\TrackingManagerAbstract', ['sendHit'], @@ -1098,68 +1262,73 @@ public function testLookupVisitor() $defaultStrategy = new DefaultStrategy($visitor); - $visitorCache1 = [ - StrategyAbstract::VERSION => 1 - ]; + $visitorCache1 = [StrategyAbstract::VERSION => 1]; $differentVisitorId = "different visitorID"; $visitorCache2 = [ - StrategyAbstract::VERSION => 1, - StrategyAbstract::DATA => [ - StrategyAbstract::VISITOR_ID => $differentVisitorId - ] - ]; + StrategyAbstract::VERSION => 1, + StrategyAbstract::DATA => [StrategyAbstract::VISITOR_ID => $differentVisitorId], + ]; $visitorCache3 = [ - StrategyAbstract::VERSION => 1, - StrategyAbstract::DATA => [ - StrategyAbstract::VISITOR_ID => $visitorId - ] - ]; + StrategyAbstract::VERSION => 1, + StrategyAbstract::DATA => [StrategyAbstract::VISITOR_ID => $visitorId], + ]; $visitorCache4 = [ - StrategyAbstract::VERSION => 1, - StrategyAbstract::DATA => [ - StrategyAbstract::VISITOR_ID => $visitorId, - StrategyAbstract::CAMPAIGNS => "not an array" - ] - ]; + StrategyAbstract::VERSION => 1, + StrategyAbstract::DATA => [ + StrategyAbstract::VISITOR_ID => $visitorId, + StrategyAbstract::CAMPAIGNS => "not an array", + ], + ]; $visitorCache5 = [ - StrategyAbstract::VERSION => 1, - StrategyAbstract::DATA => [ - StrategyAbstract::VISITOR_ID => $visitorId, - StrategyAbstract::CAMPAIGNS => [ - "anythings" - ] - ] - ]; + StrategyAbstract::VERSION => 1, + StrategyAbstract::DATA => [ + StrategyAbstract::VISITOR_ID => $visitorId, + StrategyAbstract::CAMPAIGNS => ["anythings"], + ], + ]; $visitorCache6 = [ - StrategyAbstract::VERSION => 1, + StrategyAbstract::VERSION => 1, + StrategyAbstract::DATA => [ + StrategyAbstract::VISITOR_ID => $visitorId, + StrategyAbstract::CAMPAIGNS => [ + [ + FlagshipField::FIELD_CAMPAIGN_ID => "c8pimlr7n0ig3a0pt2ig", + FlagshipField::FIELD_VARIATION_GROUP_ID => "c8pimlr7n0ig3a0pt2jg", + FlagshipField::FIELD_VARIATION_ID => "c8pimlr7n0ig3a0pt2kg", + FlagshipField::FIELD_IS_REFERENCE => false, + FlagshipField::FIELD_CAMPAIGN_TYPE => "ab", + StrategyAbstract::ACTIVATED => false, + StrategyAbstract::FLAGS => [ + "Number" => 5, + "isBool" => false, + "background" => "EE3300", + "borderColor" => "blue", + "Null" => null, + "Empty" => "", + ], + ], + ], + ], + ]; + + $visitorCache7 = [ + StrategyAbstract::VERSION => 2, StrategyAbstract::DATA => [ StrategyAbstract::VISITOR_ID => $visitorId, StrategyAbstract::CAMPAIGNS => [ - [ - FlagshipField::FIELD_CAMPAIGN_ID => "c8pimlr7n0ig3a0pt2ig", - FlagshipField::FIELD_VARIATION_GROUP_ID => "c8pimlr7n0ig3a0pt2jg", - FlagshipField::FIELD_VARIATION_ID => "c8pimlr7n0ig3a0pt2kg", - FlagshipField::FIELD_IS_REFERENCE => false, - FlagshipField::FIELD_CAMPAIGN_TYPE => "ab", - StrategyAbstract::ACTIVATED => false, - StrategyAbstract::FLAGS => [ - "Number" => 5, - "isBool" => false, - "background" => "EE3300", - "borderColor" => "blue", - "Null" => null, - "Empty" => "" - ] - ] + "anythings" ] ] ]; - $VisitorCacheImplementationMock->expects($this->exactly(7)) + /** + * @var IVisitorCacheImplementation|MockObject $VisitorCacheImplementationMock + */ + $VisitorCacheImplementationMock->expects($this->exactly(8)) ->method("lookupVisitor") ->with($visitorId) ->willReturnOnConsecutiveCalls( @@ -1169,13 +1338,14 @@ public function testLookupVisitor() $visitorCache3, $visitorCache4, $visitorCache5, - $visitorCache6 + $visitorCache6, + $visitorCache7 ); $config->setVisitorCacheImplementation($VisitorCacheImplementationMock); $functionName = "lookupVisitor"; - $logManagerStub->expects($this->exactly(5))->method('error') + $logManagerStub->expects($this->exactly(6))->method('error') ->with( $this->logicalOr( StrategyAbstract::LOOKUP_VISITOR_JSON_OBJECT_ERROR, @@ -1189,46 +1359,69 @@ public function testLookupVisitor() // test return empty array $defaultStrategy->lookupVisitor(); + $this->assertEquals($visitor->getVisitorCacheStatus(), VisitorCacheStatus::NONE); + $this->assertCount(0, $visitor->visitorCache); // test return array["version"=>1] only $defaultStrategy->lookupVisitor(); + $this->assertEquals($visitor->getVisitorCacheStatus(), VisitorCacheStatus::VISITOR_ID_CACHE); + $this->assertCount(0, $visitor->visitorCache); // test return cache with different visitor id $defaultStrategy->lookupVisitor(); + $this->assertEquals($visitor->getVisitorCacheStatus(), VisitorCacheStatus::VISITOR_ID_CACHE); + $this->assertCount(0, $visitor->visitorCache); + // test return cache without campaings $defaultStrategy->lookupVisitor(); - $this->assertSame($visitorCache3, $visitor->visitorCache); + $this->assertEquals($visitor->getVisitorCacheStatus(), VisitorCacheStatus::VISITOR_ID_CACHE); + + $this->assertCount(0, $visitor->visitorCache); // test return cache with is_array(campaings) === false $defaultStrategy->lookupVisitor(); - $this->assertSame($visitorCache3, $visitor->visitorCache); + $this->assertEquals($visitor->getVisitorCacheStatus(), VisitorCacheStatus::VISITOR_ID_CACHE); + + $this->assertCount(0, $visitor->visitorCache); // test return cache with invalid campaigns $defaultStrategy->lookupVisitor(); - $this->assertSame($visitorCache3, $visitor->visitorCache); + $this->assertEquals($visitor->getVisitorCacheStatus(), VisitorCacheStatus::VISITOR_ID_CACHE); + + $this->assertCount(0, $visitor->visitorCache); // test return cache with valid cache $defaultStrategy->lookupVisitor(); + $this->assertEquals($visitor->getVisitorCacheStatus(), VisitorCacheStatus::VISITOR_ID_CACHE); + + $this->assertSame($visitorCache6, $visitor->visitorCache); + + // + $defaultStrategy->lookupVisitor(); + + $this->assertEquals(VisitorCacheStatus::VISITOR_ID_CACHE, $visitor->getVisitorCacheStatus(), ); + $this->assertSame($visitorCache6, $visitor->visitorCache); } - public function testCacheVisitor() + public function testLookupVisitorXpc() { + $config = new DecisionApiConfig('envId', 'apiKey'); $visitorId = "visitor_id"; $visitorContext = [ @@ -1236,7 +1429,170 @@ public function testCacheVisitor() 'age' => 25 ]; + /** + * @var LoggerInterface|MockObject $logManagerStub + */ + $logManagerStub = $this->getMockForAbstractClass( + LoggerInterface::class, + [], + "", + true, + true, + true, + ['error', 'info'] + ); + + $config->setLogManager($logManagerStub); + + $VisitorCacheImplementationMock = $this->getMockForAbstractClass( + "Flagship\Cache\IVisitorCacheImplementation", + [], + "", + true, + true, + true, + ['lookupVisitor'] + ); + + /** + * @var ApiManager|MockObject $apiManager + */ + $apiManager = $this->getMockBuilder(ApiManager::class) + ->disableOriginalConstructor() + ->getMock(); + + /** + * @var TrackingManagerAbstract|MockObject $trackingManagerMock + */ + $trackingManagerMock = $this->getMockForAbstractClass( + 'Flagship\Api\TrackingManagerAbstract', + ['sendHit'], + '', + false + ); + + $configManager = new ConfigManager($config, $apiManager, $trackingManagerMock); + + $container = new Container(); + + $visitor = new VisitorDelegate($container, $configManager, $visitorId, false, $visitorContext, true); + + $defaultStrategy = new DefaultStrategy($visitor); + + $differentVisitorId = "different visitorID"; + + $anonymousId = "anonymousId"; + + $visitorCache = [ + StrategyAbstract::VERSION => 1, + StrategyAbstract::DATA => [ + StrategyAbstract::VISITOR_ID => $visitorId, + StrategyAbstract::CAMPAIGNS => [ + [ + FlagshipField::FIELD_CAMPAIGN_ID => "c8pimlr7n0ig3a0pt2ig", + FlagshipField::FIELD_VARIATION_GROUP_ID => "c8pimlr7n0ig3a0pt2jg", + FlagshipField::FIELD_VARIATION_ID => "c8pimlr7n0ig3a0pt2kg", + FlagshipField::FIELD_IS_REFERENCE => false, + FlagshipField::FIELD_CAMPAIGN_TYPE => "ab", + StrategyAbstract::ACTIVATED => false, + StrategyAbstract::FLAGS => [ + "Number" => 5, + "isBool" => false, + "background" => "EE3300", + "borderColor" => "blue", + "Null" => null, + "Empty" => "" + ] + ] + ] + ] + ]; + $visitorCacheAnonymous = [ + StrategyAbstract::VERSION => 1, + StrategyAbstract::DATA => [ + StrategyAbstract::VISITOR_ID => $anonymousId, + StrategyAbstract::CAMPAIGNS => [ + [ + FlagshipField::FIELD_CAMPAIGN_ID => $anonymousId . "c8pimlr7n0ig3a0pt2ig", + FlagshipField::FIELD_VARIATION_GROUP_ID => $anonymousId . "c8pimlr7n0ig3a0pt2jg", + FlagshipField::FIELD_VARIATION_ID => $anonymousId . "c8pimlr7n0ig3a0pt2kg", + FlagshipField::FIELD_IS_REFERENCE => false, + FlagshipField::FIELD_CAMPAIGN_TYPE => "ab", + StrategyAbstract::ACTIVATED => false, + StrategyAbstract::FLAGS => [ + "Number" => 5, + "isBool" => false, + "background" => "EE3300", + "borderColor" => "blue", + "Null" => null, + "Empty" => "" + ] + ] + ] + ] + ]; + + /** + * @var IVisitorCacheImplementation|MockObject $VisitorCacheImplementationMock + */ + $VisitorCacheImplementationMock->expects($this->exactly(7)) + ->method("lookupVisitor")->willReturnCallback(function ($id) use ($visitorCache, $visitorId, $anonymousId, $visitorCacheAnonymous) { + if ($id === $visitorId) { + return $visitorCache; + } + if ($id === $anonymousId) { + return $visitorCacheAnonymous; + } + + return []; + }); + + $config->setVisitorCacheImplementation($VisitorCacheImplementationMock); + + + $this->assertCount(0, $visitor->visitorCache); + + + $defaultStrategy->lookupVisitor(); + + $this->assertSame($visitorCache, $visitor->visitorCache); + $this->assertSame(VisitorCacheStatus::VISITOR_ID_CACHE, $visitor->getVisitorCacheStatus()); + + $visitor->setAnonymousId($anonymousId); + + $defaultStrategy->lookupVisitor(); + + $this->assertSame($visitorCache, $visitor->visitorCache); + $this->assertEquals(VisitorCacheStatus::VISITOR_ID_CACHE_WITH_ANONYMOUS_ID_CACHE, $visitor->getVisitorCacheStatus()); + + $visitor->setVisitorId("new_visitor_id"); + + $defaultStrategy->lookupVisitor(); + $this->assertEquals(VisitorCacheStatus::ANONYMOUS_ID_CACHE, $visitor->getVisitorCacheStatus()); + $this->assertSame($visitorCacheAnonymous, $visitor->visitorCache); + + $visitor->setAnonymousId("another_anonymous_id"); + $visitor->setVisitorId("another_visitor_id"); + $defaultStrategy->lookupVisitor(); + + $this->assertEquals(VisitorCacheStatus::NONE, $visitor->getVisitorCacheStatus()); + $this->assertCount(0, $visitor->visitorCache); + } + + public function testCacheVisitor() + { + + $visitorId = "visitor_id"; + $visitorContext = [ + 'name' => 'visitor_name', + 'age' => 25, + ]; + $config = new DecisionApiConfig('envId', 'apiKey'); + + /** + * @var HttpClientInterface|MockObject $httpClientMock + */ $httpClientMock = $this->getMockForAbstractClass( 'Flagship\Utils\HttpClientInterface', ['post'], @@ -1247,51 +1603,71 @@ public function testCacheVisitor() $campaignsData = $this->campaigns(); $campaignsData2 = $this->campaigns2(); - $httpClientMock->expects($this->exactly(3))->method("post") - ->willReturnOnConsecutiveCalls( - new HttpResponse(200, $campaignsData), - new HttpResponse(200, $campaignsData2), - new HttpResponse(200, $campaignsData2) - ); + $httpClientMock->expects($this->exactly(3))->method("post")->willReturnOnConsecutiveCalls( + new HttpResponse(200, $campaignsData), + new HttpResponse(200, $campaignsData2), + new HttpResponse(200, $campaignsData2) + ); $decisionManager = new ApiManager($httpClientMock, $config); + /** + * @var LoggerInterface|MockObject $logManagerStub + */ $logManagerStub = $this->getMockForAbstractClass( - 'Psr\Log\LoggerInterface', + LoggerInterface::class, [], "", true, true, true, - ['error', 'info'] + [ + 'error', + 'info', + ] ); + /** + * @var TrackingManagerAbstract|MockObject $trackingManagerMock + */ $trackingManagerMock = $this->getMockForAbstractClass( - "Flagship\Api\TrackingManagerAbstract", + TrackingManagerAbstract::class, [], "", false, false, true, - ["setTroubleshootingData", "addTroubleshootingHit"] + [ + "setTroubleshootingData", + "addTroubleshootingHit", + ] ); $config->setLogManager($logManagerStub); + /** + * @var IVisitorCacheImplementation|MockObject $VisitorCacheImplementationMock + */ $VisitorCacheImplementationMock = $this->getMockForAbstractClass( - "Flagship\Cache\IVisitorCacheImplementation", + IVisitorCacheImplementation::class, [], "", true, true, true, - ['lookupVisitor', 'cacheVisitor'] + [ + 'lookupVisitor', + 'cacheVisitor', + ] ); $configManager = new ConfigManager($config, $decisionManager, $trackingManagerMock); + /** + * @var ContainerInterface|MockObject $containerMock + */ $containerMock = $this->getMockForAbstractClass( - 'Flagship\Utils\ContainerInterface', + ContainerInterface::class, ['get'], '', false @@ -1318,104 +1694,282 @@ public function testCacheVisitor() foreach ($campaignsData[FlagshipField::FIELD_CAMPAIGNS] as $campaign) { $variation = $campaign[FlagshipField::FIELD_VARIATION]; $modifications = $variation[FlagshipField::FIELD_MODIFICATIONS]; - $assignmentsHistory[$campaign[FlagshipField::FIELD_VARIATION_GROUP_ID]] = - $variation[FlagshipField::FIELD_ID]; + $assignmentsHistory[$campaign[FlagshipField::FIELD_VARIATION_GROUP_ID]] = $variation[FlagshipField::FIELD_ID]; $campaigns[] = [ - FlagshipField::FIELD_CAMPAIGN_ID => $campaign[FlagshipField::FIELD_ID], - FlagshipField::FIELD_SLUG => $campaign[FlagshipField::FIELD_SLUG] ?? null, - FlagshipField::FIELD_VARIATION_GROUP_ID => $campaign[FlagshipField::FIELD_VARIATION_GROUP_ID], - FlagshipField::FIELD_VARIATION_ID => $variation[FlagshipField::FIELD_ID], - FlagshipField::FIELD_IS_REFERENCE => $variation[FlagshipField::FIELD_REFERENCE], - FlagshipField::FIELD_CAMPAIGN_TYPE => $modifications[FlagshipField::FIELD_CAMPAIGN_TYPE], - StrategyAbstract::ACTIVATED => false, - StrategyAbstract::FLAGS => $modifications[FlagshipField::FIELD_VALUE] - ]; + FlagshipField::FIELD_CAMPAIGN_ID => $campaign[FlagshipField::FIELD_ID], + FlagshipField::FIELD_SLUG => $campaign[FlagshipField::FIELD_SLUG] ?? null, + FlagshipField::FIELD_VARIATION_GROUP_ID => $campaign[FlagshipField::FIELD_VARIATION_GROUP_ID], + FlagshipField::FIELD_VARIATION_ID => $variation[FlagshipField::FIELD_ID], + FlagshipField::FIELD_IS_REFERENCE => $variation[FlagshipField::FIELD_REFERENCE], + FlagshipField::FIELD_CAMPAIGN_TYPE => $modifications[FlagshipField::FIELD_CAMPAIGN_TYPE], + StrategyAbstract::ACTIVATED => false, + StrategyAbstract::FLAGS => $modifications[FlagshipField::FIELD_VALUE], + ]; } $visitorCache = [ - StrategyAbstract::VERSION => 1, - StrategyAbstract::DATA => [ - StrategyAbstract::VISITOR_ID => $visitorId, - StrategyAbstract::ANONYMOUS_ID => $visitor->getAnonymousId(), - StrategyAbstract::CONSENT => $visitor->hasConsented(), - StrategyAbstract::CONTEXT => $visitor->getContext(), - StrategyAbstract::CAMPAIGNS => $campaigns, - StrategyAbstract::ASSIGNMENTS_HISTORY => $assignmentsHistory - ] - ]; + StrategyAbstract::VERSION => 1, + StrategyAbstract::DATA => [ + StrategyAbstract::VISITOR_ID => $visitorId, + StrategyAbstract::ANONYMOUS_ID => $visitor->getAnonymousId(), + StrategyAbstract::CONSENT => $visitor->hasConsented(), + StrategyAbstract::CONTEXT => $visitor->getContext(), + StrategyAbstract::CAMPAIGNS => $campaigns, + StrategyAbstract::ASSIGNMENTS_HISTORY => $assignmentsHistory, + ], + ]; $assignmentsHistory2 = []; $campaigns2 = []; foreach ($campaignsData2[FlagshipField::FIELD_CAMPAIGNS] as $campaign) { $variation = $campaign[FlagshipField::FIELD_VARIATION]; $modifications = $variation[FlagshipField::FIELD_MODIFICATIONS]; - $assignmentsHistory2[$campaign[FlagshipField::FIELD_VARIATION_GROUP_ID]] = - $variation[FlagshipField::FIELD_ID]; + $assignmentsHistory2[$campaign[FlagshipField::FIELD_VARIATION_GROUP_ID]] = $variation[FlagshipField::FIELD_ID]; $campaigns2[] = [ - FlagshipField::FIELD_CAMPAIGN_ID => $campaign[FlagshipField::FIELD_ID], - FlagshipField::FIELD_SLUG => $campaign[FlagshipField::FIELD_SLUG] ?? null, - FlagshipField::FIELD_VARIATION_GROUP_ID => $campaign[FlagshipField::FIELD_VARIATION_GROUP_ID], - FlagshipField::FIELD_VARIATION_ID => $variation[FlagshipField::FIELD_ID], - FlagshipField::FIELD_IS_REFERENCE => $variation[FlagshipField::FIELD_REFERENCE], - FlagshipField::FIELD_CAMPAIGN_TYPE => $modifications[FlagshipField::FIELD_CAMPAIGN_TYPE], - StrategyAbstract::ACTIVATED => false, - StrategyAbstract::FLAGS => $modifications[FlagshipField::FIELD_VALUE] - ]; + FlagshipField::FIELD_CAMPAIGN_ID => $campaign[FlagshipField::FIELD_ID], + FlagshipField::FIELD_SLUG => $campaign[FlagshipField::FIELD_SLUG] ?? null, + FlagshipField::FIELD_VARIATION_GROUP_ID => $campaign[FlagshipField::FIELD_VARIATION_GROUP_ID], + FlagshipField::FIELD_VARIATION_ID => $variation[FlagshipField::FIELD_ID], + FlagshipField::FIELD_IS_REFERENCE => $variation[FlagshipField::FIELD_REFERENCE], + FlagshipField::FIELD_CAMPAIGN_TYPE => $modifications[FlagshipField::FIELD_CAMPAIGN_TYPE], + StrategyAbstract::ACTIVATED => false, + StrategyAbstract::FLAGS => $modifications[FlagshipField::FIELD_VALUE], + ]; } + $visitorCache2 = [ + StrategyAbstract::VERSION => 1, + StrategyAbstract::DATA => [ + StrategyAbstract::VISITOR_ID => $visitorId, + StrategyAbstract::ANONYMOUS_ID => $visitor->getAnonymousId(), + StrategyAbstract::CONSENT => $visitor->hasConsented(), + StrategyAbstract::CONTEXT => $visitor->getContext(), + StrategyAbstract::CAMPAIGNS => $campaigns2, + StrategyAbstract::ASSIGNMENTS_HISTORY => array_merge($assignmentsHistory, $assignmentsHistory2), + ], + ]; + + $exception = new Exception("Message error"); + + $VisitorCacheImplementationMock->expects($this->exactly(3))->method("cacheVisitor")->with( + $this->logicalOr( + $visitorId + ), + $this->logicalOr( + $visitorCache, + $visitorCache2 + ) + )->willReturnOnConsecutiveCalls(null, null, $this->throwException($exception)); + + $config->setVisitorCacheImplementation($VisitorCacheImplementationMock); + + + $functionName = "cacheVisitor"; + + $visitor->fetchFlags(); + + $VisitorCacheImplementationMock->expects($this->exactly(2)) + ->method("lookupVisitor") + ->with( + $visitorId + )->willReturn( + $visitorCache + ); + + $visitor->fetchFlags(); + + $logManagerStub->expects($this->exactly(1))->method('error')->with( + $exception->getMessage(), + [FlagshipConstant::TAG => $functionName] + ); + + $visitor->fetchFlags(); + } + + public function testCacheVisitorXpc() + { + + $visitorId = "visitor_id"; + $visitorContext = [ + 'name' => 'visitor_name', + 'age' => 25 + ]; + + $config = new DecisionApiConfig('envId', 'apiKey'); + + /** + * @var HttpClientInterface|MockObject $httpClientMock + */ + $httpClientMock = $this->getMockForAbstractClass( + 'Flagship\Utils\HttpClientInterface', + ['post'], + '', + false + ); + + + $decisionManager = new ApiManager($httpClientMock, $config); + + /** + * @var LoggerInterface|MockObject $logManagerStub + */ + $logManagerStub = $this->getMockForAbstractClass( + 'Psr\Log\LoggerInterface', + [], + "", + true, + true, + true, + ['error', 'info'] + ); + + /** + * @var TrackingManagerAbstract|MockObject $trackingManagerMock + */ + $trackingManagerMock = $this->getMockForAbstractClass( + "Flagship\Api\TrackingManagerAbstract", + [], + "", + false, + false, + true, + ["setTroubleshootingData", "addTroubleshootingHit"] + ); + + $config->setLogManager($logManagerStub); + + /** + * @var IVisitorCacheImplementation|MockObject $VisitorCacheImplementationMock + */ + $VisitorCacheImplementationMock = $this->getMockForAbstractClass( + "Flagship\Cache\IVisitorCacheImplementation", + [], + "", + true, + true, + true, + ['lookupVisitor', 'cacheVisitor'] + ); + + $configManager = new ConfigManager($config, $decisionManager, $trackingManagerMock); + + /** + * @var ContainerInterface|MockObject $containerMock + */ + $containerMock = $this->getMockForAbstractClass( + 'Flagship\Utils\ContainerInterface', + ['get'], + '', + false + ); + + $containerGetMethod = function () { + $args = func_get_args(); + $params = $args[1]; + return new DefaultStrategy($params[0]); + }; + + $containerMock->method('get')->willReturnCallback($containerGetMethod); + $visitor = new VisitorDelegate( + $containerMock, + $configManager, + $visitorId, + false, + $visitorContext, + true + ); + + $defaultStrategy = new DefaultStrategy($visitor); + + $anonymousId = "anonymousId"; + + $visitorCache = [ + StrategyAbstract::VERSION => 1, + StrategyAbstract::DATA => [ + StrategyAbstract::VISITOR_ID => $visitorId, + StrategyAbstract::ANONYMOUS_ID => null, + StrategyAbstract::CONSENT => $visitor->hasConsented(), + StrategyAbstract::CONTEXT => $visitor->getContext(), + StrategyAbstract::CAMPAIGNS => [], + StrategyAbstract::ASSIGNMENTS_HISTORY => [] + ] + ]; + $visitorCache2 = [ StrategyAbstract::VERSION => 1, StrategyAbstract::DATA => [ StrategyAbstract::VISITOR_ID => $visitorId, - StrategyAbstract::ANONYMOUS_ID => $visitor->getAnonymousId(), + StrategyAbstract::ANONYMOUS_ID => $anonymousId, + StrategyAbstract::CONSENT => $visitor->hasConsented(), + StrategyAbstract::CONTEXT => $visitor->getContext(), + StrategyAbstract::CAMPAIGNS => [], + StrategyAbstract::ASSIGNMENTS_HISTORY => [] + ] + ]; + + $visitorCacheAnonymous = [ + StrategyAbstract::VERSION => 1, + StrategyAbstract::DATA => [ + StrategyAbstract::VISITOR_ID => $anonymousId, + StrategyAbstract::ANONYMOUS_ID => null, StrategyAbstract::CONSENT => $visitor->hasConsented(), StrategyAbstract::CONTEXT => $visitor->getContext(), - StrategyAbstract::CAMPAIGNS => $campaigns2, - StrategyAbstract::ASSIGNMENTS_HISTORY => array_merge($assignmentsHistory, $assignmentsHistory2) + StrategyAbstract::CAMPAIGNS => [], + StrategyAbstract::ASSIGNMENTS_HISTORY => [] ] ]; $exception = new Exception("Message error"); - $VisitorCacheImplementationMock->expects($this->exactly(3)) + $VisitorCacheImplementationMock->expects($this->exactly(7)) ->method("cacheVisitor") ->with( $this->logicalOr( - $visitorId + $visitorId, + $anonymousId ), $this->logicalOr( $visitorCache, - $visitorCache2 + $visitorCache2, + $visitorCacheAnonymous ) - ) - ->willReturnOnConsecutiveCalls(null, null, $this->throwException($exception)); + ); $config->setVisitorCacheImplementation($VisitorCacheImplementationMock); + $defaultStrategy->cacheVisitor(); - $functionName = "cacheVisitor"; + $this->assertSame($visitorCache, $visitor->visitorCache); - $visitor->fetchFlags(); + $visitor->setAnonymousId($anonymousId); - $visitor->fetchFlags(); + $visitor->setVisitorCacheStatus(VisitorCacheStatus::ANONYMOUS_ID_CACHE); - $logManagerStub->expects($this->exactly(1))->method('error') - ->with( - $exception->getMessage(), - [FlagshipConstant::TAG => $functionName] - ); + $defaultStrategy->cacheVisitor(); - $visitor->fetchFlags(); + $this->assertSame($visitorCache2, $visitor->visitorCache); + + $visitor->setVisitorCacheStatus(VisitorCacheStatus::NONE); + + $defaultStrategy->cacheVisitor(); + + $visitor->setVisitorCacheStatus(VisitorCacheStatus::VISITOR_ID_CACHE); + + $defaultStrategy->cacheVisitor(); + + $visitor->setVisitorCacheStatus(VisitorCacheStatus::VISITOR_ID_CACHE_WITH_ANONYMOUS_ID_CACHE); + + $defaultStrategy->cacheVisitor(); } public function testFlushVisitor() { $visitorId = "visitor_id"; $visitorContext = [ - 'name' => 'visitor_name', - 'age' => 25 - ]; + 'name' => 'visitor_name', + 'age' => 25, + ]; $config = new DecisionApiConfig('envId', 'apiKey'); $httpClientMock = $this->getMockForAbstractClass( @@ -1437,7 +1991,10 @@ public function testFlushVisitor() true, true, true, - ['error', 'info'] + [ + 'error', + 'info', + ] ); $config->setLogManager($logManagerStub); @@ -1469,10 +2026,7 @@ public function testFlushVisitor() $exception = new Exception("Message error"); - $VisitorCacheImplementationMock->expects($this->exactly(2)) - ->method("flushVisitor") - ->with($visitorId) - ->willReturnOnConsecutiveCalls(null, $this->throwException($exception)); + $VisitorCacheImplementationMock->expects($this->exactly(2))->method("flushVisitor")->with($visitorId)->willReturnOnConsecutiveCalls(null, $this->throwException($exception)); $config->setVisitorCacheImplementation($VisitorCacheImplementationMock); @@ -1483,11 +2037,10 @@ public function testFlushVisitor() $functionName = "flushVisitor"; - $logManagerStub->expects($this->exactly(1))->method('error') - ->with( - $exception->getMessage(), - [FlagshipConstant::TAG => $functionName] - ); + $logManagerStub->expects($this->exactly(1))->method('error')->with( + $exception->getMessage(), + [FlagshipConstant::TAG => $functionName] + ); $defaultStrategy->setConsent(false); } @@ -1498,9 +2051,9 @@ public function testFetchVisitorCampaigns() $visitorId = "visitor_id"; $visitorContext = [ - 'name' => 'visitor_name', - 'age' => 25 - ]; + 'name' => 'visitor_name', + 'age' => 25, + ]; $config = new DecisionApiConfig('envId', 'apiKey'); $httpClientMock = $this->getMockForAbstractClass( @@ -1512,9 +2065,7 @@ public function testFetchVisitorCampaigns() $campaignsData = $this->campaigns(); - $httpClientMock->expects($this->exactly(2)) - ->method("post") - ->willThrowException(new Exception()); + $httpClientMock->expects($this->exactly(2))->method("post")->willThrowException(new Exception()); $decisionManager = new ApiManager($httpClientMock, $config); @@ -1525,7 +2076,10 @@ public function testFetchVisitorCampaigns() true, true, true, - ['error', 'info'] + [ + 'error', + 'info', + ] ); $trackingManagerMock = $this->getMockForAbstractClass( @@ -1535,7 +2089,10 @@ public function testFetchVisitorCampaigns() false, false, true, - ["setTroubleshootingData", "addTroubleshootingHit"] + [ + "setTroubleshootingData", + "addTroubleshootingHit", + ] ); $config->setLogManager($logManagerStub); @@ -1575,27 +2132,27 @@ public function testFetchVisitorCampaigns() $assignmentsHistory[$campaign[FlagshipField::FIELD_ID]] = $variation[FlagshipField::FIELD_ID]; $campaigns[] = [ - FlagshipField::FIELD_CAMPAIGN_ID => $campaign[FlagshipField::FIELD_ID], - FlagshipField::FIELD_VARIATION_GROUP_ID => $campaign[FlagshipField::FIELD_VARIATION_GROUP_ID], - FlagshipField::FIELD_VARIATION_ID => $variation[FlagshipField::FIELD_ID], - FlagshipField::FIELD_IS_REFERENCE => $variation[FlagshipField::FIELD_REFERENCE], - FlagshipField::FIELD_CAMPAIGN_TYPE => $modifications[FlagshipField::FIELD_CAMPAIGN_TYPE], - StrategyAbstract::ACTIVATED => false, - StrategyAbstract::FLAGS => $modifications[FlagshipField::FIELD_VALUE] - ]; + FlagshipField::FIELD_CAMPAIGN_ID => $campaign[FlagshipField::FIELD_ID], + FlagshipField::FIELD_VARIATION_GROUP_ID => $campaign[FlagshipField::FIELD_VARIATION_GROUP_ID], + FlagshipField::FIELD_VARIATION_ID => $variation[FlagshipField::FIELD_ID], + FlagshipField::FIELD_IS_REFERENCE => $variation[FlagshipField::FIELD_REFERENCE], + FlagshipField::FIELD_CAMPAIGN_TYPE => $modifications[FlagshipField::FIELD_CAMPAIGN_TYPE], + StrategyAbstract::ACTIVATED => false, + StrategyAbstract::FLAGS => $modifications[FlagshipField::FIELD_VALUE], + ]; } $visitorCache = [ - StrategyAbstract::VERSION => 1, - StrategyAbstract::DATA => [ - StrategyAbstract::VISITOR_ID => $visitorId, - StrategyAbstract::ANONYMOUS_ID => $visitor->getAnonymousId(), - StrategyAbstract::CONSENT => $visitor->hasConsented(), - StrategyAbstract::CONTEXT => $visitor->getContext(), - StrategyAbstract::CAMPAIGNS => $campaigns, - StrategyAbstract::ASSIGNMENTS_HISTORY => $assignmentsHistory - ] - ]; + StrategyAbstract::VERSION => 1, + StrategyAbstract::DATA => [ + StrategyAbstract::VISITOR_ID => $visitorId, + StrategyAbstract::ANONYMOUS_ID => $visitor->getAnonymousId(), + StrategyAbstract::CONSENT => $visitor->hasConsented(), + StrategyAbstract::CONTEXT => $visitor->getContext(), + StrategyAbstract::CAMPAIGNS => $campaigns, + StrategyAbstract::ASSIGNMENTS_HISTORY => $assignmentsHistory, + ], + ]; $visitor->visitorCache = $visitorCache; @@ -1646,8 +2203,7 @@ public function testSendAnalyticsHit() $flagshipInstanceId = "flagshipInstanceId"; $decisionManager = new ApiManager($httpClientMock, $config); $configManager = new ConfigManager($config, $decisionManager, $trackingManagerMock); - $configManager->setDecisionManager($decisionManager) - ->setTrackingManager($trackingManagerMock); + $configManager->setDecisionManager($decisionManager)->setTrackingManager($trackingManagerMock); $visitor = new VisitorDelegate( new Container(), @@ -1659,27 +2215,11 @@ public function testSendAnalyticsHit() ); $analytic = new UsageHit(); - $analytic->setLabel(TroubleshootingLabel::SDK_CONFIG) - ->setLogLevel(LogLevel::INFO) - - ->setSdkConfigLogLevel($config->getLogLevel()) - ->setSdkConfigMode($config->getDecisionMode()) - ->setSdkConfigTimeout($config->getTimeout()) - ->setSdkConfigTrackingManagerConfigStrategy($config->getCacheStrategy()) - ->setSdkConfigUsingOnVisitorExposed(!!$config->getOnVisitorExposed()) - ->setSdkConfigUsingCustomHitCache(!!$config->getHitCacheImplementation()) - ->setSdkConfigUsingCustomVisitorCache(!!$config->getVisitorCacheImplementation()) - ->setSdkConfigBucketingUrl($bucketingUrl) - ->setSdkStatus($visitor->getSdkStatus()) - ->setFlagshipInstanceId($flagshipInstanceId) - ->setConfig($config) - ->setVisitorId($flagshipInstanceId); + $analytic->setLabel(TroubleshootingLabel::SDK_CONFIG)->setLogLevel(LogLevel::INFO)->setSdkConfigLogLevel($config->getLogLevel())->setSdkConfigMode($config->getDecisionMode())->setSdkConfigTimeout($config->getTimeout())->setSdkConfigTrackingManagerConfigStrategy($config->getCacheStrategy())->setSdkConfigUsingOnVisitorExposed(!!$config->getOnVisitorExposed())->setSdkConfigUsingCustomHitCache(!!$config->getHitCacheImplementation())->setSdkConfigUsingCustomVisitorCache(!!$config->getVisitorCacheImplementation())->setSdkConfigBucketingUrl($bucketingUrl)->setSdkStatus($visitor->getSdkStatus())->setFlagshipInstanceId($flagshipInstanceId)->setConfig($config)->setVisitorId($flagshipInstanceId); $trackingManagerMock->expects($this->once())->method("addUsageHit")->with($analytic); - $murmurHashMock->expects($this->exactly(2)) - ->method('murmurHash3Int32') - ->willReturnOnConsecutiveCalls(10, 0); + $murmurHashMock->expects($this->exactly(2))->method('murmurHash3Int32')->willReturnOnConsecutiveCalls(10, 0); $defaultStrategy = new DefaultStrategy($visitor); $defaultStrategy->setFlagshipInstanceId($flagshipInstanceId); diff --git a/tests/Visitor/NoConsentStrategyTest.php b/tests/Visitor/NoConsentStrategyTest.php index 65f12c8c..ae237ace 100644 --- a/tests/Visitor/NoConsentStrategyTest.php +++ b/tests/Visitor/NoConsentStrategyTest.php @@ -45,7 +45,10 @@ public function testMethods() false, false, true, - ["setTroubleshootingData", 'activateFlag'] + [ + "setTroubleshootingData", + 'activateFlag', + ] ); $config = new DecisionApiConfig('envId', 'apiKey'); @@ -54,12 +57,11 @@ public function testMethods() $visitorId = "visitorId"; - $httpClientMock->expects($this->exactly(2))->method("post") - ->willReturnOnConsecutiveCalls( - new HttpResponse(200, $this->campaigns()), - new HttpResponse(500, null) - ); - + $httpClientMock->expects($this->exactly(2))->method("post")->willReturnOnConsecutiveCalls( + new HttpResponse(200, $this->campaigns()), + new HttpResponse(500, null) + ); + $trackerManager->expects($this->exactly(0))->method("activateFlag"); $decisionManager = new ApiManager($httpClientMock, $config); @@ -67,25 +69,24 @@ public function testMethods() $visitor = new VisitorDelegate(new Container(), $configManager, $visitorId, false, [], true); - $logManagerStub->expects($this->exactly(2))->method('info') - ->with( - $this->logicalOr( - sprintf( - FlagshipConstant::METHOD_DEACTIVATED_CONSENT_ERROR, - "sendHit", - $visitorId - ), - sprintf( - FlagshipConstant::METHOD_DEACTIVATED_CONSENT_ERROR, - "visitorExposed", - $visitorId - ) + $logManagerStub->expects($this->exactly(2))->method('info')->with( + $this->logicalOr( + sprintf( + FlagshipConstant::METHOD_DEACTIVATED_CONSENT_ERROR, + "sendHit", + $visitorId ), - $this->logicalOr( - [FlagshipConstant::TAG => "sendHit"], - [FlagshipConstant::TAG => "visitorExposed"] + sprintf( + FlagshipConstant::METHOD_DEACTIVATED_CONSENT_ERROR, + "visitorExposed", + $visitorId ) - ); + ), + $this->logicalOr( + [FlagshipConstant::TAG => "sendHit"], + [FlagshipConstant::TAG => "visitorExposed"] + ) + ); $noConsentStrategy = new NoConsentStrategy($visitor); @@ -95,22 +96,24 @@ public function testMethods() $noConsentStrategy->updateContext($key, $value); $this->assertSame([ - "sdk_osName" => PHP_OS, - FlagshipConstant::FS_CLIENT => FlagshipConstant::SDK_LANGUAGE, - FlagshipConstant::FS_VERSION => FlagshipConstant::SDK_VERSION, - FlagshipConstant::FS_USERS => $visitorId, - $key => $value, - ], $visitor->getContext()); + "sdk_osName" => PHP_OS, + FlagshipConstant::FS_CLIENT => FlagshipConstant::SDK_LANGUAGE, + FlagshipConstant::FS_VERSION => FlagshipConstant::SDK_VERSION, + FlagshipConstant::FS_USERS => $visitorId, + $key => $value, + ], $visitor->getContext()); //Test updateContextCollection $noConsentStrategy->updateContextCollection(['age' => 20]); $this->assertSame([ - "sdk_osName" => PHP_OS, - FlagshipConstant::FS_CLIENT => FlagshipConstant::SDK_LANGUAGE, - FlagshipConstant::FS_VERSION => FlagshipConstant::SDK_VERSION, - FlagshipConstant::FS_USERS => $visitorId, - $key => $value, 'age' => 20], $visitor->getContext()); + "sdk_osName" => PHP_OS, + FlagshipConstant::FS_CLIENT => FlagshipConstant::SDK_LANGUAGE, + FlagshipConstant::FS_VERSION => FlagshipConstant::SDK_VERSION, + FlagshipConstant::FS_USERS => $visitorId, + $key => $value, + 'age' => 20, + ], $visitor->getContext()); //Test clearContext $noConsentStrategy->clearContext(); @@ -141,27 +144,27 @@ public function testMethods() $assignmentsHistory[$campaign[FlagshipField::FIELD_ID]] = $variation[FlagshipField::FIELD_ID]; $campaigns[] = [ - FlagshipField::FIELD_CAMPAIGN_ID => $campaign[FlagshipField::FIELD_ID], - FlagshipField::FIELD_VARIATION_GROUP_ID => $campaign[FlagshipField::FIELD_VARIATION_GROUP_ID], - FlagshipField::FIELD_VARIATION_ID => $variation[FlagshipField::FIELD_ID], - FlagshipField::FIELD_IS_REFERENCE => $variation[FlagshipField::FIELD_REFERENCE], - FlagshipField::FIELD_CAMPAIGN_TYPE => $modifications[FlagshipField::FIELD_CAMPAIGN_TYPE], - StrategyAbstract::ACTIVATED => false, - StrategyAbstract::FLAGS => $modifications[FlagshipField::FIELD_VALUE] - ]; + FlagshipField::FIELD_CAMPAIGN_ID => $campaign[FlagshipField::FIELD_ID], + FlagshipField::FIELD_VARIATION_GROUP_ID => $campaign[FlagshipField::FIELD_VARIATION_GROUP_ID], + FlagshipField::FIELD_VARIATION_ID => $variation[FlagshipField::FIELD_ID], + FlagshipField::FIELD_IS_REFERENCE => $variation[FlagshipField::FIELD_REFERENCE], + FlagshipField::FIELD_CAMPAIGN_TYPE => $modifications[FlagshipField::FIELD_CAMPAIGN_TYPE], + StrategyAbstract::ACTIVATED => false, + StrategyAbstract::FLAGS => $modifications[FlagshipField::FIELD_VALUE], + ]; } $visitorCache = [ - StrategyAbstract::VERSION => 1, - StrategyAbstract::DATA => [ - StrategyAbstract::VISITOR_ID => $visitorId, - StrategyAbstract::ANONYMOUS_ID => $visitor->getAnonymousId(), - StrategyAbstract::CONSENT => $visitor->hasConsented(), - StrategyAbstract::CONTEXT => $visitor->getContext(), - StrategyAbstract::CAMPAIGNS => $campaigns, - StrategyAbstract::ASSIGNMENTS_HISTORY => $assignmentsHistory - ] - ]; + StrategyAbstract::VERSION => 1, + StrategyAbstract::DATA => [ + StrategyAbstract::VISITOR_ID => $visitorId, + StrategyAbstract::ANONYMOUS_ID => $visitor->getAnonymousId(), + StrategyAbstract::CONSENT => $visitor->hasConsented(), + StrategyAbstract::CONTEXT => $visitor->getContext(), + StrategyAbstract::CAMPAIGNS => $campaigns, + StrategyAbstract::ASSIGNMENTS_HISTORY => $assignmentsHistory, + ], + ]; //Test fetchVisitorCampaigns $visitor->visitorCache = $visitorCache; @@ -176,14 +179,15 @@ public function testMethods() true, true, true, - ['lookupVisitor', 'cacheVisitor'] + [ + 'lookupVisitor', + 'cacheVisitor', + ] ); - $VisitorCacheImplementationMock->expects($this->never()) - ->method("cacheVisitor"); + $VisitorCacheImplementationMock->expects($this->never())->method("cacheVisitor"); - $VisitorCacheImplementationMock->expects($this->never()) - ->method("lookupVisitor"); + $VisitorCacheImplementationMock->expects($this->never())->method("lookupVisitor"); $config->setVisitorCacheImplementation($VisitorCacheImplementationMock); diff --git a/tests/Visitor/NotReadyStrategyTest.php b/tests/Visitor/NotReadyStrategyTest.php index 26a7183b..adcb4c7f 100644 --- a/tests/Visitor/NotReadyStrategyTest.php +++ b/tests/Visitor/NotReadyStrategyTest.php @@ -44,32 +44,29 @@ public function testMethods() }; - $decisionManager = $this->getMockBuilder(ApiManager::class) - ->disableOriginalConstructor() - ->getMock(); + $decisionManager = $this->getMockBuilder(ApiManager::class)->disableOriginalConstructor()->getMock(); $configManager = new ConfigManager($config, $decisionManager, $trackerManager); $visitorId = "visitorId"; $visitor = new VisitorDelegate(new Container(), $configManager, $visitorId, false, [], true); - $logManagerStub->expects($this->exactly(5))->method('error') - ->with( - $this->logicalOr( - $logMessageBuild('sendHit'), - $logMessageBuild('fetchFlags'), - $logMessageBuild('getFlagValue'), - $logMessageBuild('visitorExposed'), - $logMessageBuild('getFlagMetadata') - ), - $this->logicalOr( - [FlagshipConstant::TAG => 'sendHit'], - [FlagshipConstant::TAG => 'fetchFlags'], - [FlagshipConstant::TAG => 'getFlagValue'], - [FlagshipConstant::TAG => 'visitorExposed'], - [FlagshipConstant::TAG => 'getFlagMetadata'] - ) - ); + $logManagerStub->expects($this->exactly(5))->method('error')->with( + $this->logicalOr( + $logMessageBuild('sendHit'), + $logMessageBuild('fetchFlags'), + $logMessageBuild('getFlagValue'), + $logMessageBuild('visitorExposed'), + $logMessageBuild('getFlagMetadata') + ), + $this->logicalOr( + [FlagshipConstant::TAG => 'sendHit'], + [FlagshipConstant::TAG => 'fetchFlags'], + [FlagshipConstant::TAG => 'getFlagValue'], + [FlagshipConstant::TAG => 'visitorExposed'], + [FlagshipConstant::TAG => 'getFlagMetadata'] + ) + ); $notReadyStrategy = new NotReadyStrategy($visitor); @@ -81,24 +78,24 @@ public function testMethods() $this->assertSame([ - "sdk_osName" => PHP_OS, - FlagshipConstant::FS_CLIENT => FlagshipConstant::SDK_LANGUAGE, - FlagshipConstant::FS_VERSION => FlagshipConstant::SDK_VERSION, - FlagshipConstant::FS_USERS => $visitorId, - $key => $value, - ], $visitor->getContext()); + "sdk_osName" => PHP_OS, + FlagshipConstant::FS_CLIENT => FlagshipConstant::SDK_LANGUAGE, + FlagshipConstant::FS_VERSION => FlagshipConstant::SDK_VERSION, + FlagshipConstant::FS_USERS => $visitorId, + $key => $value, + ], $visitor->getContext()); //Test updateContextCollection $notReadyStrategy->updateContextCollection(['age' => 20]); $this->assertSame([ - "sdk_osName" => PHP_OS, - FlagshipConstant::FS_CLIENT => FlagshipConstant::SDK_LANGUAGE, - FlagshipConstant::FS_VERSION => FlagshipConstant::SDK_VERSION, - FlagshipConstant::FS_USERS => $visitorId, - $key => $value, - 'age' => 20 - ], $visitor->getContext()); + "sdk_osName" => PHP_OS, + FlagshipConstant::FS_CLIENT => FlagshipConstant::SDK_LANGUAGE, + FlagshipConstant::FS_VERSION => FlagshipConstant::SDK_VERSION, + FlagshipConstant::FS_USERS => $visitorId, + $key => $value, + 'age' => 20, + ], $visitor->getContext()); //Test clearContext $notReadyStrategy->clearContext(); @@ -129,14 +126,15 @@ public function testMethods() true, true, true, - ['lookupVisitor', 'cacheVisitor'] + [ + 'lookupVisitor', + 'cacheVisitor', + ] ); - $VisitorCacheImplementationMock->expects($this->never()) - ->method("cacheVisitor"); + $VisitorCacheImplementationMock->expects($this->never())->method("cacheVisitor"); - $VisitorCacheImplementationMock->expects($this->never()) - ->method("lookupVisitor"); + $VisitorCacheImplementationMock->expects($this->never())->method("lookupVisitor"); $config->setVisitorCacheImplementation($VisitorCacheImplementationMock); diff --git a/tests/Visitor/PanicStrategyTest.php b/tests/Visitor/PanicStrategyTest.php index 04bd6112..ee249633 100644 --- a/tests/Visitor/PanicStrategyTest.php +++ b/tests/Visitor/PanicStrategyTest.php @@ -70,10 +70,9 @@ public function testMethods() - $httpClientMock->expects($this->exactly(1))->method("post") - ->willReturnOnConsecutiveCalls( - new HttpResponse(500, []) - ); + $httpClientMock->expects($this->exactly(1))->method("post")->willReturnOnConsecutiveCalls( + new HttpResponse(500, []) + ); $decisionManager = new ApiManager($httpClientMock, $config); @@ -81,29 +80,28 @@ public function testMethods() $visitor = new VisitorDelegate(new Container(), $configManager, "visitorId", false, [], true); - $logManagerStub->expects($this->exactly(8))->method('info') - ->with( - $this->logicalOr( - $logMessageBuild('updateContext'), - $logMessageBuild('updateContextCollection'), - $logMessageBuild('clearContext'), - $logMessageBuild('sendHit'), - $logMessageBuildConsent(), - $logMessageBuild('getFlagValue'), - $logMessageBuild('visitorExposed'), - $logMessageBuild('getFlagMetadata') - ), - $this->logicalOr( - [FlagshipConstant::TAG => 'updateContext'], - [FlagshipConstant::TAG => 'updateContextCollection'], - [FlagshipConstant::TAG => 'clearContext'], - [FlagshipConstant::TAG => 'sendHit'], - [FlagshipConstant::TAG => 'setConsent'], - [FlagshipConstant::TAG => 'getFlagValue'], - [FlagshipConstant::TAG => 'visitorExposed'], - [FlagshipConstant::TAG => 'getFlagMetadata'] - ) - ); + $logManagerStub->expects($this->exactly(8))->method('info')->with( + $this->logicalOr( + $logMessageBuild('updateContext'), + $logMessageBuild('updateContextCollection'), + $logMessageBuild('clearContext'), + $logMessageBuild('sendHit'), + $logMessageBuildConsent(), + $logMessageBuild('getFlagValue'), + $logMessageBuild('visitorExposed'), + $logMessageBuild('getFlagMetadata') + ), + $this->logicalOr( + [FlagshipConstant::TAG => 'updateContext'], + [FlagshipConstant::TAG => 'updateContextCollection'], + [FlagshipConstant::TAG => 'clearContext'], + [FlagshipConstant::TAG => 'sendHit'], + [FlagshipConstant::TAG => 'setConsent'], + [FlagshipConstant::TAG => 'getFlagValue'], + [FlagshipConstant::TAG => 'visitorExposed'], + [FlagshipConstant::TAG => 'getFlagMetadata'] + ) + ); $panicStrategy = new PanicStrategy($visitor); @@ -144,27 +142,27 @@ public function testMethods() $assignmentsHistory[$campaign[FlagshipField::FIELD_ID]] = $variation[FlagshipField::FIELD_ID]; $campaigns[] = [ - FlagshipField::FIELD_CAMPAIGN_ID => $campaign[FlagshipField::FIELD_ID], - FlagshipField::FIELD_VARIATION_GROUP_ID => $campaign[FlagshipField::FIELD_VARIATION_GROUP_ID], - FlagshipField::FIELD_VARIATION_ID => $variation[FlagshipField::FIELD_ID], - FlagshipField::FIELD_IS_REFERENCE => $variation[FlagshipField::FIELD_REFERENCE], - FlagshipField::FIELD_CAMPAIGN_TYPE => $modifications[FlagshipField::FIELD_CAMPAIGN_TYPE], - StrategyAbstract::ACTIVATED => false, - StrategyAbstract::FLAGS => $modifications[FlagshipField::FIELD_VALUE] - ]; + FlagshipField::FIELD_CAMPAIGN_ID => $campaign[FlagshipField::FIELD_ID], + FlagshipField::FIELD_VARIATION_GROUP_ID => $campaign[FlagshipField::FIELD_VARIATION_GROUP_ID], + FlagshipField::FIELD_VARIATION_ID => $variation[FlagshipField::FIELD_ID], + FlagshipField::FIELD_IS_REFERENCE => $variation[FlagshipField::FIELD_REFERENCE], + FlagshipField::FIELD_CAMPAIGN_TYPE => $modifications[FlagshipField::FIELD_CAMPAIGN_TYPE], + StrategyAbstract::ACTIVATED => false, + StrategyAbstract::FLAGS => $modifications[FlagshipField::FIELD_VALUE], + ]; } $visitorCache = [ - StrategyAbstract::VERSION => 1, - StrategyAbstract::DATA => [ - StrategyAbstract::VISITOR_ID => $visitor->getVisitorId(), - StrategyAbstract::ANONYMOUS_ID => $visitor->getAnonymousId(), - StrategyAbstract::CONSENT => $visitor->hasConsented(), - StrategyAbstract::CONTEXT => $visitor->getContext(), - StrategyAbstract::CAMPAIGNS => $campaigns, - StrategyAbstract::ASSIGNMENTS_HISTORY => $assignmentsHistory - ] - ]; + StrategyAbstract::VERSION => 1, + StrategyAbstract::DATA => [ + StrategyAbstract::VISITOR_ID => $visitor->getVisitorId(), + StrategyAbstract::ANONYMOUS_ID => $visitor->getAnonymousId(), + StrategyAbstract::CONSENT => $visitor->hasConsented(), + StrategyAbstract::CONTEXT => $visitor->getContext(), + StrategyAbstract::CAMPAIGNS => $campaigns, + StrategyAbstract::ASSIGNMENTS_HISTORY => $assignmentsHistory, + ], + ]; //Test fetchVisitorCampaigns $visitor->visitorCache = $visitorCache; @@ -179,14 +177,15 @@ public function testMethods() true, true, true, - ['lookupVisitor', 'cacheVisitor'] + [ + 'lookupVisitor', + 'cacheVisitor', + ] ); - $VisitorCacheImplementationMock->expects($this->never()) - ->method("cacheVisitor"); + $VisitorCacheImplementationMock->expects($this->never())->method("cacheVisitor"); - $VisitorCacheImplementationMock->expects($this->never()) - ->method("lookupVisitor"); + $VisitorCacheImplementationMock->expects($this->never())->method("lookupVisitor"); $config->setVisitorCacheImplementation($VisitorCacheImplementationMock); diff --git a/tests/Visitor/VisitorBuilderTest.php b/tests/Visitor/VisitorBuilderTest.php index 40d6ce54..b18d5a48 100644 --- a/tests/Visitor/VisitorBuilderTest.php +++ b/tests/Visitor/VisitorBuilderTest.php @@ -18,9 +18,7 @@ class VisitorBuilderTest extends TestCase public function testBuilder() { - $trackerManager = $this->getMockBuilder('Flagship\Api\TrackingManager') - ->onlyMethods(['addHit']) - ->disableOriginalConstructor()->getMock(); + $trackerManager = $this->getMockBuilder('Flagship\Api\TrackingManager')->onlyMethods(['addHit'])->disableOriginalConstructor()->getMock(); $container = new Container(); @@ -28,8 +26,7 @@ public function testBuilder() $hasConsented = true; $config = new DecisionApiConfig(); - $decisionManager = $this->getMockBuilder('Flagship\Decision\ApiManager') - ->disableOriginalConstructor()->getMock(); + $decisionManager = $this->getMockBuilder('Flagship\Decision\ApiManager')->disableOriginalConstructor()->getMock(); $configManager = new ConfigManager($config, $decisionManager, $trackerManager); $visitor = VisitorBuilder::builder( @@ -45,23 +42,20 @@ public function testBuilder() $this->assertNull($visitor->getAnonymousId()); $context = [ - 'age' => 20, - "sdk_osName" => PHP_OS, - "sdk_deviceType" => "server", - FlagshipConstant::FS_CLIENT => FlagshipConstant::SDK_LANGUAGE, - FlagshipConstant::FS_VERSION => FlagshipConstant::SDK_VERSION, - FlagshipConstant::FS_USERS => $visitorId, - ]; + 'age' => 20, + "sdk_osName" => PHP_OS, + "sdk_deviceType" => "server", + FlagshipConstant::FS_CLIENT => FlagshipConstant::SDK_LANGUAGE, + FlagshipConstant::FS_VERSION => FlagshipConstant::SDK_VERSION, + FlagshipConstant::FS_USERS => $visitorId, + ]; $onFetchFlagsStatusChanged = function (FetchFlagsStatusInterface $fetchFlagsStatus) { $this->assertSame($fetchFlagsStatus->getStatus(), FSFetchStatus::FETCH_REQUIRED); $this->assertSame($fetchFlagsStatus->getReason(), FSFetchReason::VISITOR_CREATED); }; - $visitor = VisitorBuilder::builder($visitorId, $hasConsented, $configManager, $container, "instanceId") - ->setIsAuthenticated(true) - ->setOnFetchFlagsStatusChanged($onFetchFlagsStatusChanged) - ->setContext($context)->build(); + $visitor = VisitorBuilder::builder($visitorId, $hasConsented, $configManager, $container, "instanceId")->setIsAuthenticated(true)->setOnFetchFlagsStatusChanged($onFetchFlagsStatusChanged)->setContext($context)->build(); $this->assertSame($context, $visitor->getContext()); $this->assertTrue($visitor->hasConsented()); diff --git a/tests/Visitor/VisitorDelegateTest.php b/tests/Visitor/VisitorDelegateTest.php index 924953a9..16df8216 100644 --- a/tests/Visitor/VisitorDelegateTest.php +++ b/tests/Visitor/VisitorDelegateTest.php @@ -28,20 +28,23 @@ class VisitorDelegateTest extends TestCase { public function testVisitorDelegateConstruct() { - $configData = ['envId' => 'env_value', 'apiKey' => 'key_value']; + $configData = [ + 'envId' => 'env_value', + 'apiKey' => 'key_value', + ]; $config = new DecisionApiConfig($configData['envId'], $configData['apiKey']); $visitorId = "visitor_id"; $newVisitorId = 'new_visitor_id'; $ageKey = 'age'; $visitorContext = [ - 'name' => 'visitor_name', - 'age' => 25, - "sdk_osName" => PHP_OS, - "sdk_deviceType" => "server", - FlagshipConstant::FS_CLIENT => FlagshipConstant::SDK_LANGUAGE, - FlagshipConstant::FS_VERSION => FlagshipConstant::SDK_VERSION, - FlagshipConstant::FS_USERS => $visitorId, - ]; + 'name' => 'visitor_name', + 'age' => 25, + "sdk_osName" => PHP_OS, + "sdk_deviceType" => "server", + FlagshipConstant::FS_CLIENT => FlagshipConstant::SDK_LANGUAGE, + FlagshipConstant::FS_VERSION => FlagshipConstant::SDK_VERSION, + FlagshipConstant::FS_USERS => $visitorId, + ]; $trackerManager = $this->getMockForAbstractClass( TrackingManagerAbstract::class, @@ -50,8 +53,7 @@ public function testVisitorDelegateConstruct() false ); - $decisionManager = $this->getMockBuilder(ApiManager::class) - ->disableOriginalConstructor()->getMock(); + $decisionManager = $this->getMockBuilder(ApiManager::class)->disableOriginalConstructor()->getMock(); $configManager = new ConfigManager($config, $decisionManager, $trackerManager); @@ -72,23 +74,17 @@ public function testVisitorDelegateConstruct() $containerMock->method('get')->will($this->returnCallback($containerGetMethod)); $consentHit = new Event(EventCategory::USER_ENGAGEMENT, FlagshipConstant::FS_CONSENT); - $consentHit->setLabel(FlagshipConstant::SDK_LANGUAGE . ":" . "false") - ->setConfig($config) - ->setVisitorId($visitorId); + $consentHit->setLabel(FlagshipConstant::SDK_LANGUAGE . ":" . "false")->setConfig($config)->setVisitorId($visitorId); $consentHit2 = new Event(EventCategory::USER_ENGAGEMENT, FlagshipConstant::FS_CONSENT); - $consentHit2->setLabel(FlagshipConstant::SDK_LANGUAGE . ":" . "true") - ->setConfig($config) - ->setVisitorId($newVisitorId); - - $trackerManager->expects($this->exactly(2)) - ->method('addHit') - ->with( - $this->logicalOr( - $this->equalTo($consentHit), - $this->equalTo($consentHit2) - ) - ); + $consentHit2->setLabel(FlagshipConstant::SDK_LANGUAGE . ":" . "true")->setConfig($config)->setVisitorId($newVisitorId); + + $trackerManager->expects($this->exactly(2))->method('addHit')->with( + $this->logicalOr( + $this->equalTo($consentHit), + $this->equalTo($consentHit2) + ) + ); $visitorDelegate = new VisitorDelegate($containerMock, $configManager, $visitorId, false, $visitorContext); @@ -133,7 +129,10 @@ public function testVisitorDelegateConstruct() public function testSetAnonymous() { - $configData = ['envId' => 'env_value', 'apiKey' => 'key_value']; + $configData = [ + 'envId' => 'env_value', + 'apiKey' => 'key_value', + ]; $config = new DecisionApiConfig($configData['envId'], $configData['apiKey']); $visitorId = "visitor_id"; @@ -144,8 +143,7 @@ public function testSetAnonymous() false ); - $decisionManager = $this->getMockBuilder(ApiManager::class) - ->disableOriginalConstructor()->getMock(); + $decisionManager = $this->getMockBuilder(ApiManager::class)->disableOriginalConstructor()->getMock(); $configManager = new ConfigManager($config, $decisionManager, $trackerManager); @@ -176,16 +174,19 @@ public function testSetVisitorLog() ['error'] ); - $configData = ['envId' => 'env_value', 'apiKey' => 'key_value']; + $configData = [ + 'envId' => 'env_value', + 'apiKey' => 'key_value', + ]; $config = new DecisionApiConfig($configData['envId'], $configData['apiKey']); $config->setLogManager($logManagerStub); $visitorId = "visitor_id"; $visitorContext = [ - 'name' => 'visitor_name', - 'age' => 25 - ]; + 'name' => 'visitor_name', + 'age' => 25, + ]; $trackerManager = $this->getMockForAbstractClass( TrackingManagerAbstract::class, @@ -194,8 +195,7 @@ public function testSetVisitorLog() false ); - $decisionManager = $this->getMockBuilder(ApiManager::class) - ->disableOriginalConstructor()->getMock(); + $decisionManager = $this->getMockBuilder(ApiManager::class)->disableOriginalConstructor()->getMock(); $configManager = new ConfigManager($config, $decisionManager, $trackerManager); @@ -209,11 +209,10 @@ public function testSetVisitorLog() ); $flagshipSdk = FlagshipConstant::FLAGSHIP_SDK; - $logManagerStub->expects($this->once()) - ->method('error')->with( - FlagshipConstant::VISITOR_ID_ERROR, - [FlagshipConstant::TAG => "setVisitorId"] - ); + $logManagerStub->expects($this->once())->method('error')->with( + FlagshipConstant::VISITOR_ID_ERROR, + [FlagshipConstant::TAG => "setVisitorId"] + ); $visitorDelegate->setVisitorId(''); } public function testMethods() @@ -227,14 +226,17 @@ public function testMethods() true, ['error'] ); - $configData = ['envId' => 'env_value', 'apiKey' => 'key_value']; + $configData = [ + 'envId' => 'env_value', + 'apiKey' => 'key_value', + ]; $config = new DecisionApiConfig($configData['envId'], $configData['apiKey']); $visitorId = "visitor_id"; $visitorContext = [ - 'name' => 'visitor_name', - 'age' => 25 - ]; + 'name' => 'visitor_name', + 'age' => 25, + ]; $trackerManager = $this->getMockForAbstractClass( TrackingManagerAbstract::class, @@ -243,35 +245,30 @@ public function testMethods() false ); - $decisionManager = $this->getMockBuilder(ApiManager::class) - ->disableOriginalConstructor()->getMock(); + $decisionManager = $this->getMockBuilder(ApiManager::class)->disableOriginalConstructor()->getMock(); $configManager = new ConfigManager($config, $decisionManager, $trackerManager); $containerMock = $this->getMockBuilder( 'Flagship\Utils\Container' - )->onlyMethods(['get']) - ->disableOriginalConstructor() - ->getMock(); - - $defaultStrategy = $this->getMockBuilder('Flagship\Visitor\DefaultStrategy') - ->onlyMethods([ - 'initialContext', - 'updateContext', - 'updateContextCollection', - "cacheVisitor", - 'clearContext', - 'authenticate', - 'unauthenticate', - 'setConsent', - 'sendHit', - 'fetchFlags', - 'visitorExposed', - 'getFlagValue', - 'getFlagMetadata', - 'lookupVisitor' - ])->disableOriginalConstructor() - ->getMock(); + )->onlyMethods(['get'])->disableOriginalConstructor()->getMock(); + + $defaultStrategy = $this->getMockBuilder('Flagship\Visitor\DefaultStrategy')->onlyMethods([ + 'initialContext', + 'updateContext', + 'updateContextCollection', + "cacheVisitor", + 'clearContext', + 'authenticate', + 'unauthenticate', + 'setConsent', + 'sendHit', + 'fetchFlags', + 'visitorExposed', + 'getFlagValue', + 'getFlagMetadata', + 'lookupVisitor', + ])->disableOriginalConstructor()->getMock(); $containerMock->method('get')->willReturn($defaultStrategy); @@ -279,28 +276,22 @@ public function testMethods() $visitor = new VisitorDelegate($containerMock, $configManager, $visitorId, false, $visitorContext, true); - $defaultContext = [ - FlagshipContext::OS_NAME => PHP_OS, - ]; + $defaultContext = [FlagshipContext::OS_NAME => PHP_OS]; //test SetContext - $defaultStrategy->expects($this->exactly(2)) - ->method('updateContextCollection') - ->with( - $this->logicalOr( - $visitorContext, - $defaultContext - ) - ); + $defaultStrategy->expects($this->exactly(2))->method('updateContextCollection')->with( + $this->logicalOr( + $visitorContext, + $defaultContext + ) + ); $visitor->setContext($visitorContext); //test updateContext $key = "age"; $value = 20; - $defaultStrategy->expects($this->once()) - ->method('updateContext') - ->with($key, $value); + $defaultStrategy->expects($this->once())->method('updateContext')->with($key, $value); $visitor->updateContext($key, $value); @@ -314,8 +305,7 @@ public function testMethods() //Test authenticate $newVisitorId = "newVisitorId"; - $defaultStrategy->expects($this->once())->method('authenticate') - ->with($newVisitorId); + $defaultStrategy->expects($this->once())->method('authenticate')->with($newVisitorId); $visitor->authenticate($newVisitorId); //Test unauthenticate @@ -325,8 +315,7 @@ public function testMethods() //Test sendHit $hit = new Page("http://localhost"); - $defaultStrategy->expects($this->once()) - ->method('sendHit')->with($hit); + $defaultStrategy->expects($this->once())->method('sendHit')->with($hit); $visitor->sendHit($hit); @@ -337,39 +326,27 @@ public function testMethods() //Test userExposed $key = 'key'; $flagDTO = new FlagDTO(); - $defaultStrategy->expects($this->once())->method('visitorExposed') - ->with($key, true, $flagDTO); + $defaultStrategy->expects($this->once())->method('visitorExposed')->with($key, true, $flagDTO); $visitor->visitorExposed($key, true, $flagDTO); //Test getFlagValue $flagDTO = new FlagDTO(); $defaultValue = "defaultValue"; - $defaultStrategy->expects($this->once()) - ->method('getFlagValue') - ->with($key, $defaultValue, $flagDTO, true); + $defaultStrategy->expects($this->once())->method('getFlagValue')->with($key, $defaultValue, $flagDTO, true); $visitor->getFlagValue($key, $defaultValue, $flagDTO); //Test getFlagMetadata $flagDTO = new FlagDTO(); - $defaultStrategy->expects($this->exactly(1)) - ->method('getFlagMetadata') - ->with($key, $flagDTO); + $defaultStrategy->expects($this->exactly(1))->method('getFlagMetadata')->with($key, $flagDTO); $visitor->getFlagMetadata($key, $flagDTO); //Test getFlag $flagDTO = new FlagDTO(); - $flagDTO->setKey("key1") - ->setCampaignId('campaignID') - ->setVariationGroupId("varGroupID") - ->setVariationId('varID') - ->setIsReference(true)->setValue("value") - ->setCampaignType("ab"); - - $flagsDTO = [ - $flagDTO - ]; + $flagDTO->setKey("key1")->setCampaignId('campaignID')->setVariationGroupId("varGroupID")->setVariationId('varID')->setIsReference(true)->setValue("value")->setCampaignType("ab"); + + $flagsDTO = [$flagDTO]; $visitor->setFlagsDTO($flagsDTO); $flag = $visitor->getFlag('key1'); @@ -405,13 +382,13 @@ public function testJson() $config = new DecisionApiConfig(); $visitorId = "visitor_id"; $context = [ - "age" => 20, - "sdk_osName" => PHP_OS, - "sdk_deviceType" => "server", - FlagshipConstant::FS_CLIENT => FlagshipConstant::SDK_LANGUAGE, - FlagshipConstant::FS_VERSION => FlagshipConstant::SDK_VERSION, - FlagshipConstant::FS_USERS => $visitorId, - ]; + "age" => 20, + "sdk_osName" => PHP_OS, + "sdk_deviceType" => "server", + FlagshipConstant::FS_CLIENT => FlagshipConstant::SDK_LANGUAGE, + FlagshipConstant::FS_VERSION => FlagshipConstant::SDK_VERSION, + FlagshipConstant::FS_USERS => $visitorId, + ]; $trackerManager = $this->getMockForAbstractClass( TrackingManagerAbstract::class, [], @@ -419,18 +396,17 @@ public function testJson() false ); - $decisionManager = $this->getMockBuilder(ApiManager::class) - ->disableOriginalConstructor()->getMock(); + $decisionManager = $this->getMockBuilder(ApiManager::class)->disableOriginalConstructor()->getMock(); $configManager = new ConfigManager($config, $decisionManager, $trackerManager); $visitorDelegate = new VisitorDelegate(new Container(), $configManager, $visitorId, false, $context, true); $this->assertJsonStringEqualsJsonString( json_encode([ - 'visitorId' => $visitorId, - 'context' => $context, - 'hasConsent' => true - ]), + 'visitorId' => $visitorId, + 'context' => $context, + 'hasConsent' => true, + ]), json_encode($visitorDelegate) ); } @@ -449,16 +425,13 @@ public function testGetStrategy() $setStatusMethod = Utils::getMethod($instance, 'setStatus'); $setStatusMethod->invoke($instance, FSSdkStatus::SDK_NOT_INITIALIZED); - $trackerManager = $this->getMockBuilder('Flagship\Api\TrackingManager') - ->onlyMethods(['addHit']) - ->disableOriginalConstructor()->getMock(); + $trackerManager = $this->getMockBuilder('Flagship\Api\TrackingManager')->onlyMethods(['addHit'])->disableOriginalConstructor()->getMock(); $config = new DecisionApiConfig(); $visitorId = "visitor_id"; $context = ["age" => 20]; - $decisionManager = $this->getMockBuilder(ApiManager::class) - ->disableOriginalConstructor()->getMock(); + $decisionManager = $this->getMockBuilder(ApiManager::class)->disableOriginalConstructor()->getMock(); $configManager = new ConfigManager($config, $decisionManager, $trackerManager); $visitorDelegate = new VisitorDelegate(new Container(), $configManager, $visitorId, false, $context); diff --git a/tests/Visitor/VisitorTest.php b/tests/Visitor/VisitorTest.php index e3b77033..c82f2d6d 100644 --- a/tests/Visitor/VisitorTest.php +++ b/tests/Visitor/VisitorTest.php @@ -26,13 +26,16 @@ class VisitorTest extends TestCase */ public function testConstruct() { - $configData = ['envId' => 'env_value', 'apiKey' => 'key_value']; + $configData = [ + 'envId' => 'env_value', + 'apiKey' => 'key_value', + ]; $config = new DecisionApiConfig($configData['envId'], $configData['apiKey']); $visitorId = "visitor_id"; $visitorContext = [ - 'name' => 'visitor_name', - 'age' => 25 - ]; + 'name' => 'visitor_name', + 'age' => 25, + ]; $trackerManager = new TrackingManager($config, new HttpClient()); @@ -64,43 +67,47 @@ public function testConstruct() public function testMethods() { - $configData = ['envId' => 'env_value', 'apiKey' => 'key_value']; + $configData = [ + 'envId' => 'env_value', + 'apiKey' => 'key_value', + ]; $config = new DecisionApiConfig($configData['envId'], $configData['apiKey']); $visitorId = "visitor_id"; $visitorContext = [ - 'name' => 'visitor_name', - 'age' => 25 - ]; + 'name' => 'visitor_name', + 'age' => 25, + ]; - $trackerManager = $this->getMockBuilder(TrackingManager::class) - ->onlyMethods(['addHit']) - ->disableOriginalConstructor()->getMock(); + $trackerManager = $this->getMockBuilder(TrackingManager::class)->onlyMethods(['addHit'])->disableOriginalConstructor()->getMock(); - $decisionManagerMock = $this->getMockBuilder(ApiManager::class) - ->disableOriginalConstructor()->getMock(); + $decisionManagerMock = $this->getMockBuilder(ApiManager::class)->disableOriginalConstructor()->getMock(); $configManager = new ConfigManager($config, $decisionManagerMock, $trackerManager); - $visitorDelegateMock = $this->getMockBuilder('Flagship\Visitor\VisitorDelegate') - ->onlyMethods([ - 'getContext', - 'setContext', - 'updateContext', - 'updateContextCollection', - 'clearContext', - 'authenticate', - 'unauthenticate', - 'getAnonymousId', - 'sendHit', - 'fetchFlags', - 'getFlag', - 'getFlags', - 'getFlagsDTO', - "getFetchStatus", - "setOnFetchFlagsStatusChanged" - ]) - ->setConstructorArgs([new Container(), $configManager, - $visitorId, false, $visitorContext, true])->getMock(); + $visitorDelegateMock = $this->getMockBuilder('Flagship\Visitor\VisitorDelegate')->onlyMethods([ + 'getContext', + 'setContext', + 'updateContext', + 'updateContextCollection', + 'clearContext', + 'authenticate', + 'unauthenticate', + 'getAnonymousId', + 'sendHit', + 'fetchFlags', + 'getFlag', + 'getFlags', + 'getFlagsDTO', + "getFetchStatus", + "setOnFetchFlagsStatusChanged", + ])->setConstructorArgs([ + new Container(), + $configManager, + $visitorId, + false, + $visitorContext, + true, + ])->getMock(); $visitor = new Visitor($visitorDelegateMock); @@ -109,25 +116,19 @@ public function testMethods() $visitor->getContext(); //test SetContext - $visitorDelegateMock->expects($this->once()) - ->method('setContext') - ->with($visitorContext); + $visitorDelegateMock->expects($this->once())->method('setContext')->with($visitorContext); $visitor->setContext($visitorContext); //test updateContext $key = "age"; $value = 20; - $visitorDelegateMock->expects($this->once()) - ->method('updateContext') - ->with($key, $value); + $visitorDelegateMock->expects($this->once())->method('updateContext')->with($key, $value); $visitor->updateContext($key, $value); //test updateContextCollection - $visitorDelegateMock->expects($this->once()) - ->method('updateContextCollection') - ->with($visitorContext); + $visitorDelegateMock->expects($this->once())->method('updateContextCollection')->with($visitorContext); $visitor->updateContextCollection($visitorContext); @@ -141,8 +142,7 @@ public function testMethods() //Test authenticate $newVisitorId = "newVisitorId"; - $visitorDelegateMock->expects($this->once())->method('authenticate') - ->with($newVisitorId); + $visitorDelegateMock->expects($this->once())->method('authenticate')->with($newVisitorId); $visitor->authenticate($newVisitorId); //Test unauthenticate @@ -151,36 +151,28 @@ public function testMethods() //Test sendHit $hit = new Page("http://localhost"); - $visitorDelegateMock->expects($this->once()) - ->method('sendHit')->with($hit); + $visitorDelegateMock->expects($this->once())->method('sendHit')->with($hit); $visitor->sendHit($hit); //Test fetchFlags - $visitorDelegateMock->expects($this->once()) - ->method('fetchFlags'); + $visitorDelegateMock->expects($this->once())->method('fetchFlags'); $visitor->fetchFlags(); //Test getFlag $key = 'key'; - $visitorDelegateMock->expects($this->once()) - ->method('getFlag') - ->with($key)->willReturn(new FSFlag($key, null)); + $visitorDelegateMock->expects($this->once())->method('getFlag')->with($key)->willReturn(new FSFlag($key, null)); $visitor->getFlag($key); //Test getFlags - $visitorDelegateMock->expects($this->once()) - ->method('getFlags') - ->willReturn(new FSFlagCollection(null)); + $visitorDelegateMock->expects($this->once())->method('getFlags')->willReturn(new FSFlagCollection(null)); $visitor->getFlags(); //Test getFetchStatus - $visitorDelegateMock->expects($this->once()) - ->method('getFetchStatus') - ->willReturn(new FetchFlagsStatus(FSFetchStatus::FETCHED, FSFetchReason::NONE)); + $visitorDelegateMock->expects($this->once())->method('getFetchStatus')->willReturn(new FetchFlagsStatus(FSFetchStatus::FETCHED, FSFetchReason::NONE)); $fetchStatus = $visitor->getFetchStatus(); $this->assertInstanceOf(FetchFlagsStatus::class, $fetchStatus); } @@ -190,19 +182,16 @@ public function testJson() $config = new DecisionApiConfig(); $visitorId = "visitor_id"; $context = [ - "age" => 20, - "sdk_osName" => PHP_OS, - "sdk_deviceType" => "server", - FlagshipConstant::FS_CLIENT => FlagshipConstant::SDK_LANGUAGE, - FlagshipConstant::FS_VERSION => FlagshipConstant::SDK_VERSION, - FlagshipConstant::FS_USERS => $visitorId, - ]; - $trackerManager = $this->getMockBuilder(TrackingManager::class) - ->onlyMethods(['addHit']) - ->disableOriginalConstructor()->getMock(); - - $decisionManagerMock = $this->getMockBuilder(ApiManager::class) - ->disableOriginalConstructor()->getMock(); + "age" => 20, + "sdk_osName" => PHP_OS, + "sdk_deviceType" => "server", + FlagshipConstant::FS_CLIENT => FlagshipConstant::SDK_LANGUAGE, + FlagshipConstant::FS_VERSION => FlagshipConstant::SDK_VERSION, + FlagshipConstant::FS_USERS => $visitorId, + ]; + $trackerManager = $this->getMockBuilder(TrackingManager::class)->onlyMethods(['addHit'])->disableOriginalConstructor()->getMock(); + + $decisionManagerMock = $this->getMockBuilder(ApiManager::class)->disableOriginalConstructor()->getMock(); $configManager = new ConfigManager($config, $decisionManagerMock, $trackerManager); $visitorDelegate = new VisitorDelegate(new Container(), $configManager, $visitorId, false, $context, true); @@ -211,10 +200,10 @@ public function testJson() $this->assertJsonStringEqualsJsonString( json_encode([ - 'visitorId' => $visitorId, - 'context' => $context, - 'hasConsent' => true - ]), + 'visitorId' => $visitorId, + 'context' => $context, + 'hasConsent' => true, + ]), json_encode($visitor) ); }