How to test subdomain-based routes in Symfony2

I have an application that uses subdomains to route to agencies:

foo.domain.dev -> Agency:showAction(foo) bar.domain.dev -> Agency:showAction(bar) domain.dev -> Agency:indexAction() 

Each of them corresponds to the object and controller of the agency.

I have a listener that listens for the onDomainParse event and writes the subdomain to the request attributes.

 /** * Listens for on domainParse event * Writes to request attributes */ class SubdomainListener { public function onDomainParse(Event $event) { $request = $event->getRequest(); $session = $request->getSession(); // Split the host name into tokens $tokens = $this->tokenizeHost($request->getHost()); if (isset($tokens['subdomain'])){ $request->attributes->set('_subdomain',$tokens['subdomain']); } } //... } 

Then I use this in the controller to redirect to the show action:

 class AgencyController extends Controller { /** * Lists all Agency entities. * */ public function indexAction() { // We reroute to show action here. $subdomain = $this->getRequest() ->attributes ->get('_subdomain'); if ($subdomain) return $this->showAction($subdomain); $em = $this->getDoctrine()->getEntityManager(); $agencies = $em->getRepository('NordRvisnCoreBundle:Agency')->findAll(); return $this->render('NordRvisnCoreBundle:Agency:index.html.twig', array( 'agencies' => $agencies )); } // ... } 

My question is:

How do I fake this when running a test using WebTestCase?

+6
source share
2 answers

Go to the subdomain by overriding the HTTP headers for the request and check the correct page:

Unconfirmed, may contain errors

 class AgencyControllerTest extends WebTestCase { public function testShowFoo() { $client = static::createClient(); $crawler = $client->request('GET', '/', array(), array(), array( 'HTTP_HOST' => 'foo.domain.dev', 'HTTP_USER_AGENT' => 'Symfony/2.0', )); $this->assertGreaterThan(0, $crawler->filter('html:contains("Text of foo domain")')->count()); } } 
+7
source

Based on Symfony docs on host routes, Testing your controllers :

 $crawler = $client->request( 'GET', '/', array(), array(), array('HTTP_HOST' => 'foo.domain.dev') ); 

If you do not want to fill all your queries with array parameters, this might be better:

 $client->setServerParameter('HTTP_HOST', 'foo.domain.dev'); $crawler = $client->request('GET', '/'); ... $crawler2 = $client->request('GET', /foo'); // still sends the HTTP_HOST 

There is also a setServerParameters() method on the client if you have several parameters to change.

+7
source

Source: https://habr.com/ru/post/916216/


All Articles