* deactivate deprecated auto-mapping * use native month-picker with fallback on old browser * bump dependencies to new major versions * replace deprecated ARRAY column type with JSON * named arguments * nullable arguments * native lazy ghosts * update routes to use php config * disable PHP < 8.4 * use static RTL configuration * new qr code package * clear out env file * recipe updates * fix deprecations * preset new env variable if not existing * bump maria db version examples * remove deprecated api-token support * fix validator deprecations * remove timesheet category column * fix broken validator autoconfiguration * stabilize tests * fix migration syntax compatibility * fix doctrine deprecation * fix datetime format * remove constructor dependency * only include visible preferences in invoice templates * fix test container dependency * removed ProjectConstraint multi-constraint logic * allow to disable plugins in certain environments * refactor TimesheetConstraint to non-service * activate new interface methods * prevent update issues with .env * improved customer fixture * removed $user->isExportDecimal()
139 lines
4.8 KiB
PHP
139 lines
4.8 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Kimai time-tracking app.
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace App\Tests\Utils;
|
|
|
|
use App\Utils\SearchTerm;
|
|
use PHPUnit\Framework\Attributes\CoversClass;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
#[CoversClass(SearchTerm::class)]
|
|
class SearchTermTest extends TestCase
|
|
{
|
|
public function testNormalSearchTerm(): void
|
|
{
|
|
$sut = new SearchTerm('foo bar test 1');
|
|
self::assertTrue($sut->hasSearchTerm());
|
|
self::assertEquals('foo bar test 1', $sut->getOriginalSearch());
|
|
self::assertEquals('foo bar test 1', (string) $sut);
|
|
$expectedParts = [
|
|
['foo', null, false],
|
|
['bar', null, false],
|
|
['test', null, false],
|
|
['1', null, false],
|
|
];
|
|
$i = 0;
|
|
foreach ($sut->getParts() as $part) {
|
|
$expected = $expectedParts[$i++];
|
|
self::assertEquals($expected[0], $part->getTerm());
|
|
self::assertEquals($expected[1], $part->getField());
|
|
self::assertEquals($expected[2], $part->isExcluded());
|
|
}
|
|
}
|
|
|
|
public function testWithMetaField(): void
|
|
{
|
|
$sut = new SearchTerm('foo:bar');
|
|
self::assertFalse($sut->hasSearchTerm());
|
|
self::assertEquals('foo:bar', $sut->getOriginalSearch());
|
|
self::assertCount(1, $sut->getParts());
|
|
$expectedParts = [
|
|
['foo', 'bar', false],
|
|
];
|
|
$i = 0;
|
|
foreach ($sut->getParts() as $part) {
|
|
$expected = $expectedParts[$i++];
|
|
self::assertEquals($expected[0], $part->getField());
|
|
self::assertEquals($expected[1], $part->getTerm());
|
|
self::assertEquals($expected[2], $part->isExcluded());
|
|
}
|
|
}
|
|
|
|
public function testComplexWithMultipleAndDuplicateMetaFields(): void
|
|
{
|
|
$sut = new SearchTerm('foo:bar hello bar:!foo world test foo:bar2 wuff');
|
|
self::assertTrue($sut->hasSearchTerm());
|
|
self::assertEquals('foo:bar hello bar:!foo world test foo:bar2 wuff', $sut->getOriginalSearch());
|
|
self::assertCount(7, $sut->getParts());
|
|
$expectedParts = [
|
|
['bar', 'foo', false],
|
|
['hello', null, false],
|
|
['foo', 'bar', true],
|
|
['world', null, false],
|
|
['test', null, false],
|
|
['bar2', 'foo', false],
|
|
['wuff', null, false],
|
|
];
|
|
$i = 0;
|
|
foreach ($sut->getParts() as $part) {
|
|
$expected = $expectedParts[$i++];
|
|
self::assertEquals($expected[0], $part->getTerm());
|
|
self::assertEquals($expected[1], $part->getField());
|
|
self::assertEquals($expected[2], $part->isExcluded());
|
|
}
|
|
}
|
|
|
|
public function testIssue5221(): void
|
|
{
|
|
$sut = new SearchTerm('ABC-123: abcd: abcd');
|
|
self::assertTrue($sut->hasSearchTerm());
|
|
self::assertEquals('ABC-123: abcd: abcd', $sut->getOriginalSearch());
|
|
self::assertCount(3, $sut->getParts());
|
|
$expectedParts = [
|
|
['ABC-123:', null, false],
|
|
['abcd:', null, false],
|
|
['abcd', null, false],
|
|
];
|
|
$i = 0;
|
|
foreach ($sut->getParts() as $part) {
|
|
$expected = $expectedParts[$i++];
|
|
self::assertEquals($expected[0], $part->getTerm());
|
|
self::assertEquals($expected[1], $part->getField());
|
|
self::assertEquals($expected[2], $part->isExcluded());
|
|
}
|
|
|
|
$sut = new SearchTerm('1 : 1:.');
|
|
self::assertTrue($sut->hasSearchTerm());
|
|
self::assertEquals('1 : 1:.', $sut->getOriginalSearch());
|
|
self::assertCount(3, $sut->getParts());
|
|
$expectedParts = [
|
|
['1', null, false],
|
|
[':', null, false],
|
|
['.', '1', false],
|
|
];
|
|
$i = 0;
|
|
foreach ($sut->getParts() as $part) {
|
|
$expected = $expectedParts[$i++];
|
|
self::assertEquals($expected[0], $part->getTerm());
|
|
self::assertEquals($expected[1], $part->getField());
|
|
self::assertEquals($expected[2], $part->isExcluded());
|
|
}
|
|
}
|
|
|
|
public function testEmptySearchTerm(): void
|
|
{
|
|
$sut = new SearchTerm('ABC-123:"" abcd:"" abcd');
|
|
self::assertTrue($sut->hasSearchTerm());
|
|
self::assertEquals('ABC-123:"" abcd:"" abcd', $sut->getOriginalSearch());
|
|
self::assertCount(3, $sut->getParts());
|
|
$expectedParts = [
|
|
['', 'ABC-123', false],
|
|
['', 'abcd', false],
|
|
['abcd', null, false],
|
|
];
|
|
$i = 0;
|
|
foreach ($sut->getParts() as $part) {
|
|
$expected = $expectedParts[$i++];
|
|
self::assertEquals($expected[0], $part->getTerm());
|
|
self::assertEquals($expected[1], $part->getField());
|
|
self::assertEquals($expected[2], $part->isExcluded());
|
|
}
|
|
}
|
|
}
|