256 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			256 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			PHP
		
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use League\Flysystem\Cached\Storage\Memory;
							 | 
						||
| 
								 | 
							
								use League\Flysystem\Util;
							 | 
						||
| 
								 | 
							
								use PHPUnit\Framework\TestCase;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class MemoryCacheTests extends TestCase
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    public function testAutosave()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $cache = new Memory();
							 | 
						||
| 
								 | 
							
								        $cache->setAutosave(true);
							 | 
						||
| 
								 | 
							
								        $this->assertTrue($cache->getAutosave());
							 | 
						||
| 
								 | 
							
								        $cache->setAutosave(false);
							 | 
						||
| 
								 | 
							
								        $this->assertFalse($cache->getAutosave());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testCacheMiss()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $cache = new Memory();
							 | 
						||
| 
								 | 
							
								        $cache->storeMiss('path.txt');
							 | 
						||
| 
								 | 
							
								        $this->assertFalse($cache->has('path.txt'));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testIsComplete()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $cache = new Memory();
							 | 
						||
| 
								 | 
							
								        $this->assertFalse($cache->isComplete('dirname', false));
							 | 
						||
| 
								 | 
							
								        $cache->setComplete('dirname', false);
							 | 
						||
| 
								 | 
							
								        $this->assertFalse($cache->isComplete('dirname', true));
							 | 
						||
| 
								 | 
							
								        $cache->setComplete('dirname', true);
							 | 
						||
| 
								 | 
							
								        $this->assertTrue($cache->isComplete('dirname', true));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testCleanContents()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $cache = new Memory();
							 | 
						||
| 
								 | 
							
								        $input = [[
							 | 
						||
| 
								 | 
							
								            'path'       => 'path.txt',
							 | 
						||
| 
								 | 
							
								            'visibility' => 'public',
							 | 
						||
| 
								 | 
							
								            'invalid'    => 'thing',
							 | 
						||
| 
								 | 
							
								        ]];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $expected = [[
							 | 
						||
| 
								 | 
							
								            'path'       => 'path.txt',
							 | 
						||
| 
								 | 
							
								            'visibility' => 'public',
							 | 
						||
| 
								 | 
							
								        ]];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $output = $cache->cleanContents($input);
							 | 
						||
| 
								 | 
							
								        $this->assertEquals($expected, $output);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testGetForStorage()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $cache = new Memory();
							 | 
						||
| 
								 | 
							
								        $input = [[
							 | 
						||
| 
								 | 
							
								            'path'       => 'path.txt',
							 | 
						||
| 
								 | 
							
								            'visibility' => 'public',
							 | 
						||
| 
								 | 
							
								            'type'       => 'file',
							 | 
						||
| 
								 | 
							
								        ]];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $cache->storeContents('', $input, true);
							 | 
						||
| 
								 | 
							
								        $contents = $cache->listContents('', true);
							 | 
						||
| 
								 | 
							
								        $cached = [];
							 | 
						||
