'wp', 'client_secret' => 's3cret']; protected function setUp(): void { WpOidcState::reset(); } private function runPayload(?string $payload): void { putenv($payload === null ? 'WP_OIDC_SETTINGS' : 'WP_OIDC_SETTINGS=' . $payload); include dirname(__DIR__, 7) . self::SCRIPT; } private function encoded(): string { return base64_encode((string) json_encode(self::SETTINGS)); } public function testASingleSiteIsWrittenWithoutSwitchingBlogs(): void { $this->runPayload($this->encoded()); self::assertSame(self::SETTINGS, WpOidcState::$options[0][self::OPTION]); self::assertSame([], WpOidcState::$switches); } public function testEverySiteOfANetworkReceivesTheSettings(): void { WpOidcState::$multisite = true; WpOidcState::$sites = [1, 7, 9]; $this->runPayload($this->encoded()); self::assertSame([1, 7, 9], WpOidcState::$switches); self::assertSame([1, 7, 9], WpOidcState::$restores); foreach ([1, 7, 9] as $blog) { self::assertSame(self::SETTINGS, WpOidcState::$options[$blog][self::OPTION]); } } public function testASiteWhoseWriteDoesNotPersistIsNamed(): void { WpOidcState::$multisite = true; WpOidcState::$sites = [1, 7, 9]; WpOidcState::$blogsWhoseWriteNeverPersists = [7]; $this->expectException(WpCliHalt::class); $this->expectExceptionMessageMatches('/\b7\b/'); $this->runPayload($this->encoded()); } public function testEverySiteIsVisitedBeforeTheFailureIsReported(): void { WpOidcState::$multisite = true; WpOidcState::$sites = [1, 7, 9]; WpOidcState::$blogsWhoseWriteNeverPersists = [1]; try { $this->runPayload($this->encoded()); self::fail('a blocked write must halt the run'); } catch (WpCliHalt $halt) { self::assertSame([1, 7, 9], WpOidcState::$switches); } } public function testAPayloadThatIsNotAMapHalts(): void { $this->expectException(WpCliHalt::class); $this->runPayload(base64_encode('"a string"')); } public function testAnAbsentPayloadHalts(): void { $this->expectException(WpCliHalt::class); $this->runPayload(null); } }