setupCampaign(); $version = $campaign->getVersion(); // version should be incremented as campaign's "modified by user" is updated $this->refreshAndSubmitForm($campaign, ++$version); // version should not be incremented as there are no changes $this->refreshAndSubmitForm($campaign, $version); // version should be incremented as there are changes $this->refreshAndSubmitForm($campaign, ++$version, [ 'campaign[allowRestart]' => '1', 'campaign[isPublished]' => '1', ]); // version should not be incremented as there are no changes $this->refreshAndSubmitForm($campaign, $version); // refresh the page $pageCrawler = $this->refreshPage($campaign); // we should not get an optimistic lock error as the page was refreshed, version should be incremented $crawler = $this->submitForm($pageCrawler, $campaign, ++$version, [ 'campaign[allowRestart]' => '0', ]); Assert::assertStringNotContainsString(self::OPTIMISTIC_LOCK_ERROR, $crawler->text()); // we should get an optimistic lock error as the page wasn't refreshed $crawler = $this->submitForm($pageCrawler, $campaign, $version, [ 'campaign[isPublished]' => '1', ]); Assert::assertStringContainsString(self::OPTIMISTIC_LOCK_ERROR, $crawler->text()); // we should get an optimistic lock error even if there is no change $crawler = $this->submitForm($pageCrawler, $campaign, $version); Assert::assertStringContainsString(self::OPTIMISTIC_LOCK_ERROR, $crawler->text()); } /** * @param array $formValues */ private function refreshAndSubmitForm(Campaign $campaign, int $expectedVersion, array $formValues = []): void { $crawler = $this->refreshPage($campaign); $this->submitForm($crawler, $campaign, $expectedVersion, $formValues); } private function refreshPage(Campaign $campaign): Crawler { $crawler = $this->client->request('GET', sprintf('/s/campaigns/edit/%s', $campaign->getId())); Assert::assertTrue($this->client->getResponse()->isOk()); Assert::assertStringContainsString('Edit Campaign', $crawler->text()); return $crawler; } /** * @param array $formValues */ private function submitForm(Crawler $crawler, Campaign $campaign, int $expectedVersion, array $formValues = []): Crawler { $form = $crawler->selectButton('Save')->form(); $form->setValues($formValues); $newCrawler = $this->client->submit($form); Assert::assertTrue($this->client->getResponse()->isOk()); $this->em->clear(); $campaign = $this->em->find(Campaign::class, $campaign->getId()); Assert::assertSame($expectedVersion, $campaign->getVersion()); return $newCrawler; } private function setupCampaign(): Campaign { $leadList = new LeadList(); $leadList->setName('Test list'); $leadList->setPublicName('Test list'); $leadList->setAlias('test-list'); $this->em->persist($leadList); $campaign = new Campaign(); $campaign->setName('Test campaign'); $campaign->addList($leadList); $this->em->persist($campaign); $lead = new Lead(); $lead->setFirstname('Test Lead'); $this->em->persist($lead); $campaignEvent = new Event(); $campaignEvent->setCampaign($campaign); $campaignEvent->setName('Send Email 1'); $campaignEvent->setType('email.send'); $campaignEvent->setEventType('action'); $campaignEvent->setProperties([]); $this->em->persist($campaignEvent); $this->em->flush(); $this->em->clear(); return $campaign; } }