Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
SuggestTest.php
Go to the documentation of this file.
1 <?php
8 
11 
12 class SuggestTest extends \PHPUnit\Framework\TestCase
13 {
15  private $controller;
16 
18  private $objectManagerHelper;
19 
21  private $request;
22 
24  private $url;
25 
27  private $context;
28 
30  private $autocomplete;
31 
35  protected $resultFactoryMock;
36 
41 
45  protected $resultJsonMock;
46 
47  protected function setUp()
48  {
49  $this->autocomplete = $this->getMockBuilder(\Magento\Search\Model\AutocompleteInterface::class)
50  ->disableOriginalConstructor()
51  ->setMethods(['getItems'])
52  ->getMockForAbstractClass();
53  $this->request = $this->getMockBuilder(\Magento\Framework\App\RequestInterface::class)
54  ->disableOriginalConstructor()
55  ->setMethods([])
56  ->getMockForAbstractClass();
57  $this->url = $this->getMockBuilder(\Magento\Framework\UrlInterface::class)
58  ->disableOriginalConstructor()
59  ->setMethods(['getBaseUrl'])
60  ->getMockForAbstractClass();
61  $this->resultFactoryMock = $this->getMockBuilder(\Magento\Framework\Controller\ResultFactory::class)
62  ->disableOriginalConstructor()
63  ->getMock();
64  $this->resultRedirectMock = $this->getMockBuilder(\Magento\Backend\Model\View\Result\Redirect::class)
65  ->disableOriginalConstructor()
66  ->getMock();
67  $this->resultJsonMock = $this->getMockBuilder(\Magento\Framework\Controller\Result\Json::class)
68  ->disableOriginalConstructor()
69  ->getMock();
70 
71  $this->context = $this->getMockBuilder(\Magento\Framework\App\Action\Context::class)
72  ->disableOriginalConstructor()
73  ->getMock();
74  $this->context->expects($this->atLeastOnce())
75  ->method('getRequest')
76  ->will($this->returnValue($this->request));
77  $this->context->expects($this->any())
78  ->method('getUrl')
79  ->will($this->returnValue($this->url));
80  $this->context->expects($this->any())
81  ->method('getResultFactory')
82  ->willReturn($this->resultFactoryMock);
83  $this->resultFactoryMock->expects($this->any())
84  ->method('create')
85  ->willReturnMap(
86  [
87  [ResultFactory::TYPE_REDIRECT, [], $this->resultRedirectMock],
88  [ResultFactory::TYPE_JSON, [], $this->resultJsonMock]
89  ]
90  );
91 
92  $this->objectManagerHelper = new ObjectManagerHelper($this);
93  $this->controller = $this->objectManagerHelper->getObject(
94  \Magento\Search\Controller\Ajax\Suggest::class,
95  [
96  'context' => $this->context,
97  'autocomplete' => $this->autocomplete
98  ]
99  );
100  }
101 
102  public function testExecute()
103  {
104  $searchString = "simple";
105  $firstItemMock = $this->getMockBuilder(\Magento\Search\Model\Autocomplete\Item::class)
106  ->disableOriginalConstructor()
107  ->setMockClassName('FirstItem')
108  ->setMethods(['toArray'])
109  ->getMock();
110  $secondItemMock = $this->getMockBuilder(\Magento\Search\Model\Autocomplete\Item::class)
111  ->disableOriginalConstructor()
112  ->setMockClassName('SecondItem')
113  ->setMethods(['toArray'])
114  ->getMock();
115 
116  $this->request->expects($this->once())
117  ->method('getParam')
118  ->with('q')
119  ->will($this->returnValue($searchString));
120 
121  $this->autocomplete->expects($this->once())
122  ->method('getItems')
123  ->will($this->returnValue([$firstItemMock, $secondItemMock]));
124 
125  $this->resultJsonMock->expects($this->once())
126  ->method('setData')
127  ->willReturnSelf();
128 
129  $this->assertSame($this->resultJsonMock, $this->controller->execute());
130  }
131 
132  public function testExecuteEmptyQuery()
133  {
134  $url = 'some url';
135  $searchString = '';
136 
137  $this->request->expects($this->once())
138  ->method('getParam')
139  ->with('q')
140  ->will($this->returnValue($searchString));
141  $this->url->expects($this->once())
142  ->method('getBaseUrl')
143  ->willReturn($url);
144  $this->resultRedirectMock->expects($this->once())
145  ->method('setUrl')
146  ->with($url)
147  ->willReturnSelf();
148 
149  $this->assertSame($this->resultRedirectMock, $this->controller->execute());
150  }
151 }