test(audit): strengthen H5/H7/H8 into true fail-without-fix regressions

Verification pass found three tests only guarded correctness, not the fix's
behavior:
- H7: add repository white-box test asserting likes/replies come back as
  initialised PersistentCollections (lazy without the fetch-join).
- H8: add a query-count test (constant vs coverage-row count) — without the
  batch fetch the count grows ~1 per row.
- H5: add an end-to-end test hitting DELETE /api/v1/doctor and asserting the
  insurance config is purged (the service unit test didn't cover the wiring).

All three now fail when their fix is reverted. Suite: 39 tests / 92 assertions.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
hamed
2026-06-28 20:01:12 +03:30
co-authored by Claude Opus 4.8
parent c9ae3882fe
commit 131a78343b
4 changed files with 105 additions and 0 deletions
+33
View File
@@ -6,6 +6,7 @@ use App\Doctor\Entity\Doctor;
use App\Rating\Entity\Comment;
use App\Rating\Entity\Like;
use App\Tests\ApiTestCase;
use Doctrine\ORM\PersistentCollection;
/**
* The public comment list fetch-joins likes/replies/authors (two passes) to
@@ -54,4 +55,36 @@ class CommentListNPlusOneTest extends ApiTestCase
return json_decode($this->client->getResponse()->getContent(), true) ?? [];
}
/**
* True N+1 regression: after the repository loads the roots, their likes and
* replies collections must already be initialised (fetch-joined). Without the
* fetch-join they are lazy and would each trigger a query during serialization.
*/
public function testRepositoryFetchJoinsCollections(): void
{
$doctor = new Doctor($this->createUser(['ROLE_DOCTOR']), 'دکتر تست');
$this->em->persist($doctor);
$root = (new Comment($this->createUser(), $doctor, 'نظر'))->approve();
$this->em->persist($root);
$this->em->persist(new Like($this->createUser(), $root, 1));
$this->em->persist((new Comment($this->createUser(), $doctor, 'پاسخ', $root))->approve());
$this->em->flush();
$doctorId = $doctor->getId();
// fresh load — collections must come back initialised, not lazy proxies
$this->em->clear();
$doctor = $this->em->getRepository(Doctor::class)->find($doctorId);
$roots = $this->em->getRepository(Comment::class)->findApprovedRootsByDoctor($doctor);
$this->assertNotEmpty($roots);
foreach ($roots as $r) {
$likes = $r->getLikes();
$replies = $r->getReplies();
$this->assertInstanceOf(PersistentCollection::class, $likes);
$this->assertInstanceOf(PersistentCollection::class, $replies);
$this->assertTrue($likes->isInitialized(), 'likes collection was not fetch-joined');
$this->assertTrue($replies->isInitialized(), 'replies collection was not fetch-joined');
}
}
}