Files
nextcloud-recognize/tests/RemoveDuplicateFaceDetectionsTest.php
Marcel Klehr 9685e0241c fix: Repair duplicate face detections
Signed-off-by: Marcel Klehr <mklehr@gmx.net>
2025-07-26 20:13:05 +02:00

77 lines
2.3 KiB
PHP

<?php
use OCA\Recognize\Db\FaceDetectionMapper;
use OCA\Recognize\Migration\RemoveDuplicateFaceDetections;
use OCP\IDBConnection;
use OCP\Server;
use Test\TestCase;
/**
* @group DB
*/
class RemoveDuplicateFaceDetectionsTest extends TestCase {
private IDBConnection $db;
private FaceDetectionMapper $faceDetectionMapper;
public function setUp(): void {
parent::setUp();
$this->db = Server::get(IDBConnection::class);
$this->faceDetectionMapper = Server::get(FaceDetectionMapper::class);
// Clear
$qb = $this->db->getQueryBuilder();
$qb->delete('recognize_face_detections')->executeStatement();
for ($k = 0; $k < 10; $k++) {
for ($j = 0; $j < 10; $j++) {
$user = 'user' . $k;
$x = rand(0, 100) / 100;
$y = rand(0, 100) / 100;
$height = rand(0, 100) / 100;
$width = rand(0, 100) / 100;
for ($i = 0; $i < 10; $i++) {
$face = new \OCA\Recognize\Db\FaceDetection();
$face->setUserId($user);
$face->setX($x);
$face->setY($y);
$face->setHeight($height);
$face->setWidth($width);
$face->setFileId($j);
$face->setThreshold(0.5);
$face->setVector([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]);
$this->faceDetectionMapper->insertWithoutDeduplication($face);
}
$face2 = new \OCA\Recognize\Db\FaceDetection();
$face2->setUserId($user);
$face2->setX(rand(0, 100) / 100);
$face2->setY(rand(0, 100) / 100);
$face2->setHeight(rand(0, 100) / 100);
$face2->setWidth(rand(0, 100) / 100);
$face2->setFileId($k * $j);
$face2->setThreshold(0.5);
$face2->setVector([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]);
$this->faceDetectionMapper->insertWithoutDeduplication($face2);
}
}
}
public function testRepairStep() : void {
// Prepare
$repairStep = Server::get(RemoveDuplicateFaceDetections::class);
$output = $this->createMock(\OCP\Migration\IOutput::class);
// Check
$qb = $this->db->getQueryBuilder();
$count = $qb->select($qb->func()->count('*'))->from('recognize_face_detections')->executeQuery()->fetchOne();
$this->assertEquals(10 * 10 * 11, (int)$count); // 1100
// Run
$repairStep->run($output);
// Assert
$qb = $this->db->getQueryBuilder();
$count = $qb->select($qb->func()->count('*'))->from('recognize_face_detections')->executeQuery()->fetchOne();
$this->assertEquals(10 * 10 * 11 - 10 * 10 * 9, (int)$count); // 200
}
}