master

laravel/framework

Last updated at: 29/12/2023 09:24

FileFactory.php

TLDR

The FileFactory.php file in the Illuminate\Http\Testing namespace contains a FileFactory class that provides methods for creating fake files and images for testing purposes.

Methods

create($name, $kilobytes = 0, $mimeType = null)

This method creates a new fake file. It takes in the name of the file, the size in kilobytes (optional, default is 0), and the MIME type (optional, default is null). It returns an instance of the File class.

createWithContent($name, $content)

This method creates a new fake file with content. It takes in the name of the file and the content of the file. It returns an instance of the File class.

image($name, $width = 10, $height = 10)

This method creates a new fake image. It takes in the name of the image file, the width of the image (optional, default is 10), and the height of the image (optional, default is 10). It returns an instance of the File class.

generateImage($width, $height, $extension)

This is a protected method that generates a dummy image of the given width, height, and file extension. It is called internally by the image method. It returns a resource.

Classes

FileFactory

The FileFactory class provides methods for creating fake files and images for testing purposes.

<?php

namespace Illuminate\Http\Testing;

use LogicException;

class FileFactory
{
    /**
     * Create a new fake file.
     *
     * @param  string  $name
     * @param  string|int  $kilobytes
     * @param  string|null  $mimeType
     * @return \Illuminate\Http\Testing\File
     */
    public function create($name, $kilobytes = 0, $mimeType = null)
    {
        if (is_string($kilobytes)) {
            return $this->createWithContent($name, $kilobytes);
        }

        return tap(new File($name, tmpfile()), function ($file) use ($kilobytes, $mimeType) {
            $file->sizeToReport = $kilobytes * 1024;
            $file->mimeTypeToReport = $mimeType;
        });
    }

    /**
     * Create a new fake file with content.
     *
     * @param  string  $name
     * @param  string  $content
     * @return \Illuminate\Http\Testing\File
     */
    public function createWithContent($name, $content)
    {
        $tmpfile = tmpfile();

        fwrite($tmpfile, $content);

        return tap(new File($name, $tmpfile), function ($file) use ($tmpfile) {
            $file->sizeToReport = fstat($tmpfile)['size'];
        });
    }

    /**
     * Create a new fake image.
     *
     * @param  string  $name
     * @param  int  $width
     * @param  int  $height
     * @return \Illuminate\Http\Testing\File
     *
     * @throws \LogicException
     */
    public function image($name, $width = 10, $height = 10)
    {
        return new File($name, $this->generateImage(
            $width, $height, pathinfo($name, PATHINFO_EXTENSION)
        ));
    }

    /**
     * Generate a dummy image of the given width and height.
     *
     * @param  int  $width
     * @param  int  $height
     * @param  string  $extension
     * @return resource
     *
     * @throws \LogicException
     */
    protected function generateImage($width, $height, $extension)
    {
        if (! function_exists('imagecreatetruecolor')) {
            throw new LogicException('GD extension is not installed.');
        }

        return tap(tmpfile(), function ($temp) use ($width, $height, $extension) {
            ob_start();

            $extension = in_array($extension, ['jpeg', 'png', 'gif', 'webp', 'wbmp', 'bmp'])
                ? strtolower($extension)
                : 'jpeg';

            $image = imagecreatetruecolor($width, $height);

            if (! function_exists($functionName = "image{$extension}")) {
                ob_get_clean();

                throw new LogicException("{$functionName} function is not defined and image cannot be generated.");
            }

            call_user_func($functionName, $image);

            fwrite($temp, ob_get_clean());
        });
    }
}