getProperty( 'instance' ); $instance->setAccessible( true ); $instance->setValue( null, null ); // Reset Feature_Flags caches (state pollution between tests). $ref = new ReflectionClass( WPDO_Feature_Flags::class ); foreach ( array( 'cache', 'shadow_cache' ) as $prop ) { $p = $ref->getProperty( $prop ); $p->setAccessible( true ); $p->setValue( null, null ); } // Reset Entity_Registry static state. WPDO_Entity_Registry::init(); } // ── get_field / set_field (post entity) ───────────────────────────────── public function test_get_field_returns_postmeta_value(): void { update_post_meta( 100, 'hp_price', '199.99' ); $this->assertSame( '199.99', WPDO_API::get_field( 100, 'hp_price' ) ); } public function test_set_field_writes_postmeta(): void { WPDO_API::set_field( 200, 'hp_price', '299.99' ); $this->assertSame( '299.99', get_post_meta( 200, 'hp_price', true ) ); } public function test_get_field_missing_returns_empty_string_when_single(): void { $this->assertSame( '', WPDO_API::get_field( 9999, 'nonexistent' ) ); } // ── get_entity / set_entity (multi-entity) ────────────────────────────── public function test_get_entity_post_dispatches_correctly(): void { update_post_meta( 1, 'k', 'pv' ); $this->assertSame( 'pv', WPDO_API::get_entity( 'post', 1, 'k' ) ); } public function test_get_entity_unknown_type_returns_null(): void { $this->assertNull( WPDO_API::get_entity( 'invalid', 1, 'k' ) ); } public function test_set_entity_unknown_type_returns_false(): void { $this->assertFalse( WPDO_API::set_entity( 'invalid', 1, 'k', 'v' ) ); } // ── is_field_registered ───────────────────────────────────────────────── public function test_is_field_registered_returns_false_for_unknown(): void { $this->assertFalse( WPDO_API::is_field_registered( 'post', 'unregistered_key' ) ); } public function test_is_field_registered_true_after_schema_register(): void { WPDO_Schema_Registry::instance()->register( 'test', array( 'post_type' => 'hp_listing', 'meta_key' => 'hp_price', 'zone' => 'hot', 'data_type' => 'decimal(10,2)', 'column' => 'hp_price', ) ); $this->assertTrue( WPDO_API::is_field_registered( 'post', 'hp_price' ) ); } // ── trace_storage ────────────────────────────────────────────────────── public function test_trace_storage_unregistered_when_no_field(): void { $this->assertSame( 'unregistered', WPDO_API::trace_storage( 'post', 'unknown', 'hp_listing' ) ); } public function test_trace_storage_postmeta_when_registered_but_not_cutover(): void { WPDO_Schema_Registry::instance()->register( 'test', array( 'post_type' => 'hp_listing', 'meta_key' => 'hp_price', 'zone' => 'hot', 'data_type' => 'decimal(10,2)', 'column' => 'hp_price', ) ); // Module starts in 'idle' → not read-custom → returns 'postmeta'. $this->assertSame( 'postmeta', WPDO_API::trace_storage( 'post', 'hp_price', 'hp_listing' ) ); } public function test_trace_storage_zone_after_cutover(): void { $GLOBALS['_wp_options'] = array(); $ref = new ReflectionClass( WPDO_Feature_Flags::class ); $cache = $ref->getProperty( 'cache' ); $cache->setAccessible( true ); $cache->setValue( null, null ); WPDO_Schema_Registry::instance()->register( 'test', array( 'post_type' => 'hp_listing', 'meta_key' => 'hp_price', 'zone' => 'hot', 'data_type' => 'decimal(10,2)', 'column' => 'hp_price', ) ); WPDO_Feature_Flags::set( 'hot_hp_listing', 'cutover' ); $this->assertSame( 'zone_hot', WPDO_API::trace_storage( 'post', 'hp_price', 'hp_listing' ) ); } }