broadcaster = m::mock(RedisBroadcaster::class)->makePartial(); $container = Container::setInstance(new Container); $container->singleton('config', function () { return $this->createConfig(); }); } protected function tearDown(): void { m::close(); } public function testAuthCallValidAuthenticationResponseWithPrivateChannelWhenCallbackReturnTrue() { $this->broadcaster->channel('test', function () { return true; }); $this->broadcaster->shouldReceive('validAuthenticationResponse') ->once(); $this->broadcaster->auth( $this->getMockRequestWithUserForChannel('private-test') ); } public function testAuthThrowAccessDeniedHttpExceptionWithPrivateChannelWhenCallbackReturnFalse() { $this->expectException(AccessDeniedHttpException::class); $this->broadcaster->channel('test', function () { return false; }); $this->broadcaster->auth( $this->getMockRequestWithUserForChannel('private-test') ); } public function testAuthThrowAccessDeniedHttpExceptionWithPrivateChannelWhenRequestUserNotFound() { $this->expectException(AccessDeniedHttpException::class); $this->broadcaster->channel('test', function () { return true; }); $this->broadcaster->auth( $this->getMockRequestWithoutUserForChannel('private-test') ); } public function testAuthCallValidAuthenticationResponseWithPresenceChannelWhenCallbackReturnAnArray() { $returnData = [1, 2, 3, 4]; $this->broadcaster->channel('test', function () use ($returnData) { return $returnData; }); $this->broadcaster->shouldReceive('validAuthenticationResponse') ->once(); $this->broadcaster->auth( $this->getMockRequestWithUserForChannel('presence-test') ); } public function testAuthThrowAccessDeniedHttpExceptionWithPresenceChannelWhenCallbackReturnNull() { $this->expectException(AccessDeniedHttpException::class); $this->broadcaster->channel('test', function () { // }); $this->broadcaster->auth( $this->getMockRequestWithUserForChannel('presence-test') ); } public function testAuthThrowAccessDeniedHttpExceptionWithPresenceChannelWhenRequestUserNotFound() { $this->expectException(AccessDeniedHttpException::class); $this->broadcaster->channel('test', function () { return [1, 2, 3, 4]; }); $this->broadcaster->auth( $this->getMockRequestWithoutUserForChannel('presence-test') ); } public function testValidAuthenticationResponseWithPrivateChannel() { $request = $this->getMockRequestWithUserForChannel('private-test'); $this->assertEquals( json_encode(true), $this->broadcaster->validAuthenticationResponse($request, true) ); } public function testValidAuthenticationResponseWithPresenceChannel() { $request = $this->getMockRequestWithUserForChannel('presence-test'); $this->assertEquals( json_encode([ 'channel_data' => [ 'user_id' => 42, 'user_info' => [ 'a' => 'b', 'c' => 'd', ], ], ]), $this->broadcaster->validAuthenticationResponse($request, [ 'a' => 'b', 'c' => 'd', ]) ); } /** * Create a new config repository instance. * * @return \Illuminate\Config\Repository */ protected function createConfig() { return new Config([ 'redis' => [ 'options' => ['prefix' => 'laravel_database_'], ], ]); } /** * @param string $channel * @return \Illuminate\Http\Request */ protected function getMockRequestWithUserForChannel($channel) { $request = m::mock(Request::class); $request->channel_name = $channel; $user = m::mock('User'); $user->shouldReceive('getAuthIdentifierForBroadcasting') ->andReturn(42); $user->shouldReceive('getAuthIdentifier') ->andReturn(42); $request->shouldReceive('user') ->andReturn($user); return $request; } /** * @param string $channel * @return \Illuminate\Http\Request */ protected function getMockRequestWithoutUserForChannel($channel) { $request = m::mock(Request::class); $request->channel_name = $channel; $request->shouldReceive('user') ->andReturn(null); return $request; } }