124 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			124 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | ||
|  | 
 | ||
|  | namespace think\test\queue; | ||
|  | 
 | ||
|  | use Carbon\Carbon; | ||
|  | use Mockery as m; | ||
|  | use Mockery\MockInterface; | ||
|  | use ReflectionClass; | ||
|  | use stdClass; | ||
|  | use think\Db; | ||
|  | use think\queue\Connector; | ||
|  | use think\queue\connector\Database; | ||
|  | 
 | ||
|  | class DatabaseConnectorTest extends TestCase | ||
|  | { | ||
|  |     /** @var Database|MockInterface */ | ||
|  |     protected $connector; | ||
|  | 
 | ||
|  |     /** @var Db|MockInterface */ | ||
|  |     protected $db; | ||
|  | 
 | ||
|  |     protected function setUp() | ||
|  |     { | ||
|  |         parent::setUp(); | ||
|  |         $this->db        = m::mock(Db::class); | ||
|  |         $this->connector = new Database($this->db, 'table', 'default'); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testPushProperlyPushesJobOntoDatabase() | ||
|  |     { | ||
|  |         $this->db->shouldReceive('name')->with('table')->andReturn($query = m::mock(stdClass::class)); | ||
|  | 
 | ||
|  |         $query->shouldReceive('insertGetId')->once()->andReturnUsing(function ($array) { | ||
|  |             $this->assertEquals('default', $array['queue']); | ||
|  |             $this->assertEquals(json_encode(['job' => 'foo', 'maxTries' => null, 'timeout' => null, 'data' => ['data']]), $array['payload']); | ||
|  |             $this->assertEquals(0, $array['attempts']); | ||
|  |             $this->assertNull($array['reserved_at']); | ||
|  |             $this->assertInternalType('int', $array['available_at']); | ||
|  |         }); | ||
|  |         $this->connector->push('foo', ['data']); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testDelayedPushProperlyPushesJobOntoDatabase() | ||
|  |     { | ||
|  |         $this->db->shouldReceive('name')->with('table')->andReturn($query = m::mock(stdClass::class)); | ||
|  | 
 | ||
|  |         $query->shouldReceive('insertGetId')->once()->andReturnUsing(function ($array) { | ||
|  |             $this->assertEquals('default', $array['queue']); | ||
|  |             $this->assertEquals(json_encode(['job' => 'foo', 'maxTries' => null, 'timeout' => null, 'data' => ['data']]), $array['payload']); | ||
|  |             $this->assertEquals(0, $array['attempts']); | ||
|  |             $this->assertNull($array['reserved_at']); | ||
|  |             $this->assertInternalType('int', $array['available_at']); | ||
|  |         }); | ||
|  | 
 | ||
|  |         $this->connector->later(10, 'foo', ['data']); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testFailureToCreatePayloadFromObject() | ||
|  |     { | ||
|  |         $this->expectException('InvalidArgumentException'); | ||
|  | 
 | ||
|  |         $job          = new stdClass; | ||
|  |         $job->invalid = "\xc3\x28"; | ||
|  | 
 | ||
|  |         $queue = $this->getMockForAbstractClass(Connector::class); | ||
|  |         $class = new ReflectionClass(Connector::class); | ||
|  | 
 | ||
|  |         $createPayload = $class->getMethod('createPayload'); | ||
|  |         $createPayload->setAccessible(true); | ||
|  |         $createPayload->invokeArgs($queue, [ | ||
|  |             $job, | ||
|  |             'queue-name', | ||
|  |         ]); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testFailureToCreatePayloadFromArray() | ||
|  |     { | ||
|  |         $this->expectException('InvalidArgumentException'); | ||
|  | 
 | ||
|  |         $queue = $this->getMockForAbstractClass(Connector::class); | ||
|  |         $class = new ReflectionClass(Connector::class); | ||
|  | 
 | ||
|  |         $createPayload = $class->getMethod('createPayload'); | ||
|  |         $createPayload->setAccessible(true); | ||
|  |         $createPayload->invokeArgs($queue, [ | ||
|  |             ["\xc3\x28"], | ||
|  |             'queue-name', | ||
|  |         ]); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testBulkBatchPushesOntoDatabase() | ||
|  |     { | ||
|  | 
 | ||
|  |         $this->db->shouldReceive('name')->with('table')->andReturn($query = m::mock(stdClass::class)); | ||
|  | 
 | ||
|  |         Carbon::setTestNow( | ||
|  |             $now = Carbon::now()->addSeconds() | ||
|  |         ); | ||
|  | 
 | ||
|  |         $query->shouldReceive('insertAll')->once()->andReturnUsing(function ($records) use ($now) { | ||
|  |             $this->assertEquals([ | ||
|  |                 [ | ||
|  |                     'queue'        => 'queue', | ||
|  |                     'payload'      => json_encode(['job' => 'foo', 'maxTries' => null, 'timeout' => null, 'data' => ['data']]), | ||
|  |                     'attempts'     => 0, | ||
|  |                     'reserved_at'  => null, | ||
|  |                     'available_at' => $now->getTimestamp(), | ||
|  |                     'created_at'   => $now->getTimestamp(), | ||
|  |                 ], [ | ||
|  |                     'queue'        => 'queue', | ||
|  |                     'payload'      => json_encode(['job' => 'bar', 'maxTries' => null, 'timeout' => null, 'data' => ['data']]), | ||
|  |                     'attempts'     => 0, | ||
|  |                     'reserved_at'  => null, | ||
|  |                     'available_at' => $now->getTimestamp(), | ||
|  |                     'created_at'   => $now->getTimestamp(), | ||
|  |                 ], | ||
|  |             ], $records); | ||
|  |         }); | ||
|  | 
 | ||
|  |         $this->connector->bulk(['foo', 'bar'], ['data'], 'queue'); | ||
|  |     } | ||
|  | 
 | ||
|  | } |