From 9a8c0401f1eac5bf010773adf45d857af8790abd Mon Sep 17 00:00:00 2001 From: Nick Nisi Date: Mon, 7 Jul 2025 10:00:06 -0500 Subject: [PATCH 1/5] create a `getEnvVariable` utility and use it --- lib/WorkOS.php | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/lib/WorkOS.php b/lib/WorkOS.php index fbc9536e..5e93e71b 100644 --- a/lib/WorkOS.php +++ b/lib/WorkOS.php @@ -43,8 +43,9 @@ public static function getApiKey() return self::$apiKey; } - if (getenv("WORKOS_API_KEY")) { - self::$apiKey = getenv("WORKOS_API_KEY"); + $envValue = self::getEnvVariable("WORKOS_API_KEY"); + if ($envValue) { + self::$apiKey = $envValue; return self::$apiKey; } @@ -71,8 +72,9 @@ public static function getClientId() return self::$clientId; } - if (getenv("WORKOS_CLIENT_ID")) { - self::$clientId = getenv("WORKOS_CLIENT_ID"); + $envValue = self::getEnvVariable("WORKOS_CLIENT_ID"); + if ($envValue) { + self::$clientId = $envValue; return self::$clientId; } @@ -135,4 +137,28 @@ public static function getVersion() { return self::$version; } + + /** + * Get environment variable with fallback to cached config sources + * + * @param string $key Environment variable name + * @return string|false The environment variable value or false if not found + */ + private static function getEnvVariable($key) + { + $value = getenv($key); + if ($value !== false && $value !== '') { + return $value; + } + + if (isset($_ENV[$key]) && $_ENV[$key] !== '') { + return $_ENV[$key]; + } + + if (isset($_SERVER[$key]) && $_SERVER[$key] !== '') { + return $_SERVER[$key]; + } + + return false; + } } From 56a16d78ebb18e79bd1b0be07d0cb6abfada8865 Mon Sep 17 00:00:00 2001 From: Nick Nisi Date: Mon, 7 Jul 2025 10:00:35 -0500 Subject: [PATCH 2/5] add/update tests --- tests/WorkOS/WorkOSTest.php | 203 ++++++++++++++++++++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 tests/WorkOS/WorkOSTest.php diff --git a/tests/WorkOS/WorkOSTest.php b/tests/WorkOS/WorkOSTest.php new file mode 100644 index 00000000..ff72b014 --- /dev/null +++ b/tests/WorkOS/WorkOSTest.php @@ -0,0 +1,203 @@ +assertEquals($expectedApiKey, WorkOS::getApiKey()); + } + + public function testGetApiKeyFromSystemEnvironment() + { + putenv("WORKOS_API_KEY=pk_test_system_env"); + + $this->assertEquals("pk_test_system_env", WorkOS::getApiKey()); + + putenv("WORKOS_API_KEY="); + } + + public function testGetApiKeyFromEnvSuperglobal() + { + $_ENV['WORKOS_API_KEY'] = "pk_test_env_superglobal"; + + $this->assertEquals("pk_test_env_superglobal", WorkOS::getApiKey()); + + unset($_ENV['WORKOS_API_KEY']); + } + + public function testGetApiKeyFromServerSuperglobal() + { + $_SERVER['WORKOS_API_KEY'] = "pk_test_server_superglobal"; + + $this->assertEquals("pk_test_server_superglobal", WorkOS::getApiKey()); + + unset($_SERVER['WORKOS_API_KEY']); + } + + public function testGetApiKeyPrecedenceOrder() + { + putenv("WORKOS_API_KEY=pk_test_system_env"); + $_ENV['WORKOS_API_KEY'] = "pk_test_env_superglobal"; + $_SERVER['WORKOS_API_KEY'] = "pk_test_server_superglobal"; + + $this->assertEquals("pk_test_system_env", WorkOS::getApiKey()); + + // Clear cached value and system env to test $_ENV precedence + WorkOS::setApiKey(null); + putenv("WORKOS_API_KEY="); + $this->assertEquals("pk_test_env_superglobal", WorkOS::getApiKey()); + + // Clear cached value and $_ENV to test $_SERVER precedence + WorkOS::setApiKey(null); + unset($_ENV['WORKOS_API_KEY']); + $this->assertEquals("pk_test_server_superglobal", WorkOS::getApiKey()); + + unset($_SERVER['WORKOS_API_KEY']); + } + + public function testGetApiKeyProgrammaticTakesPrecedence() + { + putenv("WORKOS_API_KEY=pk_test_system_env"); + $_ENV['WORKOS_API_KEY'] = "pk_test_env_superglobal"; + WorkOS::setApiKey("pk_test_programmatic"); + + $this->assertEquals("pk_test_programmatic", WorkOS::getApiKey()); + + putenv("WORKOS_API_KEY="); + unset($_ENV['WORKOS_API_KEY']); + } + + public function testGetApiKeyThrowsExceptionWhenNotFound() + { + $this->expectException(\WorkOS\Exception\ConfigurationException::class); + $this->expectExceptionMessage('$apiKey is required'); + + WorkOS::getApiKey(); + } + + public function testGetClientIdFromProgrammaticSetting() + { + $expectedClientId = "client_test_programmatic"; + WorkOS::setClientId($expectedClientId); + + $this->assertEquals($expectedClientId, WorkOS::getClientId()); + } + + public function testGetClientIdFromSystemEnvironment() + { + putenv("WORKOS_CLIENT_ID=client_test_system_env"); + + $this->assertEquals("client_test_system_env", WorkOS::getClientId()); + + putenv("WORKOS_CLIENT_ID="); + } + + public function testGetClientIdFromEnvSuperglobal() + { + $_ENV['WORKOS_CLIENT_ID'] = "client_test_env_superglobal"; + + $this->assertEquals("client_test_env_superglobal", WorkOS::getClientId()); + + unset($_ENV['WORKOS_CLIENT_ID']); + } + + public function testGetClientIdFromServerSuperglobal() + { + $_SERVER['WORKOS_CLIENT_ID'] = "client_test_server_superglobal"; + + $this->assertEquals("client_test_server_superglobal", WorkOS::getClientId()); + + unset($_SERVER['WORKOS_CLIENT_ID']); + } + + public function testGetClientIdPrecedenceOrder() + { + putenv("WORKOS_CLIENT_ID=client_test_system_env"); + $_ENV['WORKOS_CLIENT_ID'] = "client_test_env_superglobal"; + $_SERVER['WORKOS_CLIENT_ID'] = "client_test_server_superglobal"; + + $this->assertEquals("client_test_system_env", WorkOS::getClientId()); + + // Clear cached value and system env to test $_ENV precedence + WorkOS::setClientId(null); + putenv("WORKOS_CLIENT_ID="); + $this->assertEquals("client_test_env_superglobal", WorkOS::getClientId()); + + // Clear cached value and $_ENV to test $_SERVER precedence + WorkOS::setClientId(null); + unset($_ENV['WORKOS_CLIENT_ID']); + $this->assertEquals("client_test_server_superglobal", WorkOS::getClientId()); + + unset($_SERVER['WORKOS_CLIENT_ID']); + } + + public function testGetClientIdProgrammaticTakesPrecedence() + { + putenv("WORKOS_CLIENT_ID=client_test_system_env"); + $_ENV['WORKOS_CLIENT_ID'] = "client_test_env_superglobal"; + WorkOS::setClientId("client_test_programmatic"); + + $this->assertEquals("client_test_programmatic", WorkOS::getClientId()); + + putenv("WORKOS_CLIENT_ID="); + unset($_ENV['WORKOS_CLIENT_ID']); + } + + public function testGetClientIdThrowsExceptionWhenNotFound() + { + $this->expectException(\WorkOS\Exception\ConfigurationException::class); + $this->expectExceptionMessage('$clientId is required'); + + WorkOS::getClientId(); + } + + public function testSimulateLaravelCachedConfigScenario() + { + $_ENV['WORKOS_API_KEY'] = "pk_test_laravel_cached"; + $_ENV['WORKOS_CLIENT_ID'] = "client_test_laravel_cached"; + + $this->assertEquals("pk_test_laravel_cached", WorkOS::getApiKey()); + $this->assertEquals("client_test_laravel_cached", WorkOS::getClientId()); + + unset($_ENV['WORKOS_API_KEY']); + unset($_ENV['WORKOS_CLIENT_ID']); + } +} \ No newline at end of file From efb2ec45981216cfe1090f0b7c9fd5afccd5dde9 Mon Sep 17 00:00:00 2001 From: Nick Nisi Date: Mon, 7 Jul 2025 10:14:17 -0500 Subject: [PATCH 3/5] clean up tests --- tests/WorkOS/WorkOSTest.php | 146 +----------------------------------- 1 file changed, 1 insertion(+), 145 deletions(-) diff --git a/tests/WorkOS/WorkOSTest.php b/tests/WorkOS/WorkOSTest.php index ff72b014..c2ce7734 100644 --- a/tests/WorkOS/WorkOSTest.php +++ b/tests/WorkOS/WorkOSTest.php @@ -8,15 +8,12 @@ class WorkOSTest extends TestCase { protected function setUp(): void { - // Clear any previously set programmatic values and environment variables WorkOS::setApiKey(null); WorkOS::setClientId(null); - // Clear environment variables from previous tests putenv("WORKOS_API_KEY="); putenv("WORKOS_CLIENT_ID="); - // Clear superglobals unset($_ENV['WORKOS_API_KEY']); unset($_ENV['WORKOS_CLIENT_ID']); unset($_SERVER['WORKOS_API_KEY']); @@ -37,97 +34,11 @@ protected function tearDown(): void unset($_SERVER['WORKOS_CLIENT_ID']); } - public function testGetApiKeyFromProgrammaticSetting() - { - $expectedApiKey = "pk_test_programmatic"; - WorkOS::setApiKey($expectedApiKey); - - $this->assertEquals($expectedApiKey, WorkOS::getApiKey()); - } - - public function testGetApiKeyFromSystemEnvironment() - { - putenv("WORKOS_API_KEY=pk_test_system_env"); - - $this->assertEquals("pk_test_system_env", WorkOS::getApiKey()); - - putenv("WORKOS_API_KEY="); - } - public function testGetApiKeyFromEnvSuperglobal() { $_ENV['WORKOS_API_KEY'] = "pk_test_env_superglobal"; $this->assertEquals("pk_test_env_superglobal", WorkOS::getApiKey()); - - unset($_ENV['WORKOS_API_KEY']); - } - - public function testGetApiKeyFromServerSuperglobal() - { - $_SERVER['WORKOS_API_KEY'] = "pk_test_server_superglobal"; - - $this->assertEquals("pk_test_server_superglobal", WorkOS::getApiKey()); - - unset($_SERVER['WORKOS_API_KEY']); - } - - public function testGetApiKeyPrecedenceOrder() - { - putenv("WORKOS_API_KEY=pk_test_system_env"); - $_ENV['WORKOS_API_KEY'] = "pk_test_env_superglobal"; - $_SERVER['WORKOS_API_KEY'] = "pk_test_server_superglobal"; - - $this->assertEquals("pk_test_system_env", WorkOS::getApiKey()); - - // Clear cached value and system env to test $_ENV precedence - WorkOS::setApiKey(null); - putenv("WORKOS_API_KEY="); - $this->assertEquals("pk_test_env_superglobal", WorkOS::getApiKey()); - - // Clear cached value and $_ENV to test $_SERVER precedence - WorkOS::setApiKey(null); - unset($_ENV['WORKOS_API_KEY']); - $this->assertEquals("pk_test_server_superglobal", WorkOS::getApiKey()); - - unset($_SERVER['WORKOS_API_KEY']); - } - - public function testGetApiKeyProgrammaticTakesPrecedence() - { - putenv("WORKOS_API_KEY=pk_test_system_env"); - $_ENV['WORKOS_API_KEY'] = "pk_test_env_superglobal"; - WorkOS::setApiKey("pk_test_programmatic"); - - $this->assertEquals("pk_test_programmatic", WorkOS::getApiKey()); - - putenv("WORKOS_API_KEY="); - unset($_ENV['WORKOS_API_KEY']); - } - - public function testGetApiKeyThrowsExceptionWhenNotFound() - { - $this->expectException(\WorkOS\Exception\ConfigurationException::class); - $this->expectExceptionMessage('$apiKey is required'); - - WorkOS::getApiKey(); - } - - public function testGetClientIdFromProgrammaticSetting() - { - $expectedClientId = "client_test_programmatic"; - WorkOS::setClientId($expectedClientId); - - $this->assertEquals($expectedClientId, WorkOS::getClientId()); - } - - public function testGetClientIdFromSystemEnvironment() - { - putenv("WORKOS_CLIENT_ID=client_test_system_env"); - - $this->assertEquals("client_test_system_env", WorkOS::getClientId()); - - putenv("WORKOS_CLIENT_ID="); } public function testGetClientIdFromEnvSuperglobal() @@ -135,69 +46,14 @@ public function testGetClientIdFromEnvSuperglobal() $_ENV['WORKOS_CLIENT_ID'] = "client_test_env_superglobal"; $this->assertEquals("client_test_env_superglobal", WorkOS::getClientId()); - - unset($_ENV['WORKOS_CLIENT_ID']); } - public function testGetClientIdFromServerSuperglobal() - { - $_SERVER['WORKOS_CLIENT_ID'] = "client_test_server_superglobal"; - - $this->assertEquals("client_test_server_superglobal", WorkOS::getClientId()); - - unset($_SERVER['WORKOS_CLIENT_ID']); - } - - public function testGetClientIdPrecedenceOrder() - { - putenv("WORKOS_CLIENT_ID=client_test_system_env"); - $_ENV['WORKOS_CLIENT_ID'] = "client_test_env_superglobal"; - $_SERVER['WORKOS_CLIENT_ID'] = "client_test_server_superglobal"; - - $this->assertEquals("client_test_system_env", WorkOS::getClientId()); - - // Clear cached value and system env to test $_ENV precedence - WorkOS::setClientId(null); - putenv("WORKOS_CLIENT_ID="); - $this->assertEquals("client_test_env_superglobal", WorkOS::getClientId()); - - // Clear cached value and $_ENV to test $_SERVER precedence - WorkOS::setClientId(null); - unset($_ENV['WORKOS_CLIENT_ID']); - $this->assertEquals("client_test_server_superglobal", WorkOS::getClientId()); - - unset($_SERVER['WORKOS_CLIENT_ID']); - } - - public function testGetClientIdProgrammaticTakesPrecedence() - { - putenv("WORKOS_CLIENT_ID=client_test_system_env"); - $_ENV['WORKOS_CLIENT_ID'] = "client_test_env_superglobal"; - WorkOS::setClientId("client_test_programmatic"); - - $this->assertEquals("client_test_programmatic", WorkOS::getClientId()); - - putenv("WORKOS_CLIENT_ID="); - unset($_ENV['WORKOS_CLIENT_ID']); - } - - public function testGetClientIdThrowsExceptionWhenNotFound() - { - $this->expectException(\WorkOS\Exception\ConfigurationException::class); - $this->expectExceptionMessage('$clientId is required'); - - WorkOS::getClientId(); - } - - public function testSimulateLaravelCachedConfigScenario() + public function testLaravelConfigCachingScenario() { $_ENV['WORKOS_API_KEY'] = "pk_test_laravel_cached"; $_ENV['WORKOS_CLIENT_ID'] = "client_test_laravel_cached"; $this->assertEquals("pk_test_laravel_cached", WorkOS::getApiKey()); $this->assertEquals("client_test_laravel_cached", WorkOS::getClientId()); - - unset($_ENV['WORKOS_API_KEY']); - unset($_ENV['WORKOS_CLIENT_ID']); } } \ No newline at end of file From a89434e372cedce8bd36a494fd25f4f77a14c137 Mon Sep 17 00:00:00 2001 From: Nick Nisi Date: Mon, 7 Jul 2025 10:29:14 -0500 Subject: [PATCH 4/5] formatting --- tests/WorkOS/WorkOSTest.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/WorkOS/WorkOSTest.php b/tests/WorkOS/WorkOSTest.php index c2ce7734..2385aee0 100644 --- a/tests/WorkOS/WorkOSTest.php +++ b/tests/WorkOS/WorkOSTest.php @@ -10,24 +10,24 @@ protected function setUp(): void { WorkOS::setApiKey(null); WorkOS::setClientId(null); - + putenv("WORKOS_API_KEY="); putenv("WORKOS_CLIENT_ID="); - + unset($_ENV['WORKOS_API_KEY']); unset($_ENV['WORKOS_CLIENT_ID']); unset($_SERVER['WORKOS_API_KEY']); unset($_SERVER['WORKOS_CLIENT_ID']); } - + protected function tearDown(): void { WorkOS::setApiKey(null); WorkOS::setClientId(null); - + putenv("WORKOS_API_KEY="); putenv("WORKOS_CLIENT_ID="); - + unset($_ENV['WORKOS_API_KEY']); unset($_ENV['WORKOS_CLIENT_ID']); unset($_SERVER['WORKOS_API_KEY']); @@ -37,14 +37,14 @@ protected function tearDown(): void public function testGetApiKeyFromEnvSuperglobal() { $_ENV['WORKOS_API_KEY'] = "pk_test_env_superglobal"; - + $this->assertEquals("pk_test_env_superglobal", WorkOS::getApiKey()); } public function testGetClientIdFromEnvSuperglobal() { $_ENV['WORKOS_CLIENT_ID'] = "client_test_env_superglobal"; - + $this->assertEquals("client_test_env_superglobal", WorkOS::getClientId()); } @@ -52,8 +52,8 @@ public function testLaravelConfigCachingScenario() { $_ENV['WORKOS_API_KEY'] = "pk_test_laravel_cached"; $_ENV['WORKOS_CLIENT_ID'] = "client_test_laravel_cached"; - + $this->assertEquals("pk_test_laravel_cached", WorkOS::getApiKey()); $this->assertEquals("client_test_laravel_cached", WorkOS::getClientId()); } -} \ No newline at end of file +} From e86c5b2f34582be7b9a0cb4e5f754159a09c021b Mon Sep 17 00:00:00 2001 From: Nick Nisi Date: Mon, 7 Jul 2025 10:35:25 -0500 Subject: [PATCH 5/5] Update lib/WorkOS.php Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- lib/WorkOS.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/WorkOS.php b/lib/WorkOS.php index 5e93e71b..935e32e3 100644 --- a/lib/WorkOS.php +++ b/lib/WorkOS.php @@ -139,7 +139,8 @@ public static function getVersion() } /** - * Get environment variable with fallback to cached config sources + * Get environment variable with fallback to cached config sources. + * Checks in order: getenv(), $_ENV, $_SERVER * * @param string $key Environment variable name * @return string|false The environment variable value or false if not found