1
1
Fork 0
mirror of https://code.mensbeam.com/MensBeam/Arsse.git synced 2024-12-22 13:12:41 +00:00

More user query tests

This commit is contained in:
J. King 2020-12-10 23:19:26 -05:00
parent ebdfad535c
commit 4b73698381

View file

@ -21,11 +21,49 @@ use Laminas\Diactoros\Response\EmptyResponse;
/** @covers \JKingWeb\Arsse\REST\Miniflux\V1<extended> */
class TestV1 extends \JKingWeb\Arsse\Test\AbstractTest {
protected const NOW = "2020-12-09T22:35:10.023419Z";
protected $h;
protected $transaction;
protected $token = "Tk2o9YubmZIL2fm2w8Z4KlDEQJz532fNSOcTG0s2_xc=";
protected $users = [
[
'id' => 1,
'username' => "john.doe@example.com",
'is_admin' => true,
'theme' => "custom",
'language' => "fr_CA",
'timezone' => "Asia/Gaza",
'entry_sorting_direction' => "asc",
'entries_per_page' => 200,
'keyboard_shortcuts' => false,
'show_reading_time' => false,
'last_login_at' => self::NOW,
'entry_swipe' => false,
'extra' => [
'custom_css' => "p {}",
],
],
[
'id' => 2,
'username' => "jane.doe@example.com",
'is_admin' => false,
'theme' => "light_serif",
'language' => "en_US",
'timezone' => "UTC",
'entry_sorting_direction' => "desc",
'entries_per_page' => 100,
'keyboard_shortcuts' => true,
'show_reading_time' => true,
'last_login_at' => self::NOW,
'entry_swipe' => true,
'extra' => [
'custom_css' => "",
],
]
];
protected function req(string $method, string $target, $data = "", array $headers = [], bool $authenticated = true, bool $body = true): ResponseInterface {
protected function req(string $method, string $target, $data = "", array $headers = [], ?string $user = "john.doe@example.com", bool $body = true): ResponseInterface {
$prefix = "/v1";
$url = $prefix.$target;
if ($body) {
@ -34,7 +72,7 @@ class TestV1 extends \JKingWeb\Arsse\Test\AbstractTest {
$params = $data;
$data = [];
}
$req = $this->serverRequest($method, $url, $prefix, $headers, [], $data, "application/json", $params, $authenticated ? "john.doe@example.com" : "");
$req = $this->serverRequest($method, $url, $prefix, $headers, [], $data, "application/json", $params, $user);
return $this->h->dispatch($req);
}
@ -71,7 +109,7 @@ class TestV1 extends \JKingWeb\Arsse\Test\AbstractTest {
Arsse::$user->id = null;
\Phake::when(Arsse::$db)->tokenLookup->thenThrow(new ExceptionInput("subjectMissing"));
\Phake::when(Arsse::$db)->tokenLookup("miniflux.login", $this->token)->thenReturn(['user' => $user]);
$this->assertMessage($exp, $this->req("GET", "/", "", $headers, $auth));
$this->assertMessage($exp, $this->req("GET", "/", "", $headers, $auth ? "john.doe@example.com" : null));
$this->assertSame($success ? $user : null, Arsse::$user->id);
}
@ -141,49 +179,14 @@ class TestV1 extends \JKingWeb\Arsse\Test\AbstractTest {
$this->assertMessage($exp, $this->req("POST", "/discover", ['url' => "http://localhost:8000/Feed/Discovery/Missing"]));
}
public function testQueryUsers(): void {
$now = Date::normalize("now");
/** @dataProvider provideUserQueries */
public function testQueryUsers(bool $admin, string $route, ResponseInterface $exp): void {
$u = [
['num'=> 1, 'admin' => true, 'theme' => "custom", 'lang' => "fr_CA", 'tz' => "Asia/Gaza", 'sort_asc' => true, 'page_size' => 200, 'shortcuts' => false, 'reading_time' => false, 'swipe' => false, 'stylesheet' => "p {}"],
['num'=> 2, 'admin' => false, 'theme' => null, 'lang' => null, 'tz' => null, 'sort_asc' => null, 'page_size' => null, 'shortcuts' => null, 'reading_time' => null, 'swipe' => null, 'stylesheet' => null],
new ExceptionConflict("doesNotExist"),
];
$exp = [
[
'id' => 1,
'username' => "john.doe@example.com",
'is_admin' => true,
'theme' => "custom",
'language' => "fr_CA",
'timezone' => "Asia/Gaza",
'entry_sorting_direction' => "asc",
'entries_per_page' => 200,
'keyboard_shortcuts' => false,
'show_reading_time' => false,
'last_login_at' => Date::transform($now, "iso8601m"),
'entry_swipe' => false,
'extra' => [
'custom_css' => "p {}",
],
],
[
'id' => 2,
'username' => "jane.doe@example.com",
'is_admin' => false,
'theme' => "light_serif",
'language' => "en_US",
'timezone' => "UTC",
'entry_sorting_direction' => "desc",
'entries_per_page' => 100,
'keyboard_shortcuts' => true,
'show_reading_time' => true,
'last_login_at' => Date::transform($now, "iso8601m"),
'entry_swipe' => true,
'extra' => [
'custom_css' => "",
],
]
];
$user = $admin ? "john.doe@example.com" : "jane.doe@example.com";
// FIXME: Phake is somehow unable to mock the User class correctly, so we use PHPUnit's mocks instead
Arsse::$user = $this->createMock(User::class);
Arsse::$user->method("list")->willReturn(["john.doe@example.com", "jane.doe@example.com", "admin@example.com"]);
@ -206,18 +209,29 @@ class TestV1 extends \JKingWeb\Arsse\Test\AbstractTest {
}
});
$this->h = $this->createPartialMock(V1::class, ["now"]);
$this->h->method("now")->willReturn($now);
// list all users
$this->assertMessage(new Response($exp), $this->req("GET", "/users"));
// fetch John
$this->assertMessage(new Response($exp[0]), $this->req("GET", "/me"));
$this->assertMessage(new Response($exp[0]), $this->req("GET", "/users/john.doe@example.com"));
$this->assertMessage(new Response($exp[0]), $this->req("GET", "/users/1"));
// fetch Jane
$this->assertMessage(new Response($exp[1]), $this->req("GET", "/users/jane.doe@example.com"));
$this->assertMessage(new Response($exp[1]), $this->req("GET", "/users/2"));
// fetch no one
$this->assertMessage(new ErrorResponse("404", 404), $this->req("GET", "/users/jack.doe@example.com"));
$this->assertMessage(new ErrorResponse("404", 404), $this->req("GET", "/users/47"));
$this->h->method("now")->willReturn(Date::normalize(self::NOW));
$this->assertMessage($exp, $this->req("GET", $route, "", [], $user));
}
public function provideUserQueries(): iterable {
self::clearData();
return [
[true, "/users", new Response($this->users)],
[true, "/me", new Response($this->users[0])],
[true, "/users/john.doe@example.com", new Response($this->users[0])],
[true, "/users/1", new Response($this->users[0])],
[true, "/users/jane.doe@example.com", new Response($this->users[1])],
[true, "/users/2", new Response($this->users[1])],
[true, "/users/jack.doe@example.com", new ErrorResponse("404", 404)],
[true, "/users/47", new ErrorResponse("404", 404)],
[false, "/users", new ErrorResponse("403", 403)],
[false, "/me", new Response($this->users[1])],
[false, "/users/john.doe@example.com", new ErrorResponse("403", 403)],
[false, "/users/1", new ErrorResponse("403", 403)],
[false, "/users/jane.doe@example.com", new ErrorResponse("403", 403)],
[false, "/users/2", new ErrorResponse("403", 403)],
[false, "/users/jack.doe@example.com", new ErrorResponse("403", 403)],
[false, "/users/47", new ErrorResponse("403", 403)],
];
}
}