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