1a25f0a04SGreg Roach<?php 2a25f0a04SGreg Roach/** 3a25f0a04SGreg Roach * webtrees: online genealogy 48fcd0d32SGreg Roach * Copyright (C) 2019 webtrees development team 5a25f0a04SGreg Roach * This program is free software: you can redistribute it and/or modify 6a25f0a04SGreg Roach * it under the terms of the GNU General Public License as published by 7a25f0a04SGreg Roach * the Free Software Foundation, either version 3 of the License, or 8a25f0a04SGreg Roach * (at your option) any later version. 9a25f0a04SGreg Roach * This program is distributed in the hope that it will be useful, 10a25f0a04SGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of 11a25f0a04SGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12a25f0a04SGreg Roach * GNU General Public License for more details. 13a25f0a04SGreg Roach * You should have received a copy of the GNU General Public License 14a25f0a04SGreg Roach * along with this program. If not, see <http://www.gnu.org/licenses/>. 15a25f0a04SGreg Roach */ 16e7f56f2aSGreg Roachdeclare(strict_types=1); 17e7f56f2aSGreg Roach 1884e2cf4eSGreg Roachnamespace Fisharebest\Webtrees; 19a25f0a04SGreg Roach 20*94026f20SGreg Roachuse function stream_get_contents; 21*94026f20SGreg Roach 22a25f0a04SGreg Roach/** 23a25f0a04SGreg Roach * Test harness for the class Tree 24a25f0a04SGreg Roach */ 2584e2cf4eSGreg Roachclass TreeTest extends \Fisharebest\Webtrees\TestCase 26c1010edaSGreg Roach{ 27126654d7SGreg Roach protected static $uses_database = true; 28126654d7SGreg Roach 29a25f0a04SGreg Roach /** 30126654d7SGreg Roach * @covers \Fisharebest\Webtrees\Tree::__construct 31126654d7SGreg Roach * @covers \Fisharebest\Webtrees\Tree::create 32126654d7SGreg Roach * @covers \Fisharebest\Webtrees\Tree::id 33126654d7SGreg Roach * @covers \Fisharebest\Webtrees\Tree::name 34126654d7SGreg Roach * @covers \Fisharebest\Webtrees\Tree::title 3552348eb8SGreg Roach * 3652348eb8SGreg Roach * @return void 37a25f0a04SGreg Roach */ 38126654d7SGreg Roach public function testConstructor(): void 39c1010edaSGreg Roach { 40126654d7SGreg Roach $tree = Tree::create('tree-name', 'Tree title'); 41126654d7SGreg Roach 42126654d7SGreg Roach $this->assertSame(1, $tree->id()); 43126654d7SGreg Roach $this->assertSame('tree-name', $tree->name()); 44126654d7SGreg Roach $this->assertSame('Tree title', $tree->title()); 45126654d7SGreg Roach } 46126654d7SGreg Roach 47126654d7SGreg Roach /** 48126654d7SGreg Roach * @covers \Fisharebest\Webtrees\Tree::getPreference 49126654d7SGreg Roach * @covers \Fisharebest\Webtrees\Tree::setPreference 50126654d7SGreg Roach * 51126654d7SGreg Roach * @return void 52126654d7SGreg Roach */ 53af343084SGreg Roach public function testTreePreferences(): void 54126654d7SGreg Roach { 55126654d7SGreg Roach $tree = Tree::create('tree-name', 'Tree title'); 56126654d7SGreg Roach 57126654d7SGreg Roach $pref = $tree->getPreference('foo', 'default'); 58126654d7SGreg Roach $this->assertSame('default', $pref); 59126654d7SGreg Roach 60126654d7SGreg Roach $tree->setPreference('foo', 'bar'); 61126654d7SGreg Roach $pref = $tree->getPreference('foo', 'default'); 62126654d7SGreg Roach $this->assertSame('bar', $pref); 63a25f0a04SGreg Roach } 64af343084SGreg Roach 65af343084SGreg Roach /** 66af343084SGreg Roach * @covers \Fisharebest\Webtrees\Tree::getUserPreference 67000dd58cSGreg Roach * @covers \Fisharebest\Webtrees\Tree::setUserPreference 68af343084SGreg Roach * 69af343084SGreg Roach * @return void 70af343084SGreg Roach */ 71af343084SGreg Roach public function testUserTreePreferences(): void 72af343084SGreg Roach { 73af343084SGreg Roach $tree = Tree::create('tree-name', 'Tree title'); 74af343084SGreg Roach $user = User::create('user', 'User', 'user@example.com', 'secret'); 75af343084SGreg Roach 76af343084SGreg Roach $pref = $tree->getUserPreference($user, 'foo', 'default'); 77af343084SGreg Roach $this->assertSame('default', $pref); 78af343084SGreg Roach 79af343084SGreg Roach $tree->setUserPreference($user, 'foo', 'bar'); 80af343084SGreg Roach $pref = $tree->getUserPreference($user, 'foo', 'default'); 81af343084SGreg Roach $this->assertSame('bar', $pref); 82af343084SGreg Roach } 83963fbaeeSGreg Roach 84963fbaeeSGreg Roach /** 857d76853dSGreg Roach * @covers \Fisharebest\Webtrees\Tree::getNewXref 867d76853dSGreg Roach * 877d76853dSGreg Roach * @return void 887d76853dSGreg Roach */ 897d76853dSGreg Roach public function testGetNewXref(): void 907d76853dSGreg Roach { 917d76853dSGreg Roach $tree = Tree::create('tree-name', 'Tree title'); 927d76853dSGreg Roach 937d76853dSGreg Roach $this->assertSame('X1', $tree->getNewXref()); 947d76853dSGreg Roach $this->assertSame('X2', $tree->getNewXref()); 957d76853dSGreg Roach $this->assertSame('X3', $tree->getNewXref()); 967d76853dSGreg Roach $this->assertSame('X4', $tree->getNewXref()); 977d76853dSGreg Roach $this->assertSame('X5', $tree->getNewXref()); 987d76853dSGreg Roach } 997d76853dSGreg Roach 1007d76853dSGreg Roach /** 1017d76853dSGreg Roach * @covers \Fisharebest\Webtrees\Tree::createIndividual 1027d76853dSGreg Roach * @expectedException \InvalidArgumentException 1037d76853dSGreg Roach * 1047d76853dSGreg Roach * @return void 1057d76853dSGreg Roach */ 1067d76853dSGreg Roach public function testCreateInvalidIndividual(): void 1077d76853dSGreg Roach { 1087d76853dSGreg Roach $tree = Tree::create('tree-name', 'Tree title'); 1097d76853dSGreg Roach $user = User::create('user', 'User', 'user@example.com', 'secret'); 1107d76853dSGreg Roach $user->setPreference('canadmin', '1'); 1117d76853dSGreg Roach Auth::login($user); 1127d76853dSGreg Roach 1137d76853dSGreg Roach $tree->createIndividual("0 @@ FOO\n1 SEX U"); 1147d76853dSGreg Roach } 1157d76853dSGreg Roach 1167d76853dSGreg Roach /** 117963fbaeeSGreg Roach * @covers \Fisharebest\Webtrees\Tree::createIndividual 118963fbaeeSGreg Roach * 119963fbaeeSGreg Roach * @return void 120963fbaeeSGreg Roach */ 121963fbaeeSGreg Roach public function testCreateIndividual(): void 122963fbaeeSGreg Roach { 123963fbaeeSGreg Roach $tree = Tree::create('tree-name', 'Tree title'); 124963fbaeeSGreg Roach $user = User::create('user', 'User', 'user@example.com', 'secret'); 125963fbaeeSGreg Roach $user->setPreference('canadmin', '1'); 126963fbaeeSGreg Roach Auth::login($user); 127963fbaeeSGreg Roach 1288f9b0fb2SGreg Roach $record = $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/"); 1298f9b0fb2SGreg Roach $this->assertTrue($record->isPendingAddition()); 130963fbaeeSGreg Roach 131963fbaeeSGreg Roach $user->setPreference('auto_accept', '1'); 1328f9b0fb2SGreg Roach $record = $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/"); 1338f9b0fb2SGreg Roach $this->assertFalse($record->isPendingAddition()); 1348f9b0fb2SGreg Roach } 135963fbaeeSGreg Roach 1368f9b0fb2SGreg Roach /** 1377d76853dSGreg Roach * @covers \Fisharebest\Webtrees\Tree::createFamily 1387d76853dSGreg Roach * @expectedException \InvalidArgumentException 1398f9b0fb2SGreg Roach * 1408f9b0fb2SGreg Roach * @return void 1418f9b0fb2SGreg Roach */ 1427d76853dSGreg Roach public function testCreateInvalidFamily(): void 1438f9b0fb2SGreg Roach { 1448f9b0fb2SGreg Roach $tree = Tree::create('tree-name', 'Tree title'); 1457d76853dSGreg Roach $user = User::create('user', 'User', 'user@example.com', 'secret'); 1467d76853dSGreg Roach $user->setPreference('canadmin', '1'); 1477d76853dSGreg Roach Auth::login($user); 148963fbaeeSGreg Roach 1497d76853dSGreg Roach $tree->createFamily("0 @@ FOO\n1 MARR Y"); 1508f9b0fb2SGreg Roach } 151963fbaeeSGreg Roach 1528f9b0fb2SGreg Roach /** 1538f9b0fb2SGreg Roach * @covers \Fisharebest\Webtrees\Tree::createFamily 1548f9b0fb2SGreg Roach * 1558f9b0fb2SGreg Roach * @return void 1568f9b0fb2SGreg Roach */ 1578f9b0fb2SGreg Roach public function testCreateFamily(): void 1588f9b0fb2SGreg Roach { 1598f9b0fb2SGreg Roach $tree = Tree::create('tree-name', 'Tree title'); 1608f9b0fb2SGreg Roach $user = User::create('user', 'User', 'user@example.com', 'secret'); 1618f9b0fb2SGreg Roach $user->setPreference('canadmin', '1'); 1628f9b0fb2SGreg Roach Auth::login($user); 1638f9b0fb2SGreg Roach 1648f9b0fb2SGreg Roach $record = $tree->createFamily("0 @@ FAM\n1 MARR Y"); 1658f9b0fb2SGreg Roach $this->assertTrue($record->isPendingAddition()); 1668f9b0fb2SGreg Roach 1678f9b0fb2SGreg Roach $user->setPreference('auto_accept', '1'); 1688f9b0fb2SGreg Roach $record = $tree->createFamily("0 @@ FAM\n1 MARR Y"); 1698f9b0fb2SGreg Roach $this->assertFalse($record->isPendingAddition()); 1708f9b0fb2SGreg Roach } 1718f9b0fb2SGreg Roach 1728f9b0fb2SGreg Roach /** 1737d76853dSGreg Roach * @covers \Fisharebest\Webtrees\Tree::createMediaObject 1747d76853dSGreg Roach * @expectedException \InvalidArgumentException 1757d76853dSGreg Roach * 1767d76853dSGreg Roach * @return void 1777d76853dSGreg Roach */ 1787d76853dSGreg Roach public function testCreateInvalidMediaObject(): void 1797d76853dSGreg Roach { 1807d76853dSGreg Roach $tree = Tree::create('tree-name', 'Tree title'); 1817d76853dSGreg Roach $user = User::create('user', 'User', 'user@example.com', 'secret'); 1827d76853dSGreg Roach $user->setPreference('canadmin', '1'); 1837d76853dSGreg Roach Auth::login($user); 1847d76853dSGreg Roach 1857d76853dSGreg Roach $tree->createMediaObject("0 @@ FOO\n1 MARR Y"); 1867d76853dSGreg Roach } 1877d76853dSGreg Roach 1887d76853dSGreg Roach /** 1897d76853dSGreg Roach * @covers \Fisharebest\Webtrees\Tree::createMediaObject 1907d76853dSGreg Roach * 1917d76853dSGreg Roach * @return void 1927d76853dSGreg Roach */ 1937d76853dSGreg Roach public function testCreateMediaObject(): void 1947d76853dSGreg Roach { 1957d76853dSGreg Roach $tree = Tree::create('tree-name', 'Tree title'); 1967d76853dSGreg Roach $user = User::create('user', 'User', 'user@example.com', 'secret'); 1977d76853dSGreg Roach $user->setPreference('canadmin', '1'); 1987d76853dSGreg Roach Auth::login($user); 1997d76853dSGreg Roach 2007d76853dSGreg Roach $record = $tree->createMediaObject("0 @@ OBJE\n1 FILE foo.jpeg"); 2017d76853dSGreg Roach $this->assertTrue($record->isPendingAddition()); 2027d76853dSGreg Roach 2037d76853dSGreg Roach $user->setPreference('auto_accept', '1'); 2047d76853dSGreg Roach $record = $tree->createMediaObject("0 @@ OBJE\n1 FILE foo.jpeg"); 2057d76853dSGreg Roach $this->assertFalse($record->isPendingAddition()); 2067d76853dSGreg Roach } 2077d76853dSGreg Roach 2087d76853dSGreg Roach /** 209bec87e94SGreg Roach * @covers \Fisharebest\Webtrees\Tree::createRecord 210bec87e94SGreg Roach * @expectedException \InvalidArgumentException 211bec87e94SGreg Roach * 212bec87e94SGreg Roach * @return void 213bec87e94SGreg Roach */ 214bec87e94SGreg Roach public function testCreateInvalidRecord(): void 215bec87e94SGreg Roach { 216bec87e94SGreg Roach $tree = Tree::create('tree-name', 'Tree title'); 217bec87e94SGreg Roach $user = User::create('user', 'User', 'user@example.com', 'secret'); 218bec87e94SGreg Roach $user->setPreference('canadmin', '1'); 219bec87e94SGreg Roach Auth::login($user); 220bec87e94SGreg Roach 221bec87e94SGreg Roach $tree->createRecord("0 @@FOO\n1 NOTE noted"); 222bec87e94SGreg Roach } 223bec87e94SGreg Roach 224bec87e94SGreg Roach /** 225bec87e94SGreg Roach * @covers \Fisharebest\Webtrees\Tree::createRecord 226bec87e94SGreg Roach * 227bec87e94SGreg Roach * @return void 228bec87e94SGreg Roach */ 229bec87e94SGreg Roach public function testCreateRecord(): void 230bec87e94SGreg Roach { 231bec87e94SGreg Roach $tree = Tree::create('tree-name', 'Tree title'); 232bec87e94SGreg Roach $user = User::create('user', 'User', 'user@example.com', 'secret'); 233bec87e94SGreg Roach $user->setPreference('canadmin', '1'); 234bec87e94SGreg Roach Auth::login($user); 235bec87e94SGreg Roach 236bec87e94SGreg Roach $record = $tree->createRecord("0 @@ FOO\n1 NOTE noted"); 237bec87e94SGreg Roach $this->assertTrue($record->isPendingAddition()); 238bec87e94SGreg Roach 239bec87e94SGreg Roach $user->setPreference('auto_accept', '1'); 240bec87e94SGreg Roach $record = $tree->createRecord("0 @@ FOO\n1 NOTE noted"); 241bec87e94SGreg Roach $this->assertFalse($record->isPendingAddition()); 242bec87e94SGreg Roach } 243bec87e94SGreg Roach 244bec87e94SGreg Roach /** 2458f9b0fb2SGreg Roach * @covers \Fisharebest\Webtrees\Tree::significantIndividual 2468f9b0fb2SGreg Roach * 2478f9b0fb2SGreg Roach * @return void 2488f9b0fb2SGreg Roach */ 2498f9b0fb2SGreg Roach public function testSignificantIndividual(): void 2508f9b0fb2SGreg Roach { 2518f9b0fb2SGreg Roach $tree = Tree::create('tree-name', 'Tree title'); 2528f9b0fb2SGreg Roach $user = User::create('user', 'User', 'user@example.com', 'secret'); 2538f9b0fb2SGreg Roach $user->setPreference('auto_accept', '1'); 2548f9b0fb2SGreg Roach Auth::login($user); 2558f9b0fb2SGreg Roach 2568f9b0fb2SGreg Roach // No individuals in tree? Dummy individual 2578f9b0fb2SGreg Roach $this->assertSame('I', $tree->significantIndividual($user)->xref()); 2588f9b0fb2SGreg Roach 2598f9b0fb2SGreg Roach $record1 = $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/"); 2608f9b0fb2SGreg Roach $record2 = $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/"); 2618f9b0fb2SGreg Roach $record3 = $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/"); 2628f9b0fb2SGreg Roach $record4 = $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/"); 2638f9b0fb2SGreg Roach 2648f9b0fb2SGreg Roach // Individuals exist? First one (lowest XREF). 2658f9b0fb2SGreg Roach $this->assertSame($record1->xref(), $tree->significantIndividual($user)->xref()); 2668f9b0fb2SGreg Roach 2678f9b0fb2SGreg Roach // Preference for tree? 2688f9b0fb2SGreg Roach $tree->setPreference('PEDIGREE_ROOT_ID', $record2->xref()); 2698f9b0fb2SGreg Roach $this->assertSame($record2->xref(), $tree->significantIndividual($user)->xref()); 2708f9b0fb2SGreg Roach 2718f9b0fb2SGreg Roach // User preference 2728f9b0fb2SGreg Roach $tree->setUserPreference($user, 'gedcomid', $record3->xref()); 2738f9b0fb2SGreg Roach $this->assertSame($record3->xref(), $tree->significantIndividual($user)->xref()); 2748f9b0fb2SGreg Roach 2758f9b0fb2SGreg Roach // User record 2768f9b0fb2SGreg Roach $tree->setUserPreference($user, 'rootid', $record4->xref()); 2778f9b0fb2SGreg Roach $this->assertSame($record4->xref(), $tree->significantIndividual($user)->xref()); 278963fbaeeSGreg Roach } 279a7890280SGreg Roach 280a7890280SGreg Roach /** 281a7890280SGreg Roach * @covers \Fisharebest\Webtrees\Tree::importGedcomFile 282a7890280SGreg Roach * @covers \Fisharebest\Webtrees\Tree::deleteGenealogyData 283a7890280SGreg Roach * @covers \Fisharebest\Webtrees\Tree::delete 284a7890280SGreg Roach * 285a7890280SGreg Roach * @return void 286a7890280SGreg Roach */ 287a7890280SGreg Roach public function testImportAndDeleteGedcomFile(): void 288a7890280SGreg Roach { 289a7890280SGreg Roach $tree = $this->importTree('demo.ged'); 290a7890280SGreg Roach $this->assertNotNull(Tree::findByName('demo.ged')); 291a7890280SGreg Roach 292a7890280SGreg Roach $tree->delete(); 293a7890280SGreg Roach $this->assertNull(Tree::findByName('demo.ged')); 294a7890280SGreg Roach } 29515a3f100SGreg Roach 29615a3f100SGreg Roach /** 29715a3f100SGreg Roach * @covers \Fisharebest\Webtrees\Tree::hasPendingEdit 29815a3f100SGreg Roach * 29915a3f100SGreg Roach * @return void 30015a3f100SGreg Roach */ 30115a3f100SGreg Roach public function testHasPendingEdits(): void 30215a3f100SGreg Roach { 30315a3f100SGreg Roach $tree = $this->importTree('demo.ged'); 30415a3f100SGreg Roach $user = User::create('admin', 'Administrator', 'admin@example.com', 'secret'); 30515a3f100SGreg Roach $user->setPreference('canadmin', '1'); 30615a3f100SGreg Roach Auth::login($user); 30715a3f100SGreg Roach 30815a3f100SGreg Roach $user->setPreference('auto_accept', '1'); 30915a3f100SGreg Roach $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/"); 31015a3f100SGreg Roach $this->assertFalse($tree->hasPendingEdit()); 31115a3f100SGreg Roach 31215a3f100SGreg Roach $user->setPreference('auto_accept', '0'); 31315a3f100SGreg Roach $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/"); 31415a3f100SGreg Roach $this->assertTrue($tree->hasPendingEdit()); 31515a3f100SGreg Roach } 316*94026f20SGreg Roach 317*94026f20SGreg Roach /** 318*94026f20SGreg Roach * @covers \Fisharebest\Webtrees\Tree::exportGedcom 319*94026f20SGreg Roach * 320*94026f20SGreg Roach * @return void 321*94026f20SGreg Roach */ 322*94026f20SGreg Roach public function testExportGedcom(): void 323*94026f20SGreg Roach { 324*94026f20SGreg Roach $tree = $this->importTree('demo.ged'); 325*94026f20SGreg Roach 326*94026f20SGreg Roach $fp = fopen('php://memory', 'w'); 327*94026f20SGreg Roach 328*94026f20SGreg Roach $tree->exportGedcom($fp); 329*94026f20SGreg Roach 330*94026f20SGreg Roach rewind($fp); 331*94026f20SGreg Roach 332*94026f20SGreg Roach $original = file_get_contents(__DIR__ . '/../data/demo.ged'); 333*94026f20SGreg Roach $export = stream_get_contents($fp); 334*94026f20SGreg Roach 335*94026f20SGreg Roach // The date and time in the HEAD record will be different. 336*94026f20SGreg Roach $original = preg_replace('/\n1 DATE .. ... ..../', '', $original, 1); 337*94026f20SGreg Roach $export = preg_replace('/\n1 DATE .. ... ..../', '', $export, 1); 338*94026f20SGreg Roach $original = preg_replace('/\n2 TIME ..:..:../', '', $original, 1); 339*94026f20SGreg Roach $export = preg_replace('/\n2 TIME ..:..:../', '', $export, 1); 340*94026f20SGreg Roach 341*94026f20SGreg Roach $this->assertSame($original, $export); 342*94026f20SGreg Roach } 343a25f0a04SGreg Roach} 344