2021-06-26 23:23:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< ? php  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								namespace  Tests ;  
						 
					
						
							
								
									
										
										
										
											2015-07-13 03:01:42 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-22 08:17:45 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								use  BookStack\Entities\Models\Entity ;  
						 
					
						
							
								
									
										
										
										
											2023-09-08 21:16:09 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								use  BookStack\Http\HttpClientHistory ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								use  BookStack\Http\HttpRequestService ;  
						 
					
						
							
								
									
										
										
										
											2022-07-23 22:10:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								use  BookStack\Settings\SettingService ;  
						 
					
						
							
								
									
										
										
										
											2023-08-17 21:59:28 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								use  BookStack\Users\Models\User ;  
						 
					
						
							
								
									
										
										
										
											2022-09-27 08:27:51 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								use  Illuminate\Contracts\Console\Kernel ;  
						 
					
						
							
								
									
										
										
										
											2017-02-05 22:37:50 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								use  Illuminate\Foundation\Testing\DatabaseTransactions ;  
						 
					
						
							
								
									
										
										
										
											2017-02-04 19:58:42 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								use  Illuminate\Foundation\Testing\TestCase  as  BaseTestCase ;  
						 
					
						
							
								
									
										
										
										
											2022-07-23 22:10:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								use  Illuminate\Http\JsonResponse ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								use  Illuminate\Support\Env ;  
						 
					
						
							
								
									
										
										
										
											2022-09-27 04:25:32 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								use  Illuminate\Support\Facades\DB ;  
						 
					
						
							
								
									
										
										
										
											2022-07-23 22:10:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								use  Illuminate\Support\Facades\Log ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								use  Illuminate\Testing\Assert  as  PHPUnit ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								use  Monolog\Handler\TestHandler ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								use  Monolog\Logger ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								use  Ssddanbrown\AssertHtml\TestsHtml ;  
						 
					
						
							
								
									
										
										
										
											2022-09-29 23:49:25 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								use  Tests\Helpers\EntityProvider ;  
						 
					
						
							
								
									
										
										
										
											2023-02-08 22:39:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								use  Tests\Helpers\FileProvider ;  
						 
					
						
							
								
									
										
										
										
											2023-01-21 19:08:34 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								use  Tests\Helpers\PermissionsProvider ;  
						 
					
						
							
								
									
										
										
										
											2022-09-30 05:11:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								use  Tests\Helpers\TestServiceProvider ;  
						 
					
						
							
								
									
										
										
										
											2023-01-21 19:08:34 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								use  Tests\Helpers\UserRoleProvider ;  
						 
					
						
							
								
									
										
										
										
											2015-09-03 01:26:33 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 19:58:42 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								abstract  class  TestCase  extends  BaseTestCase  
						 
					
						
							
								
									
										
										
										
											2015-07-13 03:01:42 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2017-02-04 19:58:42 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    use  CreatesApplication ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-05 22:37:50 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    use  DatabaseTransactions ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-23 22:10:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    use  TestsHtml ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 23:49:25 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    protected  EntityProvider  $entities ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 19:08:34 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    protected  UserRoleProvider  $users ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    protected  PermissionsProvider  $permissions ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-08 22:39:13 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    protected  FileProvider  $files ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 23:49:25 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    protected  function  setUp () :  void 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $this -> entities  =  new  EntityProvider (); 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 19:08:34 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        $this -> users  =  new  UserRoleProvider (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $this -> permissions  =  new  PermissionsProvider ( $this -> users ); 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-08 22:39:13 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        $this -> files  =  new  FileProvider (); 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 19:08:34 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 23:49:25 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        parent :: setUp (); 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-22 04:50:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // We can uncomment the below to run tests with failings upon deprecations.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // Can't leave on since some deprecations can only be fixed upstream.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								         // $this->withoutDeprecationHandling();
 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 23:49:25 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-21 22:15:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-01-28 21:33:50 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  The  base  URL  to  use  while  testing  the  application . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-23 22:10:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    protected  string  $baseUrl  =  'http://localhost' ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-28 21:33:50 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-27 08:27:51 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Creates  the  application . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ return  \Illuminate\Foundation\Application 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    public  function  createApplication () 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /** @var \Illuminate\Foundation\Application  $app */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $app  =  require  __DIR__  .  '/../bootstrap/app.php' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $app -> register ( TestServiceProvider :: class ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $app -> make ( Kernel :: class ) -> bootstrap (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  $app ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-09-21 22:15:16 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-23 22:10:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								     *  Set  the  current  user  context  to  be  an  admin . 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-21 22:15:16 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-23 22:10:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    public  function  asAdmin () 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-21 22:15:16 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 19:08:34 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        return  $this -> actingAs ( $this -> users -> admin ()); 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-21 22:15:16 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-23 22:10:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								     *  Set  the  current  user  context  to  be  an  editor . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    public  function  asEditor () 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 19:08:34 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        return  $this -> actingAs ( $this -> users -> editor ()); 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-23 22:10:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-03 19:32:21 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Set  the  current  user  context  to  be  a  viewer . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    public  function  asViewer () 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 19:08:34 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        return  $this -> actingAs ( $this -> users -> viewer ()); 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-23 22:10:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Quickly  sets  an  array  of  settings . 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-21 22:15:16 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-23 22:10:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    protected  function  setSettings ( array  $settingsArray ) :  void 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-21 22:15:16 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-23 22:10:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        $settings  =  app ( SettingService :: class ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        foreach  ( $settingsArray  as  $key  =>  $value )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $settings -> put ( $key ,  $value ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-08 21:16:09 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								     *  Mock  the  http  client  used  in  BookStack  http  calls . 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-21 22:15:16 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-08 21:16:09 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    protected  function  mockHttpClient ( array  $responses  =  []) :  HttpClientHistory 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-21 22:15:16 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-08 21:16:09 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        return  $this -> app -> make ( HttpRequestService :: class ) -> mockClient ( $responses ); 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-23 22:10:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Run  a  set  test  with  the  given  env  variable . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Remembers  the  original  and  resets  the  value  after  test . 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-27 04:25:32 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								     *  Database  config  is  juggled  so  the  value  can  be  restored  when 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  parallel  testing  are  used ,  where  multiple  databases  exist . 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-23 22:10:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    protected  function  runWithEnv ( string  $name ,  $value ,  callable  $callback ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        Env :: disablePutenv (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $originalVal  =  $_SERVER [ $name ]  ? ?  null ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( is_null ( $value ))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            unset ( $_SERVER [ $name ]); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $_SERVER [ $name ]  =  $value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-27 04:25:32 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        $database  =  config ( 'database.connections.mysql_testing.database' ); 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-23 22:10:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        $this -> refreshApplication (); 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-27 04:25:32 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        DB :: purge (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        config () -> set ( 'database.connections.mysql_testing.database' ,  $database ); 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 21:03:47 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        DB :: beginTransaction (); 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-27 04:25:32 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-07-23 22:10:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        $callback (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-21 21:03:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        DB :: rollBack (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-07-23 22:10:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  ( is_null ( $originalVal ))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            unset ( $_SERVER [ $name ]); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $_SERVER [ $name ]  =  $originalVal ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Check  the  keys  and  properties  in  the  given  map  to  include 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  exist ,  albeit  not  exclusively ,  within  the  map  to  check . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    protected  function  assertArrayMapIncludes ( array  $mapToInclude ,  array  $mapToCheck ,  string  $message  =  '' ) :  void 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $passed  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        foreach  ( $mapToInclude  as  $key  =>  $value )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! isset ( $mapToCheck [ $key ])  ||  $mapToCheck [ $key ]  !==  $mapToInclude [ $key ])  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                $passed  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $toIncludeStr  =  print_r ( $mapToInclude ,  true ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $toCheckStr  =  print_r ( $mapToCheck ,  true ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        self :: assertThat ( $passed ,  self :: isTrue (),  " Failed asserting that given map: \n \n { $toCheckStr } \n \n includes: \n \n { $toIncludeStr } " ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Assert  a  permission  error  has  occurred . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    protected  function  assertPermissionError ( $response ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        PHPUnit :: assertTrue ( $this -> isPermissionError ( $response -> baseResponse  ? ?  $response -> response ),  'Failed asserting the response contains a permission error.' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Assert  a  permission  error  has  occurred . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    protected  function  assertNotPermissionError ( $response ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        PHPUnit :: assertFalse ( $this -> isPermissionError ( $response -> baseResponse  ? ?  $response -> response ),  'Failed asserting the response does not contain a permission error.' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Check  if  the  given  response  is  a  permission  error . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    private  function  isPermissionError ( $response ) :  bool 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-31 03:55:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( $response -> status ()  ===  403  &&  $response  instanceof  JsonResponse )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $errMessage  =  $response -> getData ( true )[ 'error' ][ 'message' ]  ? ?  '' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  $errMessage  ===  'You do not have permission to perform the requested action.' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-07-23 22:10:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        return  $response -> status ()  ===  302 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-31 03:55:24 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            &&  $response -> headers -> get ( 'Location' )  ===  url ( '/' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            &&  str_starts_with ( session () -> pull ( 'error' ,  '' ),  'You do not have permission to access' ); 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-23 22:10:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Assert  that  the  session  has  a  particular  error  notification  message  set . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    protected  function  assertSessionError ( string  $message ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $error  =  session () -> get ( 'error' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        PHPUnit :: assertTrue ( $error  ===  $message ,  " Failed asserting the session contains an error.  \n Found:  { $error } \n Expecting:  { $message } " ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Assert  the  session  contains  a  specific  entry . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    protected  function  assertSessionHas ( string  $key ) :  self 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $this -> assertTrue ( session () -> has ( $key ),  " Session does not contain a [ { $key } ] entry " ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  $this ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    protected  function  assertNotificationContains ( \Illuminate\Testing\TestResponse  $resp ,  string  $text ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-23 20:07:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  $this -> withHtml ( $resp ) -> assertElementContains ( '.notification[role="alert"]' ,  $text ); 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-23 22:10:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Set  a  test  handler  as  the  logging  interface  for  the  application . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Allows  capture  of  logs  for  checking  against  during  tests . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    protected  function  withTestLogger () :  TestHandler 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $monolog  =  new  Logger ( 'testing' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $testHandler  =  new  TestHandler (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $monolog -> pushHandler ( $testHandler ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        Log :: extend ( 'testing' ,  function  ()  use  ( $monolog )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  $monolog ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        Log :: setDefaultDriver ( 'testing' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  $testHandler ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-28 20:55:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-12 22:45:54 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Assert  that  an  activity  entry  exists  of  the  given  key . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Checks  the  activity  belongs  to  the  given  entity  if  provided . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-19 04:29:42 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    protected  function  assertActivityExists ( string  $type ,  ? Entity  $entity  =  null ,  string  $detail  =  '' ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-12 22:45:54 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-08 08:03:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        $detailsToCheck  =  [ 'type'  =>  $type ]; 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-12 22:45:54 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( $entity )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-05 22:44:58 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            $detailsToCheck [ 'loggable_type' ]  =  $entity -> getMorphClass (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $detailsToCheck [ 'loggable_id' ]  =  $entity -> id ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-12 22:45:54 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-16 03:55:10 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( $detail )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $detailsToCheck [ 'detail' ]  =  $detail ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-01-12 22:45:54 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        $this -> assertDatabaseHas ( 'activities' ,  $detailsToCheck ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-26 23:23:15 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}