xref: /webtrees/tests/app/TreeTest.php (revision 94026f200c17dcfccf296678dc90ea88b14f6246)
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