Search code examples
phpsymfonyauthenticationphpunithttp-status-code-401

Testing Controller with PHPUnit, but it throws a 401 Error


I'm doing some tests with PHPUnit, but I have some problems especially when testing the Controller.

I want to test a route of a Controller by just calling the route and check if the response is a HTTP-Status 200. But alwas the Console has the smae errors.

Token Error It says something about a token that is missing. I don't have a clue what kind of token this is.

401 Error

Also this is the 401 Error he gets.

My PHPUnit-Test looks like this:

namespace App\Tests\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class PersonControllerTest extends WebTestCase { private $client;

protected function setUp()
{
    $this->client = static::createClient([], [
        'PHP_AUTH_USER' => 'user',
        'PHP_AUTH_PW'   => 'pass',
    ]);
}


public function testCreate()
{

    $this->client->request('GET','/create');

    $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
}

public function testIndex()
{

    $this->client->request('GET','/');

    $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
}

}

I have tried it with the authentication in the setUp Method -> didn't work.

Do you have any clue?

Thanks for all Answers or/and Comments


Solution

  • protected function setUp()
    {
        $this->client = static::createClient();
    
        $this->logIn();
    }
    
    private function logIn()
    {
        $session = $this->client->getContainer()->get('session');
    
        $firewallName = 'test';
        // if you don't define multiple connected firewalls, the context defaults to the firewall name
        // See https://symfony.com/doc/current/reference/configuration/security.html#firewall-context
        $firewallContext = 'test';
    
        // you may need to use a different token class depending on your application.
        // for example, when using Guard authentication you must instantiate PostAuthenticationGuardToken
        $testUser = new WebserviceUser('[email protected]', ['ROLE_ADMIN'],
            array("employeeid" => array(420),
            "mail" => array("[email protected]")), false);
        $token = new UsernamePasswordToken($testUser, null, $firewallName, ['ROLE_ADMIN']);
        //var_dump($token);
        $session->set('_security_' . $firewallContext, serialize($token));
        $session->save();
    
        $cookie = new Cookie($session->getName(), $session->getId());
        $this->client->getCookieJar()->set($cookie);
    }
    
    
    public function testCreate()
    {
    
        $crawler = $this->client->request('GET', '/create');
        $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
    
        $form = $crawler->filter('form')->form([
            'person[name]' => 'Chruit',
            'person[birthdate][month]' => 2,
            'person[birthdate][day]' => 15,
            'person[birthdate][year]' => 2014,
        ]);
    
        $this->client->submit($form);
    }
    
    public function testIndex()
    {
    
        $this->client->request('GET', '/');
    
        $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
    }
    

    }

    The Solution is just the logIn-Function. The $testUser needs to be in your Active Directory or your network. The rest of the Parameters doesn't matter.

    My Firewall blocked it so i couldn't do it the normal way.

    If You are doing it like this, you have to add someting to the secourity.yaml that was created from the installation of PHPUnit.

    enter image description here