Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

Ookma-Kyi's avatar

Test for storing character fails with table empty

I am trying to test my store route and when the test to store a character runs it fails with 'table empty'.

Here is the test itself:

it('Stores a character', function () {
    // Arrange
    $user = User::factory()->create();

    $data = [
        'name' => 'Test',
    ];

    $this->actingAs($user)->
    post(route('characters.store'), $data);

    $this->assertDatabaseHas(Character::class, [
        'name' => 'Test',
    ]);
});

Here is the controller:

 /**
     * Store a newly created resource in storage.
     */
    public function store(StoreCharacterRequest $request): Response|RedirectResponse
    {
        // get the current player's characters count
        $count = $this->countCharacter(auth()->user()->id);

        // if the play is already at max characters
        if ($count >= config("characters.max_allowed")) {

            // display an error instead
            return inertia('Characters/MaxCharacters');
        }

        // retrieve only the name and active status from the request
        $validated = $request->safe()->only(['name', 'active']);

        // if the player already has a character
        if($count) {

            // if the active checkbox was ticked
            if($validated['active']) {

                // get the player's active character if any
                $character = Character::where('user_id', auth()->user()->id)->where('active', 1)->first();

                // set the current one as not active
                $character->update(['active' => 0]);

                // and save the changes to the database
                $character->save();
            }
            // otherwise this is the player's 1st character
        } else {
            // so mark the character as active
            $validated['active'] = 1;
        }

        // get the first belt
        $belt = Belt::where('min_xp', '<=', 0)->first();

        // and create the players character
        Character::create([
            'name' => $validated['name'],
            'user_id' => auth()->user()->id,
            'belt_id' => $belt->id,
            'active' => $validated['active'],

        ]);

        // then redirect to the characters index
        return redirect('characters');
    }

Here is the character model:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;

class Character extends Model
{
    use HasFactory;
    use SoftDeletes;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'user_id',
        'active',
        'name',
        'belt_id',
    ];

    public function user() : BelongsTo
    {
        return $this->belongsTo(User::class);
    }

    public function belt(): BelongsTo
    {
        return $this->belongsTo(Belt::class);
    }
}

It's migration:

<?php

use App\Models\Belt;
use App\Models\User;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('characters', function (Blueprint $table) {
            $table->id();
            $table->foreignIdFor(User::class)->constrained();
            $table->boolean("active")->default(false);
            $table->string("name", 15);
            $table->integer("xp")->default(0);
            $table->foreignIdFor(Belt::class)->constrained();
            $table->integer("wins")->default(0);
            $table->integer("loses")->default(0);
            $table->integer("draws")->default(0);
            $table->timestamps();
            $table->softDeletes();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('characters');
    }
};

and the character factory:

<?php

namespace Database\Factories;

use App\Models\Belt;
use App\Models\Character;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Log;

/**
 * @extends Factory<Character>
 */
class CharacterFactory extends Factory
{
    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition(): array
    {
        $minXp = Belt::min('min_xp') ?? 0;
        $maxXp = Belt::max('max_xp') ?? 50;

        $xp = fake()->numberBetween($minXp , $maxXp);

        $belt = Belt::where('min_xp', '<=', $xp)->orderBy('min_xp', 'desc')->first();

        return [
            'user_id' => User::factory(),
            'name' => fake()->randomAscii(0, 25),
            'xp' => $xp,
            'belt_id' => $belt->id,
            'wins' => fake()->numberBetween(0, 99),
            'loses' => fake()->numberBetween(0, 99),
            'draws' => fake()->numberBetween(0, 99)
        ];
    }
}

it's belt bependency model:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Belt extends Model
{
    use HasFactory;
}

The belt migration:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('belts', function (Blueprint $table) {
            $table->id();
            $table->string("name", 32)->unique();
            $table->string("image");
            $table->integer("min_xp");
            $table->integer("max_xp");
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('belts');
    }
};

and the belt factory:

<?php

namespace Database\Factories;

use App\Models\Belt;
use Illuminate\Database\Eloquent\Factories\Factory;

/**
 * @extends Factory<Belt>
 */
class BeltFactory extends Factory
{
    // static variable to keep track if this is the 1st belt instance seeded
    protected static bool $firstInstance = true;

