getContainer(); $this->userManager = $container->get(IUserManager::class); $this->migrator = $container->get(ContactsMigrator::class); $this->output = $this->createMock(OutputInterface::class); } public 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', )), ); } /** * @dataProvider dataAssets * * @param array{displayName: string, description?: string} $importMetadata * @param VCard[] $importCards */ 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->assertEquals(count($importCards), count($exportCards)); for ($i = 0; $i < count($importCards); ++$i) { $this->assertNotEqualsCanonicalizing( $this->getPropertiesChangedOnImport($importCards[$i]), $this->getPropertiesChangedOnImport($exportCards[$i]), ); } for ($i = 0; $i < count($importCards); ++$i) { $this->assertEqualsCanonicalizing( $this->getProperties($importCards[$i]), $this->getProperties($exportCards[$i]), ); } } }