Cuando una oferta de trabajo expira en menos de cinco días o si ya ha expirado, el usuario que la creó puede ampliar la validez de la oferta por otros 30 días a partir de la fecha actual.
Probar este requisito no es nada sencillo, ya que la fecha de expiración se establece automáticamente a dentro de 30 días cuando se crea la oferta de trabajo. Por tanto, cuando accedes a la página de una oferta de trabajo, no se visualiza el enlace para extener la validez de esa oferta. Aunque podrías modificar la fecha de expiración en la base de datos o podrías modificar la plantilla para que siempre muestre ese enlace, estas soluciones no son más que chapuzas con las que es muy fácil equivocarse. Como ya habrás adivinado, vamos a escribir algunas pruebas para que hagan este trabajo por nosotros.
En primer lugar, añade una nueva ruta para el método extend:
# apps/frontend/config/routing.yml job: class: sfPropelRouteCollection options: model: JobeetJob column: token object_actions: { publish: PUT, extend: PUT } requirements: token: \w+
A continuación, actualiza el código del enlace "Extend" en el elemento parcial _admin:
<!-- apps/frontend/modules/job/templates/_admin.php --> <?php if ($job->expiresSoon()): ?> - <?php echo link_to('Extend', 'job_extend', $job, array('method' => 'put')) ?> for another <?php echo sfConfig::get('app_active_days') ?> days <?php endif; ?>
Después crea la acción extend:
// apps/frontend/modules/job/actions/actions.class.php public function executeExtend(sfWebRequest $request) { $request->checkCSRFProtection(); $job = $this->getRoute()->getObject(); $this->forward404Unless($job->extend()); $this->getUser()->setFlash('notice', sprintf('Your job validity has been extended until %s.', $job->getExpiresAt('m/d/Y'))); $this->redirect($this->generateUrl('job_show_user', $job)); }
Tal y como espera la acción, el método extend() de JobeetJob devuelve el valor true si se ha ampliado la validez de la oferta de trabajo y false en cualquier otro caso:
// lib/model/JobeetJob.php class JobeetJob extends BaseJobeetJob { public function extend() { if (!$this->expiresSoon()) { return false; } $this->setExpiresAt(time() + 86400 * sfConfig::get('app_active_days')); return $this->save(); } // ... }
Por último, añade el siguiente escenario a las pruebas:
$browser->info(' 3.6 - A job validity cannot be extended before the job expires soon')-> createJob(array('position' => 'FOO4'), true)-> call(sprintf('/job/%s/extend', $browser->getJobByPosition('FOO4')->getToken()), 'put', array('_with_csrf' => true))-> with('response')->begin()-> isStatusCode(404)-> end() ; $browser->info(' 3.7 - A job validity can be extended when the job expires soon')-> createJob(array('position' => 'FOO5'), true) ; $job = $browser->getJobByPosition('FOO5'); $job->setExpiresAt(time()); $job->save(); $browser-> call(sprintf('/job/%s/extend', $job->getToken()), 'put', array('_with_csrf' => true))-> with('response')->isRedirected() ; $job->reload(); $browser->test()->is( $job->getExpiresAt('y/m/d'), date('y/m/d', time() + 86400 * sfConfig::get('app_active_days')) );
Este escenario de pruebas introduce algunos elementos nuevos:
call() obtiene una URL utilizando un método HTTP diferente de GET o POST$job->reload()lime para probar de forma directa la fecha de expiración de la ofertaválido para Symfony 1.2