SMMP/spec/build/api/core/RequestSpec.php

288 lines
6.6 KiB
PHP
Raw Normal View History

<?php
use Kahlan\Plugin\Stub;
use Kahlan\Plugin\Monkey;
use api\core\Request;
use error\core\Error;
use error\core\Err;
2017-09-20 11:45:07 +00:00
describe('api', function(){
describe('core', function(){
describe('Request', function(){
2017-09-20 11:45:07 +00:00
beforeEach(function(){
$_SERVER = [
'REQUEST_METHOD' => 'POST'
];
});
2017-09-20 11:45:07 +00:00
describe('[check] config file', function(){
2017-09-20 11:45:07 +00:00
it('pass when config file exists', function(){
2017-09-20 11:45:07 +00:00
expect( file_exists(Request::config_path()) )->toBeTruthy();
2017-09-20 11:45:07 +00:00
});
2017-09-20 11:45:07 +00:00
it('pass when we can read the config file', function(){
2017-09-20 11:45:07 +00:00
expect( @file_get_contents(Request::config_path()) )->not->toBe(false);
2017-09-20 11:45:07 +00:00
});
2017-09-20 11:45:07 +00:00
it('pass when the config file is valid json', function(){
2017-09-20 11:45:07 +00:00
$read = @file_get_contents(Request::config_path());
expect($read)->not->toBe(false);
expect( json_decode($read, true) )->not->toBeNull();
expect( json_decode($read, true) )->toBeA('array');
2017-09-20 11:45:07 +00:00
});
2017-09-20 11:45:07 +00:00
});
2017-09-20 11:45:07 +00:00
describe('__construct(@path, @params)', function(){
2017-09-20 11:45:07 +00:00
context('with argument combinations', function(){
2017-09-20 11:45:07 +00:00
it('fail if @path is missing', function(){
2017-09-20 11:45:07 +00:00
$req = new Request();
2017-09-20 11:45:07 +00:00
expect($req->error->get())->toBe(Err::MissingPath);
2017-09-20 11:45:07 +00:00
});
2017-09-20 11:45:07 +00:00
it('fail if @path is not a string', function(){
2017-09-20 11:45:07 +00:00
expect('is_string')->toBeCalled();
$req = new Request(1);
2017-09-20 11:45:07 +00:00
expect($req->error->get())->toBe(Err::WrongPathModule);
2017-09-20 11:45:07 +00:00
});
2017-09-20 11:45:07 +00:00
it('pass if @params is an array', function(){
2017-09-20 11:45:07 +00:00
unset($_SERVER);
expect('is_array')->toBeCalled();
2017-09-20 11:45:07 +00:00
$req = new Request('someString', ['a', 'b']);
2017-09-20 11:45:07 +00:00
expect($req->error->get())->toBe(Err::UnknownHttpMethod);
2017-09-20 11:45:07 +00:00
});
2017-09-20 11:45:07 +00:00
it('pass if @params is not an array (default: [])', function(){
2017-09-20 11:45:07 +00:00
unset($_SERVER);
2017-09-20 11:45:07 +00:00
expect('is_array')->toBeCalled();
2017-09-20 11:45:07 +00:00
$types = [true, false, null, 1, 2.3, -1.2, 0, 'blabla'];
2017-09-20 11:45:07 +00:00
foreach($types as $type){
2017-09-20 11:45:07 +00:00
$req = new Request('someString', true);
expect($req->error->get())->toBe(Err::UnknownHttpMethod);
2017-09-20 11:45:07 +00:00
}
2017-09-20 11:45:07 +00:00
});
2017-09-20 11:45:07 +00:00
});
2017-09-20 11:45:07 +00:00
context('with config errors', function(){
2017-09-20 11:45:07 +00:00
it('fail if the config file exists', function(){
2017-09-20 11:45:07 +00:00
// Request::config_path -> 'aa'
allow(Request::class)->toReceive('::config_path')->andReturn('invalid_fname');
expect(Request::config_path())->toBe('invalid_fname');
2017-09-20 11:45:07 +00:00
// file_exists -> false
allow('file_exists')->toBeCalled()->andReturn(false);
expect('file_exists')->toBeCalled();
2017-09-20 11:45:07 +00:00
$req = new Request('a/b');
2017-09-20 11:45:07 +00:00
expect($req->error->get())->toBe(Err::UnreachableResource);
2017-09-20 11:45:07 +00:00
});
2017-09-20 11:45:07 +00:00
it('fail if the config file cannot be read', function(){
2017-09-20 11:45:07 +00:00
// file_get_contents -> false
allow('file_get_contents')->toBeCalled()->andReturn(false);
expect('file_get_contents')->toBeCalled();
2017-09-20 11:45:07 +00:00
$req = new Request('a/b');
2017-09-20 11:45:07 +00:00
expect($req->error->get())->toBe(Err::UnreachableResource);
2017-09-20 11:45:07 +00:00
});
2017-09-20 11:45:07 +00:00
it('fail if the json format is not valid', function(){
2017-09-20 11:45:07 +00:00
// file_exists -> true
allow('file_exists')->toBeCalled()->andReturn(true);
expect('file_exists')->toBeCalled();
2017-09-20 11:45:07 +00:00
// file_get_contents -> false
allow('file_get_contents')->toBeCalled()->andReturn('{incorrect_json');
expect('file_get_contents')->toBeCalled();
2017-09-20 11:45:07 +00:00
// json_decode -> called
expect('json_decode')->toBeCalled();
2017-09-20 11:45:07 +00:00
$req = new Request('a/b');
2017-09-20 11:45:07 +00:00
expect($req->error->get())->toBe(Err::ParsingFailed);
2017-09-20 11:45:07 +00:00
});
2017-09-20 11:45:07 +00:00
});
2017-09-20 11:45:07 +00:00
context('with checks errors', function(){
2017-09-20 11:45:07 +00:00
it('fail with checkPath() fails', function(){
2017-09-20 11:45:07 +00:00
allow(Request::class)->toReceive('checkPath')->andRun(function(){
$this->error->set(Err::UnknownError);
return false;
});
2017-09-20 11:45:07 +00:00
$req = new Request('a/b');
2017-09-20 11:45:07 +00:00
expect($req->error->get())->toBe(Err::UnknownError);
2017-09-20 11:45:07 +00:00
});
2017-09-20 11:45:07 +00:00
it('fail with checkPermission() fails', function(){
2017-09-20 11:45:07 +00:00
// bypass checkPath();
allow(Request::class)->toReceive('checkPath')->andReturn(true);
2017-09-20 11:45:07 +00:00
allow(Request::class)->toReceive('checkPermission')->andRun(function(){
$this->error->set(Err::UnknownError);
return false;
});
2017-09-20 11:45:07 +00:00
$req = new Request('a/b');
2017-09-20 11:45:07 +00:00
expect($req->error->get())->toBe(Err::UnknownError);
2017-09-20 11:45:07 +00:00
});
2017-09-20 11:45:07 +00:00
it('fail with checkParams() fails', function(){
2017-09-20 11:45:07 +00:00
// bypass checkPath(); + checkPermission();
allow(Request::class)->toReceive('checkPath')->andReturn(true);
allow(Request::class)->toReceive('checkPermission')->andReturn(true);
2017-09-20 11:45:07 +00:00
allow(Request::class)->toReceive('checkParams')->andRun(function(){
$this->error->set(Err::UnknownError);
return false;
});
2017-09-20 11:45:07 +00:00
$req = new Request('a/b');
2017-09-20 11:45:07 +00:00
expect($req->error->get())->toBe(Err::UnknownError);
});
it('pass with all checks ok', function(){
2017-09-20 11:45:07 +00:00
// bypass all checks
allow(Request::class)->toReceive('checkPath')->andReturn(true);
allow(Request::class)->toReceive('checkPermission')->andReturn(true);
allow(Request::class)->toReceive('checkParams')->andReturn(true);
2017-09-20 11:45:07 +00:00
// bypass buildOptions();
allow(Request::class)->toReceive('buildOptions')->andReturn(true);
2017-09-20 11:45:07 +00:00
$req = new Request('a/b');
2017-09-20 11:45:07 +00:00
expect($req->error->get())->toBe(Err::Success);
2017-09-20 11:45:07 +00:00
});
});
});
2017-09-20 11:45:07 +00:00
describe('checkPath(@path)', function(){
it('fail when wrong path format: \'module/method\'', function(){
2017-09-20 11:45:07 +00:00
$values = ['a-b', 'a /b', 'a/b '];
2017-09-20 11:45:07 +00:00
foreach($values as $value){
2017-09-20 11:45:07 +00:00
$req = new Request($value);
expect($req->error->get())->toBe(Err::WrongPathModule);
2017-09-20 11:45:07 +00:00
}
2017-09-20 11:45:07 +00:00
});
2017-09-20 11:45:07 +00:00
it('pass when valid path format: letter/number/-/_', function(){
2017-09-20 11:45:07 +00:00
$values = ['a_b-c/d-e_f', 'abc/def', '_a_/_b_'];
2017-09-20 11:45:07 +00:00
foreach($values as $value){
2017-09-20 11:45:07 +00:00
$req = new Request($value);
expect($req->error->get())->not->toBe(Err::WrongPathModule);
2017-09-20 11:45:07 +00:00
}
2017-09-20 11:45:07 +00:00
});
2017-09-20 11:45:07 +00:00
it('fail when unknown module', function(){
2017-09-20 11:45:07 +00:00
allow('json_decode')->toBeCalled()->andReturn([
'mo-du_leA' => [],
'moduleB' => []
]);
2017-09-20 11:45:07 +00:00
$values = ['modulea/method', 'MODULEA/method', 'moduleC/method'];
2017-09-20 11:45:07 +00:00
foreach($values as $value){
2017-09-20 11:45:07 +00:00
$req = new Request($value);
expect($req->error->get())->toBe(Err::UnknownModule);
2017-09-20 11:45:07 +00:00
}
2017-09-20 11:45:07 +00:00
});
2017-09-20 11:45:07 +00:00
it('fail when unknown method', function(){
2017-09-20 11:45:07 +00:00
allow('json_decode')->toBeCalled()->andReturn([
'mo-du_leA' => [ 'POST::me-th_odA' => [] ],
'moduleB' => []
]);
2017-09-20 11:45:07 +00:00
$values = ['mo-du_leA/me-thodA', 'mo-du_leA/meth_odA', 'mo-du_leA/me-th_oda'];
2017-09-20 11:45:07 +00:00
foreach($values as $value){
2017-09-20 11:45:07 +00:00
$req = new Request($value);
expect($req->error->get())->toBe(Err::UnknownMethod);
2017-09-20 11:45:07 +00:00
}
2017-09-20 11:45:07 +00:00
});
2017-09-20 11:45:07 +00:00
});
2017-09-20 11:45:07 +00:00
});
});
});