El tutorial Jobeet

11.7. La seguridad que te dan las pruebas

Cuando la oferta de trabajo se publica, ya no es posible modificarla. Aunque el enlace "Edit" no se muestra en la página de previsualización, vamos a añadir algunas pruebas para asegurarnos del todo.

En primer lugar, añade otro argumento al método createJob() para permitir la publicación automática de una oferta de trabajo y crea un método llamado getJobByPosition() que devuelva una oferta de trabajo a partir del puesto de trabajo indicado:

// lib/test/JobeetTestFunctional.class.php
class JobeetTestFunctional extends sfTestFunctional
{
  public function createJob($values = array(), $publish = false)
  {
    $this->
      get('/job/new')->
      click('Preview your job', array('job' => array_merge(array(
        'company'      => 'Sensio Labs',
        'url'          => 'http://www.sensio.com/',
        'position'     => 'Developer',
        'location'     => 'Atlanta, USA',
        'description'  => 'You will work with symfony to develop websites for our customers.',
        'how_to_apply' => 'Send me an email',
        'email'        => '[email protected]',
        'is_public'    => false,
      ), $values)))->
      followRedirect()
    ;

    if ($publish)
    {
      $this->
        click('Publish', array(), array('method' => 'put', '_with_csrf' => true))->
        followRedirect()
      ;
    }

    return $this;
  }

  public function getJobByPosition($position)
  {
    $criteria = new Criteria();
    $criteria->add(JobeetJobPeer::POSITION, $position);

    return JobeetJobPeer::doSelectOne($criteria);
  }

  // ...
}

Si la oferta de trabajo está publicada, la página para editarla debe devolver un código de error 404:

$browser->info('  3.5 - When a job is published, it cannot be edited anymore')->
  createJob(array('position' => 'FOO3'), true)->
  get(sprintf('/job/%s/edit', $browser->getJobByPosition('FOO3')->getToken()))->

  with('response')->begin()->
    isStatusCode(404)->
  end()
;

No obstante, si ejecutas las pruebas verás que el resultado no es el esperado, ya que ayer se nos olvidó añadir esta restricción de seguridad. Como acabas de comprobar, escribir pruebas es una forma excelente de descubrir errores en la aplicación porque te obliga a pensar en todos los posibles casos.

Solucionar este problema es muy sencillo, ya que sólo tenemos que redirigir al usuario a una página de error 404 cuando la oferta de trabajo está activada:

// apps/frontend/modules/job/actions/actions.class.php
public function executeEdit(sfWebRequest $request)
{
  $job = $this->getRoute()->getObject();
  $this->forward404If($job->getIsActivated());

  $this->form = new JobeetJobForm($job);
}

Aunque el código que hemos añadido es trivial, ¿puedes asegurar que este nuevo código no ha roto ninguna otra funcionalidad de la aplicación? Para asegurarte de ello podrías abrir el navegador y empezar a probar todas las posibles combinaciones para acceder a la página de editar una oferta. Otra alternativa mucho mejor para asegurarte de que el nuevo código no ha roto nada consiste en ejecutar las pruebas funcionales que acabas de crear. De esta forma, si el nuevo código produce errores en la aplicación, Symfony te lo mostrará en los mensajes de error de las pruebas.