Merge pull request #424 from ArthurHoaro/search
Link filter refactoring
This commit is contained in:
commit
88c15abb2a
8 changed files with 683 additions and 419 deletions
|
@ -301,217 +301,6 @@ class LinkDBTest extends PHPUnit_Framework_TestCase
|
|||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter links using a tag
|
||||
*/
|
||||
public function testFilterOneTag()
|
||||
{
|
||||
$this->assertEquals(
|
||||
3,
|
||||
sizeof(self::$publicLinkDB->filterTags('web', false))
|
||||
);
|
||||
|
||||
$this->assertEquals(
|
||||
4,
|
||||
sizeof(self::$privateLinkDB->filterTags('web', false))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter links using a tag - case-sensitive
|
||||
*/
|
||||
public function testFilterCaseSensitiveTag()
|
||||
{
|
||||
$this->assertEquals(
|
||||
0,
|
||||
sizeof(self::$privateLinkDB->filterTags('mercurial', true))
|
||||
);
|
||||
|
||||
$this->assertEquals(
|
||||
1,
|
||||
sizeof(self::$privateLinkDB->filterTags('Mercurial', true))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter links using a tag combination
|
||||
*/
|
||||
public function testFilterMultipleTags()
|
||||
{
|
||||
$this->assertEquals(
|
||||
1,
|
||||
sizeof(self::$publicLinkDB->filterTags('dev cartoon', false))
|
||||
);
|
||||
|
||||
$this->assertEquals(
|
||||
2,
|
||||
sizeof(self::$privateLinkDB->filterTags('dev cartoon', false))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter links using a non-existent tag
|
||||
*/
|
||||
public function testFilterUnknownTag()
|
||||
{
|
||||
$this->assertEquals(
|
||||
0,
|
||||
sizeof(self::$publicLinkDB->filterTags('null', false))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return links for a given day
|
||||
*/
|
||||
public function testFilterDay()
|
||||
{
|
||||
$this->assertEquals(
|
||||
2,
|
||||
sizeof(self::$publicLinkDB->filterDay('20121206'))
|
||||
);
|
||||
|
||||
$this->assertEquals(
|
||||
3,
|
||||
sizeof(self::$privateLinkDB->filterDay('20121206'))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 404 - day not found
|
||||
*/
|
||||
public function testFilterUnknownDay()
|
||||
{
|
||||
$this->assertEquals(
|
||||
0,
|
||||
sizeof(self::$publicLinkDB->filterDay('19700101'))
|
||||
);
|
||||
|
||||
$this->assertEquals(
|
||||
0,
|
||||
sizeof(self::$privateLinkDB->filterDay('19700101'))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Use an invalid date format
|
||||
* @expectedException Exception
|
||||
* @expectedExceptionMessageRegExp /Invalid date format/
|
||||
*/
|
||||
public function testFilterInvalidDayWithChars()
|
||||
{
|
||||
self::$privateLinkDB->filterDay('Rainy day, dream away');
|
||||
}
|
||||
|
||||
/**
|
||||
* Use an invalid date format
|
||||
* @expectedException Exception
|
||||
* @expectedExceptionMessageRegExp /Invalid date format/
|
||||
*/
|
||||
public function testFilterInvalidDayDigits()
|
||||
{
|
||||
self::$privateLinkDB->filterDay('20');
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve a link entry with its hash
|
||||
*/
|
||||
public function testFilterSmallHash()
|
||||
{
|
||||
$links = self::$privateLinkDB->filterSmallHash('IuWvgA');
|
||||
|
||||
$this->assertEquals(
|
||||
1,
|
||||
sizeof($links)
|
||||
);
|
||||
|
||||
$this->assertEquals(
|
||||
'MediaGoblin',
|
||||
$links['20130614_184135']['title']
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* No link for this hash
|
||||
*/
|
||||
public function testFilterUnknownSmallHash()
|
||||
{
|
||||
$this->assertEquals(
|
||||
0,
|
||||
sizeof(self::$privateLinkDB->filterSmallHash('Iblaah'))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Full-text search - result from a link's URL
|
||||
*/
|
||||
public function testFilterFullTextURL()
|
||||
{
|
||||
$this->assertEquals(
|
||||
2,
|
||||
sizeof(self::$publicLinkDB->filterFullText('ars.userfriendly.org'))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Full-text search - result from a link's title only
|
||||
*/
|
||||
public function testFilterFullTextTitle()
|
||||
{
|
||||
// use miscellaneous cases
|
||||
$this->assertEquals(
|
||||
2,
|
||||
sizeof(self::$publicLinkDB->filterFullText('userfriendly -'))
|
||||
);
|
||||
$this->assertEquals(
|
||||
2,
|
||||
sizeof(self::$publicLinkDB->filterFullText('UserFriendly -'))
|
||||
);
|
||||
$this->assertEquals(
|
||||
2,
|
||||
sizeof(self::$publicLinkDB->filterFullText('uSeRFrIendlY -'))
|
||||
);
|
||||
|
||||
// use miscellaneous case and offset
|
||||
$this->assertEquals(
|
||||
2,
|
||||
sizeof(self::$publicLinkDB->filterFullText('RFrIendL'))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Full-text search - result from the link's description only
|
||||
*/
|
||||
public function testFilterFullTextDescription()
|
||||
{
|
||||
$this->assertEquals(
|
||||
1,
|
||||
sizeof(self::$publicLinkDB->filterFullText('media publishing'))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Full-text search - result from the link's tags only
|
||||
*/
|
||||
public function testFilterFullTextTags()
|
||||
{
|
||||
$this->assertEquals(
|
||||
2,
|
||||
sizeof(self::$publicLinkDB->filterFullText('gnu'))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Full-text search - result set from mixed sources
|
||||
*/
|
||||
public function testFilterFullTextMixed()
|
||||
{
|
||||
$this->assertEquals(
|
||||
2,
|
||||
sizeof(self::$publicLinkDB->filterFullText('free software'))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test real_url without redirector.
|
||||
*/
|
||||
|
@ -534,4 +323,28 @@ class LinkDBTest extends PHPUnit_Framework_TestCase
|
|||
$this->assertStringStartsWith($redirector, $link['real_url']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test filter with string.
|
||||
*/
|
||||
public function testFilterString()
|
||||
{
|
||||
$tags = 'dev cartoon';
|
||||
$this->assertEquals(
|
||||
2,
|
||||
count(self::$privateLinkDB->filter(LinkFilter::$FILTER_TAG, $tags, true, false))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test filter with string.
|
||||
*/
|
||||
public function testFilterArray()
|
||||
{
|
||||
$tags = array('dev', 'cartoon');
|
||||
$this->assertEquals(
|
||||
2,
|
||||
count(self::$privateLinkDB->filter(LinkFilter::$FILTER_TAG, $tags, true, false))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
242
tests/LinkFilterTest.php
Normal file
242
tests/LinkFilterTest.php
Normal file
|
@ -0,0 +1,242 @@
|
|||
<?php
|
||||
|
||||
require_once 'application/LinkFilter.php';
|
||||
|
||||
/**
|
||||
* Class LinkFilterTest.
|
||||
*/
|
||||
class LinkFilterTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
/**
|
||||
* @var LinkFilter instance.
|
||||
*/
|
||||
protected static $linkFilter;
|
||||
|
||||
/**
|
||||
* Instanciate linkFilter with ReferenceLinkDB data.
|
||||
*/
|
||||
public static function setUpBeforeClass()
|
||||
{
|
||||
$refDB = new ReferenceLinkDB();
|
||||
self::$linkFilter = new LinkFilter($refDB->getLinks());
|
||||
}
|
||||
|
||||
/**
|
||||
* Blank filter.
|
||||
*/
|
||||
public function testFilter()
|
||||
{
|
||||
$this->assertEquals(
|
||||
6,
|
||||
count(self::$linkFilter->filter('', ''))
|
||||
);
|
||||
|
||||
// Private only.
|
||||
$this->assertEquals(
|
||||
2,
|
||||
count(self::$linkFilter->filter('', '', false, true))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter links using a tag
|
||||
*/
|
||||
public function testFilterOneTag()
|
||||
{
|
||||
$this->assertEquals(
|
||||
4,
|
||||
count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false))
|
||||
);
|
||||
|
||||
// Private only.
|
||||
$this->assertEquals(
|
||||
1,
|
||||
count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false, true))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter links using a tag - case-sensitive
|
||||
*/
|
||||
public function testFilterCaseSensitiveTag()
|
||||
{
|
||||
$this->assertEquals(
|
||||
0,
|
||||
count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'mercurial', true))
|
||||
);
|
||||
|
||||
$this->assertEquals(
|
||||
1,
|
||||
count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'Mercurial', true))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter links using a tag combination
|
||||
*/
|
||||
public function testFilterMultipleTags()
|
||||
{
|
||||
$this->assertEquals(
|
||||
2,
|
||||
count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'dev cartoon', false))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter links using a non-existent tag
|
||||
*/
|
||||
public function testFilterUnknownTag()
|
||||
{
|
||||
$this->assertEquals(
|
||||
0,
|
||||
count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'null', false))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return links for a given day
|
||||
*/
|
||||
public function testFilterDay()
|
||||
{
|
||||
$this->assertEquals(
|
||||
3,
|
||||
count(self::$linkFilter->filter(LinkFilter::$FILTER_DAY, '20121206'))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 404 - day not found
|
||||
*/
|
||||
public function testFilterUnknownDay()
|
||||
{
|
||||
$this->assertEquals(
|
||||
0,
|
||||
count(self::$linkFilter->filter(LinkFilter::$FILTER_DAY, '19700101'))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Use an invalid date format
|
||||
* @expectedException Exception
|
||||
* @expectedExceptionMessageRegExp /Invalid date format/
|
||||
*/
|
||||
public function testFilterInvalidDayWithChars()
|
||||
{
|
||||
self::$linkFilter->filter(LinkFilter::$FILTER_DAY, 'Rainy day, dream away');
|
||||
}
|
||||
|
||||
/**
|
||||
* Use an invalid date format
|
||||
* @expectedException Exception
|
||||
* @expectedExceptionMessageRegExp /Invalid date format/
|
||||
*/
|
||||
public function testFilterInvalidDayDigits()
|
||||
{
|
||||
self::$linkFilter->filter(LinkFilter::$FILTER_DAY, '20');
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve a link entry with its hash
|
||||
*/
|
||||
public function testFilterSmallHash()
|
||||
{
|
||||
$links = self::$linkFilter->filter(LinkFilter::$FILTER_HASH, 'IuWvgA');
|
||||
|
||||
$this->assertEquals(
|
||||
1,
|
||||
count($links)
|
||||
);
|
||||
|
||||
$this->assertEquals(
|
||||
'MediaGoblin',
|
||||
$links['20130614_184135']['title']
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* No link for this hash
|
||||
*/
|
||||
public function testFilterUnknownSmallHash()
|
||||
{
|
||||
$this->assertEquals(
|
||||
0,
|
||||
count(self::$linkFilter->filter(LinkFilter::$FILTER_HASH, 'Iblaah'))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Full-text search - result from a link's URL
|
||||
*/
|
||||
public function testFilterFullTextURL()
|
||||
{
|
||||
$this->assertEquals(
|
||||
2,
|
||||
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'ars.userfriendly.org'))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Full-text search - result from a link's title only
|
||||
*/
|
||||
public function testFilterFullTextTitle()
|
||||
{
|
||||
// use miscellaneous cases
|
||||
$this->assertEquals(
|
||||
2,
|
||||
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'userfriendly -'))
|
||||
);
|
||||
$this->assertEquals(
|
||||
2,
|
||||
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'UserFriendly -'))
|
||||
);
|
||||
$this->assertEquals(
|
||||
2,
|
||||
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'uSeRFrIendlY -'))
|
||||
);
|
||||
|
||||
// use miscellaneous case and offset
|
||||
$this->assertEquals(
|
||||
2,
|
||||
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'RFrIendL'))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Full-text search - result from the link's description only
|
||||
*/
|
||||
public function testFilterFullTextDescription()
|
||||
{
|
||||
$this->assertEquals(
|
||||
1,
|
||||
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'media publishing'))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Full-text search - result from the link's tags only
|
||||
*/
|
||||
public function testFilterFullTextTags()
|
||||
{
|
||||
$this->assertEquals(
|
||||
2,
|
||||
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'gnu'))
|
||||
);
|
||||
|
||||
// Private only.
|
||||
$this->assertEquals(
|
||||
1,
|
||||
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'web', false, true))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Full-text search - result set from mixed sources
|
||||
*/
|
||||
public function testFilterFullTextMixed()
|
||||
{
|
||||
$this->assertEquals(
|
||||
2,
|
||||
count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'free software'))
|
||||
);
|
||||
}
|
||||
}
|
|
@ -124,4 +124,9 @@ class ReferenceLinkDB
|
|||
{
|
||||
return $this->_privateCount;
|
||||
}
|
||||
|
||||
public function getLinks()
|
||||
{
|
||||
return $this->_links;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue