Paginatoegang testen met SimpleTest en live DB

De Drupal 7 core-mogelijkheden om geautomatiseerd te testen door middel van de SimpleTest module worden vaakt benut om de werking van (delen van) modules te verifieren. De mogelijkheden beperken zich echter niet tot module-tests; het is heel goed mogelijk en vaak aan te raden om, nadat een website is ingericht, geconfigureerd en gepopuleerd, periodiek de functionaliteit van allerlei delen van de website als zodanig te testen.

Hieronder een mogelijke aanpak om de toegangsrestricties te testen van bepaalde pagina's of secties.

Live database

Een probleem dat zich voordoet bij het testen  van live websites is dat we hiervoor doorgaans het liefst de live database willen gebruiken, en niet de sandbox database die SimpleTest aanmaakt bij aanvang van de test. We willen immers de site testen in de toestand waarin die zich werkelijk bevindt en niet waarin die zich theoretisch -of volgens onze verwachtingen- bevindt. Dus eerst een node type aanmaken met permissie X om vervolgens te checken of ons node type permissie X heeft, is niet erg zinvol; nuttig is wel om te checken of van het node type dat we ooit aanmaakten niet per ongeluk de permissies gewijzigd zijn geraakt.

Gelukkig kunnen we op een eenvoudige manier SimpleTest instrueren om geen sandbox aan te maken maar de live database te gebruiken. Dit gaat als volgt:

<?php
class VoorbeeldTestCase extends DrupalWebTestCase {
  function getInfo() {
    return array(
      'name' => t('Paginatoegang testen'),
      'description' => t('Paginatoegang testen met SimpleTest en live DB'),
      'group' => t('Websitetests'),
    );
  }
 
  // Om te voorkomen dat SimpleTest een test-sandbox aanmaakt, overriden we
  // De setUp() en tearDown() functies.
  // Dit betekent wel dat we in de tests gecreeerde data na afloop zelf 
  // moeten opruimen
  function setUp() {
    $this->setup = TRUE;
  }

  function tearDown() {}
}
?>

Nu we de live database hebben ingesteld om mee te testen kunnen we tests uitvoeren op de data zoals die feitelijk op de website bestaat. Bijvoorbeeld om voor verschillende rollen de toegang tot bepaalde content te verifieren.

<?php
/**
 * Test toegang voor anonymous user
 */
public function testAccessAnonymous() {
  $path = 'admin/config/content/nieuwsbrief';
  $this->drupalGet($path);
  $this->assertResponse(403, 'Anonymous user heeft geen toegang tot ' . $path);
}

/**
 * Test toegang voor rol=klant
 */ 
public function testAccessKlant() {
  $this->user = user_load(218);// bijvoorbeeld
  $this->drupalLogin($this->user);

  $path = 'reviews/schrijf-klantreview';
  $this->drupalGet($path);
  $this->assertResponse(200, 'Klant heeft toegang tot ' . $path);
} 
?>