assertTrue( true ); } public function test_all_four_groups_are_registered(): void { WPDO_Member_Fields::register_entity_fields(); foreach ( array( 'membership', 'activity', 'profile', 'sso' ) as $group ) { $fields = WPDO_Entity_Registry::get_group_fields( 'user', $group ); $this->assertNotEmpty( $fields, "Group '{$group}' should have registered fields." ); } } // ── membership group ───────────────────────────────────────────────────── public function test_membership_group_has_six_fields(): void { WPDO_Member_Fields::register_entity_fields(); $fields = WPDO_Entity_Registry::get_group_fields( 'user', 'membership' ); $this->assertCount( 6, $fields ); } public function test_membership_level_is_enum_with_five_options(): void { WPDO_Member_Fields::register_entity_fields(); $fields = WPDO_Entity_Registry::get_group_fields( 'user', 'membership' ); $level = $this->find_field( $fields, 'membership_level' ); $this->assertNotNull( $level ); $this->assertSame( 'enum', $level['type'] ); $this->assertCount( 5, $level['options'] ); $this->assertContains( 'gold', $level['options'] ); $this->assertContains( 'platinum', $level['options'] ); } public function test_membership_level_is_searchable(): void { WPDO_Member_Fields::register_entity_fields(); $fields = WPDO_Entity_Registry::get_group_fields( 'user', 'membership' ); $level = $this->find_field( $fields, 'membership_level' ); $this->assertTrue( (bool) $level['searchable'] ); } public function test_points_balance_is_integer_searchable(): void { WPDO_Member_Fields::register_entity_fields(); $fields = WPDO_Entity_Registry::get_group_fields( 'user', 'membership' ); $field = $this->find_field( $fields, 'points_balance' ); $this->assertSame( 'integer', $field['type'] ); $this->assertTrue( (bool) $field['searchable'] ); $this->assertSame( 0, $field['default'] ); } public function test_membership_expires_at_is_datetime_searchable(): void { WPDO_Member_Fields::register_entity_fields(); $fields = WPDO_Entity_Registry::get_group_fields( 'user', 'membership' ); $field = $this->find_field( $fields, 'membership_expires_at' ); $this->assertSame( 'datetime', $field['type'] ); $this->assertTrue( (bool) $field['searchable'] ); } // ── activity group ─────────────────────────────────────────────────────── public function test_activity_group_has_six_fields(): void { WPDO_Member_Fields::register_entity_fields(); $fields = WPDO_Entity_Registry::get_group_fields( 'user', 'activity' ); $this->assertCount( 6, $fields ); } public function test_login_count_has_integer_type_and_zero_default(): void { WPDO_Member_Fields::register_entity_fields(); $fields = WPDO_Entity_Registry::get_group_fields( 'user', 'activity' ); $field = $this->find_field( $fields, 'login_count' ); $this->assertSame( 'integer', $field['type'] ); $this->assertSame( 0, $field['default'] ); } public function test_account_flags_is_integer(): void { WPDO_Member_Fields::register_entity_fields(); $fields = WPDO_Entity_Registry::get_group_fields( 'user', 'activity' ); $field = $this->find_field( $fields, 'account_flags' ); $this->assertSame( 'integer', $field['type'] ); } // ── profile group ──────────────────────────────────────────────────────── public function test_profile_group_has_five_fields(): void { WPDO_Member_Fields::register_entity_fields(); $fields = WPDO_Entity_Registry::get_group_fields( 'user', 'profile' ); $this->assertCount( 5, $fields ); } public function test_specialties_is_json_type(): void { WPDO_Member_Fields::register_entity_fields(); $fields = WPDO_Entity_Registry::get_group_fields( 'user', 'profile' ); $field = $this->find_field( $fields, 'specialties' ); $this->assertSame( 'json', $field['type'] ); } public function test_display_name_custom_is_fulltext_searchable(): void { WPDO_Member_Fields::register_entity_fields(); $fields = WPDO_Entity_Registry::get_group_fields( 'user', 'profile' ); $field = $this->find_field( $fields, 'display_name_custom' ); $this->assertTrue( (bool) $field['searchable'] ); $this->assertTrue( (bool) $field['fulltext'] ); } // ── sso group ──────────────────────────────────────────────────────────── public function test_sso_group_has_eight_fields(): void { WPDO_Member_Fields::register_entity_fields(); $fields = WPDO_Entity_Registry::get_group_fields( 'user', 'sso' ); // v3.4.4: known_login_ips registered (was leaking to wp_usermeta via set_entity). $this->assertCount( 8, $fields ); $this->assertNotNull( $this->find_field( $fields, 'known_login_ips' ) ); } public function test_hub_global_user_id_is_searchable(): void { WPDO_Member_Fields::register_entity_fields(); $fields = WPDO_Entity_Registry::get_group_fields( 'user', 'sso' ); $field = $this->find_field( $fields, 'hub_global_user_id' ); $this->assertTrue( (bool) $field['searchable'] ); } public function test_token_expires_at_is_datetime_searchable(): void { WPDO_Member_Fields::register_entity_fields(); $fields = WPDO_Entity_Registry::get_group_fields( 'user', 'sso' ); $field = $this->find_field( $fields, 'token_expires_at' ); $this->assertSame( 'datetime', $field['type'] ); $this->assertTrue( (bool) $field['searchable'] ); } public function test_refresh_token_enc_is_textarea(): void { WPDO_Member_Fields::register_entity_fields(); $fields = WPDO_Entity_Registry::get_group_fields( 'user', 'sso' ); $field = $this->find_field( $fields, 'refresh_token_enc' ); $this->assertSame( 'textarea', $field['type'] ); } // ── register() hooks add_action ────────────────────────────────────────── public function test_register_hooks_wpdo_register_entity_fields(): void { // add_action is a no-op stub in test bootstrap; just confirm no exception. $this->assertNull( WPDO_Member_Fields::register() ); } // ── helper ─────────────────────────────────────────────────────────────── /** * Find a field definition by key within a fields array. * * @param array $fields Array of field definitions. * @param string $key Meta key to find. * @return array|null */ private function find_field( array $fields, string $key ): ?array { foreach ( $fields as $field ) { if ( $field['key'] === $key ) { return $field; } } return null; } }