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\Session; 27use Fisharebest\Webtrees\TestCase; 28use Fisharebest\Webtrees\Tree; 29use Illuminate\Support\Collection; 30use PHPUnit\Framework\Attributes\CoversClass; 31 32#[CoversClass(FixDuplicateLinks::class)] 33#[CoversClass(ModuleDataFixTrait::class)] 34class FixDuplicateLinksTest extends TestCase 35{ 36 protected static bool $uses_database = true; 37 38 protected FixDuplicateLinks $fixDuplicateLinks; 39 40 protected Tree $tree; 41 42 protected bool $restore_session_user = false; 43 44 /** 45 * {@inheritdoc} 46 */ 47 protected function setUp(): void 48 { 49 parent::setUp(); 50 51 $tree_service = new TreeService(new GedcomImportService()); 52 $this->tree = $tree_service->create('name', 'title'); 53 54 $this->fixDuplicateLinks = new FixDuplicateLinks(new DataFixService()); 55 56 if (Auth::id() === null) { 57 Session::put('wt_user', 0); 58 $this->restore_session_user = true; 59 } 60 } 61 62 /** 63 * {@inheritdoc} 64 */ 65 protected function tearDown(): void 66 { 67 parent::tearDown(); 68 69 if ($this->restore_session_user) { 70 Session::forget('wt_user'); 71 } 72 73 unset($this->fixDuplicateLinks, $this->tree); 74 } 75 76 /** 77 * Test the module returns a title and a description 78 */ 79 public function testModuleMetadata(): void 80 { 81 self::assertNotEmpty($this->fixDuplicateLinks->title()); 82 self::assertNotEmpty($this->fixDuplicateLinks->description()); 83 } 84 85 /** 86 * Test the trait's recordsToFix method 87 */ 88 public function testRecordsToFix(): void 89 { 90 $records = $this->fixDuplicateLinks->recordsToFix($this->tree, []); 91 self::assertInstanceOf(Collection::class, $records); 92 self::assertCount(1, $records); 93 94 $records = $this->fixDuplicateLinks->recordsToFix($this->tree, ['start' => 'X1', 'end' => 'X9']); 95 self::assertCount(1, $records); 96 97 $records = $this->fixDuplicateLinks->recordsToFix($this->tree, ['start' => 'X2', 'end' => 'X9']); 98 self::assertCount(0, $records); 99 } 100 101 /** 102 * Test the doesRecordNeedUpdate method on a negative and positive test 103 */ 104 public function testDoesRecordNeedUpdate(): void 105 { 106 $family = $this->tree->createFamily("0 @@ FAM\n1 HUSB @X1@\n1 CHIL @X2@"); 107 self::assertFalse($this->fixDuplicateLinks->doesRecordNeedUpdate($family, [])); 108 109 $family->createFact('1 CHIL @X2@', true); 110 self::assertTrue($this->fixDuplicateLinks->doesRecordNeedUpdate($family, [])); 111 } 112 113 /** 114 * Test the preview of the update 115 */ 116 public function testPreviewUpdate(): void 117 { 118 $family = $this->tree->createFamily("0 @@ FAM\n1 HUSB @X1@\n1 CHIL @X2@\n1 CHIL @X2@"); 119 120 self::assertStringContainsString( 121 '<del>1 CHIL @X2@</del>', 122 $this->fixDuplicateLinks->previewUpdate($family, []) 123 ); 124 } 125 126 /** 127 * Test the update of the record 128 */ 129 public function testUpdateRecord(): void 130 { 131 $family = $this->tree->createFamily("0 @@ FAM\n1 HUSB @X1@\n1 CHIL @X2@\n1 CHIL @X2@"); 132 $this->fixDuplicateLinks->updateRecord($family, []); 133 134 self::assertCount(1, $family->facts(['CHIL'])); 135 } 136} 137