talkConfig = $this->createMock(Config::class); $this->mailer = $this->createMock(IMailer::class); $this->defaults = $this->createMock(Defaults::class); $this->userSession = $this->createMock(IUserSession::class); $this->participantService = $this->createMock(ParticipantService::class); $this->pollService = $this->createMock(PollService::class); $this->roomService = $this->createMock(RoomService::class); $this->urlGenerator = $this->createMock(IURLGenerator::class); $this->l = $this->createMock(IL10N::class); $this->dispatcher = $this->createMock(IEventDispatcher::class); $this->logger = $this->createMock(LoggerInterface::class); $this->dateTime = $this->createMock(IDateTimeZone::class); } public function getGuestManager(array $methods = []): GuestManager|MockObject { if (!empty($methods)) { return $this->getMockBuilder(GuestManager::class) ->setConstructorArgs([ $this->talkConfig, $this->mailer, $this->defaults, $this->userSession, $this->participantService, $this->pollService, $this->roomService, $this->urlGenerator, $this->l, $this->dispatcher, $this->logger, $this->dateTime, ]) ->onlyMethods($methods) ->getMock(); } $this->guestManager = new GuestManager( $this->talkConfig, $this->mailer, $this->defaults, $this->userSession, $this->participantService, $this->pollService, $this->roomService, $this->urlGenerator, $this->l, $this->dispatcher, $this->logger, $this->dateTime, ); } public static function dataImportEmails(): array { return [ [ 'import-valid-only-email.csv', 1, 0, [['valid@example.tld', null]], ], [ 'import-valid-email-and-name.csv', 1, 0, [['valid@example.tld', 'Name']], ], [ 'import-valid-filter-duplicates-by-email.csv', 2, 1, [['valid-1@example.tld', 'Valid 1'], ['valid-2@example.tld',null]], GuestImportException::REASON_ROWS, [4], ], ]; } #[DataProvider('dataImportEmails')] public function testImportEmails(string $fileName, int $invites, int $duplicates, array $invited, ?string $reason = null, array $invalidLines = []): void { $this->mailer->method('validateMailAddress') ->willReturnCallback(static fn (string $email): bool => str_starts_with($email, 'valid')); $actualInvites = []; $this->participantService->method('inviteEmailAddress') ->willReturnCallback(function ($room, $actorId, string $email, ?string $name) use (&$actualInvites): Participant { $actualInvites[] = [$email, $name]; return $this->createMock(Participant::class); }); $room = $this->createMock(Room::class); try { $guestManager = $this->getGuestManager(['sendEmailInvitation']); $data = $guestManager->importEmails($room, __DIR__ . '/data/' . $fileName, false); } catch (GuestImportException $e) { if ($reason === null) { throw $e; } $data = $e->getData(); $this->assertSame($invalidLines, $data['invalidLines']); } $this->assertSame($invited, $actualInvites); $this->assertSame($invites, $data['invites'], 'Invites count mismatch'); $this->assertSame($duplicates, $data['duplicates'], 'Duplicates count mismatch'); } }