*/ 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"], ]; } }