1<?php 2 3/** 4 * webtrees: online genealogy 5 * Copyright (C) 2023 webtrees development team 6 * This program is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation, either version 3 of the License, or 9 * (at your option) any later version. 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * You should have received a copy of the GNU General Public License 15 * along with this program. If not, see <https://www.gnu.org/licenses/>. 16 */ 17 18declare(strict_types=1); 19 20namespace Fisharebest\Webtrees\Module; 21 22use Fisharebest\Webtrees\Auth; 23use Fisharebest\Webtrees\Services\DataFixService; 24use Fisharebest\Webtrees\Services\GedcomImportService; 25use Fisharebest\Webtrees\Services\TreeService; 26use Fisharebest\Webtrees\Services\UserService; 27use Fisharebest\Webtrees\Session; 28use Fisharebest\Webtrees\TestCase; 29use Fisharebest\Webtrees\Tree; 30use Illuminate\Support\Collection; 31use PHPUnit\Framework\Attributes\CoversClass; 32use PHPUnit\Framework\Attributes\CoversTrait; 33 34#[CoversClass(FixDuplicateLinks::class)] 35#[CoversTrait(ModuleDataFixTrait::class)] 36class FixDuplicateLinksTest extends TestCase 37{ 38 protected static bool $uses_database = true; 39 40 protected FixDuplicateLinks $fixDuplicateLinks; 41 42 protected Tree $tree; 43 44 protected bool $restore_session_user = false; 45 46 /** 47 * {@inheritdoc} 48 */ 49 protected function setUp(): void 50 { 51 parent::setUp(); 52 53 $tree_service = new TreeService(new GedcomImportService()); 54 $this->tree = $tree_service->create('name', 'title'); 55 56 $this->fixDuplicateLinks = new FixDuplicateLinks(new DataFixService()); 57 58 $user_service = new UserService(); 59 $user = $user_service->create('user', 'real', 'email', 'pass'); 60 Auth::login($user); 61 } 62 63 /** 64 * {@inheritdoc} 65 */ 66 protected function tearDown(): void 67 { 68 parent::tearDown(); 69 70 if ($this->restore_session_user) { 71 Session::forget('wt_user'); 72 } 73 74 unset($this->fixDuplicateLinks, $this->tree); 75 } 76 77 /** 78 * Test the module returns a title and a description 79 */ 80 public function testModuleMetadata(): void 81 { 82 self::assertNotEmpty($this->fixDuplicateLinks->title()); 83 self::assertNotEmpty($this->fixDuplicateLinks->description()); 84 } 85 86 /** 87 * Test the trait's recordsToFix method 88 */ 89 public function testRecordsToFix(): void 90 { 91 $records = $this->fixDuplicateLinks->recordsToFix($this->tree, []); 92 self::assertInstanceOf(Collection::class, $records); 93 self::assertCount(1, $records); 94 95 $records = $this->fixDuplicateLinks->recordsToFix($this->tree, ['start' => 'X1', 'end' => 'X9']); 96 self::assertCount(1, $records); 97 98 $records = $this->fixDuplicateLinks->recordsToFix($this->tree, ['start' => 'X2', 'end' => 'X9']); 99 self::assertCount(0, $records); 100 } 101 102 /** 103 * Test the doesRecordNeedUpdate method on a negative and positive test 104 */ 105 public function testDoesRecordNeedUpdate(): void 106 { 107 $family = $this->tree->createFamily("0 @@ FAM\n1 HUSB @X1@\n1 CHIL @X2@"); 108 self::assertFalse($this->fixDuplicateLinks->doesRecordNeedUpdate($family, [])); 109 110 $family->createFact('1 CHIL @X2@', true); 111 self::assertTrue($this->fixDuplicateLinks->doesRecordNeedUpdate($family, [])); 112 } 113 114 /** 115 * Test the preview of the update 116 */ 117 public function testPreviewUpdate(): void 118 { 119 $family = $this->tree->createFamily("0 @@ FAM\n1 HUSB @X1@\n1 CHIL @X2@\n1 CHIL @X2@"); 120 121 self::assertStringContainsString( 122 '<del>1 CHIL @X2@</del>', 123 $this->fixDuplicateLinks->previewUpdate($family, []) 124 ); 125 } 126 127 /** 128 * Test the update of the record 129 */ 130 public function testUpdateRecord(): void 131 { 132 $family = $this->tree->createFamily("0 @@ FAM\n1 HUSB @X1@\n1 CHIL @X2@\n1 CHIL @X2@"); 133 $this->fixDuplicateLinks->updateRecord($family, []); 134 135 self::assertCount(1, $family->facts(['CHIL'])); 136 } 137} 138