aboutsummaryrefslogtreecommitdiffstats
path: root/apps/dav/tests/integration/UserMigration/ContactsMigratorTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'apps/dav/tests/integration/UserMigration/ContactsMigratorTest.php')
-rw-r--r--apps/dav/tests/integration/UserMigration/ContactsMigratorTest.php143
1 files changed, 143 insertions, 0 deletions
diff --git a/apps/dav/tests/integration/UserMigration/ContactsMigratorTest.php b/apps/dav/tests/integration/UserMigration/ContactsMigratorTest.php
new file mode 100644
index 00000000000..9ae1ca28501
--- /dev/null
+++ b/apps/dav/tests/integration/UserMigration/ContactsMigratorTest.php
@@ -0,0 +1,143 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\DAV\Tests\integration\UserMigration;
+
+use OCA\DAV\AppInfo\Application;
+use OCA\DAV\UserMigration\ContactsMigrator;
+use OCP\AppFramework\App;
+use OCP\IUserManager;
+use Sabre\VObject\Component\VCard;
+use Sabre\VObject\Parser\Parser as VObjectParser;
+use Sabre\VObject\Property as VObjectProperty;
+use Sabre\VObject\Splitter\VCard as VCardSplitter;
+use Sabre\VObject\UUIDUtil;
+use Symfony\Component\Console\Output\OutputInterface;
+use Test\TestCase;
+use function scandir;
+
+/**
+ * @group DB
+ */
+class ContactsMigratorTest extends TestCase {
+
+ private IUserManager $userManager;
+
+ private ContactsMigrator $migrator;
+
+ private OutputInterface $output;
+
+ private const ASSETS_DIR = __DIR__ . '/assets/address_books/';
+
+ protected function setUp(): void {
+ $app = new App(Application::APP_ID);
+ $container = $app->getContainer();
+
+ $this->userManager = $container->get(IUserManager::class);
+ $this->migrator = $container->get(ContactsMigrator::class);
+ $this->output = $this->createMock(OutputInterface::class);
+ }
+
+ public static function dataAssets(): array {
+ return array_map(
+ function (string $filename) {
+ $vCardSplitter = new VCardSplitter(
+ fopen(self::ASSETS_DIR . $filename, 'r'),
+ VObjectParser::OPTION_FORGIVING,
+ );
+
+ /** @var VCard[] $vCards */
+ $vCards = [];
+ while ($vCard = $vCardSplitter->getNext()) {
+ $vCards[] = $vCard;
+ }
+
+ [$initialAddressBookUri, $ext] = explode('.', $filename, 2);
+ $metadata = ['displayName' => ucwords(str_replace('-', ' ', $initialAddressBookUri))];
+ return [UUIDUtil::getUUID(), $filename, $initialAddressBookUri, $metadata, $vCards];
+ },
+ array_diff(
+ scandir(self::ASSETS_DIR),
+ // Exclude current and parent directories
+ ['.', '..'],
+ ),
+ );
+ }
+
+ private function getPropertiesChangedOnImport(VCard $vCard): array {
+ return array_map(
+ fn (VObjectProperty $property) => $property->serialize(),
+ array_values(array_filter(
+ $vCard->children(),
+ fn (mixed $child) => $child instanceof VObjectProperty && $child->name === 'PRODID',
+ )),
+ );
+ }
+
+ private function getProperties(VCard $vCard): array {
+ return array_map(
+ fn (VObjectProperty $property) => $property->serialize(),
+ array_values(array_filter(
+ $vCard->children(),
+ fn (mixed $child) => $child instanceof VObjectProperty && $child->name !== 'PRODID',
+ )),
+ );
+ }
+
+ /**
+ *
+ * @param array{displayName: string, description?: string} $importMetadata
+ * @param VCard[] $importCards
+ */
+ #[\PHPUnit\Framework\Attributes\DataProvider('dataAssets')]
+ public function testImportExportAsset(string $userId, string $filename, string $initialAddressBookUri, array $importMetadata, array $importCards): void {
+ $user = $this->userManager->createUser($userId, 'topsecretpassword');
+
+ foreach ($importCards as $importCard) {
+ $problems = $importCard->validate();
+ $this->assertEmpty($problems);
+ }
+
+ $this->invokePrivate($this->migrator, 'importAddressBook', [$user, $filename, $initialAddressBookUri, $importMetadata, $importCards, $this->output]);
+
+ $addressBookExports = $this->invokePrivate($this->migrator, 'getAddressBookExports', [$user, $this->output]);
+ $this->assertCount(1, $addressBookExports);
+
+ /** @var VCard[] $exportCards */
+ ['displayName' => $displayName, 'description' => $description, 'vCards' => $exportCards] = reset($addressBookExports);
+ $exportMetadata = array_filter(['displayName' => $displayName, 'description' => $description]);
+
+ $this->assertEquals($importMetadata, $exportMetadata);
+ $this->assertSameSize($importCards, $exportCards);
+
+ $importProperties = [];
+ $exportProperties = [];
+ for ($i = 0, $iMax = count($importCards); $i < $iMax; ++$i) {
+ $importProperties[] = $this->getPropertiesChangedOnImport($importCards[$i]);
+ $exportProperties[] = $this->getPropertiesChangedOnImport($exportCards[$i]);
+ }
+
+ $this->assertNotEqualsCanonicalizing(
+ $importProperties,
+ $exportProperties,
+ );
+
+ $importProperties = [];
+ $exportProperties = [];
+ for ($i = 0, $iMax = count($importCards); $i < $iMax; ++$i) {
+ $importProperties[] = $this->getProperties($importCards[$i]);
+ $exportProperties[] = $this->getProperties($exportCards[$i]);
+ }
+
+ $this->assertEqualsCanonicalizing(
+ $importProperties,
+ $exportProperties,
+ );
+ }
+}