*/
class TestV1 extends \JKingWeb\Arsse\Test\AbstractTest {
protected $h;
protected $transaction;
protected function req(string $method, string $target, $data = "", array $headers = [], bool $authenticated = true, bool $body = true): ResponseInterface {
$prefix = "/v1";
$url = $prefix.$target;
if ($body) {
$params = [];
} else {
$params = $data;
$data = [];
}
$req = $this->serverRequest($method, $url, $prefix, $headers, [], $data, "application/json", $params, $authenticated ? "john.doe@example.com" : "");
return $this->h->dispatch($req);
}
public function setUp(): void {
self::clearData();
self::setConf();
// create a mock user manager
Arsse::$user = \Phake::mock(User::class);
Arsse::$user->id = "john.doe@example.com";
// create a mock database interface
Arsse::$db = \Phake::mock(Database::class);
$this->transaction = \Phake::mock(Transaction::class);
\Phake::when(Arsse::$db)->begin->thenReturn($this->transaction);
//initialize a handler
$this->h = new V1();
}
public function tearDown(): void {
self::clearData();
}
protected function v($value) {
return $value;
}
public function testSendAuthenticationChallenge(): void {
$exp = new EmptyResponse(401);
$this->assertMessage($exp, $this->req("GET", "/", "", [], false));
}
/** @dataProvider provideInvalidPaths */
public function testRespondToInvalidPaths($path, $method, $code, $allow = null): void {
$exp = new EmptyResponse($code, $allow ? ['Allow' => $allow] : []);
$this->assertMessage($exp, $this->req($method, $path));
}
public function provideInvalidPaths(): array {
return [
["/", "GET", 404],
["/", "POST", 404],
["/", "PUT", 404],
["/", "DELETE", 404],
["/", "OPTIONS", 404],
["/version/invalid", "GET", 404],
["/version/invalid", "POST", 404],
["/version/invalid", "PUT", 404],
["/version/invalid", "DELETE", 404],
["/version/invalid", "OPTIONS", 404],
["/folders/1/invalid", "GET", 404],
["/folders/1/invalid", "POST", 404],
["/folders/1/invalid", "PUT", 404],
["/folders/1/invalid", "DELETE", 404],
["/folders/1/invalid", "OPTIONS", 404],
["/version", "POST", 405, "GET"],
["/version", "PUT", 405, "GET"],
["/version", "DELETE", 405, "GET"],
["/folders", "PUT", 405, "GET, POST"],
["/folders", "DELETE", 405, "GET, POST"],
["/folders/1", "GET", 405, "PUT, DELETE"],
["/folders/1", "POST", 405, "PUT, DELETE"],
];
}
public function testRespondToInvalidInputTypes(): void {
$exp = new EmptyResponse(415, ['Accept' => "application/json"]);
$this->assertMessage($exp, $this->req("PUT", "/folders/1", '', ['Content-Type' => "application/xml"]));
$exp = new EmptyResponse(400);
$this->assertMessage($exp, $this->req("PUT", "/folders/1", ''));
$this->assertMessage($exp, $this->req("PUT", "/folders/1", '', ['Content-Type' => null]));
}
/** @dataProvider provideOptionsRequests */
public function testRespondToOptionsRequests(string $url, string $allow, string $accept): void {
$exp = new EmptyResponse(204, [
'Allow' => $allow,
'Accept' => $accept,
]);
$this->assertMessage($exp, $this->req("OPTIONS", $url));
}
public function provideOptionsRequests(): array {
return [
["/feeds", "HEAD,GET,POST", "application/json"],
["/feeds/2112", "DELETE", "application/json"],
["/user", "HEAD,GET", "application/json"],
];
}
}