    // Static variable to keep track of the last max XP
    protected static int $lastMaxXp = 0;

    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition(): array
    {
        // generate a random color for the belt
        $colorName = fake()->colorName();

        // if this is the first belt instance
        if(self::$firstInstance) {
            // Set the minimum XP to be 0
            $minXp = 0;

            // and set firstInstance to false for the next instance
            self::$firstInstance = false;
        } else {
            // Otherwise set the minimum XP to be one more than the last max XP
            $minXp = self::$lastMaxXp + 1;
        }

        // Generate a max XP that is greater than the min XP
        // For example, you can use a random number between min XP + 20 and min XP + 50
        $maxXp = $minXp + fake()->numberBetween(20, 50);

        // Update the last max XP for the next belt
        self::$lastMaxXp = $maxXp;

        return [
            'name' => $colorName,
            'image' => storage_path('app/public/belts/' . $colorName . '.png'),
            'min_xp' => $minXp,
            'max_xp' => $maxXp,
        ];
    }
}

I have no clue what I'm doing wrong as I'm following something similar to the build a forum series with the revelent code. Any ideas?

0 likes
7 replies
LaryAI's avatar
Level 58

It seems like the issue might be related to the setup of your test environment, particularly with the handling of the Belt model which is a dependency for creating a Character. Here are a few steps and checks to ensure that your test environment is correctly set up and that all dependencies are properly initialized:

  1. Ensure Belt Records Exist: Before running the test, make sure that there are Belt records in the database since your Character creation depends on it. You can create a Belt record in your test setup.

  2. Database Transactions: Use database transactions to ensure that each test is isolated and does not interfere with others. Laravel provides a convenient way to handle this using the DatabaseTransactions trait.

  3. Debugging Tips: If the problem persists, add debugging statements or logs to check the values and flow within your test and controller.

Here's how you can modify your test to include these suggestions:

use Illuminate\Foundation\Testing\DatabaseTransactions;

class CharacterTest extends TestCase
{
    use DatabaseTransactions;

    public function testStoresACharacter()
    {
        // Arrange
        $user = User::factory()->create();
        $belt = Belt::factory()->create(); // Ensure a Belt record exists

        $data = [
            'name' => 'Test',
            'active' => true // Make sure to include all necessary fields based on your controller logic
        ];

        // Act
        $response = $this->actingAs($user)->post(route('characters.store'), $data);

        // Assert
        $response->assertRedirect('characters'); // Check if redirection happens as expected
        $this->assertDatabaseHas('characters', [
            'name' => 'Test',
            'user_id' => $user->id,
            'belt_id' => $belt->id,
            'active' => true
        ]);
    }
}

Make sure that your Belt factory is correctly setting up records. If Belt::create() in your controller does not find a valid Belt due to incorrect setup or missing fields, it could cause the character creation to fail. Ensure that the Belt factory properly initializes all fields required by your Belt model.

// BeltFactory example
public function definition(): array
{
    return [
        'name' => $this->faker->word,
        'image' => 'path/to/image.png',
        'min_xp' => 0,
        'max_xp' => 100
    ];
}

By ensuring that all dependencies are correctly set up and using database transactions to maintain isolation, your test should be more robust and less prone to errors related to database state.

Ookma-Kyi's avatar

@LaryAI Sorry Larry but this did not work. Here is the modified code:

Ookma-Kyi-Core\tests\Feature\Controllers\CharacterController.php:

<?php

use Illuminate\Foundation\Testing\DatabaseTransactions;
use App\Models\Belt;
use App\Models\Character;
use App\Models\User;

use function Pest\Laravel\get;

it('gives back successful redirect response for unauthenticated users for the characters.store page', function () {
    $user = null;
    get(route('characters.store', ['user' => $user]))
        ->assertStatus(302);
});

it('can be accessed by verified user', function () {
    // Arrange
    $user = User::factory()->create();

    // Act & Assert
    $this->actingAs($user)
        ->get(route('characters.store'))
        ->assertOk();
});

it('Stores a character', function () {
    // Arrange
    $user = User::factory()->create();
    $belt = Belt::factory()->create();

    $data = [
        'name' => 'Test',
        'active' => true,
    ];

    $response = $this->actingAs($user)->post(route('characters.store'), $data);

    // Check if redirection happens as expected
    $response->assertRedirect('characters');

    $this->assertDatabaseHas(Character::class, [
        'user_id' => $user->id,
        'active' => true,
        'name' => 'Test',
        'belt_id' => $belt->id,
    ]);
});

?>

Error:

