Writing Dredd Hooks In PHP
PHP hooks are using Dredd’s hooks handler socket interface. For using PHP hooks in Dredd you have to have Dredd already installed
Installation
Requirements
php version >= 5.4
Installing dredd-hooks-php can be easily installed through the package manager, composer.
$ composer require ddelnano/dredd-hooks-php --dev
Usage
$ dredd apiary.apib http://127.0.0.1:3000 --language=vendor/bin/dredd-hooks-php --hookfiles=./hooks*.php
Note
If you’re running Dredd inside Docker, read about specifics of getting it working together with non-JavaScript hooks.
API Reference
The Dredd\Hooks
class provides the static methods listed below to create hooks
beforeEach
,beforeEachValidation
,afterEach
accepts a closure as a first argument passing a Transaction object as a first argument
before
,beforeValidation
,after
accepts transaction name as a first argument
accepts a block as a second argument passing a Transaction object as a first argument of it
beforeAll
,afterAll
accepts a block as a first argument passing an Array of Transaction objects as a first argument
Refer to Dredd execution lifecycle to find when is each hook function executed.
Using PHP API
Example usage of all methods. Very Important The $transaction
variable passed to the closure MUST be a reference. Otherwise the $transaction
variable will be passed by value when the closure is executed and the changes will not be reflected.
<?php
use Dredd\Hooks;
Hooks::beforeAll(function(&$transaction) {
echo "before all";
});
Hooks::beforeEach(function(&$transaction) {
echo "before each";
});
Hooks::before("Machines > Machines collection > Get Machines", function(&$transaction) {
echo "before";
});
Hooks::beforeEachValidation(function(&$transaction) {
echo "before each validation";
});
Hooks::beforeValidation("Machines > Machines collection > Get Machines", function(&$transaction) {
echo "before validation";
});
Hooks::after("Machines > Machines collection > Get Machines", function(&$transaction) {
echo "after";
});
Hooks::afterEach(function(&$transaction) {
echo "after each";
});
Hooks::afterAll(function(&$transaction) {
echo "after all";
});
Examples
In the dredd-hooks-php repository there is an example laravel application with instructions in the wiki
How to Skip Tests
Any test step can be skipped by setting skip
property of the transaction
object to true
.
<?php
use Dredd\Hooks;
Hooks::before("Machines > Machines collection > Get Machines", function(&$transaction) {
$transaction->skip = true;
});
Failing Tests Programmatically
You can fail any step by setting fail
property on transaction
object to true
or any string with descriptive message.
<?php
use Dredd\Hooks;
Hooks::before("Machines > Machines collection > Get Machines", function(&$transaction) {
$transaction->fail = true;
});
Modifying Transaction Request Body Prior to Execution
<?php
use Dredd\Hooks;
Hooks::before("Machines > Machines collection > Get Machines", function(&$transaction) {
$requestBody = $transaction->request->body;
$requestBody['someKey'] = 'new value';
$transaction->request->body = json_encode($requestBody);
});
Adding or Changing URI Query Parameters to All Requests
<?php
use Dredd\Hooks;
Hooks::beforeEach(function(&$transaction) {
// add query parameter to each transaction here
$paramToAdd = 'api-key=23456';
if (strpos($transaction->fullPath, "?")) {
$transaction->fullPath .= "&{$paramToAdd}";
}
else {
$transaction->fullPath .= "?{$paramToAdd}";
}
});
Handling sessions
<?php
use Dredd\Hooks;
$stash = [];
Hooks::after("Auth > /remoteauto/userpass", function(&$transaction) use (&$stash) {
$parsedBody = json_decode($transaction->real->body);
$stash['token'] = $parseBody->sessionId;
});
Hooks::beforeEach(function(&$transaction) use (&$stash) {
if ($transaction->token) {
$transaction->request->headers->Cookie = "id={$stash['token']}s";
}
});