xref: /webtrees/tests/app/TreeTest.php (revision d11be7027e34e3121be11cc025421873364403f9)
1a25f0a04SGreg Roach<?php
23976b470SGreg Roach
3a25f0a04SGreg Roach/**
4a25f0a04SGreg Roach * webtrees: online genealogy
5*d11be702SGreg Roach * Copyright (C) 2023 webtrees development team
6a25f0a04SGreg Roach * This program is free software: you can redistribute it and/or modify
7a25f0a04SGreg Roach * it under the terms of the GNU General Public License as published by
8a25f0a04SGreg Roach * the Free Software Foundation, either version 3 of the License, or
9a25f0a04SGreg Roach * (at your option) any later version.
10a25f0a04SGreg Roach * This program is distributed in the hope that it will be useful,
11a25f0a04SGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of
12a25f0a04SGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13a25f0a04SGreg Roach * GNU General Public License for more details.
14a25f0a04SGreg Roach * You should have received a copy of the GNU General Public License
1589f7189bSGreg Roach * along with this program. If not, see <https://www.gnu.org/licenses/>.
16a25f0a04SGreg Roach */
17fcfa147eSGreg Roach
18e7f56f2aSGreg Roachdeclare(strict_types=1);
19e7f56f2aSGreg Roach
2084e2cf4eSGreg Roachnamespace Fisharebest\Webtrees;
21a25f0a04SGreg Roach
2269675509SGreg Roachuse Fisharebest\Webtrees\Contracts\CacheFactoryInterface;
231fe542e9SGreg Roachuse Fisharebest\Webtrees\Contracts\UserInterface;
2469c05a6eSGreg Roachuse Fisharebest\Webtrees\Services\GedcomExportService;
252c685d76SGreg Roachuse Fisharebest\Webtrees\Services\GedcomImportService;
265afbc57aSGreg Roachuse Fisharebest\Webtrees\Services\TreeService;
27e5a6b4d4SGreg Roachuse Fisharebest\Webtrees\Services\UserService;
283cfcc809SGreg Roachuse InvalidArgumentException;
2916ecfcafSGreg Roachuse Nyholm\Psr7\Factory\Psr17Factory;
3069675509SGreg Roachuse Symfony\Component\Cache\Adapter\NullAdapter;
313976b470SGreg Roach
32ea517a3bSGreg Roachuse function fclose;
33ea517a3bSGreg Roachuse function file_get_contents;
34ea517a3bSGreg Roachuse function preg_replace;
3594026f20SGreg Roachuse function stream_get_contents;
3694026f20SGreg Roach
37a25f0a04SGreg Roach/**
38a25f0a04SGreg Roach * Test harness for the class Tree
39a25f0a04SGreg Roach */
40e5a6b4d4SGreg Roachclass TreeTest extends TestCase
41c1010edaSGreg Roach{
42cd94ca66SGreg Roach    protected static bool $uses_database = true;
43126654d7SGreg Roach
4492a78a2fSGreg Roach    /**
4592a78a2fSGreg Roach     * Things to run before every test.
4692a78a2fSGreg Roach     */
4757b69958SGreg Roach    protected function setUp(): void
4869675509SGreg Roach    {
4969675509SGreg Roach        parent::setUp();
5069675509SGreg Roach
51cd94ca66SGreg Roach        $cache_factory = $this->createMock(CacheFactoryInterface::class);
5269675509SGreg Roach        $cache_factory->method('array')->willReturn(new Cache(new NullAdapter()));
536b9cb339SGreg Roach        Registry::cache($cache_factory);
5469675509SGreg Roach    }
5569675509SGreg Roach
56a25f0a04SGreg Roach    /**
57126654d7SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::__construct
58126654d7SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::id
59126654d7SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::name
60126654d7SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::title
6152348eb8SGreg Roach     * @return void
62a25f0a04SGreg Roach     */
63126654d7SGreg Roach    public function testConstructor(): void
64c1010edaSGreg Roach    {
652c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
662c685d76SGreg Roach        $tree_service          = new TreeService($gedcom_import_service);
671e653452SGreg Roach        $tree                  = $tree_service->create('name', 'title');
68126654d7SGreg Roach
695e933c21SGreg Roach        self::assertSame('name', $tree->name());
705e933c21SGreg Roach        self::assertSame('title', $tree->title());
71126654d7SGreg Roach    }
72126654d7SGreg Roach
73126654d7SGreg Roach    /**
74126654d7SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::getPreference
75126654d7SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::setPreference
76126654d7SGreg Roach     * @return void
77126654d7SGreg Roach     */
78af343084SGreg Roach    public function testTreePreferences(): void
79126654d7SGreg Roach    {
802c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
812c685d76SGreg Roach        $tree_service          = new TreeService($gedcom_import_service);
821e653452SGreg Roach        $tree                  = $tree_service->create('name', 'title');
83126654d7SGreg Roach
84126654d7SGreg Roach        $tree->setPreference('foo', 'bar');
858a07c98eSGreg Roach        $pref = $tree->getPreference('foo');
865e933c21SGreg Roach        self::assertSame('bar', $pref);
87a25f0a04SGreg Roach    }
88af343084SGreg Roach
89af343084SGreg Roach    /**
90af343084SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::getUserPreference
91000dd58cSGreg Roach     * @covers \Fisharebest\Webtrees\Tree::setUserPreference
92af343084SGreg Roach     * @return void
93af343084SGreg Roach     */
94af343084SGreg Roach    public function testUserTreePreferences(): void
95af343084SGreg Roach    {
96e5a6b4d4SGreg Roach        $user_service          = new UserService();
972c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
982c685d76SGreg Roach        $tree_service          = new TreeService($gedcom_import_service);
991e653452SGreg Roach        $tree                  = $tree_service->create('name', 'title');
100e5a6b4d4SGreg Roach        $user                  = $user_service->create('user', 'User', 'user@example.com', 'secret');
101af343084SGreg Roach
102af343084SGreg Roach        $pref = $tree->getUserPreference($user, 'foo', 'default');
1035e933c21SGreg Roach        self::assertSame('default', $pref);
104af343084SGreg Roach
105af343084SGreg Roach        $tree->setUserPreference($user, 'foo', 'bar');
106af343084SGreg Roach        $pref = $tree->getUserPreference($user, 'foo', 'default');
1075e933c21SGreg Roach        self::assertSame('bar', $pref);
1087d76853dSGreg Roach    }
1097d76853dSGreg Roach
1107d76853dSGreg Roach    /**
1117d76853dSGreg Roach     * @covers \Fisharebest\Webtrees\Tree::createIndividual
1127d76853dSGreg Roach     * @return void
1137d76853dSGreg Roach     */
1147d76853dSGreg Roach    public function testCreateInvalidIndividual(): void
1157d76853dSGreg Roach    {
1163cfcc809SGreg Roach        $this->expectException(InvalidArgumentException::class);
1173cfcc809SGreg Roach
118e5a6b4d4SGreg Roach        $user_service          = new UserService();
1192c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
1202c685d76SGreg Roach        $tree_service          = new TreeService($gedcom_import_service);
1211e653452SGreg Roach        $tree                  = $tree_service->create('name', 'title');
122e5a6b4d4SGreg Roach        $user                  = $user_service->create('user', 'User', 'user@example.com', 'secret');
1231fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_IS_ADMINISTRATOR, '1');
1247d76853dSGreg Roach        Auth::login($user);
1257d76853dSGreg Roach
1267d76853dSGreg Roach        $tree->createIndividual("0 @@ FOO\n1 SEX U");
1277d76853dSGreg Roach    }
1287d76853dSGreg Roach
1297d76853dSGreg Roach    /**
130963fbaeeSGreg Roach     * @covers \Fisharebest\Webtrees\Tree::createIndividual
131963fbaeeSGreg Roach     * @return void
132963fbaeeSGreg Roach     */
133963fbaeeSGreg Roach    public function testCreateIndividual(): void
134963fbaeeSGreg Roach    {
135e5a6b4d4SGreg Roach        $user_service          = new UserService();
1362c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
1372c685d76SGreg Roach        $tree_service          = new TreeService($gedcom_import_service);
1381e653452SGreg Roach        $tree                  = $tree_service->create('name', 'title');
139e5a6b4d4SGreg Roach        $user                  = $user_service->create('user', 'User', 'user@example.com', 'secret');
1401fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_IS_ADMINISTRATOR, '1');
141963fbaeeSGreg Roach        Auth::login($user);
142963fbaeeSGreg Roach
1438f9b0fb2SGreg Roach        $record = $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/");
1445e933c21SGreg Roach        self::assertTrue($record->isPendingAddition());
145963fbaeeSGreg Roach
1461fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS, '1');
1478f9b0fb2SGreg Roach        $record = $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/");
1485e933c21SGreg Roach        self::assertFalse($record->isPendingAddition());
1498f9b0fb2SGreg Roach    }
150963fbaeeSGreg Roach
1518f9b0fb2SGreg Roach    /**
1527d76853dSGreg Roach     * @covers \Fisharebest\Webtrees\Tree::createFamily
1538f9b0fb2SGreg Roach     * @return void
1548f9b0fb2SGreg Roach     */
1557d76853dSGreg Roach    public function testCreateInvalidFamily(): void
1568f9b0fb2SGreg Roach    {
1573cfcc809SGreg Roach        $this->expectException(InvalidArgumentException::class);
1583cfcc809SGreg Roach
159e5a6b4d4SGreg Roach        $user_service          = new UserService();
1602c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
1612c685d76SGreg Roach        $tree_service          = new TreeService($gedcom_import_service);
1621e653452SGreg Roach        $tree                  = $tree_service->create('name', 'title');
163e5a6b4d4SGreg Roach        $user                  = $user_service->create('user', 'User', 'user@example.com', 'secret');
1641fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_IS_ADMINISTRATOR, '1');
1657d76853dSGreg Roach        Auth::login($user);
166963fbaeeSGreg Roach
1677d76853dSGreg Roach        $tree->createFamily("0 @@ FOO\n1 MARR Y");
1688f9b0fb2SGreg Roach    }
169963fbaeeSGreg Roach
1708f9b0fb2SGreg Roach    /**
1718f9b0fb2SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::createFamily
1728f9b0fb2SGreg Roach     * @return void
1738f9b0fb2SGreg Roach     */
1748f9b0fb2SGreg Roach    public function testCreateFamily(): void
1758f9b0fb2SGreg Roach    {
176e5a6b4d4SGreg Roach        $user_service          = new UserService();
1772c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
1782c685d76SGreg Roach        $tree_service          = new TreeService($gedcom_import_service);
1791e653452SGreg Roach        $tree                  = $tree_service->create('name', 'title');
180e5a6b4d4SGreg Roach        $user                  = $user_service->create('user', 'User', 'user@example.com', 'secret');
1811fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_IS_ADMINISTRATOR, '1');
1828f9b0fb2SGreg Roach        Auth::login($user);
1838f9b0fb2SGreg Roach
1848f9b0fb2SGreg Roach        $record = $tree->createFamily("0 @@ FAM\n1 MARR Y");
1855e933c21SGreg Roach        self::assertTrue($record->isPendingAddition());
1868f9b0fb2SGreg Roach
1871fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS, '1');
1888f9b0fb2SGreg Roach        $record = $tree->createFamily("0 @@ FAM\n1 MARR Y");
1895e933c21SGreg Roach        self::assertFalse($record->isPendingAddition());
1908f9b0fb2SGreg Roach    }
1918f9b0fb2SGreg Roach
1928f9b0fb2SGreg Roach    /**
1937d76853dSGreg Roach     * @covers \Fisharebest\Webtrees\Tree::createMediaObject
1947d76853dSGreg Roach     * @return void
1957d76853dSGreg Roach     */
1967d76853dSGreg Roach    public function testCreateInvalidMediaObject(): void
1977d76853dSGreg Roach    {
1983cfcc809SGreg Roach        $this->expectException(InvalidArgumentException::class);
1993cfcc809SGreg Roach
200e5a6b4d4SGreg Roach        $user_service          = new UserService();
2012c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
2022c685d76SGreg Roach        $tree_service          = new TreeService($gedcom_import_service);
2031e653452SGreg Roach        $tree                  = $tree_service->create('name', 'title');
204e5a6b4d4SGreg Roach        $user                  = $user_service->create('user', 'User', 'user@example.com', 'secret');
2051fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_IS_ADMINISTRATOR, '1');
2067d76853dSGreg Roach        Auth::login($user);
2077d76853dSGreg Roach
2087d76853dSGreg Roach        $tree->createMediaObject("0 @@ FOO\n1 MARR Y");
2097d76853dSGreg Roach    }
2107d76853dSGreg Roach
2117d76853dSGreg Roach    /**
2127d76853dSGreg Roach     * @covers \Fisharebest\Webtrees\Tree::createMediaObject
2137d76853dSGreg Roach     * @return void
2147d76853dSGreg Roach     */
2157d76853dSGreg Roach    public function testCreateMediaObject(): void
2167d76853dSGreg Roach    {
217e5a6b4d4SGreg Roach        $user_service          = new UserService();
2182c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
2192c685d76SGreg Roach        $tree_service          = new TreeService($gedcom_import_service);
2201e653452SGreg Roach        $tree                  = $tree_service->create('name', 'title');
221e5a6b4d4SGreg Roach        $user                  = $user_service->create('user', 'User', 'user@example.com', 'secret');
2221fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_IS_ADMINISTRATOR, '1');
2237d76853dSGreg Roach        Auth::login($user);
2247d76853dSGreg Roach
2257d76853dSGreg Roach        $record = $tree->createMediaObject("0 @@ OBJE\n1 FILE foo.jpeg");
2265e933c21SGreg Roach        self::assertTrue($record->isPendingAddition());
2277d76853dSGreg Roach
2281fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS, '1');
2297d76853dSGreg Roach        $record = $tree->createMediaObject("0 @@ OBJE\n1 FILE foo.jpeg");
2305e933c21SGreg Roach        self::assertFalse($record->isPendingAddition());
2317d76853dSGreg Roach    }
2327d76853dSGreg Roach
2337d76853dSGreg Roach    /**
234bec87e94SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::createRecord
235bec87e94SGreg Roach     * @return void
236bec87e94SGreg Roach     */
237bec87e94SGreg Roach    public function testCreateInvalidRecord(): void
238bec87e94SGreg Roach    {
2393cfcc809SGreg Roach        $this->expectException(InvalidArgumentException::class);
2403cfcc809SGreg Roach
241e5a6b4d4SGreg Roach        $user_service          = new UserService();
2422c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
2432c685d76SGreg Roach        $tree_service          = new TreeService($gedcom_import_service);
2441e653452SGreg Roach        $tree                  = $tree_service->create('name', 'title');
245e5a6b4d4SGreg Roach        $user                  = $user_service->create('user', 'User', 'user@example.com', 'secret');
2461fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_IS_ADMINISTRATOR, '1');
247bec87e94SGreg Roach        Auth::login($user);
248bec87e94SGreg Roach
249bec87e94SGreg Roach        $tree->createRecord("0 @@FOO\n1 NOTE noted");
250bec87e94SGreg Roach    }
251bec87e94SGreg Roach
252bec87e94SGreg Roach    /**
253bec87e94SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::createRecord
254bec87e94SGreg Roach     * @return void
255bec87e94SGreg Roach     */
256bec87e94SGreg Roach    public function testCreateRecord(): void
257bec87e94SGreg Roach    {
258e5a6b4d4SGreg Roach        $user_service          = new UserService();
2592c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
2602c685d76SGreg Roach        $tree_service          = new TreeService($gedcom_import_service);
2611e653452SGreg Roach        $tree                  = $tree_service->create('name', 'title');
262e5a6b4d4SGreg Roach        $user                  = $user_service->create('user', 'User', 'user@example.com', 'secret');
2631fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_IS_ADMINISTRATOR, '1');
264bec87e94SGreg Roach        Auth::login($user);
265bec87e94SGreg Roach
266bec87e94SGreg Roach        $record = $tree->createRecord("0 @@ FOO\n1 NOTE noted");
2675e933c21SGreg Roach        self::assertTrue($record->isPendingAddition());
268bec87e94SGreg Roach
2691fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS, '1');
270bec87e94SGreg Roach        $record = $tree->createRecord("0 @@ FOO\n1 NOTE noted");
2715e933c21SGreg Roach        self::assertFalse($record->isPendingAddition());
272bec87e94SGreg Roach    }
273bec87e94SGreg Roach
274bec87e94SGreg Roach    /**
2758f9b0fb2SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::significantIndividual
2768f9b0fb2SGreg Roach     * @return void
2778f9b0fb2SGreg Roach     */
2788f9b0fb2SGreg Roach    public function testSignificantIndividual(): void
2798f9b0fb2SGreg Roach    {
2802c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
281e5a6b4d4SGreg Roach        $user_service = new UserService();
2822c685d76SGreg Roach        $tree_service = new TreeService($gedcom_import_service);
2831e653452SGreg Roach        $tree         = $tree_service->create('name', 'title');
284e5a6b4d4SGreg Roach        $user         = $user_service->create('user', 'User', 'user@example.com', 'secret');
2851fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS, '1');
2868f9b0fb2SGreg Roach        Auth::login($user);
2878f9b0fb2SGreg Roach
2885afbc57aSGreg Roach        // Delete the tree's default individual.
2892c685d76SGreg Roach        $gedcom_import_service->updateRecord('0 @X1@ INDI', $tree, true);
2905afbc57aSGreg Roach
2911f244d77SGreg Roach        // No individuals in tree?  Fake individual
2925e933c21SGreg Roach        self::assertSame('I', $tree->significantIndividual($user)->xref());
2938f9b0fb2SGreg Roach
2948f9b0fb2SGreg Roach        $record1 = $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/");
2958f9b0fb2SGreg Roach        $record2 = $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/");
2968f9b0fb2SGreg Roach        $record3 = $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/");
2978f9b0fb2SGreg Roach        $record4 = $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/");
2988f9b0fb2SGreg Roach
2998f9b0fb2SGreg Roach        // Individuals exist?  First one (lowest XREF).
3005e933c21SGreg Roach        self::assertSame($record1->xref(), $tree->significantIndividual($user)->xref());
3018f9b0fb2SGreg Roach
3028f9b0fb2SGreg Roach        // Preference for tree?
3038f9b0fb2SGreg Roach        $tree->setPreference('PEDIGREE_ROOT_ID', $record2->xref());
3045e933c21SGreg Roach        self::assertSame($record2->xref(), $tree->significantIndividual($user)->xref());
3058f9b0fb2SGreg Roach
3068f9b0fb2SGreg Roach        // User preference
3071fe542e9SGreg Roach        $tree->setUserPreference($user, UserInterface::PREF_TREE_ACCOUNT_XREF, $record3->xref());
3085e933c21SGreg Roach        self::assertSame($record3->xref(), $tree->significantIndividual($user)->xref());
3098f9b0fb2SGreg Roach
3108f9b0fb2SGreg Roach        // User record
3111fe542e9SGreg Roach        $tree->setUserPreference($user, UserInterface::PREF_TREE_DEFAULT_XREF, $record4->xref());
3125e933c21SGreg Roach        self::assertSame($record4->xref(), $tree->significantIndividual($user)->xref());
313963fbaeeSGreg Roach    }
314a7890280SGreg Roach
315a7890280SGreg Roach    /**
3165cd281f4SGreg Roach     * @covers \Fisharebest\Webtrees\Services\TreeService::importGedcomFile
317a7890280SGreg Roach     * @return void
318a7890280SGreg Roach     */
319a7890280SGreg Roach    public function testImportAndDeleteGedcomFile(): void
320a7890280SGreg Roach    {
3212c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
3222c685d76SGreg Roach        $tree_service          = new TreeService($gedcom_import_service);
323a7890280SGreg Roach        $tree                  = $this->importTree('demo.ged');
3245e933c21SGreg Roach        self::assertNotNull($tree_service->all()->get('demo.ged'));
325432ff88aSGreg Roach        Site::setPreference('DEFAULT_GEDCOM', $tree->name());
326a7890280SGreg Roach
3275afbc57aSGreg Roach        $tree_service->delete($tree);
328432ff88aSGreg Roach
3295e933c21SGreg Roach        self::assertNull($tree_service->all()->get('demo.ged'));
3305e933c21SGreg Roach        self::assertSame('', Site::getPreference('DEFAULT_GEDCOM'));
331a7890280SGreg Roach    }
33215a3f100SGreg Roach
33315a3f100SGreg Roach    /**
33415a3f100SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::hasPendingEdit
33515a3f100SGreg Roach     * @return void
33615a3f100SGreg Roach     */
33715a3f100SGreg Roach    public function testHasPendingEdits(): void
33815a3f100SGreg Roach    {
339e5a6b4d4SGreg Roach        $user_service = new UserService();
34015a3f100SGreg Roach        $tree         = $this->importTree('demo.ged');
341e5a6b4d4SGreg Roach        $user         = $user_service->create('admin', 'Administrator', 'admin@example.com', 'secret');
3421fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_IS_ADMINISTRATOR, '1');
34315a3f100SGreg Roach        Auth::login($user);
34415a3f100SGreg Roach
3451fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS, '1');
34615a3f100SGreg Roach        $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/");
3475e933c21SGreg Roach        self::assertFalse($tree->hasPendingEdit());
34815a3f100SGreg Roach
3491fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS, '');
35015a3f100SGreg Roach        $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/");
3515e933c21SGreg Roach        self::assertTrue($tree->hasPendingEdit());
35215a3f100SGreg Roach    }
35394026f20SGreg Roach
35494026f20SGreg Roach    /**
35569c05a6eSGreg Roach     * @covers \Fisharebest\Webtrees\Services\GedcomExportService::export
35694026f20SGreg Roach     * @return void
35794026f20SGreg Roach     */
35894026f20SGreg Roach    public function testExportGedcom(): void
35994026f20SGreg Roach    {
36094026f20SGreg Roach        $tree = $this->importTree('demo.ged');
36194026f20SGreg Roach
36216ecfcafSGreg Roach        $gedcom_export_service = new GedcomExportService(new Psr17Factory(), new Psr17Factory());
36394026f20SGreg Roach
364ea517a3bSGreg Roach        $resource = $gedcom_export_service->export($tree, true);
36594026f20SGreg Roach        $original = file_get_contents(__DIR__ . '/../data/demo.ged');
366ea517a3bSGreg Roach        $export   = stream_get_contents($resource);
367ea517a3bSGreg Roach        fclose($resource);
36894026f20SGreg Roach
36969c05a6eSGreg Roach        // The version, date and time in the HEAD record will be different.
37069c05a6eSGreg Roach        $original = preg_replace('/\n2 VERS .*/', '', $original, 1);
37169c05a6eSGreg Roach        $export   = preg_replace('/\n2 VERS .*/', '', $export, 1);
37294026f20SGreg Roach        $original = preg_replace('/\n1 DATE .. ... ..../', '', $original, 1);
37394026f20SGreg Roach        $export   = preg_replace('/\n1 DATE .. ... ..../', '', $export, 1);
37494026f20SGreg Roach        $original = preg_replace('/\n2 TIME ..:..:../', '', $original, 1);
37594026f20SGreg Roach        $export   = preg_replace('/\n2 TIME ..:..:../', '', $export, 1);
37694026f20SGreg Roach
3775e933c21SGreg Roach        self::assertSame($original, $export);
37894026f20SGreg Roach    }
379a25f0a04SGreg Roach}
380