master

laravel/framework

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

NotSoftDeletedInDatabase.php

TLDR

This file contains a class called NotSoftDeletedInDatabase that extends the Constraint class from the PHPUnit framework. The class is used to check if a given set of data exists in a database table and is not marked as soft deleted.

Classes

NotSoftDeletedInDatabase

This class represents a constraint for checking if a set of data exists in a database table and is not marked as soft deleted. It has the following properties:

  • show (int): Number of records that will be shown in the console in case of failure.
  • database (Connection): The database connection.
  • data (array): The data that will be used to narrow the search in the database table.
  • deletedAtColumn (string): The name of the column that indicates soft deletion has occurred.

The class has the following methods:

  • __construct(Connection $database, array $data, string $deletedAtColumn): Initializes the constraint with the given database connection, data, and deletedAtColumn.
  • matches(string $table): bool: Checks if the data is found in the given table and is not soft deleted.
  • failureDescription(string $table): string: Gets the description of the failure when the constraint does not match.
  • getAdditionalInfo(string $table): string: Gets additional information about the records found in the database table.
  • toString(): string: Gets a string representation of the data used in the constraint.
<?php

namespace Illuminate\Testing\Constraints;

use Illuminate\Database\Connection;
use PHPUnit\Framework\Constraint\Constraint;

class NotSoftDeletedInDatabase extends Constraint
{
    /**
     * Number of records that will be shown in the console in case of failure.
     *
     * @var int
     */
    protected $show = 3;

    /**
     * The database connection.
     *
     * @var \Illuminate\Database\Connection
     */
    protected $database;

    /**
     * The data that will be used to narrow the search in the database table.
     *
     * @var array
     */
    protected $data;

    /**
     * The name of the column that indicates soft deletion has occurred.
     *
     * @var string
     */
    protected $deletedAtColumn;

    /**
     * Create a new constraint instance.
     *
     * @param  \Illuminate\Database\Connection  $database
     * @param  array  $data
     * @param  string  $deletedAtColumn
     * @return void
     */
    public function __construct(Connection $database, array $data, string $deletedAtColumn)
    {
        $this->database = $database;
        $this->data = $data;
        $this->deletedAtColumn = $deletedAtColumn;
    }

    /**
     * Check if the data is found in the given table.
     *
     * @param  string  $table
     * @return bool
     */
    public function matches($table): bool
    {
        return $this->database->table($table)
                ->where($this->data)
                ->whereNull($this->deletedAtColumn)
                ->count() > 0;
    }

    /**
     * Get the description of the failure.
     *
     * @param  string  $table
     * @return string
     */
    public function failureDescription($table): string
    {
        return sprintf(
            "any existing row in the table [%s] matches the attributes %s.\n\n%s",
            $table, $this->toString(), $this->getAdditionalInfo($table)
        );
    }

    /**
     * Get additional info about the records found in the database table.
     *
     * @param  string  $table
     * @return string
     */
    protected function getAdditionalInfo($table)
    {
        $query = $this->database->table($table);

        $results = $query->limit($this->show)->get();

        if ($results->isEmpty()) {
            return 'The table is empty';
        }

        $description = 'Found: '.json_encode($results, JSON_PRETTY_PRINT);

        if ($query->count() > $this->show) {
            $description .= sprintf(' and %s others', $query->count() - $this->show);
        }

        return $description;
    }

    /**
     * Get a string representation of the object.
     *
     * @return string
     */
    public function toString(): string
    {
        return json_encode($this->data);
    }
}