15062b1caSJonathan Jaubart<?php 25062b1caSJonathan Jaubart 35062b1caSJonathan Jaubart/** 45062b1caSJonathan Jaubart * webtrees: online genealogy 5d11be702SGreg Roach * Copyright (C) 2023 webtrees development team 65062b1caSJonathan Jaubart * This program is free software: you can redistribute it and/or modify 75062b1caSJonathan Jaubart * it under the terms of the GNU General Public License as published by 85062b1caSJonathan Jaubart * the Free Software Foundation, either version 3 of the License, or 95062b1caSJonathan Jaubart * (at your option) any later version. 105062b1caSJonathan Jaubart * This program is distributed in the hope that it will be useful, 115062b1caSJonathan Jaubart * but WITHOUT ANY WARRANTY; without even the implied warranty of 125062b1caSJonathan Jaubart * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 135062b1caSJonathan Jaubart * GNU General Public License for more details. 145062b1caSJonathan Jaubart * You should have received a copy of the GNU General Public License 155062b1caSJonathan Jaubart * along with this program. If not, see <https://www.gnu.org/licenses/>. 165062b1caSJonathan Jaubart */ 175062b1caSJonathan Jaubart 185062b1caSJonathan Jaubartdeclare(strict_types=1); 195062b1caSJonathan Jaubart 205062b1caSJonathan Jaubartnamespace Fisharebest\Webtrees\Module; 215062b1caSJonathan Jaubart 225062b1caSJonathan Jaubartuse Fisharebest\Webtrees\Auth; 23f0c88a96SGreg Roachuse Fisharebest\Webtrees\Services\DataFixService; 242c685d76SGreg Roachuse Fisharebest\Webtrees\Services\GedcomImportService; 25f0c88a96SGreg Roachuse Fisharebest\Webtrees\Services\TreeService; 2652550490SGreg Roachuse Fisharebest\Webtrees\Services\UserService; 275062b1caSJonathan Jaubartuse Fisharebest\Webtrees\Session; 285062b1caSJonathan Jaubartuse Fisharebest\Webtrees\TestCase; 295062b1caSJonathan Jaubartuse Fisharebest\Webtrees\Tree; 305062b1caSJonathan Jaubartuse Illuminate\Support\Collection; 31202c018bSGreg Roachuse PHPUnit\Framework\Attributes\CoversClass; 32*a6305e60SGreg Roachuse PHPUnit\Framework\Attributes\CoversTrait; 335062b1caSJonathan Jaubart 34202c018bSGreg Roach#[CoversClass(FixDuplicateLinks::class)] 35168400f2SJulien BARBEY#[CoversTrait(ModuleDataFixTrait::class)] 365062b1caSJonathan Jaubartclass FixDuplicateLinksTest extends TestCase 375062b1caSJonathan Jaubart{ 38cd94ca66SGreg Roach protected static bool $uses_database = true; 395062b1caSJonathan Jaubart 4033c746f1SGreg Roach protected FixDuplicateLinks $fixDuplicateLinks; 415062b1caSJonathan Jaubart 4233c746f1SGreg Roach protected Tree $tree; 435062b1caSJonathan Jaubart 4433c746f1SGreg Roach protected bool $restore_session_user = false; 455062b1caSJonathan Jaubart 465062b1caSJonathan Jaubart /** 475062b1caSJonathan Jaubart * {@inheritdoc} 485062b1caSJonathan Jaubart */ 495062b1caSJonathan Jaubart protected function setUp(): void 505062b1caSJonathan Jaubart { 515062b1caSJonathan Jaubart parent::setUp(); 525062b1caSJonathan Jaubart 532c685d76SGreg Roach $tree_service = new TreeService(new GedcomImportService()); 545062b1caSJonathan Jaubart $this->tree = $tree_service->create('name', 'title'); 555062b1caSJonathan Jaubart 565062b1caSJonathan Jaubart $this->fixDuplicateLinks = new FixDuplicateLinks(new DataFixService()); 575062b1caSJonathan Jaubart 5852550490SGreg Roach $user_service = new UserService(); 5952550490SGreg Roach $user = $user_service->create('user', 'real', 'email', 'pass'); 6052550490SGreg Roach Auth::login($user); 615062b1caSJonathan Jaubart } 625062b1caSJonathan Jaubart 635062b1caSJonathan Jaubart /** 645062b1caSJonathan Jaubart * {@inheritdoc} 655062b1caSJonathan Jaubart */ 665062b1caSJonathan Jaubart protected function tearDown(): void 675062b1caSJonathan Jaubart { 685062b1caSJonathan Jaubart parent::tearDown(); 695062b1caSJonathan Jaubart 705062b1caSJonathan Jaubart if ($this->restore_session_user) { 715062b1caSJonathan Jaubart Session::forget('wt_user'); 725062b1caSJonathan Jaubart } 735062b1caSJonathan Jaubart 7405babb96SGreg Roach unset($this->fixDuplicateLinks, $this->tree); 755062b1caSJonathan Jaubart } 765062b1caSJonathan Jaubart 775062b1caSJonathan Jaubart /** 785062b1caSJonathan Jaubart * Test the module returns a title and a description 795062b1caSJonathan Jaubart */ 805062b1caSJonathan Jaubart public function testModuleMetadata(): void 815062b1caSJonathan Jaubart { 825062b1caSJonathan Jaubart self::assertNotEmpty($this->fixDuplicateLinks->title()); 835062b1caSJonathan Jaubart self::assertNotEmpty($this->fixDuplicateLinks->description()); 845062b1caSJonathan Jaubart } 855062b1caSJonathan Jaubart 865062b1caSJonathan Jaubart /** 875062b1caSJonathan Jaubart * Test the trait's recordsToFix method 885062b1caSJonathan Jaubart */ 895062b1caSJonathan Jaubart public function testRecordsToFix(): void 905062b1caSJonathan Jaubart { 915062b1caSJonathan Jaubart $records = $this->fixDuplicateLinks->recordsToFix($this->tree, []); 925062b1caSJonathan Jaubart self::assertInstanceOf(Collection::class, $records); 935062b1caSJonathan Jaubart self::assertCount(1, $records); 945062b1caSJonathan Jaubart 955062b1caSJonathan Jaubart $records = $this->fixDuplicateLinks->recordsToFix($this->tree, ['start' => 'X1', 'end' => 'X9']); 965062b1caSJonathan Jaubart self::assertCount(1, $records); 975062b1caSJonathan Jaubart 985062b1caSJonathan Jaubart $records = $this->fixDuplicateLinks->recordsToFix($this->tree, ['start' => 'X2', 'end' => 'X9']); 995062b1caSJonathan Jaubart self::assertCount(0, $records); 1005062b1caSJonathan Jaubart } 1015062b1caSJonathan Jaubart 1025062b1caSJonathan Jaubart /** 1035062b1caSJonathan Jaubart * Test the doesRecordNeedUpdate method on a negative and positive test 1045062b1caSJonathan Jaubart */ 1055062b1caSJonathan Jaubart public function testDoesRecordNeedUpdate(): void 1065062b1caSJonathan Jaubart { 1075062b1caSJonathan Jaubart $family = $this->tree->createFamily("0 @@ FAM\n1 HUSB @X1@\n1 CHIL @X2@"); 1085062b1caSJonathan Jaubart self::assertFalse($this->fixDuplicateLinks->doesRecordNeedUpdate($family, [])); 1095062b1caSJonathan Jaubart 1106e60786aSGreg Roach $family->createFact('1 CHIL @X2@', true); 1115062b1caSJonathan Jaubart self::assertTrue($this->fixDuplicateLinks->doesRecordNeedUpdate($family, [])); 1125062b1caSJonathan Jaubart } 1135062b1caSJonathan Jaubart 1145062b1caSJonathan Jaubart /** 1155062b1caSJonathan Jaubart * Test the preview of the update 1165062b1caSJonathan Jaubart */ 1175062b1caSJonathan Jaubart public function testPreviewUpdate(): void 1185062b1caSJonathan Jaubart { 1195062b1caSJonathan Jaubart $family = $this->tree->createFamily("0 @@ FAM\n1 HUSB @X1@\n1 CHIL @X2@\n1 CHIL @X2@"); 1205062b1caSJonathan Jaubart 1215062b1caSJonathan Jaubart self::assertStringContainsString( 1225062b1caSJonathan Jaubart '<del>1 CHIL @X2@</del>', 1235062b1caSJonathan Jaubart $this->fixDuplicateLinks->previewUpdate($family, []) 1245062b1caSJonathan Jaubart ); 1255062b1caSJonathan Jaubart } 1265062b1caSJonathan Jaubart 1275062b1caSJonathan Jaubart /** 1285062b1caSJonathan Jaubart * Test the update of the record 1295062b1caSJonathan Jaubart */ 1305062b1caSJonathan Jaubart public function testUpdateRecord(): void 1315062b1caSJonathan Jaubart { 1325062b1caSJonathan Jaubart $family = $this->tree->createFamily("0 @@ FAM\n1 HUSB @X1@\n1 CHIL @X2@\n1 CHIL @X2@"); 1335062b1caSJonathan Jaubart $this->fixDuplicateLinks->updateRecord($family, []); 1345062b1caSJonathan Jaubart 1355062b1caSJonathan Jaubart self::assertCount(1, $family->facts(['CHIL'])); 1365062b1caSJonathan Jaubart } 1375062b1caSJonathan Jaubart} 138