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) ); }