2018-05-16 15:25:48 +08:00
< ? php
/*
* This file is part of Flarum .
*
2019-11-28 08:16:50 +08:00
* For detailed copyright and license information , please view the
* LICENSE file that was distributed with this source code .
2018-05-16 15:25:48 +08:00
*/
2020-03-27 20:39:38 +08:00
namespace Flarum\Tests\integration\api\discussions ;
2018-05-16 15:25:48 +08:00
2019-01-31 04:15:27 +08:00
use Carbon\Carbon ;
2019-07-29 19:22:10 +08:00
use Flarum\Event\ScopeModelVisibility ;
2020-03-27 20:39:38 +08:00
use Flarum\Tests\integration\RetrievesAuthorizedUsers ;
use Flarum\Tests\integration\TestCase ;
2019-07-29 19:22:10 +08:00
use Illuminate\Contracts\Events\Dispatcher ;
use Illuminate\Support\Arr ;
2018-05-16 15:25:48 +08:00
2020-03-27 20:39:38 +08:00
class ShowTest extends TestCase
2018-05-16 15:25:48 +08:00
{
2020-03-27 20:39:38 +08:00
use RetrievesAuthorizedUsers ;
2018-05-16 15:25:48 +08:00
2020-03-28 08:26:26 +08:00
protected function setUp () : void
2018-05-16 15:25:48 +08:00
{
2019-01-31 04:15:27 +08:00
parent :: setUp ();
$this -> prepareDatabase ([
'discussions' => [
[ 'id' => 1 , 'title' => 'Empty discussion' , 'created_at' => Carbon :: now () -> toDateTimeString (), 'user_id' => 2 , 'first_post_id' => null , 'comment_count' => 0 , 'is_private' => 0 ],
[ 'id' => 2 , 'title' => 'Discussion with post' , 'created_at' => Carbon :: now () -> toDateTimeString (), 'user_id' => 2 , 'first_post_id' => 1 , 'comment_count' => 1 , 'is_private' => 0 ],
[ 'id' => 3 , 'title' => 'Private discussion' , 'created_at' => Carbon :: now () -> toDateTimeString (), 'user_id' => 2 , 'first_post_id' => null , 'comment_count' => 0 , 'is_private' => 1 ],
2019-07-29 19:22:10 +08:00
[ 'id' => 4 , 'title' => 'Discussion with hidden post' , 'created_at' => Carbon :: now () -> toDateTimeString (), 'user_id' => 2 , 'first_post_id' => 2 , 'comment_count' => 1 , 'is_private' => 0 ],
2019-01-31 04:15:27 +08:00
],
'posts' => [
[ 'id' => 1 , 'discussion_id' => 2 , 'created_at' => Carbon :: now () -> toDateTimeString (), 'user_id' => 2 , 'type' => 'comment' , 'content' => '<t><p>a normal reply - too-obscure</p></t>' ],
2019-07-29 19:22:10 +08:00
[ 'id' => 2 , 'discussion_id' => 4 , 'created_at' => Carbon :: now () -> toDateTimeString (), 'user_id' => 2 , 'type' => 'comment' , 'content' => '<t><p>a hidden reply - too-obscure</p></t>' , 'hidden_at' => Carbon :: now () -> toDateTimeString ()],
2019-01-31 04:15:27 +08:00
],
'users' => [
$this -> normalUser (),
],
'groups' => [
$this -> guestGroup (),
$this -> memberGroup (),
],
'group_user' => [
[ 'user_id' => 2 , 'group_id' => 3 ],
],
'group_permission' => [
[ 'permission' => 'viewDiscussions' , 'group_id' => 2 ],
[ 'permission' => 'viewDiscussions' , 'group_id' => 3 ],
]
]);
2018-05-16 15:25:48 +08:00
}
/**
* @ test
*/
public function author_can_see_discussion ()
{
2020-03-27 20:39:38 +08:00
$response = $this -> send (
$this -> request ( 'GET' , '/api/discussions/1' , [
'authenticatedAs' => 2 ,
])
);
2018-05-16 15:25:48 +08:00
$this -> assertEquals ( 200 , $response -> getStatusCode ());
}
/**
* @ test
*/
public function guest_cannot_see_empty_discussion ()
{
2020-03-27 20:39:38 +08:00
$response = $this -> send (
$this -> request ( 'GET' , '/api/discussions/1' )
);
2018-05-16 15:25:48 +08:00
2019-08-10 05:57:33 +08:00
$this -> assertEquals ( 404 , $response -> getStatusCode ());
2018-05-16 15:25:48 +08:00
}
2019-07-29 19:22:10 +08:00
/**
* @ test
*/
public function guest_cannot_see_hidden_posts ()
{
2020-03-27 20:39:38 +08:00
$response = $this -> send (
$this -> request ( 'GET' , '/api/discussions/4' )
);
2019-07-29 19:22:10 +08:00
$json = json_decode ( $response -> getBody () -> getContents (), true );
$this -> assertNull ( Arr :: get ( $json , 'data.relationships.posts' ));
}
/**
* @ test
*/
public function author_can_see_hidden_posts ()
{
2020-03-27 20:39:38 +08:00
$response = $this -> send (
$this -> request ( 'GET' , '/api/discussions/4' , [
'authenticatedAs' => 2 ,
])
);
2019-07-29 19:22:10 +08:00
$json = json_decode ( $response -> getBody () -> getContents (), true );
$this -> assertEquals ( 2 , Arr :: get ( $json , 'data.relationships.posts.data.0.id' ));
}
/**
* @ test
*/
public function when_allowed_guests_can_see_hidden_posts ()
{
/** @var Dispatcher $events */
2020-05-23 07:55:58 +08:00
$events = $this -> app () -> getContainer () -> make ( Dispatcher :: class );
2019-07-29 19:22:10 +08:00
$events -> listen ( ScopeModelVisibility :: class , function ( ScopeModelVisibility $event ) {
2019-11-21 20:14:35 +08:00
if ( $event -> ability === 'hidePosts' ) {
2019-11-21 18:47:01 +08:00
$event -> query -> whereRaw ( '1=1' );
}
2019-07-29 19:22:10 +08:00
});
2020-03-27 20:39:38 +08:00
$response = $this -> send (
$this -> request ( 'GET' , '/api/discussions/4' )
);
2019-07-29 19:22:10 +08:00
$json = json_decode ( $response -> getBody () -> getContents (), true );
$this -> assertEquals ( 2 , Arr :: get ( $json , 'data.relationships.posts.data.0.id' ));
}
2018-05-16 15:25:48 +08:00
/**
* @ test
*/
public function guest_can_see_discussion ()
{
2020-03-27 20:39:38 +08:00
$response = $this -> send (
$this -> request ( 'GET' , '/api/discussions/2' )
);
2018-05-16 15:25:48 +08:00
$this -> assertEquals ( 200 , $response -> getStatusCode ());
}
/**
* @ test
*/
public function guests_cannot_see_private_discussion ()
{
2020-03-27 20:39:38 +08:00
$response = $this -> send (
$this -> request ( 'GET' , '/api/discussions/3' )
);
2019-07-30 06:09:10 +08:00
2019-08-10 05:57:33 +08:00
$this -> assertEquals ( 404 , $response -> getStatusCode ());
2018-05-16 15:25:48 +08:00
}
}