| 
								 | 
							
								        foreach ($contents as $item) {
							 | 
						||
| 
								 | 
							
								            $cached[$item['path']] = $item;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->assertEquals(json_encode([$cached, ['' => 'recursive']]), $cache->getForStorage());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testParentCompleteIsUsedDuringHas()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $cache = new Memory();
							 | 
						||
| 
								 | 
							
								        $cache->setComplete('dirname', false);
							 | 
						||
| 
								 | 
							
								        $this->assertFalse($cache->has('dirname/path.txt'));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testFlush()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $cache = new Memory();
							 | 
						||
| 
								 | 
							
								        $cache->setComplete('dirname', true);
							 | 
						||
| 
								 | 
							
								        $cache->updateObject('path.txt', [
							 | 
						||
| 
								 | 
							
								            'path'       => 'path.txt',
							 | 
						||
| 
								 | 
							
								            'visibility' => 'public',
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								        $cache->flush();
							 | 
						||
| 
								 | 
							
								        $this->assertFalse($cache->isComplete('dirname', true));
							 | 
						||
| 
								 | 
							
								        $this->assertNull($cache->has('path.txt'));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testSetFromStorage()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $cache = new Memory();
							 | 
						||
| 
								 | 
							
								        $json = [[
							 | 
						||
| 
								 | 
							
								            'path.txt' => ['path' => 'path.txt', 'type' => 'file'],
							 | 
						||
| 
								 | 
							
								        ], ['dirname' => 'recursive']];
							 | 
						||
| 
								 | 
							
								        $jsonString = json_encode($json);
							 | 
						||
| 
								 | 
							
								        $cache->setFromStorage($jsonString);
							 | 
						||
| 
								 | 
							
								        $this->assertTrue($cache->has('path.txt'));
							 | 
						||
| 
								 | 
							
								        $this->assertTrue($cache->isComplete('dirname', true));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testGetMetadataFail()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $cache = new Memory();
							 | 
						||
| 
								 | 
							
								        $this->assertFalse($cache->getMetadata('path.txt'));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function metaGetterProvider()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return [
							 | 
						||
| 
								 | 
							
								            ['getTimestamp', 'timestamp', 12344],
							 | 
						||
| 
								 | 
							
								            ['getMimetype', 'mimetype', 'text/plain'],
							 | 
						||
| 
								 | 
							
								            ['getSize', 'size', 12],
							 | 
						||
| 
								 | 
							
								            ['getVisibility', 'visibility', 'private'],
							 | 
						||
| 
								 | 
							
								            ['read', 'contents', '__contents__'],
							 | 
						||
| 
								 | 
							
								        ];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @dataProvider metaGetterProvider
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @param $method
							 | 
						||
| 
								 | 
							
								     * @param $key
							 | 
						||
| 
								 | 
							
								     * @param $value
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function testMetaGetters($method, $key, $value)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $cache = new Memory();
							 | 
						||
| 
								 | 
							
								        $this->assertFalse($cache->{$method}('path.txt'));
							 | 
						||
| 
								 | 
							
								        $cache->updateObject('path.txt', $object = [
							 | 
						||
| 
								 | 
							
								                'path' => 'path.txt',
							 | 
						||
| 
								 | 
							
								                'type' => 'file',
							 | 
						||
| 
								 | 
							
								                $key   => $value,
							 | 
						||
| 
								 | 
							
								            ] + Util::pathinfo('path.txt'), true);
							 | 
						||
| 
								 | 
							
								        $this->assertEquals($object, $cache->{$method}('path.txt'));
							 | 
						||
| 
								 | 
							
								        $this->assertEquals($object, $cache->getMetadata('path.txt'));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testGetDerivedMimetype()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $cache = new Memory();
							 | 
						||
| 
								 | 
							
								        $cache->updateObject('path.txt', [
							 | 
						||
| 
								 | 
							
								            'contents' => 'something',
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								        $response = $cache->getMimetype('path.txt');
							 | 
						||
| 
								 | 
							
								        $this->assertEquals('text/plain', $response['mimetype']);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testCopyFail()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $cache = new Memory();
							 | 
						||
| 
								 | 
							
								        $cache->copy('one', 'two');
							 | 
						||
| 
								 | 
							
								        $this->assertNull($cache->has('two'));
							 | 
						||
| 
								 | 
							
								        $this->assertNull($cache->load());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testStoreContents()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $cache = new Memory();
							 | 
						||
| 
								 | 
							
								        $cache->storeContents('dirname', [
							 | 
						||
| 
								 | 
							
								            ['path' => 'dirname', 'type' => 'dir'],
							 | 
						||
| 
								 | 
							
								            ['path' => 'dirname/nested', 'type' => 'dir'],
							 | 
						||
| 
								 | 
							
								            ['path' => 'dirname/nested/deep', 'type' => 'dir'],
							 | 
						||
| 
								 | 
							
								            ['path' => 'other/nested/deep', 'type' => 'dir'],
							 | 
						||
| 
								 | 
							
								        ], true);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->isTrue($cache->isComplete('other/nested', true));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testDelete()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $cache = new Memory();
							 | 
						||
| 
								 | 
							
								        $cache->updateObject('path.txt', ['type' => 'file']);
							 | 
						||
| 
								 | 
							
								        $this->assertTrue($cache->has('path.txt'));
							 | 
						||
| 
								 | 
							
								        $cache->delete('path.txt');
							 | 
						||
| 
								 | 
							
								        $this->assertFalse($cache->has('path.txt'));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testDeleteDir()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $cache = new Memory();
							 | 
						||
| 
								 | 
							
								        $cache->storeContents('dirname', [
							 | 
						||
| 
								 | 
							
								            ['path' => 'dirname/path.txt', 'type' => 'file'],
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								        $this->assertTrue($cache->isComplete('dirname', false));
							 | 
						||
| 
								 | 
							
								        $this->assertTrue($cache->has('dirname/path.txt'));
							 | 
						||
| 
								 | 
							
								        $cache->deleteDir('dirname');
							 | 
						||
| 
								 | 
							
								        $this->assertFalse($cache->isComplete('dirname', false));
							 | 
						||
| 
								 | 
							
								        $this->assertNull($cache->has('dirname/path.txt'));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testReadStream()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $cache = new Memory();
							 | 
						||
| 
								 | 
							
								        $this->assertFalse($cache->readStream('path.txt'));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testRename()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $cache = new Memory();
							 | 
						||
| 
								 | 
							
								        $cache->updateObject('path.txt', ['type' => 'file']);
							 | 
						||
| 
								 | 
							
								        $cache->rename('path.txt', 'newpath.txt');
							 | 
						||
| 
								 | 
							
								        $this->assertTrue($cache->has('newpath.txt'));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testCopy()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $cache = new Memory();
							 | 
						||
| 
								 | 
							
								        $cache->updateObject('path.txt', ['type' => 'file']);
							 | 
						||
| 
								 | 
							
								        $cache->copy('path.txt', 'newpath.txt');
							 | 
						||
| 
								 | 
							
								        $this->assertTrue($cache->has('newpath.txt'));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testComplextListContents()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $cache = new Memory();
							 | 
						||
| 
								 | 
							
								        $cache->storeContents('', [
							 | 
						||
| 
								 | 
							
								            ['path' => 'dirname', 'type' => 'dir'],
							 | 
						||
| 
								 | 
							
								            ['path' => 'dirname/file.txt', 'type' => 'file'],
							 | 
						||
| 
								 | 
							
								            ['path' => 'other', 'type' => 'dir'],
							 | 
						||
| 
								 | 
							
								            ['path' => 'other/file.txt', 'type' => 'file'],
							 | 
						||
| 
								 | 
							
								            ['path' => 'other/nested/file.txt', 'type' => 'file'],
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->assertCount(3, $cache->listContents('other', true));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testComplextListContentsWithDeletedFile()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $cache = new Memory();
							 | 
						||
| 
								 | 
							
								        $cache->storeContents('', [
							 | 
						||
| 
								 | 
							
								            ['path' => 'dirname', 'type' => 'dir'],
							 | 
						||
| 
								 | 
							
								            ['path' => 'dirname/file.txt', 'type' => 'file'],
							 | 
						||
| 
								 | 
							
								            ['path' => 'other', 'type' => 'dir'],
							 | 
						||
| 
								 | 
							
								            ['path' => 'other/file.txt', 'type' => 'file'],
							 | 
						||
| 
								 | 
							
								            ['path' => 'other/another_file.txt', 'type' => 'file'],
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $cache->delete('other/another_file.txt');
							 | 
						||
| 
								 | 
							
								        $this->assertCount(4, $cache->listContents('', true));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testCacheMissIfContentsIsFalse()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $cache = new Memory();
							 | 
						||
| 
								 | 
							
								        $cache->updateObject('path.txt', [
							 | 
						||
| 
								 | 
							
								            'path'     => 'path.txt',
							 | 
						||
| 
								 | 
							
								            'contents' => false,
							 | 
						||
| 
								 | 
							
								        ], true);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->assertFalse($cache->read('path.txt'));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |