getComponents()) ->map(fn ($component) => method_exists($component, 'getHeading') ? $component->getHeading() : $component->getLabel()) ->all(); $this->assertContains('付费设置', $headings); // 找到付费设置 Section;无 Livewire 环境下用反射读取默认内容槽(childComponents 按 schema key 分组) $section = collect($schema->getComponents()) ->first(fn ($component) => $component->getHeading() === '付费设置'); $property = (new ReflectionClass($section))->getProperty('childComponents'); $fieldNames = collect($property->getValue($section)['default'] ?? []) ->map(fn ($field) => $field->getName()) ->all(); $this->assertContains('meta.price', $fieldNames); $this->assertContains('meta.members_only', $fieldNames); } public function test_post_table_includes_price_and_member_columns(): void { // Table 构造器要求 HasTable Livewire 组件,测试中绕过构造器 $table = (new ReflectionClass(Table::class))->newInstanceWithoutConstructor(); PostResource::table($table); $names = array_keys($table->getColumns()); $this->assertContains('meta.price', $names); $this->assertContains('meta.members_only', $names); $this->assertContains('title', $names); } public function test_meta_price_maps_to_post_meta_json(): void { $post = \App\Models\Post::create([ 'title' => '付费文章', 'content' => '内容', 'content_format' => 'markdown', 'status' => 'published', 'published_at' => now(), 'meta' => ['price' => 9900, 'members_only' => true], ]); $this->assertSame(9900, $post->meta['price']); $this->assertTrue($post->meta['members_only']); } }