time() + 3600, 'schedule' => 'weekly' ]; // Verify options are present before uninstall. prv_assert( false !== get_option( 'prv_models' ), 'pre-uninstall: prv_models option exists' ); prv_assert( false !== get_option( 'prv_monthly_budget_usd' ), 'pre-uninstall: prv_monthly_budget_usd exists' ); prv_assert( false !== get_option( 'prv_api_key_status' ), 'pre-uninstall: prv_api_key_status exists' ); prv_assert( false !== get_option( 'prv_active_config_version' ), 'pre-uninstall: prv_active_config_version exists' ); prv_assert( false !== get_transient( PRV_Run_Lock::LOCK_KEY ), 'pre-uninstall: run lock transient set' ); prv_assert( PRV_Cron::is_scheduled(), 'pre-uninstall: cron scheduled' ); // Simulate uninstall: delete all prv_ options. // In production, the SQL wildcard handles this; in test we iterate. $keys_to_purge = array_filter( array_keys( $GLOBALS['prv_test_state']['options'] ), static fn( $k ) => str_starts_with( $k, 'prv_' ) ); foreach ( $keys_to_purge as $k ) { unset( $GLOBALS['prv_test_state']['options'][ $k ] ); } // Also delete transients. delete_transient( PRV_Run_Lock::LOCK_KEY ); // Clear cron. wp_clear_scheduled_hook( PRV_CRON_HOOK ); // Verify all prv_ options gone. prv_assert( false === get_option( 'prv_models' ), 'post-uninstall: prv_models deleted' ); prv_assert( false === get_option( 'prv_monthly_budget_usd' ), 'post-uninstall: prv_monthly_budget_usd deleted' ); prv_assert( false === get_option( 'prv_api_key_status' ), 'post-uninstall: prv_api_key_status deleted' ); prv_assert( false === get_option( 'prv_active_config_version' ), 'post-uninstall: prv_active_config_version deleted' ); prv_assert( false === get_option( 'prv_config_versions' ), 'post-uninstall: prv_config_versions deleted' ); prv_assert( false === get_option( 'prv_models_schema_version' ), 'post-uninstall: prv_models_schema_version deleted' ); prv_assert( false === get_option( 'prv_schema_version' ), 'post-uninstall: prv_schema_version deleted' ); prv_assert( false === get_option( 'prv_provider_key_enc' ), 'post-uninstall: prv_provider_key_enc (v0.2.3 encrypted key) deleted' ); prv_assert( false === get_option( 'prv_last_run_truncated' ), 'post-uninstall: prv_last_run_truncated deleted' ); prv_assert( false === get_transient( PRV_Run_Lock::LOCK_KEY ), 'post-uninstall: run lock transient cleared' ); prv_assert( false === PRV_Cron::is_scheduled(), 'post-uninstall: cron cleared' ); exit( prv_test_summary() );