url = $this->createMock(UrlInterface::class); $this->plugin = new OrderViewMessagesButton($this->url); } public function testAddsMessagesButtonAndPreservesLayoutArgument(): void { $layout = $this->createMock(LayoutInterface::class); $order = $this->createMock(Order::class); $order->method('getCustomerId')->willReturn(3); $order->method('getId')->willReturn(16); $view = $this->getMockBuilder(View::class) ->disableOriginalConstructor() ->onlyMethods(['getOrder', 'addButton']) ->getMock(); $view->method('getOrder')->willReturn($order); $this->url->expects(self::once()) ->method('getUrl') ->with('esun_customer_message/message/index', ['order_id' => 16]) ->willReturn('https://esun3d.test/admin/messages/order/16'); $view->expects(self::once()) ->method('addButton') ->with( 'esun_order_messages', self::callback(static fn(array $button): bool => (string)$button['label'] === 'Messages' && str_contains($button['onclick'], '/messages/order/16') ) ); self::assertSame([$layout], $this->plugin->beforeSetLayout($view, $layout)); } public function testPreservesLayoutWithoutAddingButtonForGuestOrder(): void { $layout = $this->createMock(LayoutInterface::class); $order = $this->createMock(Order::class); $order->method('getCustomerId')->willReturn(null); $view = $this->getMockBuilder(View::class) ->disableOriginalConstructor() ->onlyMethods(['getOrder', 'addButton']) ->getMock(); $view->method('getOrder')->willReturn($order); $view->expects(self::never())->method('addButton'); self::assertSame([$layout], $this->plugin->beforeSetLayout($view, $layout)); } }