xref: /webtrees/tests/app/TreeTest.php (revision 5bfc689774bb9a6401271c4ed15a6d50652c991b)
1a25f0a04SGreg Roach<?php
23976b470SGreg Roach
3a25f0a04SGreg Roach/**
4a25f0a04SGreg Roach * webtrees: online genealogy
5*5bfc6897SGreg Roach * Copyright (C) 2022 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;
2969675509SGreg Roachuse Symfony\Component\Cache\Adapter\NullAdapter;
303976b470SGreg Roach
31ea517a3bSGreg Roachuse function fclose;
32ea517a3bSGreg Roachuse function file_get_contents;
33ea517a3bSGreg Roachuse function preg_replace;
3494026f20SGreg Roachuse function stream_get_contents;
3594026f20SGreg Roach
36a25f0a04SGreg Roach/**
37a25f0a04SGreg Roach * Test harness for the class Tree
38a25f0a04SGreg Roach */
39e5a6b4d4SGreg Roachclass TreeTest extends TestCase
40c1010edaSGreg Roach{
41cd94ca66SGreg Roach    protected static bool $uses_database = true;
42126654d7SGreg Roach
4357b69958SGreg Roach    protected function setUp(): void
4469675509SGreg Roach    {
4569675509SGreg Roach        parent::setUp();
4669675509SGreg Roach
47cd94ca66SGreg Roach        $cache_factory = $this->createMock(CacheFactoryInterface::class);
4869675509SGreg Roach        $cache_factory->method('array')->willReturn(new Cache(new NullAdapter()));
496b9cb339SGreg Roach        Registry::cache($cache_factory);
5069675509SGreg Roach    }
5169675509SGreg Roach
52a25f0a04SGreg Roach    /**
53126654d7SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::__construct
54126654d7SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::id
55126654d7SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::name
56126654d7SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::title
5752348eb8SGreg Roach     * @return void
58a25f0a04SGreg Roach     */
59126654d7SGreg Roach    public function testConstructor(): void
60c1010edaSGreg Roach    {
612c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
622c685d76SGreg Roach        $tree_service          = new TreeService($gedcom_import_service);
631e653452SGreg Roach        $tree                  = $tree_service->create('name', 'title');
64126654d7SGreg Roach
655e933c21SGreg Roach        self::assertSame('name', $tree->name());
665e933c21SGreg Roach        self::assertSame('title', $tree->title());
67126654d7SGreg Roach    }
68126654d7SGreg Roach
69126654d7SGreg Roach    /**
70126654d7SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::getPreference
71126654d7SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::setPreference
72126654d7SGreg Roach     * @return void
73126654d7SGreg Roach     */
74af343084SGreg Roach    public function testTreePreferences(): void
75126654d7SGreg Roach    {
762c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
772c685d76SGreg Roach        $tree_service          = new TreeService($gedcom_import_service);
781e653452SGreg Roach        $tree                  = $tree_service->create('name', 'title');
79126654d7SGreg Roach
80126654d7SGreg Roach        $tree->setPreference('foo', 'bar');
818a07c98eSGreg Roach        $pref = $tree->getPreference('foo');
825e933c21SGreg Roach        self::assertSame('bar', $pref);
83a25f0a04SGreg Roach    }
84af343084SGreg Roach
85af343084SGreg Roach    /**
86af343084SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::getUserPreference
87000dd58cSGreg Roach     * @covers \Fisharebest\Webtrees\Tree::setUserPreference
88af343084SGreg Roach     * @return void
89af343084SGreg Roach     */
90af343084SGreg Roach    public function testUserTreePreferences(): void
91af343084SGreg Roach    {
92e5a6b4d4SGreg Roach        $user_service          = new UserService();
932c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
942c685d76SGreg Roach        $tree_service          = new TreeService($gedcom_import_service);
951e653452SGreg Roach        $tree                  = $tree_service->create('name', 'title');
96e5a6b4d4SGreg Roach        $user                  = $user_service->create('user', 'User', 'user@example.com', 'secret');
97af343084SGreg Roach
98af343084SGreg Roach        $pref = $tree->getUserPreference($user, 'foo', 'default');
995e933c21SGreg Roach        self::assertSame('default', $pref);
100af343084SGreg Roach
101af343084SGreg Roach        $tree->setUserPreference($user, 'foo', 'bar');
102af343084SGreg Roach        $pref = $tree->getUserPreference($user, 'foo', 'default');
1035e933c21SGreg Roach        self::assertSame('bar', $pref);
1047d76853dSGreg Roach    }
1057d76853dSGreg Roach
1067d76853dSGreg Roach    /**
1077d76853dSGreg Roach     * @covers \Fisharebest\Webtrees\Tree::createIndividual
1087d76853dSGreg Roach     * @return void
1097d76853dSGreg Roach     */
1107d76853dSGreg Roach    public function testCreateInvalidIndividual(): void
1117d76853dSGreg Roach    {
1123cfcc809SGreg Roach        $this->expectException(InvalidArgumentException::class);
1133cfcc809SGreg Roach
114e5a6b4d4SGreg Roach        $user_service          = new UserService();
1152c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
1162c685d76SGreg Roach        $tree_service          = new TreeService($gedcom_import_service);
1171e653452SGreg Roach        $tree                  = $tree_service->create('name', 'title');
118e5a6b4d4SGreg Roach        $user                  = $user_service->create('user', 'User', 'user@example.com', 'secret');
1191fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_IS_ADMINISTRATOR, '1');
1207d76853dSGreg Roach        Auth::login($user);
1217d76853dSGreg Roach
1227d76853dSGreg Roach        $tree->createIndividual("0 @@ FOO\n1 SEX U");
1237d76853dSGreg Roach    }
1247d76853dSGreg Roach
1257d76853dSGreg Roach    /**
126963fbaeeSGreg Roach     * @covers \Fisharebest\Webtrees\Tree::createIndividual
127963fbaeeSGreg Roach     * @return void
128963fbaeeSGreg Roach     */
129963fbaeeSGreg Roach    public function testCreateIndividual(): void
130963fbaeeSGreg Roach    {
131e5a6b4d4SGreg Roach        $user_service          = new UserService();
1322c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
1332c685d76SGreg Roach        $tree_service          = new TreeService($gedcom_import_service);
1341e653452SGreg Roach        $tree                  = $tree_service->create('name', 'title');
135e5a6b4d4SGreg Roach        $user                  = $user_service->create('user', 'User', 'user@example.com', 'secret');
1361fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_IS_ADMINISTRATOR, '1');
137963fbaeeSGreg Roach        Auth::login($user);
138963fbaeeSGreg Roach
1398f9b0fb2SGreg Roach        $record = $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/");
1405e933c21SGreg Roach        self::assertTrue($record->isPendingAddition());
141963fbaeeSGreg Roach
1421fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS, '1');
1438f9b0fb2SGreg Roach        $record = $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/");
1445e933c21SGreg Roach        self::assertFalse($record->isPendingAddition());
1458f9b0fb2SGreg Roach    }
146963fbaeeSGreg Roach
1478f9b0fb2SGreg Roach    /**
1487d76853dSGreg Roach     * @covers \Fisharebest\Webtrees\Tree::createFamily
1498f9b0fb2SGreg Roach     * @return void
1508f9b0fb2SGreg Roach     */
1517d76853dSGreg Roach    public function testCreateInvalidFamily(): void
1528f9b0fb2SGreg Roach    {
1533cfcc809SGreg Roach        $this->expectException(InvalidArgumentException::class);
1543cfcc809SGreg Roach
155e5a6b4d4SGreg Roach        $user_service          = new UserService();
1562c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
1572c685d76SGreg Roach        $tree_service          = new TreeService($gedcom_import_service);
1581e653452SGreg Roach        $tree                  = $tree_service->create('name', 'title');
159e5a6b4d4SGreg Roach        $user                  = $user_service->create('user', 'User', 'user@example.com', 'secret');
1601fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_IS_ADMINISTRATOR, '1');
1617d76853dSGreg Roach        Auth::login($user);
162963fbaeeSGreg Roach
1637d76853dSGreg Roach        $tree->createFamily("0 @@ FOO\n1 MARR Y");
1648f9b0fb2SGreg Roach    }
165963fbaeeSGreg Roach
1668f9b0fb2SGreg Roach    /**
1678f9b0fb2SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::createFamily
1688f9b0fb2SGreg Roach     * @return void
1698f9b0fb2SGreg Roach     */
1708f9b0fb2SGreg Roach    public function testCreateFamily(): void
1718f9b0fb2SGreg Roach    {
172e5a6b4d4SGreg Roach        $user_service          = new UserService();
1732c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
1742c685d76SGreg Roach        $tree_service          = new TreeService($gedcom_import_service);
1751e653452SGreg Roach        $tree                  = $tree_service->create('name', 'title');
176e5a6b4d4SGreg Roach        $user                  = $user_service->create('user', 'User', 'user@example.com', 'secret');
1771fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_IS_ADMINISTRATOR, '1');
1788f9b0fb2SGreg Roach        Auth::login($user);
1798f9b0fb2SGreg Roach
1808f9b0fb2SGreg Roach        $record = $tree->createFamily("0 @@ FAM\n1 MARR Y");
1815e933c21SGreg Roach        self::assertTrue($record->isPendingAddition());
1828f9b0fb2SGreg Roach
1831fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS, '1');
1848f9b0fb2SGreg Roach        $record = $tree->createFamily("0 @@ FAM\n1 MARR Y");
1855e933c21SGreg Roach        self::assertFalse($record->isPendingAddition());
1868f9b0fb2SGreg Roach    }
1878f9b0fb2SGreg Roach
1888f9b0fb2SGreg Roach    /**
1897d76853dSGreg Roach     * @covers \Fisharebest\Webtrees\Tree::createMediaObject
1907d76853dSGreg Roach     * @return void
1917d76853dSGreg Roach     */
1927d76853dSGreg Roach    public function testCreateInvalidMediaObject(): void
1937d76853dSGreg Roach    {
1943cfcc809SGreg Roach        $this->expectException(InvalidArgumentException::class);
1953cfcc809SGreg Roach
196e5a6b4d4SGreg Roach        $user_service          = new UserService();
1972c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
1982c685d76SGreg Roach        $tree_service          = new TreeService($gedcom_import_service);
1991e653452SGreg Roach        $tree                  = $tree_service->create('name', 'title');
200e5a6b4d4SGreg Roach        $user                  = $user_service->create('user', 'User', 'user@example.com', 'secret');
2011fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_IS_ADMINISTRATOR, '1');
2027d76853dSGreg Roach        Auth::login($user);
2037d76853dSGreg Roach
2047d76853dSGreg Roach        $tree->createMediaObject("0 @@ FOO\n1 MARR Y");
2057d76853dSGreg Roach    }
2067d76853dSGreg Roach
2077d76853dSGreg Roach    /**
2087d76853dSGreg Roach     * @covers \Fisharebest\Webtrees\Tree::createMediaObject
2097d76853dSGreg Roach     * @return void
2107d76853dSGreg Roach     */
2117d76853dSGreg Roach    public function testCreateMediaObject(): void
2127d76853dSGreg Roach    {
213e5a6b4d4SGreg Roach        $user_service          = new UserService();
2142c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
2152c685d76SGreg Roach        $tree_service          = new TreeService($gedcom_import_service);
2161e653452SGreg Roach        $tree                  = $tree_service->create('name', 'title');
217e5a6b4d4SGreg Roach        $user                  = $user_service->create('user', 'User', 'user@example.com', 'secret');
2181fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_IS_ADMINISTRATOR, '1');
2197d76853dSGreg Roach        Auth::login($user);
2207d76853dSGreg Roach
2217d76853dSGreg Roach        $record = $tree->createMediaObject("0 @@ OBJE\n1 FILE foo.jpeg");
2225e933c21SGreg Roach        self::assertTrue($record->isPendingAddition());
2237d76853dSGreg Roach
2241fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS, '1');
2257d76853dSGreg Roach        $record = $tree->createMediaObject("0 @@ OBJE\n1 FILE foo.jpeg");
2265e933c21SGreg Roach        self::assertFalse($record->isPendingAddition());
2277d76853dSGreg Roach    }
2287d76853dSGreg Roach
2297d76853dSGreg Roach    /**
230bec87e94SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::createRecord
231bec87e94SGreg Roach     * @return void
232bec87e94SGreg Roach     */
233bec87e94SGreg Roach    public function testCreateInvalidRecord(): void
234bec87e94SGreg Roach    {
2353cfcc809SGreg Roach        $this->expectException(InvalidArgumentException::class);
2363cfcc809SGreg Roach
237e5a6b4d4SGreg Roach        $user_service          = new UserService();
2382c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
2392c685d76SGreg Roach        $tree_service          = new TreeService($gedcom_import_service);
2401e653452SGreg Roach        $tree                  = $tree_service->create('name', 'title');
241e5a6b4d4SGreg Roach        $user                  = $user_service->create('user', 'User', 'user@example.com', 'secret');
2421fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_IS_ADMINISTRATOR, '1');
243bec87e94SGreg Roach        Auth::login($user);
244bec87e94SGreg Roach
245bec87e94SGreg Roach        $tree->createRecord("0 @@FOO\n1 NOTE noted");
246bec87e94SGreg Roach    }
247bec87e94SGreg Roach
248bec87e94SGreg Roach    /**
249bec87e94SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::createRecord
250bec87e94SGreg Roach     * @return void
251bec87e94SGreg Roach     */
252bec87e94SGreg Roach    public function testCreateRecord(): void
253bec87e94SGreg Roach    {
254e5a6b4d4SGreg Roach        $user_service          = new UserService();
2552c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
2562c685d76SGreg Roach        $tree_service          = new TreeService($gedcom_import_service);
2571e653452SGreg Roach        $tree                  = $tree_service->create('name', 'title');
258e5a6b4d4SGreg Roach        $user                  = $user_service->create('user', 'User', 'user@example.com', 'secret');
2591fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_IS_ADMINISTRATOR, '1');
260bec87e94SGreg Roach        Auth::login($user);
261bec87e94SGreg Roach
262bec87e94SGreg Roach        $record = $tree->createRecord("0 @@ FOO\n1 NOTE noted");
2635e933c21SGreg Roach        self::assertTrue($record->isPendingAddition());
264bec87e94SGreg Roach
2651fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS, '1');
266bec87e94SGreg Roach        $record = $tree->createRecord("0 @@ FOO\n1 NOTE noted");
2675e933c21SGreg Roach        self::assertFalse($record->isPendingAddition());
268bec87e94SGreg Roach    }
269bec87e94SGreg Roach
270bec87e94SGreg Roach    /**
2718f9b0fb2SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::significantIndividual
2728f9b0fb2SGreg Roach     * @return void
2738f9b0fb2SGreg Roach     */
2748f9b0fb2SGreg Roach    public function testSignificantIndividual(): void
2758f9b0fb2SGreg Roach    {
2762c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
277e5a6b4d4SGreg Roach        $user_service = new UserService();
2782c685d76SGreg Roach        $tree_service = new TreeService($gedcom_import_service);
2791e653452SGreg Roach        $tree         = $tree_service->create('name', 'title');
280e5a6b4d4SGreg Roach        $user         = $user_service->create('user', 'User', 'user@example.com', 'secret');
2811fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS, '1');
2828f9b0fb2SGreg Roach        Auth::login($user);
2838f9b0fb2SGreg Roach
2845afbc57aSGreg Roach        // Delete the tree's default individual.
2852c685d76SGreg Roach        $gedcom_import_service->updateRecord('0 @X1@ INDI', $tree, true);
2865afbc57aSGreg Roach
2871f244d77SGreg Roach        // No individuals in tree?  Fake individual
2885e933c21SGreg Roach        self::assertSame('I', $tree->significantIndividual($user)->xref());
2898f9b0fb2SGreg Roach
2908f9b0fb2SGreg Roach        $record1 = $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/");
2918f9b0fb2SGreg Roach        $record2 = $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/");
2928f9b0fb2SGreg Roach        $record3 = $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/");
2938f9b0fb2SGreg Roach        $record4 = $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/");
2948f9b0fb2SGreg Roach
2958f9b0fb2SGreg Roach        // Individuals exist?  First one (lowest XREF).
2965e933c21SGreg Roach        self::assertSame($record1->xref(), $tree->significantIndividual($user)->xref());
2978f9b0fb2SGreg Roach
2988f9b0fb2SGreg Roach        // Preference for tree?
2998f9b0fb2SGreg Roach        $tree->setPreference('PEDIGREE_ROOT_ID', $record2->xref());
3005e933c21SGreg Roach        self::assertSame($record2->xref(), $tree->significantIndividual($user)->xref());
3018f9b0fb2SGreg Roach
3028f9b0fb2SGreg Roach        // User preference
3031fe542e9SGreg Roach        $tree->setUserPreference($user, UserInterface::PREF_TREE_ACCOUNT_XREF, $record3->xref());
3045e933c21SGreg Roach        self::assertSame($record3->xref(), $tree->significantIndividual($user)->xref());
3058f9b0fb2SGreg Roach
3068f9b0fb2SGreg Roach        // User record
3071fe542e9SGreg Roach        $tree->setUserPreference($user, UserInterface::PREF_TREE_DEFAULT_XREF, $record4->xref());
3085e933c21SGreg Roach        self::assertSame($record4->xref(), $tree->significantIndividual($user)->xref());
309963fbaeeSGreg Roach    }
310a7890280SGreg Roach
311a7890280SGreg Roach    /**
3125cd281f4SGreg Roach     * @covers \Fisharebest\Webtrees\Services\TreeService::importGedcomFile
3135cd281f4SGreg Roach     * @covers \Fisharebest\Webtrees\Services\TreeService::deleteGenealogyData
314a7890280SGreg Roach     * @return void
315a7890280SGreg Roach     */
316a7890280SGreg Roach    public function testImportAndDeleteGedcomFile(): void
317a7890280SGreg Roach    {
3182c685d76SGreg Roach        $gedcom_import_service = new GedcomImportService();
3192c685d76SGreg Roach        $tree_service          = new TreeService($gedcom_import_service);
320a7890280SGreg Roach        $tree                  = $this->importTree('demo.ged');
3215e933c21SGreg Roach        self::assertNotNull($tree_service->all()->get('demo.ged'));
322432ff88aSGreg Roach        Site::setPreference('DEFAULT_GEDCOM', $tree->name());
323a7890280SGreg Roach
3245afbc57aSGreg Roach        $tree_service->delete($tree);
325432ff88aSGreg Roach
3265e933c21SGreg Roach        self::assertNull($tree_service->all()->get('demo.ged'));
3275e933c21SGreg Roach        self::assertSame('', Site::getPreference('DEFAULT_GEDCOM'));
328a7890280SGreg Roach    }
32915a3f100SGreg Roach
33015a3f100SGreg Roach    /**
33115a3f100SGreg Roach     * @covers \Fisharebest\Webtrees\Tree::hasPendingEdit
33215a3f100SGreg Roach     * @return void
33315a3f100SGreg Roach     */
33415a3f100SGreg Roach    public function testHasPendingEdits(): void
33515a3f100SGreg Roach    {
336e5a6b4d4SGreg Roach        $user_service = new UserService();
33715a3f100SGreg Roach        $tree         = $this->importTree('demo.ged');
338e5a6b4d4SGreg Roach        $user         = $user_service->create('admin', 'Administrator', 'admin@example.com', 'secret');
3391fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_IS_ADMINISTRATOR, '1');
34015a3f100SGreg Roach        Auth::login($user);
34115a3f100SGreg Roach
3421fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS, '1');
34315a3f100SGreg Roach        $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/");
3445e933c21SGreg Roach        self::assertFalse($tree->hasPendingEdit());
34515a3f100SGreg Roach
3461fe542e9SGreg Roach        $user->setPreference(UserInterface::PREF_AUTO_ACCEPT_EDITS, '');
34715a3f100SGreg Roach        $tree->createIndividual("0 @@ INDI\n1 SEX F\n1 NAME Foo /Bar/");
3485e933c21SGreg Roach        self::assertTrue($tree->hasPendingEdit());
34915a3f100SGreg Roach    }
35094026f20SGreg Roach
35194026f20SGreg Roach    /**
35269c05a6eSGreg Roach     * @covers \Fisharebest\Webtrees\Services\GedcomExportService::export
35394026f20SGreg Roach     * @return void
35494026f20SGreg Roach     */
35594026f20SGreg Roach    public function testExportGedcom(): void
35694026f20SGreg Roach    {
35794026f20SGreg Roach        $tree = $this->importTree('demo.ged');
35894026f20SGreg Roach
35969c05a6eSGreg Roach        $gedcom_export_service = new GedcomExportService();
36094026f20SGreg Roach
361ea517a3bSGreg Roach        $resource = $gedcom_export_service->export($tree, true);
36294026f20SGreg Roach        $original = file_get_contents(__DIR__ . '/../data/demo.ged');
363ea517a3bSGreg Roach        $export   = stream_get_contents($resource);
364ea517a3bSGreg Roach        fclose($resource);
36594026f20SGreg Roach
36669c05a6eSGreg Roach        // The version, date and time in the HEAD record will be different.
36769c05a6eSGreg Roach        $original = preg_replace('/\n2 VERS .*/', '', $original, 1);
36869c05a6eSGreg Roach        $export   = preg_replace('/\n2 VERS .*/', '', $export, 1);
36994026f20SGreg Roach        $original = preg_replace('/\n1 DATE .. ... ..../', '', $original, 1);
37094026f20SGreg Roach        $export   = preg_replace('/\n1 DATE .. ... ..../', '', $export, 1);
37194026f20SGreg Roach        $original = preg_replace('/\n2 TIME ..:..:../', '', $original, 1);
37294026f20SGreg Roach        $export   = preg_replace('/\n2 TIME ..:..:../', '', $export, 1);
37394026f20SGreg Roach
3745e933c21SGreg Roach        self::assertSame($original, $export);
37594026f20SGreg Roach    }
376a25f0a04SGreg Roach}
377