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');
 | |
|     }
 | |
| 
 | |
| }
 |