toBeInstanceOf(ObjectKey::class); expect($key->toString())->toContain('orig'); expect($key->toString())->toContain($now->format('Y')); expect($key->toString())->toContain($now->format('m')); expect($key->toString())->toContain($now->format('d')); expect($key->toString())->toContain($assetId->toString()); expect($key->toString())->toEndWith('.jpg'); }); it('generates key with custom prefix', function () { $clock = new SystemClock(); $assetId = AssetId::generate($clock); $key = ObjectKeyGenerator::generateKey($assetId, 'png', 'custom'); expect($key->toString())->toStartWith('custom/'); }); it('removes leading dot from extension', function () { $clock = new SystemClock(); $assetId = AssetId::generate($clock); $key1 = ObjectKeyGenerator::generateKey($assetId, '.jpg'); $key2 = ObjectKeyGenerator::generateKey($assetId, 'jpg'); expect($key1->toString())->toBe($key2->toString()); }); it('generates variant key', function () { $clock = new SystemClock(); $assetId = AssetId::generate($clock); $variant = VariantName::fromString('1200w.webp'); $now = new \DateTimeImmutable(); $key = ObjectKeyGenerator::generateVariantKey($assetId, $variant); expect($key)->toBeInstanceOf(ObjectKey::class); expect($key->toString())->toContain('variants'); expect($key->toString())->toContain($now->format('Y')); expect($key->toString())->toContain($now->format('m')); expect($key->toString())->toContain($now->format('d')); expect($key->toString())->toContain($assetId->toString()); expect($key->toString())->toEndWith('/1200w.webp'); }); it('generates variant key with custom prefix', function () { $clock = new SystemClock(); $assetId = AssetId::generate($clock); $variant = VariantName::fromString('thumb@1x'); $key = ObjectKeyGenerator::generateVariantKey($assetId, $variant, 'custom-variants'); expect($key->toString())->toStartWith('custom-variants/'); }); it('generates keys with date-based structure', function () { $clock = new SystemClock(); $assetId = AssetId::generate($clock); $now = new \DateTimeImmutable(); $key = ObjectKeyGenerator::generateKey($assetId, 'jpg'); $expectedPattern = sprintf( '/^orig\/%s\/%s\/%s\/%s\.jpg$/', $now->format('Y'), $now->format('m'), $now->format('d'), preg_quote($assetId->toString(), '/') ); expect($key->toString())->toMatch($expectedPattern); }); });