Spaces:
No application file
No application file
declare(strict_types=1); | |
namespace Mautic\LeadBundle\Tests\Controller; | |
use Mautic\CoreBundle\Test\MauticMysqlTestCase; | |
use Mautic\LeadBundle\Command\ImportCommand; | |
use Mautic\LeadBundle\Entity\Import; | |
use Mautic\LeadBundle\Entity\ImportRepository; | |
use Mautic\LeadBundle\Entity\Lead; | |
use Mautic\LeadBundle\Entity\LeadField; | |
use Mautic\LeadBundle\Entity\LeadFieldRepository; | |
use Mautic\LeadBundle\Entity\LeadRepository; | |
use PHPUnit\Framework\Assert; | |
use Symfony\Component\HttpFoundation\File\UploadedFile; | |
use Symfony\Component\HttpFoundation\Request; | |
final class ImportControllerTest extends MauticMysqlTestCase | |
{ | |
public function testImportWithoutFile(): void | |
{ | |
$crawler = $this->client->request(Request::METHOD_GET, '/s/contacts/import/new'); | |
$form = $crawler->selectButton('Upload')->form(); | |
$crawler = $this->client->submit($form); | |
Assert::assertStringContainsString('Please select a CSV file to upload', $crawler->html(), $crawler->html()); | |
} | |
/** | |
* Setting the phone field as required to test the validation. | |
* Phone is not part of the csv fixture so it won't be auto-mapped. | |
*/ | |
public function testImportMappingRequiredFieldValidation(): void | |
{ | |
$this->setPhoneFieldIsRequired(true); | |
$crawler = $this->client->request(Request::METHOD_GET, '/s/contacts/import/new'); | |
$uploadForm = $crawler->selectButton('Upload')->form(); | |
$file = new UploadedFile(__DIR__.'/../Fixtures/contacts.csv', 'contacs.csv', 'itext/csv'); | |
$uploadForm['lead_import[file]']->setValue((string) $file); | |
$crawler = $this->client->submit($uploadForm); | |
$mappingForm = $crawler->selectButton('Import')->form(); | |
$crawler = $this->client->submit($mappingForm); | |
Assert::assertStringContainsString('Some required fields are missing. You must map the field "Phone."', $crawler->html()); | |
} | |
/** | |
* @dataProvider validateDataProvider | |
*/ | |
public function testImportMappingAndImport(string $skipIfExist, string $expectedName): void | |
{ | |
$this->createLead('[email protected]', 'Johny'); | |
$crawler = $this->client->request(Request::METHOD_GET, '/s/contacts/import/new'); | |
$uploadForm = $crawler->selectButton('Upload')->form(); | |
$file = new UploadedFile(__DIR__.'/../Fixtures/contacts.csv', 'contacs.csv', 'itext/csv'); | |
$uploadForm['lead_import[file]']->setValue((string) $file); | |
$crawler = $this->client->submit($uploadForm); | |
$mappingForm = $crawler->selectButton('Import')->form(); | |
$mappingForm['lead_field_import[skip_if_exists]']->setValue($skipIfExist); | |
$crawler = $this->client->submit($mappingForm); | |
Assert::assertStringContainsString('Import process was successfully created. You will be notified when finished.', $crawler->html()); | |
/** @var ImportRepository $importRepository */ | |
$importRepository = $this->em->getRepository(Import::class); | |
/** @var Import $importEntity */ | |
$importEntity = $importRepository->findOneBy(['originalFile' => 'contacts.csv']); | |
$fields = ['email' => 'email', 'firstname' => 'firstname', 'lastname' => 'lastname']; | |
Assert::assertNotNull($importEntity); | |
Assert::assertSame(2, $importEntity->getLineCount()); | |
Assert::assertSame(Import::QUEUED, $importEntity->getStatus()); | |
Assert::assertSame('lead', $importEntity->getObject()); | |
Assert::assertSame($fields, $importEntity->getProperties()['fields']); | |
Assert::assertSame(array_values($fields), $importEntity->getProperties()['headers']); | |
$this->testSymfonyCommand(ImportCommand::COMMAND_NAME); | |
$this->em->clear(); | |
/** @var Import $importEntity */ | |
$importEntity = $importRepository->findOneBy(['originalFile' => 'contacts.csv']); | |
Assert::assertNotNull($importEntity); | |
Assert::assertSame(2, $importEntity->getLineCount()); | |
Assert::assertSame(1, $importEntity->getInsertedCount()); | |
Assert::assertSame(1, $importEntity->getUpdatedCount()); | |
Assert::assertSame(Import::IMPORTED, $importEntity->getStatus()); | |
/** @var LeadRepository $importRepository */ | |
$leadRepository = $this->em->getRepository(Lead::class); | |
/** @var Lead[] $contacts */ | |
$contacts = $leadRepository->findBy(['email' => ['[email protected]', '[email protected]']], ['email' => 'desc']); | |
Assert::assertSame($expectedName, $contacts[0]->getFirstname()); | |
Assert::assertCount(2, $contacts); | |
$crawler = $this->client->request(Request::METHOD_GET, '/s/contacts/import/view/'.$importEntity->getId()); | |
Assert::assertStringContainsString('No failed rows found', $crawler->html(), 'No failed rows exist.'); | |
} | |
private function setPhoneFieldIsRequired(bool $required): void | |
{ | |
/** @var LeadFieldRepository $fieldRepository */ | |
$fieldRepository = $this->em->getRepository(LeadField::class); | |
/** @var LeadField $phoneField */ | |
$phoneField = $fieldRepository->findOneBy(['alias' => 'phone']); | |
$phoneField->setIsRequired($required); | |
$fieldRepository->saveEntity($phoneField); | |
} | |
private function createLead(string $email = null, string $firstName = ''): Lead | |
{ | |
$lead = new Lead(); | |
if (!empty($email)) { | |
$lead->setEmail($email); | |
} | |
$lead->setFirstname($firstName); | |
$this->em->persist($lead); | |
return $lead; | |
} | |
/** | |
* @return mixed[] | |
*/ | |
public function validateDataProvider(): iterable | |
{ | |
yield ['0', 'John']; | |
yield ['1', 'Johny']; | |
} | |
} | |