LocalAdapter::class, 'root' => $root, 'dirname' => 'unit-test', 'domain' => 'http://127.0.0.1:8787', 'uri' => '/storage', 'algo' => 'sha1', '_is_file_upload' => false, ]) extends LocalAdapter { /** * @param UploadFile[] $files */ public function withFiles(array $files): self { $this->files = $files; return $this; } }; } function makeTempFile(string $content): string { $path = (string) tempnam(sys_get_temp_dir(), 'storage_test_'); file_put_contents($path, $content); return $path; } test('本地上传文件返回标准信息且文件落盘', function () { $root = sys_get_temp_dir() . '/storage_test_' . uniqid(); $tmpFile = makeTempFile('hello webman storage'); // 上传过程会移动源文件,需在上传前计算哈希 $expectedHash = sha1_file($tmpFile); $uploadFile = new UploadFile($tmpFile, 'demo.txt', 'text/plain', UPLOAD_ERR_OK); $result = makeLocalAdapter($root)->withFiles([$uploadFile])->uploadFile(); expect($result)->toHaveCount(1); $file = $result[0]; expect($file)->toHaveKeys([ 'key', 'origin_name', 'save_name', 'save_path', 'url', 'unique_id', 'size', 'mime_type', 'extension', ]); expect($file['origin_name'])->toBe('demo.txt'); expect($file['extension'])->toBe('txt'); expect($file['size'])->toBe(strlen('hello webman storage')); expect($file['unique_id'])->toBe($expectedHash); // url = domain + uri + 分隔符 + dirname(uri 尾部分隔符自动规整) expect($file['url'])->toBe('http://127.0.0.1:8787/storage/unit-test/' . $file['save_name']); // root 无尾部分隔符时,dirname 也必须独立成目录(storage/日期 而非 storage日期) expect($file['save_path'])->toStartWith($root . DIRECTORY_SEPARATOR . 'unit-test' . DIRECTORY_SEPARATOR); expect($file['save_path'])->toBeFile(); }); test('未实现的能力返回失败并记录错误信息', function () { $root = sys_get_temp_dir() . '/storage_test_' . uniqid(); $adapter = makeLocalAdapter($root); expect($adapter->uploadBase64('data:image/png;base64,xxx')) ->toBeFalse() ->and($adapter->getMessage()) ->toBe('暂不支持') ->and($adapter->uploadServerFile(__FILE__)) ->toBeFalse(); });