2018-05-16 15:25:48 +08:00
< ? php
/*
* This file is part of Flarum .
*
* ( c ) Toby Zerner < toby . zerner @ gmail . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
2019-01-02 05:17:09 +08:00
namespace Flarum\Tests\integration\api\Controller ;
2018-05-16 15:25:48 +08:00
2019-01-31 04:15:27 +08:00
use Carbon\Carbon ;
2018-05-16 15:25:48 +08:00
use Flarum\Api\Controller\ShowDiscussionController ;
use Flarum\Discussion\Discussion ;
2019-07-29 19:22:10 +08:00
use Flarum\Event\ScopeModelVisibility ;
2019-01-31 04:15:27 +08:00
use Flarum\User\User ;
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
class ShowDiscussionControllerTest extends ApiControllerTestCase
{
protected $controller = ShowDiscussionController :: class ;
/**
* @ var Discussion
*/
protected $discussion ;
2019-01-31 04:15:27 +08:00
public function setUp ()
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 ()
{
2019-01-31 04:15:27 +08:00
$this -> actor = User :: find ( 2 );
2018-05-16 15:25:48 +08:00
2019-01-31 04:15:27 +08:00
$response = $this -> callWith ([], [ 'id' => 1 ]);
2018-05-16 15:25:48 +08:00
$this -> assertEquals ( 200 , $response -> getStatusCode ());
}
/**
* @ test
*/
public function guest_cannot_see_empty_discussion ()
{
2019-01-31 04:15:27 +08:00
$response = $this -> callWith ([], [ 'id' => 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 ()
{
$response = $this -> callWith ([], [ 'id' => 4 ]);
$json = json_decode ( $response -> getBody () -> getContents (), true );
$this -> assertNull ( Arr :: get ( $json , 'data.relationships.posts' ));
}
/**
* @ test
*/
public function author_can_see_hidden_posts ()
{
$this -> actor = User :: find ( 2 );
$response = $this -> callWith ([], [ 'id' => 4 ]);
$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 */
$events = app ( Dispatcher :: class );
$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
});
$response = $this -> callWith ([], [ 'id' => 4 ]);
$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 ()
{
2019-01-31 04:15:27 +08:00
$response = $this -> callWith ([], [ 'id' => 2 ]);
2018-05-16 15:25:48 +08:00
$this -> assertEquals ( 200 , $response -> getStatusCode ());
}
/**
* @ test
*/
public function guests_cannot_see_private_discussion ()
{
2019-08-10 05:57:33 +08:00
$response = $this -> callWith ([], [ 'id' => 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
}
}