Open Journal Systems  3.3.0
ArticleSearchTest.php
1 <?php
2 
17 require_mock_env('env1');
18 
19 import('lib.pkp.tests.PKPTestCase');
20 import('lib.pkp.classes.core.ArrayItemIterator');
21 import('classes.search.ArticleSearch');
22 import('lib.pkp.classes.core.PKPRouter');
23 
24 define('SUBMISSION_SEARCH_TEST_DEFAULT_ARTICLE', 1);
25 define('SUBMISSION_SEARCH_TEST_ARTICLE_FROM_PLUGIN', 2);
26 
29  private $_retrieveResultsParams;
30 
31  //
32  // Implementing protected template methods from PKPTestCase
33  //
37  protected function getMockedDAOs() {
38  $mockedDaos = parent::getMockedDAOs();
39  $mockedDaos += array(
40  'ArticleSearchDAO', 'SubmissionDAO',
41  'IssueDAO', 'JournalDAO', 'SectionDAO'
42  );
43  return $mockedDaos;
44  }
45 
49  protected function setUp() : void {
50  parent::setUp();
52 
53  // Prepare the mock environment for this test.
54  $this->registerMockArticleSearchDAO();
55  $this->registerMockSubmissionDAO();
56  $this->registerMockIssueDAO();
57  $this->registerMockJournalDAO();
58  $this->registerMockSectionDAO();
59 
60  $request = Application::get()->getRequest();
61  if (is_null($request->getRouter())) {
62  $router = new PKPRouter();
63  $request->setRouter($router);
64  }
65  }
66 
70  protected function tearDown() : void {
72  parent::tearDown();
73  }
74 
75 
76  //
77  // Unit tests
78  //
82  public function testRetrieveResults() {
83  $this->markTestSkipped(); // Temporarily disabled!
84 
85  // Make sure that no hook is being called.
86  HookRegistry::clear('SubmissionSearch::retrieveResults');
87 
88  // Test a simple search with a mock database back-end.
89  $journal = new Journal();
90  $keywords = array(null => 'test');
91  $articleSearch = new ArticleSearch();
92  $error = '';
93  $request = Application::get()->getRequest();
94  $searchResult = $articleSearch->retrieveResults($request, $journal, $keywords, $error);
95 
96  // Test whether the result from the mocked DAOs is being returned.
97  self::assertInstanceOf('ItemIterator', $searchResult);
98  $firstResult = $searchResult->next();
99  self::assertArrayHasKey('article', $firstResult);
100  self::assertEquals(SUBMISSION_SEARCH_TEST_DEFAULT_ARTICLE, $firstResult['article']->getId());
101  self::assertEquals('', $error);
102 
103  // Make sure that articles from unpublished issues will
104  // be filtered out.
105  $this->registerMockIssueDAO(false);
106  $this->registerMockArticleSearchDAO(); // This is necessary to instantiate a fresh iterator.
107  $keywords = array(null => 'test');
108  $searchResult = $articleSearch->retrieveResults($request, $journal, $keywords, $error);
109  self::assertTrue($searchResult->eof());
110  }
111 
115  public function testRetrieveResultsViaPluginHook() {
116  $this->markTestSkipped(); // Temporarily disabled!
117 
118  // Diverting a search to the search plugin hook.
119  HookRegistry::register('SubmissionSearch::retrieveResults', array($this, 'callbackRetrieveResults'));
120 
121  $testCases = array(
122  array (null => 'query'), // Simple Search - "All"
123  array ('1' => 'author'), // Simple Search - "Authors"
124  array ('2' => 'title'), // Simple Search - "Title"
125  array (
126  null => 'query',
127  1 => 'author',
128  2 => 'title'
129  ), // Advanced Search
130  );
131 
132  $testFromDate = date('Y-m-d H:i:s', strtotime('2011-03-15 00:00:00'));
133  $testToDate = date('Y-m-d H:i:s', strtotime('2012-03-15 18:30:00'));
134  $error = '';
135 
136  $request = Application::get()->getRequest();
137 
138  foreach($testCases as $testCase) {
139  // Test a simple search with the simulated callback.
140  $journal = new Journal();
141  $keywords = $testCase;
142  $articleSearch = new ArticleSearch();
143  $searchResult = $articleSearch->retrieveResults($request, $journal, $keywords, $error, $testFromDate, $testToDate);
144 
145  // Check the parameters passed into the callback.
146  $expectedPage = 1;
147  $expectedItemsPerPage = 20;
148  $expectedTotalResults = 3;
149  $expectedError = '';
150  $expectedParams = array(
151  $journal, $testCase, $testFromDate, $testToDate,
152  $expectedPage, $expectedItemsPerPage, $expectedTotalResults,
153  $expectedError
154  );
155  self::assertEquals($expectedParams, $this->_retrieveResultsParams);
156 
157  // Test and clear the call history of the hook registry.
158  $calledHooks = HookRegistry::getCalledHooks();
159  self::assertEquals('SubmissionSearch::retrieveResults', $calledHooks[0][0]);
161 
162  // Test whether the result from the hook is being returned.
163  self::assertInstanceOf('VirtualArrayIterator', $searchResult);
164 
165  // Test the total count.
166  self::assertEquals(3, $searchResult->getCount());
167 
168  // Test the search result.
169  $firstResult = $searchResult->next();
170  self::assertArrayHasKey('article', $firstResult);
171  self::assertEquals(SUBMISSION_SEARCH_TEST_ARTICLE_FROM_PLUGIN, $firstResult['article']->getId());
172  self::assertEquals('', $error);
173  }
174 
175  // Remove the test hook.
176  HookRegistry::clear('SubmissionSearch::retrieveResults');
177  }
178 
179 
180  //
181  // Public callback methods
182  //
187  public function callbackRetrieveResults($hook, $params) {
188  // Save the test parameters
189  $this->_retrieveResultsParams = $params;
190 
191  // Test returning count by-ref.
192  $totalCount =& $params[6];
193  $totalCount = 3;
194 
195  // Mock a result set and return it.
196  $results = array(
197  3 => SUBMISSION_SEARCH_TEST_ARTICLE_FROM_PLUGIN
198  );
199  return $results;
200  }
201 
208  public function callbackGetArticle($articleId, $journalId = null, $useCache = false) {
209  // Create an article instance with the correct id.
210  $article = new Submission();
211  $article->setId($articleId);
212  return $article;
213  }
214 
215 
216  //
217  // Private helper methods
218  //
223  private function registerMockArticleSearchDAO() {
224  // Mock an ArticleSearchDAO.
225  $articleSearchDAO = $this->getMockBuilder(ArticleSearchDAO::class)
226  ->setMethods(array('getPhraseResults'))
227  ->getMock();
228 
229  // Mock a result set.
230  $searchResult = array(
231  SUBMISSION_SEARCH_TEST_DEFAULT_ARTICLE => array(
232  'count' => 3,
233  'journal_id' => 2,
234  'issuePublicationDate' => '2013-05-01 20:30:00',
235  'publicationDate' => '2013-05-01 20:30:00'
236  )
237  );
238 
239  // Mock the getPhraseResults() method.
240  $articleSearchDAO->expects($this->any())
241  ->method('getPhraseResults')
242  ->will($this->returnValue($searchResult));
243 
244  // Register the mock DAO.
245  DAORegistry::registerDAO('ArticleSearchDAO', $articleSearchDAO);
246  }
247 
252  private function registerMockSubmissionDAO() {
253  // Mock an SubmissionDAO.
254  $submissionDao = $this->getMockBuilder(SubmissionDAO::class)
255  ->setMethods(array('getArticle'))
256  ->getMock();
257 
258  // Mock an article.
259  $article = new Submission();
260 
261  // Mock the getArticle() method.
262  $submissionDao->expects($this->any())
263  ->method('getArticle')
264  ->will($this->returnCallback(array($this, 'callbackGetArticle')));
265 
266  // Register the mock DAO.
267  DAORegistry::registerDAO('SubmissionDAO', $submissionDao);
268  }
269 
274  private function registerMockIssueDAO($published = true) {
275  // Mock an IssueDAO.
276  $issueDAO = $this->getMockBuilder(IssueDAO::class)
277  ->setMethods(array('getById'))
278  ->getMock();
279 
280  // Mock an issue.
281  $issue = $issueDAO->newDataObject();
282  $issue->setPublished($published);
283 
284  // Mock the getById() method.
285  $issueDAO->expects($this->any())
286  ->method('getById')
287  ->will($this->returnValue($issue));
288 
289  // Register the mock DAO.
290  DAORegistry::registerDAO('IssueDAO', $issueDAO);
291  }
292 
297  private function registerMockJournalDAO() {
298  // Mock a JournalDAO.
299  $journalDAO = $this->getMockBuilder(JournalDAO::class)
300  ->setMethods(array('getById'))
301  ->getMock();
302 
303  // Mock a journal.
304  $journal = new Journal();
305 
306  // Mock the getById() method.
307  $journalDAO->expects($this->any())
308  ->method('getById')
309  ->will($this->returnValue($journal));
310 
311  // Register the mock DAO.
312  DAORegistry::registerDAO('JournalDAO', $journalDAO);
313  }
314 
319  private function registerMockSectionDAO() {
320  // Mock a SectionDAO.
321  $sectionDAO = $this->getMockBuilder(SectionDAO::class)
322  ->setMethods(array('getSection'))
323  ->getMock();
324 
325  // Mock a section.
326  $section = new Section();
327 
328  // Mock the getSection() method.
329  $sectionDAO->expects($this->any())
330  ->method('getSection')
331  ->will($this->returnValue($section));
332 
333  // Register the mock DAO.
334  DAORegistry::registerDAO('SectionDAO', $sectionDAO);
335  }
336 }
337 
ArticleSearchTest\callbackGetArticle
callbackGetArticle($articleId, $journalId=null, $useCache=false)
Definition: ArticleSearchTest.php:211
HookRegistry\resetCalledHooks
static resetCalledHooks($leaveAlive=false)
Definition: HookRegistry.inc.php:143
Submission
Article class.
Definition: Submission.inc.php:34
ArticleSearchTest\callbackRetrieveResults
callbackRetrieveResults($hook, $params)
Definition: ArticleSearchTest.php:190
GuzzleHttp\Promise\any
any($promises)
Definition: guzzlehttp/promises/src/functions.php:293
HookRegistry\rememberCalledHooks
static rememberCalledHooks($askOnly=false, $updateTo=true)
Definition: HookRegistry.inc.php:128
HookRegistry\clear
static clear($hookName)
Definition: HookRegistry.inc.php:58
ArticleSearchTest\getMockedDAOs
getMockedDAOs()
Definition: ArticleSearchTest.php:40
ArticleSearchTest\tearDown
tearDown()
Definition: ArticleSearchTest.php:73
PKPTestCase
Class that implements functionality common to all PKP unit test cases.
Definition: PKPTestCase.inc.php:27
HookRegistry\getCalledHooks
static & getCalledHooks()
Definition: HookRegistry.inc.php:153
DAORegistry\registerDAO
static registerDAO($name, $dao)
Definition: DAORegistry.inc.php:40
ArticleSearchTest\setUp
setUp()
Definition: ArticleSearchTest.php:52
PKPRouter
Basic router class that has functionality common to all routers.
Definition: PKPRouter.inc.php:57
HookRegistry\register
static register($hookName, $callback, $hookSequence=HOOK_SEQUENCE_NORMAL)
Definition: HookRegistry.inc.php:70
Journal
Describes basic journal properties.
Definition: Journal.inc.php:30
ArticleSearchTest\testRetrieveResultsViaPluginHook
testRetrieveResultsViaPluginHook()
Definition: ArticleSearchTest.php:118
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
ArticleSearchTest
Test class for the ArticleSearch class.
Definition: ArticleSearchTest.php:27
Section
Describes basic section properties.
Definition: Section.inc.php:19
ArticleSearch
Class for retrieving article search results.
Definition: ArticleSearch.inc.php:20
ArticleSearchTest\testRetrieveResults
testRetrieveResults()
Definition: ArticleSearchTest.php:85