working on API: simplifying PUT request mocking

This commit is contained in:
El RIDO 2015-10-11 18:50:48 +02:00
parent e5b096ed8c
commit 9e6e29bc93
3 changed files with 101 additions and 9 deletions

View file

@ -23,7 +23,7 @@ class request
* @access private * @access private
* @var string * @var string
*/ */
private $_inputStream = 'php://input'; private static $_inputStream = 'php://input';
/** /**
* Operation to perform. * Operation to perform.
@ -80,7 +80,8 @@ class request
switch (array_key_exists('REQUEST_METHOD', $_SERVER) ? $_SERVER['REQUEST_METHOD'] : 'GET') switch (array_key_exists('REQUEST_METHOD', $_SERVER) ? $_SERVER['REQUEST_METHOD'] : 'GET')
{ {
case 'PUT': case 'PUT':
parse_str(file_get_contents($this->_inputStream), $this->_params); $this->_operation = 'create';
parse_str(file_get_contents(self::$_inputStream), $this->_params);
break; break;
case 'POST': case 'POST':
$this->_params = $_POST; $this->_params = $_POST;
@ -89,7 +90,7 @@ class request
$this->_params = $_GET; $this->_params = $_GET;
} }
// prepare paremeters, depending on current operation // prepare parameters, depending on current operation
if ( if (
(array_key_exists('data', $this->_params) && !empty($this->_params['data'])) || (array_key_exists('data', $this->_params) && !empty($this->_params['data'])) ||
(array_key_exists('attachment', $this->_params) && !empty($this->_params['attachment'])) (array_key_exists('attachment', $this->_params) && !empty($this->_params['attachment']))
@ -107,7 +108,7 @@ class request
// display an existing paste // display an existing paste
elseif (array_key_exists('QUERY_STRING', $_SERVER) && !empty($_SERVER['QUERY_STRING'])) elseif (array_key_exists('QUERY_STRING', $_SERVER) && !empty($_SERVER['QUERY_STRING']))
{ {
$this->_operation = 'read'; if ($this->_operation != 'create') $this->_operation = 'read';
$this->_params['pasteid'] = $_SERVER['QUERY_STRING']; $this->_params['pasteid'] = $_SERVER['QUERY_STRING'];
} }
} }
@ -148,13 +149,12 @@ class request
} }
/** /**
* Override the default input stream source * Override the default input stream source, used for unit testing.
* *
* @param unknown $input * @param unknown $input
*/ */
public function setInputStream($input) public static function setInputStream($input)
{ {
$this->_inputStream = $input; self::$_inputStream = $input;
$this->__construct();
} }
} }

92
tst/jsonApi.php Normal file
View file

@ -0,0 +1,92 @@
<?php
class jsonApiTest extends PHPUnit_Framework_TestCase
{
protected $_model;
public function setUp()
{
/* Setup Routine */
$this->_model = zerobin_data::getInstance(array('dir' => PATH . 'data'));
serversalt::setPath(PATH . 'data');
$this->reset();
}
public function tearDown()
{
/* Tear Down Routine */
helper::confRestore();
}
public function reset()
{
$_POST = array();
$_GET = array();
$_SERVER = array();
if ($this->_model->exists(helper::getPasteId()))
$this->_model->delete(helper::getPasteId());
helper::confRestore();
}
/**
* @runInSeparateProcess
*/
public function testCreate()
{
$this->reset();
$options = parse_ini_file(CONF, true);
$options['traffic']['limit'] = 0;
helper::confBackup();
helper::createIniFile(CONF, $options);
$_POST = helper::getPaste();
$_SERVER['HTTP_X_REQUESTED_WITH'] = 'JSONHttpRequest';
$_SERVER['REQUEST_METHOD'] = 'POST';
$_SERVER['REMOTE_ADDR'] = '::1';
ob_start();
new zerobin;
$content = ob_get_contents();
$response = json_decode($content, true);
$this->assertEquals(0, $response['status'], 'outputs status');
$this->assertEquals(
hash_hmac('sha1', $response['id'], serversalt::get()),
$response['deletetoken'],
'outputs valid delete token'
);
$this->assertStringEndsWith('?' . $response['id'], $response['url'], 'returned URL points to new paste');
$this->assertTrue($this->_model->exists($response['id']), 'paste exists after posting data');
}
/**
* @runInSeparateProcess
*/
public function testPut()
{
$this->reset();
$options = parse_ini_file(CONF, true);
$options['traffic']['limit'] = 0;
helper::confBackup();
helper::createIniFile(CONF, $options);
$file = tempnam(sys_get_temp_dir(), 'FOO');
$paste = helper::getPaste();
unset($paste['meta']);
file_put_contents($file, http_build_query($paste));
request::setInputStream($file);
$_SERVER['QUERY_STRING'] = helper::getPasteId();
$_SERVER['HTTP_X_REQUESTED_WITH'] = 'JSONHttpRequest';
$_SERVER['REQUEST_METHOD'] = 'PUT';
$_SERVER['REMOTE_ADDR'] = '::1';
ob_start();
new zerobin;
$content = ob_get_contents();
$response = json_decode($content, true);
$this->assertEquals(0, $response['status'], 'outputs status');
$this->assertEquals(helper::getPasteId(), $response['id'], 'outputted paste ID matches input');
$this->assertEquals(
hash_hmac('sha1', $response['id'], serversalt::get()),
$response['deletetoken'],
'outputs valid delete token'
);
$this->assertStringEndsWith('?' . $response['id'], $response['url'], 'returned URL points to new paste');
$this->assertTrue($this->_model->exists($response['id']), 'paste exists after posting data');
}
}

View file

@ -60,8 +60,8 @@ class requestTest extends PHPUnit_Framework_TestCase
$_SERVER['HTTP_X_REQUESTED_WITH'] = 'JSONHttpRequest'; $_SERVER['HTTP_X_REQUESTED_WITH'] = 'JSONHttpRequest';
$file = tempnam(sys_get_temp_dir(), 'FOO'); $file = tempnam(sys_get_temp_dir(), 'FOO');
file_put_contents($file, 'data=foo'); file_put_contents($file, 'data=foo');
request::setInputStream($file);
$request = new request; $request = new request;
$request->setInputStream($file);
$this->assertTrue($request->isJsonApiCall(), 'is JSON Api call'); $this->assertTrue($request->isJsonApiCall(), 'is JSON Api call');
$this->assertEquals('create', $request->getOperation()); $this->assertEquals('create', $request->getOperation());
$this->assertEquals('foo', $request->getParam('data')); $this->assertEquals('foo', $request->getParam('data'));