justReturn(true); Functions\when('wp_doing_ajax')->justReturn(false); $this->renderer = new WidgetRenderer(); } protected function tearDown(): void { Monkey\tearDown(); parent::tearDown(); } // ── wrapWidgetInCard ──────────────────────────────────────── public function testWrapWidgetInCardSetsCardStructure(): void { Functions\when('esc_attr')->returnArg(); $params = $this->makeParams('block-2', 'widget mb-4 widget_block'); $result = $this->renderer->wrapWidgetInCard($params); $this->assertStringContainsString('card', $result[0]['before_widget']); $this->assertStringContainsString('card-body', $result[0]['before_widget']); $this->assertSame('', $result[0]['after_widget']); } public function testWrapWidgetInCardSetsCardTitle(): void { Functions\when('esc_attr')->returnArg(); $params = $this->makeParams('block-3', 'widget mb-4 widget_block'); $result = $this->renderer->wrapWidgetInCard($params); $this->assertStringContainsString('assertStringContainsString('card-title', $result[0]['before_title']); $this->assertSame('', $result[0]['after_title']); } public function testWrapWidgetInCardPreservesWidgetId(): void { Functions\when('esc_attr')->returnArg(); $params = $this->makeParams('search-1', 'widget mb-4 widget_search'); $result = $this->renderer->wrapWidgetInCard($params); $this->assertStringContainsString('id="search-1"', $result[0]['before_widget']); } public function testWrapWidgetInCardPreservesWidgetTypeClasses(): void { Functions\when('esc_attr')->returnArg(); $params = $this->makeParams('block-5', 'widget mb-4 widget_block wp-block-heading'); $result = $this->renderer->wrapWidgetInCard($params); // widget_block and wp-block-heading are kept; widget and mb-4 are removed. $this->assertStringContainsString('widget_block', $result[0]['before_widget']); $this->assertStringContainsString('wp-block-heading', $result[0]['before_widget']); } public function testWrapWidgetInCardFiltersGenericClasses(): void { Functions\when('esc_attr')->returnArg(); $params = $this->makeParams('block-2', 'widget mb-4 widget_block'); $result = $this->renderer->wrapWidgetInCard($params); // The card wrapper adds its own "widget" class, but the extracted // classes should not include the generic "widget" or "mb-4". // Count occurrences: "card mb-3 widget " + "widget_block" should have exactly one "widget". preg_match_all('/\bwidget\b/', $result[0]['before_widget'], $matches); $this->assertCount(1, $matches[0], 'Generic "widget" class should appear once (from card wrapper), not duplicated'); } public function testWrapWidgetInCardWithNoExistingClasses(): void { Functions\when('esc_attr')->returnArg(); $params = [ [ 'widget_id' => 'text-1', 'before_widget' => '
', 'after_widget' => '
', 'before_title' => '

', 'after_title' => '

', ], ]; $result = $this->renderer->wrapWidgetInCard($params); $this->assertStringContainsString('card', $result[0]['before_widget']); $this->assertStringContainsString('id="text-1"', $result[0]['before_widget']); } // ── processBlockWidgetContent ─────────────────────────────── public function testProcessBlockWidgetContentReplacesH2WithH4(): void { $content = '

Categories

'; $widget = new \WP_Widget(); $result = $this->renderer->processBlockWidgetContent($content, [], $widget); $this->assertStringContainsString('

', $result); $this->assertStringContainsString('

', $result); $this->assertStringNotContainsString('assertStringNotContainsString('', $result); } public function testProcessBlockWidgetContentPreservesOtherH2(): void { $content = '

Keep me

'; $widget = new \WP_Widget(); $result = $this->renderer->processBlockWidgetContent($content, [], $widget); // h2 without wp-block-heading class should remain. $this->assertStringContainsString('

', $result); } public function testProcessBlockWidgetContentEmptyReturnsEmpty(): void { $widget = new \WP_Widget(); $this->assertSame('', $this->renderer->processBlockWidgetContent('', [], $widget)); } public function testProcessBlockWidgetContentMultipleH2(): void { $content = '

First

Text

Second

'; $widget = new \WP_Widget(); $result = $this->renderer->processBlockWidgetContent($content, [], $widget); $this->assertSame(0, substr_count($result, 'assertSame(2, substr_count($result, ' $widgetId, 'before_widget' => sprintf('
', $widgetId, $classes), 'after_widget' => '
', 'before_title' => '', ], ]; } }