Expected response status code [201, 301, 302, 303, 307, 308] but received 500.
Failed asserting that false is true.
at vendor\laravel\framework\src\Illuminate\Testing\TestResponse.php:184
at tests\Feature\Controllers\CharacterController\StoreTest.php:39
Ookma-Kyi's avatar

Logging output produces:

[2024-05-07 19:13:15] testing.DEBUG: {"name":"Robin Dicki Jr.","email":"[email protected]","email_verified_at":"2024-05-07T19:13:15.000000Z","profile_photo_path":null,"current_team_id":null,"updated_at":"2024-05-07T19:13:15.000000Z","created_at":"2024-05-07T19:13:15.000000Z","id":8,"profile_photo_url":"https:\/\/ui-avatars.com\/api\/?name=R+D+J&color=7F9CF5&background=EBF4FF"}  
[2024-05-07 19:13:15] testing.ERROR: Attempt to read property "id" on null {"userId":8,"exception":"[object] (ErrorException(code: 0): Attempt to read property \"id\" on null at C:\laragon\www\Ookma-Kyi-Core\app\Http\Controllers\CharacterController.php:99)
[stacktrace]
#0 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Foundation\Bootstrap\HandleExceptions.php(256): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(2, 'Attempt to read...', 'C:\\laragon\\www\\...', 99)
#1 C:\laragon\www\Ookma-Kyi-Core\app\Http\Controllers\CharacterController.php(99): Illuminate\Foundation\Bootstrap\HandleExceptions->Illuminate\Foundation\Bootstrap\{closure}(2, 'Attempt to read...', 'C:\\laragon\\www\\...', 99)
#2 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Routing\Controller.php(54): App\Http\Controllers\CharacterController->store(Object(App\Http\Requests\StoreCharacterRequest))
#3 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Routing\ControllerDispatcher.php(43): Illuminate\Routing\Controller->callAction('store', Array)
#4 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Routing\Route.php(260): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(App\Http\Controllers\CharacterController), 'store')
#5 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Routing\Route.php(206): Illuminate\Routing\Route->runController()
#6 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Routing\Router.php(806): Illuminate\Routing\Route->run()
#7 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(144): Illuminate\Routing\Router->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#8 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Auth\Middleware\EnsureEmailIsVerified.php(41): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#9 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Auth\Middleware\EnsureEmailIsVerified->handle(Object(Illuminate\Http\Request), Object(Closure))
#10 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Http\Middleware\AddLinkHeadersForPreloadedAssets.php(19): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#11 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Http\Middleware\AddLinkHeadersForPreloadedAssets->handle(Object(Illuminate\Http\Request), Object(Closure))
#12 C:\laragon\www\Ookma-Kyi-Core\vendor\inertiajs\inertia-laravel\src\Middleware.php(87): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#13 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Inertia\Middleware->handle(Object(Illuminate\Http\Request), Object(Closure))
#14 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\jetstream\src\Http\Middleware\ShareInertiaData.php(69): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#15 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Laravel\Jetstream\Http\Middleware\ShareInertiaData->handle(Object(Illuminate\Http\Request), Object(Closure))
#16 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Auth\Middleware\Authorize.php(57): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#17 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Auth\Middleware\Authorize->handle(Object(Illuminate\Http\Request), Object(Closure), 'create', 'App\\Models\\Char...')
#18 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Routing\Middleware\SubstituteBindings.php(50): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#19 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Routing\Middleware\SubstituteBindings->handle(Object(Illuminate\Http\Request), Object(Closure))
#20 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Session\Middleware\AuthenticateSession.php(67): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#21 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Session\Middleware\AuthenticateSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#22 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Auth\Middleware\Authenticate.php(64): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#23 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Auth\Middleware\Authenticate->handle(Object(Illuminate\Http\Request), Object(Closure), 'sanctum')
#24 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\VerifyCsrfToken.php(81): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#25 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure))
#26 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\View\Middleware\ShareErrorsFromSession.php(49): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#27 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#28 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Session\Middleware\StartSession.php(121): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#29 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Session\Middleware\StartSession.php(64): Illuminate\Session\Middleware\StartSession->handleStatefulRequest(Object(Illuminate\Http\Request), Object(Illuminate\Session\Store), Object(Closure))
#30 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#31 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse.php(37): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#32 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure))
#33 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Cookie\Middleware\EncryptCookies.php(75): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#34 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Cookie\Middleware\EncryptCookies->handle(Object(Illuminate\Http\Request), Object(Closure))
#35 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(119): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#36 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Routing\Router.php(805): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#37 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Routing\Router.php(784): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request))
#38 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Routing\Router.php(748): Illuminate\Routing\Router->runRoute(Object(Illuminate\Http\Request), Object(Illuminate\Routing\Route))
#39 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Routing\Router.php(737): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))
#40 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(200): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))
#41 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(144): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}(Object(Illuminate\Http\Request))
#42 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#43 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure))
#44 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle(Object(Illuminate\Http\Request), Object(Closure))
#45 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#46 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TrimStrings.php(50): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure))
#47 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Foundation\Http\Middleware\TrimStrings->handle(Object(Illuminate\Http\Request), Object(Closure))
#48 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Http\Middleware\ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#49 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Http\Middleware\ValidatePostSize->handle(Object(Illuminate\Http\Request), Object(Closure))
#50 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance.php(103): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#51 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle(Object(Illuminate\Http\Request), Object(Closure))
#52 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Http\Middleware\HandleCors.php(49): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#53 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Http\Middleware\HandleCors->handle(Object(Illuminate\Http\Request), Object(Closure))
#54 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Http\Middleware\TrustProxies.php(57): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#55 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Http\Middleware\TrustProxies->handle(Object(Illuminate\Http\Request), Object(Closure))
#56 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(119): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#57 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(175): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#58 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(144): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))
#59 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Foundation\Testing\Concerns\MakesHttpRequests.php(585): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))
#60 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Foundation\Testing\Concerns\MakesHttpRequests.php(375): Illuminate\Foundation\Testing\TestCase->call('POST', 'http://ookma-ky...', Array, Array, Array, Array)
#61 C:\laragon\www\Ookma-Kyi-Core\tests\Feature\Controllers\CharacterController\StoreTest.php(38): Illuminate\Foundation\Testing\TestCase->post('http://ookma-ky...', Array)
#62 C:\laragon\www\Ookma-Kyi-Core\vendor\pestphp\pest\src\Factories\TestCaseMethodFactory.php(110): P\Tests\Feature\Controllers\CharacterController\StoreTest->{closure}()
#63 [internal function]: P\Tests\Feature\Controllers\CharacterController\StoreTest->Pest\Factories\{closure}()
#64 C:\laragon\www\Ookma-Kyi-Core\vendor\pestphp\pest\src\Concerns\Testable.php(337): call_user_func_array(Object(Closure), Array)
#65 C:\laragon\www\Ookma-Kyi-Core\vendor\pestphp\pest\src\Support\ExceptionTrace.php(26): P\Tests\Feature\Controllers\CharacterController\StoreTest->Pest\Concerns\{closure}()
#66 C:\laragon\www\Ookma-Kyi-Core\vendor\pestphp\pest\src\Concerns\Testable.php(337): Pest\Support\ExceptionTrace::ensure(Object(Closure))
#67 C:\laragon\www\Ookma-Kyi-Core\vendor\pestphp\pest\src\Concerns\Testable.php(254): P\Tests\Feature\Controllers\CharacterController\StoreTest->__callClosure(Object(Closure), Array)
#68 C:\laragon\www\Ookma-Kyi-Core\vendor\pestphp\pest\src\Factories\TestCaseFactory.php(196) : eval()'d code(56): P\Tests\Feature\Controllers\CharacterController\StoreTest->__runTest(Object(Closure))
#69 C:\laragon\www\Ookma-Kyi-Core\vendor\phpunit\phpunit\src\Framework\TestCase.php(1122): P\Tests\Feature\Controllers\CharacterController\StoreTest->__pest_evaluable_it_Stores_a_character()
#70 C:\laragon\www\Ookma-Kyi-Core\vendor\phpunit\phpunit\src\Framework\TestCase.php(654): PHPUnit\Framework\TestCase->runTest()
#71 C:\laragon\www\Ookma-Kyi-Core\vendor\phpunit\phpunit\src\Framework\TestRunner.php(105): PHPUnit\Framework\TestCase->runBare()
#72 C:\laragon\www\Ookma-Kyi-Core\vendor\phpunit\phpunit\src\Framework\TestCase.php(488): PHPUnit\Framework\TestRunner->run(Object(P\Tests\Feature\Controllers\CharacterController\StoreTest))
#73 C:\laragon\www\Ookma-Kyi-Core\vendor\phpunit\phpunit\src\Framework\TestSuite.php(341): PHPUnit\Framework\TestCase->run()
#74 C:\laragon\www\Ookma-Kyi-Core\vendor\phpunit\phpunit\src\Framework\TestSuite.php(341): PHPUnit\Framework\TestSuite->run()
#75 C:\laragon\www\Ookma-Kyi-Core\vendor\phpunit\phpunit\src\Framework\TestSuite.php(341): PHPUnit\Framework\TestSuite->run()
#76 C:\laragon\www\Ookma-Kyi-Core\vendor\phpunit\phpunit\src\TextUI\TestRunner.php(62): PHPUnit\Framework\TestSuite->run()
#77 C:\laragon\www\Ookma-Kyi-Core\vendor\phpunit\phpunit\src\TextUI\Application.php(197): PHPUnit\TextUI\TestRunner->run(Object(PHPUnit\TextUI\Configuration\Configuration), Object(PHPUnit\Runner\ResultCache\DefaultResultCache), Object(PHPUnit\Framework\TestSuite))
#78 C:\laragon\www\Ookma-Kyi-Core\vendor\pestphp\pest\src\Kernel.php(103): PHPUnit\TextUI\Application->run(Array)
#79 C:\laragon\www\Ookma-Kyi-Core\vendor\pestphp\pest\bin\pest(91): Pest\Kernel->handle(Array, Array)
#80 C:\laragon\www\Ookma-Kyi-Core\vendor\pestphp\pest\bin\pest(99): {closure}()
#81 {main}
"} 

Which returns this line:

Character::create([
            'name' => $validated['name'],
            'user_id' => auth()->user()->id,
            'belt_id' => $belt->id, // <----- here
            'active' => $validated['active'],

        ]);

I created a belt prior to performing the test and logged it:

[2024-05-07 19:18:52] testing.DEBUG: {"name":"MintCream","image":"C:\laragon\www\Ookma-Kyi-Core\storage\app\/public\/belts\/MintCream.png","min_xp":459,"max_xp":490,"updated_at":"2024-05-07T19:18:52.000000Z","created_at":"2024-05-07T19:18:52.000000Z","id":13}  
[2024-05-07 19:18:52] testing.ERROR: Attempt to read property "id" on null {"userId":8,"exception":"[object] (ErrorException(code: 0): Attempt to read property \"id\" on null at C:\laragon\www\Ookma-Kyi-Core\app\Http\Controllers\CharacterController.php:99)
[stacktrace]
#0 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Foundation\Bootstrap\HandleExceptions.php(256): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(2, 'Attempt to read...', 'C:\\laragon\\www\\...', 99)
#1 C:\laragon\www\Ookma-Kyi-Core\app\Http\Controllers\CharacterController.php(99): Illuminate\Foundation\Bootstrap\HandleExceptions->Illuminate\Foundation\Bootstrap\{closure}(2, 'Attempt to read...', 'C:\\laragon\\www\\...', 99)
#2 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Routing\Controller.php(54): App\Http\Controllers\CharacterController->store(Object(App\Http\Requests\StoreCharacterRequest))
#3 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Routing\ControllerDispatcher.php(43): Illuminate\Routing\Controller->callAction('store', Array)
#4 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Routing\Route.php(260): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(App\Http\Controllers\CharacterController), 'store')
#5 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Routing\Route.php(206): Illuminate\Routing\Route->runController()
#6 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Routing\Router.php(806): Illuminate\Routing\Route->run()
#7 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(144): Illuminate\Routing\Router->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#8 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Auth\Middleware\EnsureEmailIsVerified.php(41): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#9 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Auth\Middleware\EnsureEmailIsVerified->handle(Object(Illuminate\Http\Request), Object(Closure))
#10 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Http\Middleware\AddLinkHeadersForPreloadedAssets.php(19): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#11 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Http\Middleware\AddLinkHeadersForPreloadedAssets->handle(Object(Illuminate\Http\Request), Object(Closure))
#12 C:\laragon\www\Ookma-Kyi-Core\vendor\inertiajs\inertia-laravel\src\Middleware.php(87): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#13 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Inertia\Middleware->handle(Object(Illuminate\Http\Request), Object(Closure))
#14 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\jetstream\src\Http\Middleware\ShareInertiaData.php(69): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#15 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Laravel\Jetstream\Http\Middleware\ShareInertiaData->handle(Object(Illuminate\Http\Request), Object(Closure))
#16 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Auth\Middleware\Authorize.php(57): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#17 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Auth\Middleware\Authorize->handle(Object(Illuminate\Http\Request), Object(Closure), 'create', 'App\\Models\\Char...')
#18 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Routing\Middleware\SubstituteBindings.php(50): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#19 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Routing\Middleware\SubstituteBindings->handle(Object(Illuminate\Http\Request), Object(Closure))
#20 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Session\Middleware\AuthenticateSession.php(67): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#21 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Session\Middleware\AuthenticateSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#22 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Auth\Middleware\Authenticate.php(64): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#23 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Auth\Middleware\Authenticate->handle(Object(Illuminate\Http\Request), Object(Closure), 'sanctum')
#24 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\VerifyCsrfToken.php(81): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#25 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure))
#26 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\View\Middleware\ShareErrorsFromSession.php(49): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#27 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#28 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Session\Middleware\StartSession.php(121): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#29 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Session\Middleware\StartSession.php(64): Illuminate\Session\Middleware\StartSession->handleStatefulRequest(Object(Illuminate\Http\Request), Object(Illuminate\Session\Store), Object(Closure))
#30 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#31 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse.php(37): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#32 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure))
#33 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Cookie\Middleware\EncryptCookies.php(75): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#34 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Cookie\Middleware\EncryptCookies->handle(Object(Illuminate\Http\Request), Object(Closure))
#35 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(119): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#36 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Routing\Router.php(805): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#37 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Routing\Router.php(784): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request))
#38 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Routing\Router.php(748): Illuminate\Routing\Router->runRoute(Object(Illuminate\Http\Request), Object(Illuminate\Routing\Route))
#39 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Routing\Router.php(737): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))
#40 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(200): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))
#41 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(144): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}(Object(Illuminate\Http\Request))
#42 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#43 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure))
#44 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle(Object(Illuminate\Http\Request), Object(Closure))
#45 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#46 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TrimStrings.php(50): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure))
#47 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Foundation\Http\Middleware\TrimStrings->handle(Object(Illuminate\Http\Request), Object(Closure))
#48 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Http\Middleware\ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#49 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Http\Middleware\ValidatePostSize->handle(Object(Illuminate\Http\Request), Object(Closure))
#50 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance.php(103): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#51 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle(Object(Illuminate\Http\Request), Object(Closure))
#52 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Http\Middleware\HandleCors.php(49): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#53 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Http\Middleware\HandleCors->handle(Object(Illuminate\Http\Request), Object(Closure))
#54 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Http\Middleware\TrustProxies.php(57): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#55 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(183): Illuminate\Http\Middleware\TrustProxies->handle(Object(Illuminate\Http\Request), Object(Closure))
#56 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(119): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#57 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(175): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#58 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(144): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))
#59 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Foundation\Testing\Concerns\MakesHttpRequests.php(585): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))
#60 C:\laragon\www\Ookma-Kyi-Core\vendor\laravel\framework\src\Illuminate\Foundation\Testing\Concerns\MakesHttpRequests.php(375): Illuminate\Foundation\Testing\TestCase->call('POST', 'http://ookma-ky...', Array, Array, Array, Array)
#61 C:\laragon\www\Ookma-Kyi-Core\tests\Feature\Controllers\CharacterController\StoreTest.php(38): Illuminate\Foundation\Testing\TestCase->post('http://ookma-ky...', Array)
#62 C:\laragon\www\Ookma-Kyi-Core\vendor\pestphp\pest\src\Factories\TestCaseMethodFactory.php(110): P\Tests\Feature\Controllers\CharacterController\StoreTest->{closure}()
#63 [internal function]: P\Tests\Feature\Controllers\CharacterController\StoreTest->Pest\Factories\{closure}()
#64 C:\laragon\www\Ookma-Kyi-Core\vendor\pestphp\pest\src\Concerns\Testable.php(337): call_user_func_array(Object(Closure), Array)
#65 C:\laragon\www\Ookma-Kyi-Core\vendor\pestphp\pest\src\Support\ExceptionTrace.php(26): P\Tests\Feature\Controllers\CharacterController\StoreTest->Pest\Concerns\{closure}()
#66 C:\laragon\www\Ookma-Kyi-Core\vendor\pestphp\pest\src\Concerns\Testable.php(337): Pest\Support\ExceptionTrace::ensure(Object(Closure))
#67 C:\laragon\www\Ookma-Kyi-Core\vendor\pestphp\pest\src\Concerns\Testable.php(254): P\Tests\Feature\Controllers\CharacterController\StoreTest->__callClosure(Object(Closure), Array)
#68 C:\laragon\www\Ookma-Kyi-Core\vendor\pestphp\pest\src\Factories\TestCaseFactory.php(196) : eval()'d code(56): P\Tests\Feature\Controllers\CharacterController\StoreTest->__runTest(Object(Closure))
#69 C:\laragon\www\Ookma-Kyi-Core\vendor\phpunit\phpunit\src\Framework\TestCase.php(1122): P\Tests\Feature\Controllers\CharacterController\StoreTest->__pest_evaluable_it_Stores_a_character()
#70 C:\laragon\www\Ookma-Kyi-Core\vendor\phpunit\phpunit\src\Framework\TestCase.php(654): PHPUnit\Framework\TestCase->runTest()
#71 C:\laragon\www\Ookma-Kyi-Core\vendor\phpunit\phpunit\src\Framework\TestRunner.php(105): PHPUnit\Framework\TestCase->runBare()
#72 C:\laragon\www\Ookma-Kyi-Core\vendor\phpunit\phpunit\src\Framework\TestCase.php(488): PHPUnit\Framework\TestRunner->run(Object(P\Tests\Feature\Controllers\CharacterController\StoreTest))
#73 C:\laragon\www\Ookma-Kyi-Core\vendor\phpunit\phpunit\src\Framework\TestSuite.php(341): PHPUnit\Framework\TestCase->run()
#74 C:\laragon\www\Ookma-Kyi-Core\vendor\phpunit\phpunit\src\Framework\TestSuite.php(341): PHPUnit\Framework\TestSuite->run()
#75 C:\laragon\www\Ookma-Kyi-Core\vendor\phpunit\phpunit\src\Framework\TestSuite.php(341): PHPUnit\Framework\TestSuite->run()
#76 C:\laragon\www\Ookma-Kyi-Core\vendor\phpunit\phpunit\src\TextUI\TestRunner.php(62): PHPUnit\Framework\TestSuite->run()
#77 C:\laragon\www\Ookma-Kyi-Core\vendor\phpunit\phpunit\src\TextUI\Application.php(197): PHPUnit\TextUI\TestRunner->run(Object(PHPUnit\TextUI\Configuration\Configuration), Object(PHPUnit\Runner\ResultCache\DefaultResultCache), Object(PHPUnit\Framework\TestSuite))
#78 C:\laragon\www\Ookma-Kyi-Core\vendor\pestphp\pest\src\Kernel.php(103): PHPUnit\TextUI\Application->run(Array)
#79 C:\laragon\www\Ookma-Kyi-Core\vendor\pestphp\pest\bin\pest(91): Pest\Kernel->handle(Array, Array)
#80 C:\laragon\www\Ookma-Kyi-Core\vendor\pestphp\pest\bin\pest(99): {closure}()
#81 {main}
"} 

The issue is the belt is being created with an abnormal amount of xp, even though the factory logic prevents it.

<?php

namespace Database\Factories;

use App\Models\Belt;
use Illuminate\Database\Eloquent\Factories\Factory;

/**
 * @extends Factory<Belt>
 */
class BeltFactory extends Factory
{
    // static variable to keep track if this is the 1st belt instance seeded
    protected static bool $firstInstance = true;

    // Static variable to keep track of the last max XP
    protected static int $lastMaxXp = 0;

    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition(): array
    {
        // generate a random color for the belt
        $colorName = fake()->colorName();

        // if this is the first belt instance
        if(self::$firstInstance) {
            // Set the minimum XP to be 0
            $minXp = 0;

            // and set firstInstance to false for the next instance
            self::$firstInstance = false;
        } else {
            // Otherwise set the minimum XP to be one more than the last max XP
            $minXp = self::$lastMaxXp + 1;
        }

        // Generate a max XP that is greater than the min XP
        // For example, you can use a random number between min XP + 20 and min XP + 50
        $maxXp = $minXp + fake()->numberBetween(20, 50);

        // Update the last max XP for the next belt
        self::$lastMaxXp = $maxXp;

        return [
            'name' => $colorName,
            'image' => storage_path('app/public/belts/' . $colorName . '.png'),
            'min_xp' => $minXp,
            'max_xp' => $maxXp,
        ];
    }
}

Any ideas?

martinbean's avatar

@ookma-kyi You should try actually performing some assertions on the response. You make a post request but then assert nothing about the response, you just check the database. So you don’t know whether the request itself was successful or not.

If you’re expecting the request to succeed, then actually verify that:

$this
    ->actingAs($user)
    ->post(route('characters.store'), $data)
    ->assertValid();

This will check the response is successful, and that no validation errors occurred (which is probably the case given the database is empty after the request).

1 like
amitsolanki24_'s avatar

@Ookma-Kyi you can do in that same test.

Or you can also check response with dd in test


$this->withoutExceptionHnadling();
$response = $this
    ->actingAs($user)
    ->post(route('characters.store'), $data);

dd($response);
Ookma-Kyi's avatar

@amitsolanki24_ Here you go:

ErrorException: Attempt to read property "id" on null
at vendor\laravel\framework\src\Illuminate\Foundation\Bootstrap\HandleExceptions.php:256
at app\Http\Controllers\CharacterController.php:99
at vendor\laravel\framework\src\Illuminate\Routing\Controller.php:54
at vendor\laravel\framework\src\Illuminate\Routing\ControllerDispatcher.php:43
at vendor\laravel\framework\src\Illuminate\Routing\Route.php:260
at vendor\laravel\framework\src\Illuminate\Routing\Route.php:206
at vendor\laravel\framework\src\Illuminate\Routing\Router.php:806
at vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:144
at vendor\laravel\framework\src\Illuminate\Auth\Middleware\EnsureEmailIsVerified.php:41
at vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:183
at vendor\laravel\framework\src\Illuminate\Http\Middleware\AddLinkHeadersForPreloadedAssets.php:19
at vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:183
at vendor\inertiajs\inertia-laravel\src\Middleware.php:87
at vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:183
at vendor\laravel\jetstream\src\Http\Middleware\ShareInertiaData.php:69
at vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:183
at vendor\laravel\framework\src\Illuminate\Auth\Middleware\Authorize.php:57
at vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:183
at vendor\laravel\framework\src\Illuminate\Routing\Middleware\SubstituteBindings.php:50
at vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:183
at vendor\laravel\framework\src\Illuminate\Session\Middleware\AuthenticateSession.php:67
at vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:183
at vendor\laravel\framework\src\Illuminate\Auth\Middleware\Authenticate.php:64
at vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:183
at vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\VerifyCsrfToken.php:81
at vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:183
at vendor\laravel\framework\src\Illuminate\View\Middleware\ShareErrorsFromSession.php:49
at vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:183
at vendor\laravel\framework\src\Illuminate\Session\Middleware\StartSession.php:121
at vendor\laravel\framework\src\Illuminate\Session\Middleware\StartSession.php:64
at vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:183
at vendor\laravel\framework\src\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse.php:37
at vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:183
at vendor\laravel\framework\src\Illuminate\Cookie\Middleware\EncryptCookies.php:75
at vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:183
at vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:119
at vendor\laravel\framework\src\Illuminate\Routing\Router.php:805
at vendor\laravel\framework\src\Illuminate\Routing\Router.php:784
at vendor\laravel\framework\src\Illuminate\Routing\Router.php:748
at vendor\laravel\framework\src\Illuminate\Routing\Router.php:737
at vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php:200
at vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:144
at vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php:21
at vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull.php:31
at vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:183
at vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php:21
at vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TrimStrings.php:50
at vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:183
at vendor\laravel\framework\src\Illuminate\Http\Middleware\ValidatePostSize.php:27
at vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:183
at vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance.php:103
at vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:183
at vendor\laravel\framework\src\Illuminate\Http\Middleware\HandleCors.php:49
at vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:183
at vendor\laravel\framework\src\Illuminate\Http\Middleware\TrustProxies.php:57
at vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:183
at vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php:119
at vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php:175
at vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php:144
at vendor\laravel\framework\src\Illuminate\Foundation\Testing\Concerns\MakesHttpRequests.php:585
at vendor\laravel\framework\src\Illuminate\Foundation\Testing\Concerns\MakesHttpRequests.php:375
at tests\Feature\Controllers\CharacterController\StoreTest.php:36

Line 99:

        // get the first belt
        $belt = Belt::where('min_xp', '<=', 1)->first();

        // and create the players character
        Character::create([
            'name' => $validated['name'],
            'user_id' => auth()->user()->id,
            'belt_id' => $belt->id, // <----- Line 99
            'active' => $validated['active'],

        ]);

Please or to participate in this conversation.