master

laravel/framework

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

TestView.php

TLDR

The TestView class is a part of the Illuminate Testing component in the Laravel framework. It provides methods to test views in a Laravel application.

Methods

assertViewHas

Asserts that the response view has a given piece of bound data. It accepts a key and an optional value. If the key is an array, it asserts that all the keys in the array exist in the view's bound data. If the value is null, it asserts that the key exists in the view's bound data. If the value is a closure, it asserts that the closure returns true when passed the value associated with the key. If the value is an instance of the Model class, it asserts that the model instance is the same as the value associated with the key. If the value is an instance of the Collection class, it asserts that the collection and the value associated with the key have the same number of items and that each item in the value is equal to the corresponding item in the collection. Otherwise, it asserts that the value associated with the key is equal to the provided value.

assertViewHasAll

Asserts that the response view has a given list of bound data. It accepts an array of bindings. For each binding, if the key is an integer, it calls the assertViewHas method with the value as the key. Otherwise, it calls the assertViewHas method with the key and the value.

assertViewMissing

Asserts that the response view is missing a piece of bound data. It accepts a key and asserts that the key does not exist in the view's bound data.

assertSee

Asserts that the given string is contained within the view. It accepts a value and an optional escape flag. If the escape flag is true, it escapes the value using the e function before performing the assertion.

assertSeeInOrder

Asserts that the given strings are contained in order within the view. It accepts an array of values and an optional escape flag. If the escape flag is true, it escapes each value in the array using the e function before performing the assertion.

assertSeeText

Asserts that the given string is contained within the view text. It accepts a value and an optional escape flag. If the escape flag is true, it escapes the value using the e function before performing the assertion. It ignores any HTML tags in the view text.

assertSeeTextInOrder

Asserts that the given strings are contained in order within the view text. It accepts an array of values and an optional escape flag. If the escape flag is true, it escapes each value in the array using the e function before performing the assertion. It ignores any HTML tags in the view text.

assertDontSee

Asserts that the given string is not contained within the view. It accepts a value and an optional escape flag. If the escape flag is true, it escapes the value using the e function before performing the assertion.

assertDontSeeText

Asserts that the given string is not contained within the view text. It accepts a value and an optional escape flag. If the escape flag is true, it escapes the value using the e function before performing the assertion. It ignores any HTML tags in the view text.

Classes

TestView

The TestView class is used to test views in a Laravel application. It implements the Stringable interface and provides methods to assert the presence or absence of data and specific strings in the view.

<?php

namespace Illuminate\Testing;

use Closure;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Arr;
use Illuminate\Support\Traits\Macroable;
use Illuminate\Testing\Assert as PHPUnit;
use Illuminate\Testing\Constraints\SeeInOrder;
use Illuminate\View\View;
use Stringable;

class TestView implements Stringable
{
    use Macroable;

    /**
     * The original view.
     *
     * @var \Illuminate\View\View
     */
    protected $view;

    /**
     * The rendered view contents.
     *
     * @var string
     */
    protected $rendered;

    /**
     * Create a new test view instance.
     *
     * @param  \Illuminate\View\View  $view
     * @return void
     */
    public function __construct(View $view)
    {
        $this->view = $view;
        $this->rendered = $view->render();
    }

    /**
     * Assert that the response view has a given piece of bound data.
     *
     * @param  string|array  $key
     * @param  mixed  $value
     * @return $this
     */
    public function assertViewHas($key, $value = null)
    {
        if (is_array($key)) {
            return $this->assertViewHasAll($key);
        }

        if (is_null($value)) {
            PHPUnit::assertTrue(Arr::has($this->view->gatherData(), $key));
        } elseif ($value instanceof Closure) {
            PHPUnit::assertTrue($value(Arr::get($this->view->gatherData(), $key)));
        } elseif ($value instanceof Model) {
            PHPUnit::assertTrue($value->is(Arr::get($this->view->gatherData(), $key)));
        } elseif ($value instanceof Collection) {
            $actual = Arr::get($this->view->gatherData(), $key);

            PHPUnit::assertInstanceOf(Collection::class, $actual);
            PHPUnit::assertSameSize($value, $actual);

            $value->each(fn ($item, $index) => PHPUnit::assertTrue($actual->get($index)->is($item)));
        } else {
            PHPUnit::assertEquals($value, Arr::get($this->view->gatherData(), $key));
        }

        return $this;
    }

    /**
     * Assert that the response view has a given list of bound data.
     *
     * @param  array  $bindings
     * @return $this
     */
    public function assertViewHasAll(array $bindings)
    {
        foreach ($bindings as $key => $value) {
            if (is_int($key)) {
                $this->assertViewHas($value);
            } else {
                $this->assertViewHas($key, $value);
            }
        }

        return $this;
    }

    /**
     * Assert that the response view is missing a piece of bound data.
     *
     * @param  string  $key
     * @return $this
     */
    public function assertViewMissing($key)
    {
        PHPUnit::assertFalse(Arr::has($this->view->gatherData(), $key));

        return $this;
    }

    /**
     * Assert that the given string is contained within the view.
     *
     * @param  string  $value
     * @param  bool  $escape
     * @return $this
     */
    public function assertSee($value, $escape = true)
    {
        $value = $escape ? e($value) : $value;

        PHPUnit::assertStringContainsString((string) $value, $this->rendered);

        return $this;
    }

    /**
     * Assert that the given strings are contained in order within the view.
     *
     * @param  array  $values
     * @param  bool  $escape
     * @return $this
     */
    public function assertSeeInOrder(array $values, $escape = true)
    {
        $values = $escape ? array_map('e', $values) : $values;

        PHPUnit::assertThat($values, new SeeInOrder($this->rendered));

        return $this;
    }

    /**
     * Assert that the given string is contained within the view text.
     *
     * @param  string  $value
     * @param  bool  $escape
     * @return $this
     */
    public function assertSeeText($value, $escape = true)
    {
        $value = $escape ? e($value) : $value;

        PHPUnit::assertStringContainsString((string) $value, strip_tags($this->rendered));

        return $this;
    }

    /**
     * Assert that the given strings are contained in order within the view text.
     *
     * @param  array  $values
     * @param  bool  $escape
     * @return $this
     */
    public function assertSeeTextInOrder(array $values, $escape = true)
    {
        $values = $escape ? array_map('e', $values) : $values;

        PHPUnit::assertThat($values, new SeeInOrder(strip_tags($this->rendered)));

        return $this;
    }

    /**
     * Assert that the given string is not contained within the view.
     *
     * @param  string  $value
     * @param  bool  $escape
     * @return $this
     */
    public function assertDontSee($value, $escape = true)
    {
        $value = $escape ? e($value) : $value;

        PHPUnit::assertStringNotContainsString((string) $value, $this->rendered);

        return $this;
    }

    /**
     * Assert that the given string is not contained within the view text.
     *
     * @param  string  $value
     * @param  bool  $escape
     * @return $this
     */
    public function assertDontSeeText($value, $escape = true)
    {
        $value = $escape ? e($value) : $value;

        PHPUnit::assertStringNotContainsString((string) $value, strip_tags($this->rendered));

        return $this;
    }

    /**
     * Get the string contents of the rendered view.
     *
     * @return string
     */
    public function __toString()
    {
        return $this->rendered;
    }
}