warning( 'Connection failed.', array( 'url' => 'https://example.test' ) ); $entries = get_option( OptionLogger::OPTION_NAME, array() ); self::assertCount( 1, $entries ); self::assertSame( 'warning', $entries[0]['level'] ); self::assertSame( 'Connection failed.', $entries[0]['message'] ); self::assertSame( 'https://example.test', $entries[0]['context']['url'] ); self::assertArrayHasKey( 'timestamp', $entries[0] ); } public function test_it_redacts_sensitive_context_values(): void { $logger = new OptionLogger( 10 ); $logger->error( 'Authentication failed.', array( 'application_password' => 'secret-value', 'client_secret' => 'client-secret-value', 'headers' => array( 'Authorization' => 'Bearer nested-token', ), 'token' => 'token-value', 'username' => 'admin', ) ); $entries = get_option( OptionLogger::OPTION_NAME, array() ); self::assertSame( '[redacted]', $entries[0]['context']['application_password'] ); self::assertSame( '[redacted]', $entries[0]['context']['client_secret'] ); self::assertSame( '[redacted]', $entries[0]['context']['headers']['Authorization'] ); self::assertSame( '[redacted]', $entries[0]['context']['token'] ); self::assertSame( 'admin', $entries[0]['context']['username'] ); } public function test_it_limits_retained_entries(): void { $logger = new OptionLogger( 2 ); $logger->info( 'First' ); $logger->info( 'Second' ); $logger->info( 'Third' ); $entries = get_option( OptionLogger::OPTION_NAME, array() ); self::assertCount( 2, $entries ); self::assertSame( 'Second', $entries[0]['message'] ); self::assertSame( 'Third', $entries[1]['message'] ); } }