Skip to content

Commit

Permalink
fix: Fix search with "NOT assignee" for unassigned tickets
Browse files Browse the repository at this point in the history
Followup of 8f973a1 (i.e. assignee can be null, and comparaison with
null value always returns null instead of a boolean).
  • Loading branch information
marien-probesys committed Aug 1, 2024
1 parent 8f973a1 commit 5b78fd8
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 7 deletions.
3 changes: 2 additions & 1 deletion src/SearchEngine/QueryBuilder/TicketQueryBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,8 @@ private function buildQualifierExpr(SearchEngine\Query\Condition $condition): st
return $this->buildExpr('t.status', $value, $condition->not());
} elseif ($qualifier === 'assignee' || $qualifier === 'requester') {
$value = $this->processActorQualifier($value);
return $this->buildExpr('t.' . $qualifier, $value, $condition->not());
$field = "COALESCE(IDENTITY(t.{$qualifier}), 0)";
return $this->buildExpr($field, $value, $condition->not());
} elseif ($qualifier === 'involves') {
$value = $this->processActorQualifier($value);

Expand Down
12 changes: 6 additions & 6 deletions tests/SearchEngine/QueryBuilder/TicketQueryBuilderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ public function testBuildQueryWithQualifierAssignee(): void
list($dql, $parameters) = $this->ticketQueryBuilder->buildQuery($query);

$this->assertSame(<<<SQL
t.assignee = :q0p0
COALESCE(IDENTITY(t.assignee), 0) = :q0p0
SQL, $dql);
$this->assertSame($alix->getId(), $parameters['q0p0']);
}
Expand All @@ -251,7 +251,7 @@ public function testBuildQueryWithQualifierAssigneeAsId(): void
list($dql, $parameters) = $this->ticketQueryBuilder->buildQuery($query);

$this->assertSame(<<<SQL
t.assignee = :q0p0
COALESCE(IDENTITY(t.assignee), 0) = :q0p0
SQL, $dql);
$this->assertSame($alix->getId(), $parameters['q0p0']);
}
Expand All @@ -263,7 +263,7 @@ public function testBuildQueryWithQualifierAssigneeAsMe(): void
list($dql, $parameters) = $this->ticketQueryBuilder->buildQuery($query);

$this->assertSame(<<<SQL
t.assignee = :q0p0
COALESCE(IDENTITY(t.assignee), 0) = :q0p0
SQL, $dql);
$this->assertSame($this->currentUser->getId(), $parameters['q0p0']);
}
Expand All @@ -278,7 +278,7 @@ public function testBuildQueryWithQualifierAssigneeAsArray(): void
list($dql, $parameters) = $this->ticketQueryBuilder->buildQuery($query);

$this->assertSame(<<<SQL
t.assignee IN (:q0p0)
COALESCE(IDENTITY(t.assignee), 0) IN (:q0p0)
SQL, $dql);
$this->assertSame(
[$alix->getId(), $this->currentUser->getId()],
Expand All @@ -293,7 +293,7 @@ public function testBuildQueryWithQualifierAssigneeAndUnknownEmail(): void
list($dql, $parameters) = $this->ticketQueryBuilder->buildQuery($query);

$this->assertSame(<<<SQL
t.assignee = :q0p0
COALESCE(IDENTITY(t.assignee), 0) = :q0p0
SQL, $dql);
$this->assertSame(-1, $parameters['q0p0']);
}
Expand All @@ -308,7 +308,7 @@ public function testBuildQueryWithQualifierRequester(): void
list($dql, $parameters) = $this->ticketQueryBuilder->buildQuery($query);

$this->assertSame(<<<SQL
t.requester = :q0p0
COALESCE(IDENTITY(t.requester), 0) = :q0p0
SQL, $dql);
$this->assertSame($alix->getId(), $parameters['q0p0']);
}
Expand Down
31 changes: 31 additions & 0 deletions tests/SearchEngine/TicketSearcherTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,37 @@ public function testGetTicketsCanLimitToTicketsNotInvolvingUser(): void
$this->assertSame($ticket4->getId(), $ticketsPagination->items[0]->getId());
}

public function testGetTicketsCanLimitToTicketsNotAssignedToUser(): void
{
$client = static::createClient();
$container = static::getContainer();
/** @var TicketSearcher $ticketSearcher */
$ticketSearcher = $container->get(TicketSearcher::class);
$user = UserFactory::createOne();
$otherUser = UserFactory::createOne();
$client->loginUser($user->_real());
$organization = OrganizationFactory::createOne();
$ticket1 = TicketFactory::createOne([
'requester' => $user,
'assignee' => null,
]);
$ticket2 = TicketFactory::createOne([
'requester' => $user,
'assignee' => $otherUser,
]);
$ticket3 = TicketFactory::createOne([
'requester' => $user,
'assignee' => $user,
]);

$query = Query::fromString('NOT assignee:@me');
$ticketsPagination = $ticketSearcher->getTickets($query);

$this->assertSame(2, $ticketsPagination->count);
$this->assertSame($ticket1->getId(), $ticketsPagination->items[0]->getId());
$this->assertSame($ticket2->getId(), $ticketsPagination->items[1]->getId());
}

public function testGetTicketsCanRestrictToAGivenContract(): void
{
$client = static::createClient();
Expand Down

0 comments on commit 5b78fd8

Please sign in to comment.