Eric V.
Eric V.

Reputation: 418

Symfony : Mock LDAP Component in functional tests

I want to do functional tests on my Symfony (5.1) application, this application uses an Active Directory server as a "datas" database (creating , listing , updating datas). I'm using the Symfony ldap component. Code example below may contain typos.

Controller

class DatasController
{
/**
     * @Route("/datas", name="datas")
     * @IsGranted("ROLE_USER")
     *
     * @return Response
     * @desc Displays LDAP datas
     */
    public function datasList(DatasRepository $datasRepository)
    {
        $datas = $datasRepository->findAll();
        return $this->render('datas/list.html.twig', [
            'datas' => $datas,
        ]);
    }
}

Repository

class DatasRepository
{
    private Ldap $ldap;
    private EntryManagerInterface $manager;

    /**
     * DatasRepository constructor.
     * Service injected params
     */
    public function __construct(Ldap $ldap, string $ldapAdminLogin, string $ldapAdminPwd)
    {
        $this->ldap = $ldap->bind($ldapAdminLogin, $ldapAdminPwd);
        $this->manager = $ldap->getEntryManager();
    }
    
    public function create(Data $data): void
    {
        // ... some $data to Symfony\Component\Ldap\Entry $entry logic
        
        $this->manager->add( $entry );
    }

    /**
     * @return datas[]
     */
    public function findAll()
    {
        $this->ldap->query('ou=test', '(&(objectclass=person))');
        $entries = $query->execute()->toArray();

        // ... some $entries to $datas logic

        return $datas;
    }
    
}

Test

class DatasControllerTest extends WebTestCase
{
    public function testDatasList()
    {
        $client = static::createClient();
        $client->request('GET', '/datas');
        # Crash can't contact LDAP and thats logical
        $this->assertResponseIsSuccessful();
    }
}

So, how to do functional test on "GET /datas" ? What part of the code should i mock to maximize test efficiency and coverage ?

Some additional information :

Any suggestion is welcome. Thanks

Eric

Upvotes: 0

Views: 371

Answers (1)

tarasikarius
tarasikarius

Reputation: 533

About mockin external services: you can extend test service from the original one and make it methods behave how you want. Ex.:

class TestService extends \Symfony\OrAnyOtherExternalService
{
    public function getConnection()
    {
        return new Connection([]);
    }
}

then in your services_test.yaml change the class of this service to you tests service:

services:
    Symfony\OrAnyOtherExternalService:
        class: TestData\Services\TestService

this way in test environment application will use TestService instead of original

Upvotes: 2

Related Questions