From 153b98567a72c66e1c829f7e6ab6f2d5ef52213d Mon Sep 17 00:00:00 2001 From: JakubKermes Date: Tue, 23 Apr 2024 16:01:11 +0200 Subject: [PATCH 01/11] Create tests for api controllers --- app/Exceptions/ExceptionHandler.php | 15 ++ app/Http/Controllers/Api/AuthController.php | 9 +- .../Controllers/Api/CityOpinionController.php | 3 +- routes/api.php | 8 +- tests/Feature/Api/AdminTest.php | 50 ++++ .../Api/ChangeLocaleControllerTest.php | 23 ++ .../Api/CityAlternativeNameController.php | 41 ++++ tests/Feature/Api/CityControllerTest.php | 184 +++++++++++++++ .../Feature/Api/CityOpinionControllerTest.php | 112 +++++++++ tests/Feature/Api/CityPageControllerTest.php | 28 +++ .../Api/CityProviderControllerTest.php | 53 +++++ tests/Feature/Api/CountryControllerTest.php | 221 ++++++++++++++++++ tests/Feature/Api/FavoritesControllerTest.php | 56 +++++ .../Feature/Api/ImportInfoControllerTest.php | 32 +++ tests/Feature/Api/LoginTest.php | 58 +++++ tests/Feature/Api/SignupTest.php | 63 +++++ tests/Feature/Api/SocialMediaLoginTest.php | 37 +++ tests/Feature/SocialMediaLoginTest.php | 1 - 18 files changed, 986 insertions(+), 8 deletions(-) create mode 100644 tests/Feature/Api/AdminTest.php create mode 100644 tests/Feature/Api/ChangeLocaleControllerTest.php create mode 100644 tests/Feature/Api/CityAlternativeNameController.php create mode 100644 tests/Feature/Api/CityControllerTest.php create mode 100644 tests/Feature/Api/CityOpinionControllerTest.php create mode 100644 tests/Feature/Api/CityPageControllerTest.php create mode 100644 tests/Feature/Api/CityProviderControllerTest.php create mode 100644 tests/Feature/Api/CountryControllerTest.php create mode 100644 tests/Feature/Api/FavoritesControllerTest.php create mode 100644 tests/Feature/Api/ImportInfoControllerTest.php create mode 100644 tests/Feature/Api/LoginTest.php create mode 100644 tests/Feature/Api/SignupTest.php create mode 100644 tests/Feature/Api/SocialMediaLoginTest.php diff --git a/app/Exceptions/ExceptionHandler.php b/app/Exceptions/ExceptionHandler.php index 9c349d94..f029365c 100644 --- a/app/Exceptions/ExceptionHandler.php +++ b/app/Exceptions/ExceptionHandler.php @@ -6,6 +6,7 @@ use Illuminate\Foundation\Exceptions\Handler; use Illuminate\Support\Facades\Crypt; +use Illuminate\Support\Facades\Request; use Illuminate\Validation\ValidationException; use Inertia\Inertia; use Sentry\Laravel\Integration; @@ -29,6 +30,13 @@ public function register(): void public function render($request, Throwable $exception) { if ($exception instanceof ValidationException) { + if (Request::is("api/*")) { + return response()->json([ + "message" => $exception->getMessage(), + "errors" => $exception->errors(), + ], Response::HTTP_UNPROCESSABLE_ENTITY); + } + return back()->withErrors($exception->errors()); } @@ -74,6 +82,13 @@ public function render($request, Throwable $exception) break; } + if (Request::is("api/*")) { + return response()->json([ + "statusTitle" => $statusTitle, + "statusDescription" => $statusDescription, + ], $statusCode); + } + return Inertia::render("Error", [ "statusTitle" => $statusTitle, "statusDescription" => $statusDescription, diff --git a/app/Http/Controllers/Api/AuthController.php b/app/Http/Controllers/Api/AuthController.php index 1225cc83..d0fa6bf7 100644 --- a/app/Http/Controllers/Api/AuthController.php +++ b/app/Http/Controllers/Api/AuthController.php @@ -30,7 +30,7 @@ public function store(RegisterRequest $request): JsonResponse return response()->json([ "message" => __("User created."), - ]); + ], Response::HTTP_CREATED); } public function login(LoginRequest $request): JsonResponse @@ -49,7 +49,8 @@ public function login(LoginRequest $request): JsonResponse $token = $user->createToken($user_id, $token_abilities)->plainTextToken; return response()->json([ - $token_abilities, + "abilities" => $token_abilities, + "user" => $user, "access_token" => $token, ]); } @@ -90,7 +91,7 @@ public function handleProviderRedirect(string $provider): JsonResponse ]); $token_abilities = $this->getUserAbilities($user); - $user_id = $user->id->toString(); + $user_id = (string)$user->id; $token = $user->createToken($user_id, $token_abilities)->plainTextToken; return response()->json([ @@ -99,7 +100,7 @@ public function handleProviderRedirect(string $provider): JsonResponse } catch (Exception $e) { return response()->json([ "message" => __("Login failed."), - ]); + ], Response::HTTP_UNAUTHORIZED); } } diff --git a/app/Http/Controllers/Api/CityOpinionController.php b/app/Http/Controllers/Api/CityOpinionController.php index 7565e043..6f4dc0d8 100644 --- a/app/Http/Controllers/Api/CityOpinionController.php +++ b/app/Http/Controllers/Api/CityOpinionController.php @@ -8,6 +8,7 @@ use App\Http\Requests\CityOpinionRequest; use App\Models\CityOpinion; use Illuminate\Http\JsonResponse; +use Symfony\Component\HttpFoundation\Response; class CityOpinionController extends Controller { @@ -19,7 +20,7 @@ public function store(CityOpinionRequest $request): JsonResponse return response()->json([ "message" => __("Opinion added successfully."), - ]); + ], Response::HTTP_CREATED); } public function update(CityOpinionRequest $request, CityOpinion $cityOpinion): JsonResponse diff --git a/routes/api.php b/routes/api.php index 9db2f5a1..1b7d2d19 100644 --- a/routes/api.php +++ b/routes/api.php @@ -26,6 +26,8 @@ Route::middleware("guest")->group(function (): void { Route::post("/register", [AuthController::class, "store"])->name("register"); Route::post("/login", [AuthController::class, "login"])->name("login"); + Route::get("/login/{provider}", [AuthController::class, "redirectToProvider"])->name("login.provider"); + Route::get("/login/{provider}/redirect", [AuthController::class, "handleProviderRedirect"])->name("login.provider.redirect"); }); Route::middleware("auth:sanctum")->group(function (): void { @@ -36,8 +38,10 @@ Route::get("/favorite-cities", [FavoritesController::class, "index"]); Route::post("/opinions", [CityOpinionController::class, "store"]); - Route::patch("/opinions/{cityOpinion}", [CityOpinionController::class, "update"]); - Route::delete("/opinions/{cityOpinion}", [CityOpinionController::class, "destroy"]); + Route::patch("/opinions/{cityOpinion}", [CityOpinionController::class, "update"]) + ->middleware("can:update,cityOpinion"); + Route::delete("/opinions/{cityOpinion}", [CityOpinionController::class, "destroy"]) + ->middleware("can:delete,cityOpinion"); Route::middleware("ability:HasAdminRole")->group(function (): void { Route::get("/admin/importers", [ImportInfoController::class, "index"]); diff --git a/tests/Feature/Api/AdminTest.php b/tests/Feature/Api/AdminTest.php new file mode 100644 index 00000000..97a22ac4 --- /dev/null +++ b/tests/Feature/Api/AdminTest.php @@ -0,0 +1,50 @@ +adminUser = User::factory()->create([ + "name" => "Admin User", + "email" => "admin@example.com", + "password" => Hash::make("password@example"), + ]); + } + + public function testAdminCanLoginWithValidCredentials(): void + { + $response = $this->postJson("/api/login", [ + "email" => "admin@example.com", + "password" => "password@example", + ]); + + $response->assertOk() + ->assertJsonStructure([ + "abilities", + "access_token", + ]); + } + + public function testAdminCanEnterAdminDashboardCountries(): void + { + Sanctum::actingAs($this->adminUser, ["HasAdminRole"]); + + $this->getJson("/api/admin/countries"); + $this->assertAuthenticatedAs(User::first()); + } +} diff --git a/tests/Feature/Api/ChangeLocaleControllerTest.php b/tests/Feature/Api/ChangeLocaleControllerTest.php new file mode 100644 index 00000000..aa0190a8 --- /dev/null +++ b/tests/Feature/Api/ChangeLocaleControllerTest.php @@ -0,0 +1,23 @@ +postJson("/api/language/en"); + + $response->assertOk() + ->assertJson(["message" => "Language has been changed."]); + + $response = $this->postJson("/api/language/pl"); + + $response->assertOk() + ->assertJson(["message" => "Język został zmieniony."]); + } +} diff --git a/tests/Feature/Api/CityAlternativeNameController.php b/tests/Feature/Api/CityAlternativeNameController.php new file mode 100644 index 00000000..f5f015e2 --- /dev/null +++ b/tests/Feature/Api/CityAlternativeNameController.php @@ -0,0 +1,41 @@ +create(); + Sanctum::actingAs($adminUser, ["HasAdminRole"]); + } + + public function testCityAlternativeNameCanBeStored(): void + { + $response = $this->postJson(route("city-alternative-names.store"), [ + "city_id" => 1, + "name" => "Test City Alternative Name", + ]); + + $response->assertCreated() + ->assertJson(["message" => __("City alternative name created successfully.")]); + } + + public function testCityAlternativeNameCanBeDeleted(): void + { + $cityAlternativeName = CityAlternativeName::factory()->create(); + + $response = $this->deleteJson(route("city-alternative-names.destroy", $cityAlternativeName->id)); + + $response->assertOk() + ->assertJson(["message" => __("City alternative name deleted successfully.")]); + } +} diff --git a/tests/Feature/Api/CityControllerTest.php b/tests/Feature/Api/CityControllerTest.php new file mode 100644 index 00000000..c9841fba --- /dev/null +++ b/tests/Feature/Api/CityControllerTest.php @@ -0,0 +1,184 @@ +create(); + Sanctum::actingAs($adminUser, ["HasAdminRole"]); + } + + public function testCitiesArrayIsReturned(): void + { + City::factory()->count(3)->create(); + + $response = $this->getJson("/api/admin/cities"); + + $response->assertStatus(200)->assertJsonStructure([ + "cities" => ["*" => []], + "providers" => ["*" => []], + "countries" => ["*" => []], + "citiesWithoutAssignedCountry" => ["*" => []], + ]); + } + + public function testCityCanBeCreated(): void + { + $country = Country::factory()->create(); + + $city = [ + "name" => "Legnica", + "latitude" => 44.543, + "longitude" => -43.122, + "country_id" => $country->id, + ]; + + $this->postJson("/api/admin/cities", $city); + + $this->assertDatabaseHas("cities", $city); + } + + public function testCityCannotBeCreatedBecauseFieldsAlreadyExist(): void + { + $country = Country::factory()->create(); + + $city = [ + "name" => "Legnica", + "latitude" => 44.543, + "longitude" => -43.122, + "country_id" => $country->id, + ]; + + City::query()->create([ + "name" => $city["name"], + "latitude" => -55.54323, + "longitude" => 42.3721, + "country_id" => $country->id, + ])->toArray(); + + $this->postJson("/api/admin/cities", $city); + + $this->assertDatabaseMissing("cities", $city); + } + + /** + * @dataProvider invalidCityDataProvider + */ + public function testCityCannotBeCreatedWithInvalidData(array $data, array $expectedErrors): void + { + $response = $this->postJson("/api/admin/cities", $data); + + $response->assertJsonValidationErrors($expectedErrors); + } + + /** + * @dataProvider invalidCityDataProvider + */ + public function testCityCannotBeUpdatedWithInvalidData(array $data, array $expectedErrors): void + { + $city = City::factory()->create(); + + $response = $this->patchJson("/api/admin/cities/{$city->id}", $data); + + $response->assertJsonValidationErrors($expectedErrors); + } + + public static function invalidCityDataProvider(): Generator + { + yield "city with empty credentials" => [ + "data" => [ + "name" => null, + "longitude" => null, + "latitude" => null, + ], + "expectedErrors" => ["name", "latitude", "longitude"], + ]; + + yield "city with incorrect name" => [ + "data" => [ + "name" => "legnica", + "longitude" => 21.555, + "latitude" => 55.234, + ], + "expectedErrors" => ["name"], + ]; + + yield "city with incorrect longitude" => [ + "data" => [ + "name" => "Legnica", + "longitude" => "21string", + "latitude" => 55.234, + ], + "expectedErrors" => ["longitude"], + ]; + + yield "city with incorrect latitude" => [ + "data" => [ + "name" => "Legnica", + "longitude" => 21.555, + "latitude" => "55.234string", + ], + "expectedErrors" => ["latitude"], + ]; + } + + public function testCityCanBeUpdated(): void + { + $country = Country::factory()->create(); + + $data = [ + "name" => "Legnica", + "latitude" => 44.543, + "longitude" => -43.122, + "country_id" => $country->id, + ]; + + $city = City::factory()->create(); + + $this->patchJson("/api/admin/cities/{$city->id}", $data); + + $this->assertDatabaseHas("cities", $data); + } + + public function testCityCannotBeUpdatedBecauseNameAlreadyExistInOtherCity(): void + { + City::factory()->create([ + "name" => "Legnica", + ]); + + $cityToUpdate = City::factory()->create([ + "name" => "Wrocław", + ]); + + $response = $this->patchJson("/api/admin/cities/{$cityToUpdate->id}", [ + "name" => "Legnica", + "latitude" => 32.444, + "longitude" => 44.222, + "country_id" => 1, + ]); + + $response->assertStatus(422)->assertJsonValidationErrorFor("name"); + } + + public function testCityCanBeDeleted(): void + { + $city = City::factory()->create(); + + $this->deleteJson("/api/admin/cities/{$city->id}"); + + $this->assertDatabaseMissing("cities", $city->toArray()); + } +} diff --git a/tests/Feature/Api/CityOpinionControllerTest.php b/tests/Feature/Api/CityOpinionControllerTest.php new file mode 100644 index 00000000..a175f9f3 --- /dev/null +++ b/tests/Feature/Api/CityOpinionControllerTest.php @@ -0,0 +1,112 @@ +create(); + Sanctum::actingAs($user); + } + + public function testCityOpinionCanBeCreated(): void + { + $city = City::factory()->create(); + $response = $this->postJson("/api/opinions", [ + "rating" => 5, + "content" => "Great city!", + "city_id" => $city->id, + ]); + $response->assertCreated() + ->assertJson([ + "message" => "Opinion added successfully.", + ]); + $this->assertDatabaseHas("city_opinions", [ + "rating" => 5, + "content" => "Great city!", + "city_id" => $city->id, + ]); + } + + public function testCityOpinionCanBeUpdated(): void + { + $city = City::factory()->create(); + $response = $this->postJson("/api/opinions", [ + "rating" => 5, + "content" => "Great city!", + "city_id" => $city->id, + ]); + $response->assertCreated() + ->assertJson([ + "message" => "Opinion added successfully.", + ]); + $opinion_id = CityOpinion::query()->first()->id; + $response = $this->patchJson("/api/opinions/$opinion_id", [ + "rating" => 4, + "content" => "Good city!", + "city_id" => $city->id, + ]); + + $response->assertJson([ + "message" => "Opinion edited successfully.", + ]); + } + + public function testCityOpinionCanBeDeleted(): void + { + $city = City::factory()->create(); + $response = $this->postJson("/api/opinions", [ + "rating" => 5, + "content" => "Great city!", + "city_id" => $city->id, + ]); + $response->assertCreated() + ->assertJson([ + "message" => "Opinion added successfully.", + ]); + $opinion_id = CityOpinion::query()->first()->id; + $response = $this->deleteJson("/api/opinions/$opinion_id"); + $response->assertOk() + ->assertJson([ + "message" => "Opinion removed successfully!", + ]); + } + + public function testUnauthorizedUserCannotEditOrDeleteOpinion(): void + { + $city = City::factory()->create(); + $response = $this->postJson("/api/opinions", [ + "rating" => 5, + "content" => "Great city!", + "city_id" => $city->id, + ]); + $response->assertCreated() + ->assertJson([ + "message" => "Opinion added successfully.", + ]); + + Sanctum::actingAs(User::factory()->create()); + + $opinion_id = CityOpinion::query()->first()->id; + $response = $this->patchJson("/api/opinions/$opinion_id", [ + "rating" => 4, + "content" => "Good city!", + "city_id" => $city->id, + ]); + + $response->assertNotFound(); + + $response = $this->deleteJson("/api/opinions/$opinion_id"); + $response->assertNotFound(); + } +} diff --git a/tests/Feature/Api/CityPageControllerTest.php b/tests/Feature/Api/CityPageControllerTest.php new file mode 100644 index 00000000..cce69f66 --- /dev/null +++ b/tests/Feature/Api/CityPageControllerTest.php @@ -0,0 +1,28 @@ +create(); + $city = City::factory()->create([ + "country_id" => $country->id, + ]); + + $response = $this->getJson("/api/$country->slug/$city->slug"); + $response->assertOk() + ->assertJsonStructure([ + "city", + "providers", + "cityOpinions", + ]); + } +} diff --git a/tests/Feature/Api/CityProviderControllerTest.php b/tests/Feature/Api/CityProviderControllerTest.php new file mode 100644 index 00000000..9dd65922 --- /dev/null +++ b/tests/Feature/Api/CityProviderControllerTest.php @@ -0,0 +1,53 @@ +getJson("/api/providers"); + + $response->assertOk() + ->assertJsonStructure([ + "cities", + "providers", + "countries", + ]); + } + + public function testCityProviderDataIsUpdated(): void + { + $adminUser = User::factory()->create(); + Sanctum::actingAs($adminUser, ["HasAdminRole"]); + Provider::query()->create([ + "name" => "provider1", + "url" => "http://provider1.com", + "color" => "#000000", + ]); + $city = City::factory()->create(); + + $response = $this->patchJson("/api/update-city-providers/$city->id", [ + "providerNames" => ["provider1"], + "city" => $city, + ]); + + $response->assertOk() + ->assertJson([ + "message" => "City providers updated successfully.", + ]); + $this->assertDatabaseHas("city_providers", [ + "city_id" => $city->id, + "provider_name" => "provider1", + "created_by" => "admin", + ]); + } +} diff --git a/tests/Feature/Api/CountryControllerTest.php b/tests/Feature/Api/CountryControllerTest.php new file mode 100644 index 00000000..1c965243 --- /dev/null +++ b/tests/Feature/Api/CountryControllerTest.php @@ -0,0 +1,221 @@ +create(); + Sanctum::actingAs($adminUser, ["HasAdminRole"]); + } + + public function testCountriesViewCanBeRendered(): void + { + Country::factory()->count(3)->create(); + + $response = $this->getJson("/api/admin/countries"); + $response->assertJsonStructure([ + "countries" => [ + "*" => [ + "id", + "name", + "latitude", + "longitude", + "iso", + ], + ], + ]); + } + + public function testCountryCanBeCreated(): void + { + $country = [ + "name" => "Poland", + "latitude" => 44.543, + "longitude" => -43.122, + "iso" => "pl", + ]; + + $this->postJson("/api/admin/countries", $country); + + $this->assertDatabaseHas("countries", $country); + } + + public function testCountryCannotBeCreatedBecauseFieldsAlreadyExist(): void + { + $country = [ + "name" => "Poland", + "latitude" => 44.543, + "longitude" => -43.122, + "iso" => "pl", + ]; + + Country::query()->create([ + "name" => $country["name"], + "latitude" => -55.54323, + "longitude" => 42.3721, + "iso" => $country["iso"], + ])->toArray(); + + $this->postJson("/api/admin/countries", $country); + + $this->assertDatabaseMissing("countries", $country); + } + + /** + * @dataProvider invalidCountryDataProvider + */ + public function testCountryCannotBeCreatedWithInvalidData(array $data, array $expectedErrors): void + { + $response = $this->postJson("/api/admin/countries", $data); + $response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY) + ->assertJsonValidationErrors($expectedErrors); + } + + /** + * @dataProvider invalidCountryDataProvider + */ + public function testCountryCannotBeUpdatedWithInvalidData(array $data, array $expectedErrors): void + { + $country = Country::factory()->create(); + + $response = $this->patchJson("/api/admin/countries/{$country->id}", $data); + $response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY) + ->assertJsonValidationErrors($expectedErrors); + } + + public static function invalidCountryDataProvider(): Generator + { + yield "country with empty credentials" => [ + "data" => [ + "name" => null, + "longitude" => null, + "latitude" => null, + "iso" => null, + ], + "expectedErrors" => ["name", "latitude", "longitude", "iso"], + ]; + + yield "country with incorrect name" => [ + "data" => [ + "name" => "poland", + "longitude" => 21.555, + "latitude" => 55.234, + "iso" => "pl", + ], + "expectedErrors" => ["name"], + ]; + + yield "country with incorrect longitude" => [ + "data" => [ + "name" => "Poland", + "longitude" => "21string", + "latitude" => 55.234, + "iso" => "pl", + ], + "expectedErrors" => ["longitude"], + ]; + + yield "country with incorrect latitude" => [ + "data" => [ + "name" => "Poland", + "longitude" => 21.555, + "latitude" => "55.234string", + "iso" => "pl", + ], + "expectedErrors" => ["latitude"], + ]; + + yield "country with incorrect iso" => [ + "data" => [ + "name" => "Poland", + "longitude" => 21.555, + "latitude" => 55.234, + "iso" => "Pl", + ], + "expectedErrors" => ["iso"], + ]; + } + + public function testCountryCanBeUpdated(): void + { + $data = [ + "name" => "Poland", + "latitude" => 44.543, + "longitude" => -43.122, + "iso" => "pl", + ]; + + $country = Country::factory()->create(); + + $this->patchJson("/api/admin/countries/{$country->id}", $data); + + $this->assertDatabaseHas("countries", $data); + } + + public function testCountryCannotBeUpdatedBecauseIsoAlreadyExistInOtherCountry(): void + { + Country::factory()->create([ + "name" => "Poland", + "iso" => "pl", + ]); + + $countryToUpdate = Country::factory()->create([ + "name" => "Romania", + "iso" => "rom", + ]); + + $response = $this->patch("/api/admin/countries/{$countryToUpdate->id}", [ + "name" => "Romania", + "latitude" => 32.444, + "longitude" => 44.222, + "iso" => "pl", + ]); + $response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY) + ->assertJsonValidationErrorFor("iso"); + } + + public function testCountryCannotBeUpdatedBecauseNameAlreadyExistInOtherCountry(): void + { + Country::factory()->create([ + "name" => "Poland", + "iso" => "pl", + ]); + + $countryToUpdate = Country::factory()->create([ + "name" => "Romania", + "iso" => "rom", + ]); + + $response = $this->patchJson("/api/admin/countries/{$countryToUpdate->id}", [ + "name" => "Poland", + "latitude" => 32.444, + "longitude" => 44.222, + "iso" => "rom", + ]); + + $response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY) + ->assertJsonValidationErrorFor("name"); + } + + public function testCountryCanBeDeleted(): void + { + $country = Country::factory()->create(); + + $this->delete("/api/admin/countries/{$country->id}"); + + $this->assertDatabaseMissing("countries", $country->toArray()); + } +} diff --git a/tests/Feature/Api/FavoritesControllerTest.php b/tests/Feature/Api/FavoritesControllerTest.php new file mode 100644 index 00000000..a6f698c5 --- /dev/null +++ b/tests/Feature/Api/FavoritesControllerTest.php @@ -0,0 +1,56 @@ +create(); + Sanctum::actingAs($user); + $city = City::factory()->create(); + + $this->postJson("/api/favorites/", ["city_id" => $city->id]); + + $this->assertDatabaseHas("favorites", ["city_id" => $city->id]); + } + + public function testCityCanBeRemovedFromFavorites(): void + { + $user = User::factory()->create(); + Sanctum::actingAs($user); + + $city = City::factory()->create(); + + $this->postJson("/api/favorites/", ["city_id" => $city->id]); + + $this->assertDatabaseHas("favorites", [ + "user_id" => $user->id, + "city_id" => $city->id, + ]); + + $this->postJson("/api/favorites", ["city_id" => $city->id]); + + $this->assertDatabaseMissing("favorites", [ + "user_id" => $user->id, + "city_id" => $city->id, + ]); + } + + public function testUnauthenticatedUserCannotAddCityToFavourites(): void + { + $city = City::factory()->create(); + + $response = $this->postJson("/api/favorites/", ["city_id" => $city->id]); + + $response->assertStatus(Response::HTTP_NOT_FOUND); + } +} diff --git a/tests/Feature/Api/ImportInfoControllerTest.php b/tests/Feature/Api/ImportInfoControllerTest.php new file mode 100644 index 00000000..c717078b --- /dev/null +++ b/tests/Feature/Api/ImportInfoControllerTest.php @@ -0,0 +1,32 @@ +create(); + Sanctum::actingAs($adminUser, ["HasAdminRole"]); + } + + public function testImportInfoArrayIsReturned(): void + { + $response = $this->getJson("/api/admin/importers"); + + $response->assertOk() + ->assertJsonStructure([ + "importInfo", + "codes", + "providers", + ]); + } +} diff --git a/tests/Feature/Api/LoginTest.php b/tests/Feature/Api/LoginTest.php new file mode 100644 index 00000000..5674e815 --- /dev/null +++ b/tests/Feature/Api/LoginTest.php @@ -0,0 +1,58 @@ +create([ + "email" => "email@example.com", + "password" => Hash::make("password@example"), + ]); + + $response = $this->postJson("/api/login", [ + "email" => "email@example.com", + "password" => "password@example", + ]); + + $response->assertJsonStructure([ + "access_token", + ]); + } + + public function testAuthenticatedUserCanLogout(): void + { + Sanctum::actingAs(User::factory()->create()); + + $response = $this->postJson("/api/logout"); + + $response->assertJson([ + "message" => "Logged out.", + ]); + } + + public function testUserCannotLoginWithInvalidPassword(): void + { + User::factory()->create([ + "email" => "email@example.com", + "password" => Hash::make("password@example"), + ]); + + $response = $this->postJson("/api/login", [ + "email" => "email@example.com", + "password" => "IncorrectPassword", + ]); + + $response->assertJson([ + "message" => "Invalid credentials.", + ]); + } +} diff --git a/tests/Feature/Api/SignupTest.php b/tests/Feature/Api/SignupTest.php new file mode 100644 index 00000000..caeb7d33 --- /dev/null +++ b/tests/Feature/Api/SignupTest.php @@ -0,0 +1,63 @@ + "Test", + "email" => "test@example.com", + "password" => "123456789", + ]; + + $response = $this->postJson("/api/register", $user); + + $response->assertStatus(Response::HTTP_CREATED) + ->assertJson(["message" => "User created."]); + + $this->assertDatabaseHas("users", ["email" => "test@example.com"]); + } + + public function testUserCannotBeCreatedWithInvalidName(): void + { + $response = $this->postJson("/api/register", [ + "name" => Str::random(256), + "email" => "email@example.com", + "password" => "123456789", + ]); + + $response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY) + ->assertJsonValidationErrorFor("name"); + } + + public function testUserCannotBeCreatedWithInvalidEmail(): void + { + $response = $this->postJson("/api/register", [ + "name" => "Test", + "email" => "invalid-email", + "password" => "123456789", + ]); + + $response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY) + ->assertJsonValidationErrorFor("email"); + } + + public function testUserCannotBeCreatedWithInvalidPassword(): void + { + $response = $this->postJson("/api/register", [ + "name" => "Test", + "email" => "email@example.com", + "password" => "123", + ]); + $response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY) + ->assertJsonValidationErrorFor("password"); + } +} diff --git a/tests/Feature/Api/SocialMediaLoginTest.php b/tests/Feature/Api/SocialMediaLoginTest.php new file mode 100644 index 00000000..d8b8c7b9 --- /dev/null +++ b/tests/Feature/Api/SocialMediaLoginTest.php @@ -0,0 +1,37 @@ +getJson(route("api.login.provider", ["provider" => "github"])); + + $response->assertOk() + ->assertJsonStructure([ + "redirect_url", + ]); + } + + public function testUserIsLoggedIn(): void + { + Socialite::shouldReceive("driver->user")->andReturn(Mockery::mock([ + "getId" => 1, + "getEmail" => "test@example.com", + "getName" => "Test", + ])); + + $response = $this->getJson(route("api.login.provider.redirect", ["provider" => "github"])); + $response->assertOk() + ->assertJsonStructure([ + "access_token", + ]); + } +} diff --git a/tests/Feature/SocialMediaLoginTest.php b/tests/Feature/SocialMediaLoginTest.php index 572633cd..2c95f4d2 100644 --- a/tests/Feature/SocialMediaLoginTest.php +++ b/tests/Feature/SocialMediaLoginTest.php @@ -32,7 +32,6 @@ public function testUserIsLoggedIn(): void "getName" => "Test", ])); - $this->get(route("login.provider", ["provider" => "github"])); $this->get(route("login.provider.redirect", ["provider" => "github"])); $this->assertAuthenticated(); } From ad387af32186fd3bb2d95dd7556fed937608d90d Mon Sep 17 00:00:00 2001 From: JakubKermes Date: Thu, 25 Apr 2024 20:01:46 +0200 Subject: [PATCH 02/11] add unhappy paths tests --- app/Http/Controllers/Api/AuthController.php | 11 ++-- .../Api/ChangeLocaleController.php | 3 +- .../Api/CityProviderController.php | 8 +++ .../Controllers/Api/FavoritesController.php | 8 +++ lang/pl.json | 2 +- tests/Feature/Api/AdminTest.php | 23 ++++++- .../Api/ChangeLocaleControllerTest.php | 17 ++++- .../Api/CityAlternativeNameController.php | 29 +++++++++ tests/Feature/Api/CityControllerTest.php | 62 +++++++++---------- .../Feature/Api/CityOpinionControllerTest.php | 11 ++++ .../Api/CityProviderControllerTest.php | 42 ++++++++++++- tests/Feature/Api/FavoritesControllerTest.php | 27 ++++++++ .../Feature/Api/ImportInfoControllerTest.php | 9 +++ tests/Feature/Api/LoginTest.php | 21 ++++--- tests/Feature/Api/SignupTest.php | 21 +++++++ 15 files changed, 243 insertions(+), 51 deletions(-) diff --git a/app/Http/Controllers/Api/AuthController.php b/app/Http/Controllers/Api/AuthController.php index d0fa6bf7..e3bd0fad 100644 --- a/app/Http/Controllers/Api/AuthController.php +++ b/app/Http/Controllers/Api/AuthController.php @@ -42,15 +42,15 @@ public function login(LoginRequest $request): JsonResponse "password" => $request->password, ], $remember)) { $user = Auth::user(); - $user_id = (string)Auth::id(); + $userId = (string)Auth::id(); $token_abilities = $this->getUserAbilities($user); - $token = $user->createToken($user_id, $token_abilities)->plainTextToken; + $token = $user->createToken($userId, $token_abilities)->plainTextToken; return response()->json([ "abilities" => $token_abilities, - "user" => $user, + "userId" => $userId, "access_token" => $token, ]); } @@ -91,11 +91,12 @@ public function handleProviderRedirect(string $provider): JsonResponse ]); $token_abilities = $this->getUserAbilities($user); - $user_id = (string)$user->id; - $token = $user->createToken($user_id, $token_abilities)->plainTextToken; + $userId = (string)$user->id; + $token = $user->createToken($userId, $token_abilities)->plainTextToken; return response()->json([ "access_token" => $token, + "userId" => $userId, ]); } catch (Exception $e) { return response()->json([ diff --git a/app/Http/Controllers/Api/ChangeLocaleController.php b/app/Http/Controllers/Api/ChangeLocaleController.php index 408970cb..612323ce 100644 --- a/app/Http/Controllers/Api/ChangeLocaleController.php +++ b/app/Http/Controllers/Api/ChangeLocaleController.php @@ -7,6 +7,7 @@ use App\Http\Controllers\Controller; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Symfony\Component\HttpFoundation\Response; class ChangeLocaleController extends Controller { @@ -22,6 +23,6 @@ public function __invoke(Request $request, string $locale): JsonResponse return response()->json([ "message" => __("Error changing the language."), - ]); + ], Response::HTTP_UNPROCESSABLE_ENTITY); } } diff --git a/app/Http/Controllers/Api/CityProviderController.php b/app/Http/Controllers/Api/CityProviderController.php index d4990c6a..6628f492 100644 --- a/app/Http/Controllers/Api/CityProviderController.php +++ b/app/Http/Controllers/Api/CityProviderController.php @@ -16,6 +16,7 @@ use App\Services\DataImporterService; use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\JsonResponse; +use Symfony\Component\HttpFoundation\Response; class CityProviderController extends Controller { @@ -47,6 +48,13 @@ public function index(): JsonResponse public function update(CityProviderService $service, CityProviderRequest $request, City $city): JsonResponse { + foreach ($request->providerNames as $providerName) { + if (Provider::query()->where("name", $providerName)->doesntExist()) { + return response()->json([ + "message" => __("Provider does not exist."), + ], Response::HTTP_UNPROCESSABLE_ENTITY); + } + } $service->updateProvider($request->providerNames, $city); return response()->json([ diff --git a/app/Http/Controllers/Api/FavoritesController.php b/app/Http/Controllers/Api/FavoritesController.php index 38b49116..b7804f15 100644 --- a/app/Http/Controllers/Api/FavoritesController.php +++ b/app/Http/Controllers/Api/FavoritesController.php @@ -7,10 +7,12 @@ use App\Http\Controllers\Controller; use App\Http\Resources\CityResource; use App\Http\Resources\ProviderResource; +use App\Models\City; use App\Models\Favorites; use App\Models\Provider; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Symfony\Component\HttpFoundation\Response; class FavoritesController extends Controller { @@ -35,6 +37,12 @@ public function store(Request $request): JsonResponse $cityId = $request->input("city_id"); $userId = $request->user()?->id; + if (City::query()->where("id", $cityId)->doesntExist() || !$cityId) { + return response()->json([ + "message" => "City not found.", + ], Response::HTTP_BAD_REQUEST); + } + $favorite = Favorites::firstOrCreate([ "user_id" => $userId, "city_id" => $cityId, diff --git a/lang/pl.json b/lang/pl.json index ad3e37d9..441680cb 100644 --- a/lang/pl.json +++ b/lang/pl.json @@ -68,7 +68,7 @@ "to": "do", "results": "wyników", "Language has been changed.": "Język został zmieniony.", - "Error changing language.": "Błąd podczas zmiany języka.", + "Error changing the language.": "Błąd podczas zmiany języka.", "Alternative name": "Alternatywna nazwa", "Filling map with providers...": "Wypełnianie mapy dostawcami...", "Didn't find any providers.": "Nie znaleziono dostawców.", diff --git a/tests/Feature/Api/AdminTest.php b/tests/Feature/Api/AdminTest.php index 97a22ac4..896259af 100644 --- a/tests/Feature/Api/AdminTest.php +++ b/tests/Feature/Api/AdminTest.php @@ -8,6 +8,7 @@ use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Support\Facades\Hash; use Laravel\Sanctum\Sanctum; +use Symfony\Component\HttpFoundation\Response; use Tests\TestCase; class AdminTest extends TestCase @@ -44,7 +45,27 @@ public function testAdminCanEnterAdminDashboardCountries(): void { Sanctum::actingAs($this->adminUser, ["HasAdminRole"]); - $this->getJson("/api/admin/countries"); + $response = $this->getJson("/api/admin/countries"); + $response->assertOk() + ->assertJsonStructure([ + "countries" => [ + "*" => [ + "id", + "name", + "created_at", + "updated_at", + ], + ], + ]); $this->assertAuthenticatedAs(User::first()); } + + public function testUserCannotAccessAdminRoutes(): void + { + $user = User::factory()->create(); + Sanctum::actingAs($user); + + $response = $this->getJson("/api/admin/countries"); + $response->assertStatus(Response::HTTP_NOT_FOUND); + } } diff --git a/tests/Feature/Api/ChangeLocaleControllerTest.php b/tests/Feature/Api/ChangeLocaleControllerTest.php index aa0190a8..fd3b1379 100644 --- a/tests/Feature/Api/ChangeLocaleControllerTest.php +++ b/tests/Feature/Api/ChangeLocaleControllerTest.php @@ -4,11 +4,12 @@ namespace Tests\Feature\Api; +use Symfony\Component\HttpFoundation\Response; use Tests\TestCase; class ChangeLocaleControllerTest extends TestCase { - public function testLanguageChangeHappens(): void + public function testUserCanChangeLanguageToSupportedLanguage(): void { $response = $this->postJson("/api/language/en"); @@ -20,4 +21,18 @@ public function testLanguageChangeHappens(): void $response->assertOk() ->assertJson(["message" => "Język został zmieniony."]); } + + public function testUserCannotChangeLanguageToUnsupportedLanguage(): void + { + $response = $this->postJson("/api/language/unsupported"); + + $response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY) + ->assertJson(["message" => "Error changing the language."]); + + $this->postJson("/api/language/pl"); + + $response = $this->postJson("/api/language/unsupported"); + $response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY) + ->assertJson(["message" => "Błąd podczas zmiany języka."]); + } } diff --git a/tests/Feature/Api/CityAlternativeNameController.php b/tests/Feature/Api/CityAlternativeNameController.php index f5f015e2..314ba310 100644 --- a/tests/Feature/Api/CityAlternativeNameController.php +++ b/tests/Feature/Api/CityAlternativeNameController.php @@ -7,6 +7,7 @@ use App\Models\CityAlternativeName; use App\Models\User; use Laravel\Sanctum\Sanctum; +use Symfony\Component\HttpFoundation\Response; use Tests\TestCase; class CityAlternativeNameController extends TestCase @@ -38,4 +39,32 @@ public function testCityAlternativeNameCanBeDeleted(): void $response->assertOk() ->assertJson(["message" => __("City alternative name deleted successfully.")]); } + + public function testCityAlternativeNamesDuplicatesAreNotCreated(): void + { + $cityAlternativeName = CityAlternativeName::factory()->create(); + $response = $this->postJson(route("city-alternative-names.store"), [ + "city_id" => $cityAlternativeName->city_id, + "name" => $cityAlternativeName->name, + ]); + + $response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY) + ->assertJsonValidationErrors(["name"]); + } + + public function testNonAdminUserCannotAddOrDeleteAlternativeNames(): void + { + Sanctum::actingAs(User::factory()->create()); + + $response = $this->postJson(route("city-alternative-names.store"), [ + "city_id" => 1, + "name" => "Test City Alternative Name", + ]); + $response->assertStatus(Response::HTTP_FORBIDDEN); + + $cityAlternativeName = CityAlternativeName::factory()->create(); + + $response = $this->deleteJson(route("city-alternative-names.destroy", $cityAlternativeName->id)); + $response->assertStatus(Response::HTTP_FORBIDDEN); + } } diff --git a/tests/Feature/Api/CityControllerTest.php b/tests/Feature/Api/CityControllerTest.php index c9841fba..64e27e1c 100644 --- a/tests/Feature/Api/CityControllerTest.php +++ b/tests/Feature/Api/CityControllerTest.php @@ -7,7 +7,6 @@ use App\Models\City; use App\Models\Country; use App\Models\User; -use Generator; use Laravel\Sanctum\Sanctum; use Tests\TestCase; @@ -96,42 +95,41 @@ public function testCityCannotBeUpdatedWithInvalidData(array $data, array $expec $response->assertJsonValidationErrors($expectedErrors); } - public static function invalidCityDataProvider(): Generator + public static function invalidCityDataProvider(): array { - yield "city with empty credentials" => [ - "data" => [ - "name" => null, - "longitude" => null, - "latitude" => null, + return [ + "city with empty credentials" => [ + "data" => [ + "name" => null, + "longitude" => null, + "latitude" => null, + ], + "expectedErrors" => ["name", "latitude", "longitude"], ], - "expectedErrors" => ["name", "latitude", "longitude"], - ]; - - yield "city with incorrect name" => [ - "data" => [ - "name" => "legnica", - "longitude" => 21.555, - "latitude" => 55.234, + "city with incorrect name" => [ + "data" => [ + "name" => "legnica", + "longitude" => 21.555, + "latitude" => 55.234, + ], + "expectedErrors" => ["name"], ], - "expectedErrors" => ["name"], - ]; - - yield "city with incorrect longitude" => [ - "data" => [ - "name" => "Legnica", - "longitude" => "21string", - "latitude" => 55.234, + "city with incorrect longitude" => [ + "data" => [ + "name" => "Legnica", + "longitude" => "21string", + "latitude" => 55.234, + ], + "expectedErrors" => ["longitude"], ], - "expectedErrors" => ["longitude"], - ]; - - yield "city with incorrect latitude" => [ - "data" => [ - "name" => "Legnica", - "longitude" => 21.555, - "latitude" => "55.234string", + "city with incorrect latitude" => [ + "data" => [ + "name" => "Legnica", + "longitude" => 21.555, + "latitude" => "55.234string", + ], + "expectedErrors" => ["latitude"], ], - "expectedErrors" => ["latitude"], ]; } diff --git a/tests/Feature/Api/CityOpinionControllerTest.php b/tests/Feature/Api/CityOpinionControllerTest.php index a175f9f3..206feb96 100644 --- a/tests/Feature/Api/CityOpinionControllerTest.php +++ b/tests/Feature/Api/CityOpinionControllerTest.php @@ -8,6 +8,7 @@ use App\Models\CityOpinion; use App\Models\User; use Laravel\Sanctum\Sanctum; +use Symfony\Component\HttpFoundation\Response; use Tests\TestCase; class CityOpinionControllerTest extends TestCase @@ -109,4 +110,14 @@ public function testUnauthorizedUserCannotEditOrDeleteOpinion(): void $response = $this->deleteJson("/api/opinions/$opinion_id"); $response->assertNotFound(); } + + public function testUserCannotAddOpinionForNonexistentCity(): void + { + $response = $this->postJson("/api/opinions", [ + "rating" => 5, + "content" => "Great city!", + "city_id" => 999, + ]); + $response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY); + } } diff --git a/tests/Feature/Api/CityProviderControllerTest.php b/tests/Feature/Api/CityProviderControllerTest.php index 9dd65922..1b68fa67 100644 --- a/tests/Feature/Api/CityProviderControllerTest.php +++ b/tests/Feature/Api/CityProviderControllerTest.php @@ -8,10 +8,18 @@ use App\Models\Provider; use App\Models\User; use Laravel\Sanctum\Sanctum; +use Symfony\Component\HttpFoundation\Response; use Tests\TestCase; class CityProviderControllerTest extends TestCase { + protected function setUp(): void + { + parent::setUp(); + $adminUser = User::factory()->create(); + Sanctum::actingAs($adminUser, ["HasAdminRole"]); + } + public function testCityProviderDataIsReturned(): void { $response = $this->getJson("/api/providers"); @@ -26,11 +34,9 @@ public function testCityProviderDataIsReturned(): void public function testCityProviderDataIsUpdated(): void { - $adminUser = User::factory()->create(); - Sanctum::actingAs($adminUser, ["HasAdminRole"]); Provider::query()->create([ "name" => "provider1", - "url" => "http://provider1.com", + "url" => "https://provider1.com", "color" => "#000000", ]); $city = City::factory()->create(); @@ -50,4 +56,34 @@ public function testCityProviderDataIsUpdated(): void "created_by" => "admin", ]); } + + public function testCityProviderCannotBeUpdatedWithInvalidData(): void + { + $city = City::factory()->create(); + $response = $this->patchJson("/api/update-city-providers/$city->id", [ + "providerNames" => ["provider1"], + "city" => $city, + ]); + $response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY) + ->assertJson([ + "message" => "Provider does not exist.", + ]); + } + + public function testCityProviderCannotBeUpdatedByUnauthorisedUser(): void + { + $user = User::factory()->create(); + Sanctum::actingAs($user); + $city = City::factory()->create(); + $provider = Provider::query()->create([ + "name" => "provider1", + "url" => "https://provider1.com", + "color" => "#000000", + ]); + $response = $this->patchJson("/api/update-city-providers/$city->id", [ + "providerNames" => [$provider->name], + "city" => $city, + ]); + $response->assertStatus(Response::HTTP_NOT_FOUND); + } } diff --git a/tests/Feature/Api/FavoritesControllerTest.php b/tests/Feature/Api/FavoritesControllerTest.php index a6f698c5..46d6b375 100644 --- a/tests/Feature/Api/FavoritesControllerTest.php +++ b/tests/Feature/Api/FavoritesControllerTest.php @@ -53,4 +53,31 @@ public function testUnauthenticatedUserCannotAddCityToFavourites(): void $response->assertStatus(Response::HTTP_NOT_FOUND); } + + public function testNonexistentCityCannotBeAddedToFavourites(): void + { + $user = User::factory()->create(); + Sanctum::actingAs($user); + + $response = $this->postJson("/api/favorites/", ["city_id" => 999]); + + $response->assertStatus(Response::HTTP_BAD_REQUEST); + } + + public function testRequestWithoutCityIdReturnsBadRequest(): void + { + $user = User::factory()->create(); + Sanctum::actingAs($user); + + $response = $this->postJson("/api/favorites/"); + + $response->assertStatus(Response::HTTP_BAD_REQUEST); + } + + public function testUnauthenticatedUserCannotCheckFavourites(): void + { + $response = $this->getJson("/api/favorite-cities"); + + $response->assertStatus(Response::HTTP_NOT_FOUND); + } } diff --git a/tests/Feature/Api/ImportInfoControllerTest.php b/tests/Feature/Api/ImportInfoControllerTest.php index c717078b..f0748b4d 100644 --- a/tests/Feature/Api/ImportInfoControllerTest.php +++ b/tests/Feature/Api/ImportInfoControllerTest.php @@ -6,6 +6,7 @@ use App\Models\User; use Laravel\Sanctum\Sanctum; +use Symfony\Component\HttpFoundation\Response; use Tests\TestCase; class ImportInfoControllerTest extends TestCase @@ -29,4 +30,12 @@ public function testImportInfoArrayIsReturned(): void "providers", ]); } + + public function testUnauthorisedUserCannotAccessImportInfo(): void + { + Sanctum::actingAs(User::factory()->create()); + $response = $this->getJson("/api/admin/importers"); + + $response->assertStatus(Response::HTTP_NOT_FOUND); + } } diff --git a/tests/Feature/Api/LoginTest.php b/tests/Feature/Api/LoginTest.php index 5674e815..0d009fe7 100644 --- a/tests/Feature/Api/LoginTest.php +++ b/tests/Feature/Api/LoginTest.php @@ -7,6 +7,7 @@ use App\Models\User; use Illuminate\Support\Facades\Hash; use Laravel\Sanctum\Sanctum; +use Symfony\Component\HttpFoundation\Response; use Tests\TestCase; class LoginTest extends TestCase @@ -39,20 +40,26 @@ public function testAuthenticatedUserCanLogout(): void ]); } - public function testUserCannotLoginWithInvalidPassword(): void + public function testUserCannotLogInWithInvalidCredentials(): void { - User::factory()->create([ + User::query()->create([ + "name" => "Test", "email" => "email@example.com", - "password" => Hash::make("password@example"), + "password" => Hash::make("123456789"), ]); - $response = $this->postJson("/api/login", [ "email" => "email@example.com", - "password" => "IncorrectPassword", + "password" => "password", ]); + $response->assertStatus(Response::HTTP_UNAUTHORIZED) + ->assertJson(["message" => "Invalid credentials."]); - $response->assertJson([ - "message" => "Invalid credentials.", + $response = $this->postJson("/api/login", [ + "email" => "invalid@example.com", + "password" => "123456789", ]); + + $response->assertStatus(Response::HTTP_UNAUTHORIZED) + ->assertJson(["message" => "Invalid credentials."]); } } diff --git a/tests/Feature/Api/SignupTest.php b/tests/Feature/Api/SignupTest.php index caeb7d33..7cfb71ab 100644 --- a/tests/Feature/Api/SignupTest.php +++ b/tests/Feature/Api/SignupTest.php @@ -60,4 +60,25 @@ public function testUserCannotBeCreatedWithInvalidPassword(): void $response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY) ->assertJsonValidationErrorFor("password"); } + + public function testUserCannotSignUpWithTakenEmail(): void + { + $user1 = [ + "name" => "Test", + "email" => "test@example.com", + "password" => "123456789", + ]; + $user2 = [ + "name" => "Test1", + "email" => "test@example.com", + "password" => "password", + ]; + + $response = $this->postJson("/api/register", $user1); + $response->assertStatus(Response::HTTP_CREATED); + + $response = $this->postJson("/api/register", $user2); + $response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY) + ->assertJsonValidationErrorFor("email"); + } } From 5b07be3448c46ea5a0e6bdb8b23885f5209edbd8 Mon Sep 17 00:00:00 2001 From: JakubKermes Date: Thu, 25 Apr 2024 20:17:04 +0200 Subject: [PATCH 03/11] small fixes --- tests/Feature/Api/CityControllerTest.php | 16 ++- tests/Feature/Api/CountryControllerTest.php | 109 ++++++++++---------- 2 files changed, 61 insertions(+), 64 deletions(-) diff --git a/tests/Feature/Api/CityControllerTest.php b/tests/Feature/Api/CityControllerTest.php index 64e27e1c..4e1382c4 100644 --- a/tests/Feature/Api/CityControllerTest.php +++ b/tests/Feature/Api/CityControllerTest.php @@ -8,6 +8,7 @@ use App\Models\Country; use App\Models\User; use Laravel\Sanctum\Sanctum; +use Symfony\Component\HttpFoundation\Response; use Tests\TestCase; class CityControllerTest extends TestCase @@ -54,23 +55,20 @@ public function testCityCannotBeCreatedBecauseFieldsAlreadyExist(): void { $country = Country::factory()->create(); - $city = [ + $cityData = [ "name" => "Legnica", "latitude" => 44.543, "longitude" => -43.122, "country_id" => $country->id, ]; - City::query()->create([ - "name" => $city["name"], - "latitude" => -55.54323, - "longitude" => 42.3721, - "country_id" => $country->id, - ])->toArray(); - $this->postJson("/api/admin/cities", $city); + $response = $this->postJson("/api/admin/cities", $cityData); + $response->assertStatus(Response::HTTP_CREATED); + + $response = $this->postJson("/api/admin/cities", $cityData); + $response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY); - $this->assertDatabaseMissing("cities", $city); } /** diff --git a/tests/Feature/Api/CountryControllerTest.php b/tests/Feature/Api/CountryControllerTest.php index 1c965243..4900d17f 100644 --- a/tests/Feature/Api/CountryControllerTest.php +++ b/tests/Feature/Api/CountryControllerTest.php @@ -21,7 +21,7 @@ protected function setUp(): void Sanctum::actingAs($adminUser, ["HasAdminRole"]); } - public function testCountriesViewCanBeRendered(): void + public function testCountriesArrayIsReturned(): void { Country::factory()->count(3)->create(); @@ -55,23 +55,24 @@ public function testCountryCanBeCreated(): void public function testCountryCannotBeCreatedBecauseFieldsAlreadyExist(): void { - $country = [ + $countryData = [ "name" => "Poland", "latitude" => 44.543, "longitude" => -43.122, "iso" => "pl", ]; - Country::query()->create([ - "name" => $country["name"], - "latitude" => -55.54323, - "longitude" => 42.3721, - "iso" => $country["iso"], - ])->toArray(); + $response = $this->postJson("/api/admin/countries", $countryData); + + $response->assertStatus(Response::HTTP_CREATED); + + $response = $this->postJson("/api/admin/countries", $countryData); + + $response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY) + ->assertJsonValidationErrors(["name", "iso"]); + - $this->postJson("/api/admin/countries", $country); - $this->assertDatabaseMissing("countries", $country); } /** @@ -96,56 +97,54 @@ public function testCountryCannotBeUpdatedWithInvalidData(array $data, array $ex ->assertJsonValidationErrors($expectedErrors); } - public static function invalidCountryDataProvider(): Generator + public static function invalidCountryDataProvider(): array { - yield "country with empty credentials" => [ - "data" => [ - "name" => null, - "longitude" => null, - "latitude" => null, - "iso" => null, - ], - "expectedErrors" => ["name", "latitude", "longitude", "iso"], - ]; - - yield "country with incorrect name" => [ - "data" => [ - "name" => "poland", - "longitude" => 21.555, - "latitude" => 55.234, - "iso" => "pl", + return [ + "country with empty credentials" => [ + "data" => [ + "name" => null, + "longitude" => null, + "latitude" => null, + "iso" => null, + ], + "expectedErrors" => ["name", "latitude", "longitude", "iso"], ], - "expectedErrors" => ["name"], - ]; - - yield "country with incorrect longitude" => [ - "data" => [ - "name" => "Poland", - "longitude" => "21string", - "latitude" => 55.234, - "iso" => "pl", + "country with incorrect name" => [ + "data" => [ + "name" => "poland", + "longitude" => 21.555, + "latitude" => 55.234, + "iso" => "pl", + ], + "expectedErrors" => ["name"], ], - "expectedErrors" => ["longitude"], - ]; - - yield "country with incorrect latitude" => [ - "data" => [ - "name" => "Poland", - "longitude" => 21.555, - "latitude" => "55.234string", - "iso" => "pl", + "country with incorrect longitude" => [ + "data" => [ + "name" => "Poland", + "longitude" => "21string", + "latitude" => 55.234, + "iso" => "pl", + ], + "expectedErrors" => ["longitude"], ], - "expectedErrors" => ["latitude"], - ]; - - yield "country with incorrect iso" => [ - "data" => [ - "name" => "Poland", - "longitude" => 21.555, - "latitude" => 55.234, - "iso" => "Pl", + "country with incorrect latitude" => [ + "data" => [ + "name" => "Poland", + "longitude" => 21.555, + "latitude" => "55.234string", + "iso" => "pl", + ], + "expectedErrors" => ["latitude"], ], - "expectedErrors" => ["iso"], + "country with incorrect iso" => [ + "data" => [ + "name" => "Poland", + "longitude" => 21.555, + "latitude" => 55.234, + "iso" => "Pl", + ], + "expectedErrors" => ["iso"], + ] ]; } From 3b7e5deca768c1cf347ecff6c8572b07f17f6ba2 Mon Sep 17 00:00:00 2001 From: JakubKermes Date: Thu, 25 Apr 2024 20:17:23 +0200 Subject: [PATCH 04/11] small fixes --- tests/Feature/Api/CityControllerTest.php | 2 -- tests/Feature/Api/CountryControllerTest.php | 6 +----- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/tests/Feature/Api/CityControllerTest.php b/tests/Feature/Api/CityControllerTest.php index 4e1382c4..1db0c22a 100644 --- a/tests/Feature/Api/CityControllerTest.php +++ b/tests/Feature/Api/CityControllerTest.php @@ -62,13 +62,11 @@ public function testCityCannotBeCreatedBecauseFieldsAlreadyExist(): void "country_id" => $country->id, ]; - $response = $this->postJson("/api/admin/cities", $cityData); $response->assertStatus(Response::HTTP_CREATED); $response = $this->postJson("/api/admin/cities", $cityData); $response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY); - } /** diff --git a/tests/Feature/Api/CountryControllerTest.php b/tests/Feature/Api/CountryControllerTest.php index 4900d17f..5d303e0f 100644 --- a/tests/Feature/Api/CountryControllerTest.php +++ b/tests/Feature/Api/CountryControllerTest.php @@ -6,7 +6,6 @@ use App\Models\Country; use App\Models\User; -use Generator; use Laravel\Sanctum\Sanctum; use Symfony\Component\HttpFoundation\Response; use Tests\TestCase; @@ -70,9 +69,6 @@ public function testCountryCannotBeCreatedBecauseFieldsAlreadyExist(): void $response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY) ->assertJsonValidationErrors(["name", "iso"]); - - - } /** @@ -144,7 +140,7 @@ public static function invalidCountryDataProvider(): array "iso" => "Pl", ], "expectedErrors" => ["iso"], - ] + ], ]; } From b47c36793df941fbbf1ecb4b420095308a71cdb4 Mon Sep 17 00:00:00 2001 From: JakubKermes Date: Fri, 26 Apr 2024 11:40:14 +0200 Subject: [PATCH 05/11] changes in CityOpinionControllerTest.php --- .../Feature/Api/CityOpinionControllerTest.php | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/tests/Feature/Api/CityOpinionControllerTest.php b/tests/Feature/Api/CityOpinionControllerTest.php index 206feb96..43e7649b 100644 --- a/tests/Feature/Api/CityOpinionControllerTest.php +++ b/tests/Feature/Api/CityOpinionControllerTest.php @@ -83,7 +83,7 @@ public function testCityOpinionCanBeDeleted(): void ]); } - public function testUnauthorizedUserCannotEditOrDeleteOpinion(): void + public function testUnauthorizedUserCannotEditOpinion(): void { $city = City::factory()->create(); $response = $this->postJson("/api/opinions", [ @@ -106,12 +106,30 @@ public function testUnauthorizedUserCannotEditOrDeleteOpinion(): void ]); $response->assertNotFound(); + } + + public function testUnauthorizedUserCannotDeleteOpinion(): void + { + $city = City::factory()->create(); + $response = $this->postJson("/api/opinions", [ + "rating" => 5, + "content" => "Great city!", + "city_id" => $city->id, + ]); + $response->assertCreated() + ->assertJson([ + "message" => "Opinion added successfully.", + ]); + + Sanctum::actingAs(User::factory()->create()); + + $opinion_id = CityOpinion::query()->first()->id; $response = $this->deleteJson("/api/opinions/$opinion_id"); $response->assertNotFound(); } - public function testUserCannotAddOpinionForNonexistentCity(): void + public function testUserCannotAddOpinionForNonExistentCity(): void { $response = $this->postJson("/api/opinions", [ "rating" => 5, From a355485714679755923c92d5d2d6e187636367be Mon Sep 17 00:00:00 2001 From: JakubKermes Date: Fri, 26 Apr 2024 20:44:24 +0200 Subject: [PATCH 06/11] Update tests --- .../Api/Admin/ProviderController.php | 95 +- app/Http/Requests/ApiProviderRequest.php | 35 + composer.json | 3 +- composer.lock | 1368 ++++++++++------- environment/dev/app/Dockerfile | 12 + lang/pl.json | 3 +- tests/Feature/Api/CountryControllerTest.php | 8 + tests/Feature/Api/FavoritesControllerTest.php | 2 +- tests/Feature/Api/LoginTest.php | 18 +- tests/Feature/Api/ProviderControllerTest.php | 90 ++ tests/Feature/Api/SocialMediaLoginTest.php | 1 + 11 files changed, 1000 insertions(+), 635 deletions(-) create mode 100644 app/Http/Requests/ApiProviderRequest.php create mode 100644 tests/Feature/Api/ProviderControllerTest.php diff --git a/app/Http/Controllers/Api/Admin/ProviderController.php b/app/Http/Controllers/Api/Admin/ProviderController.php index 7f3f59a9..f593edfb 100644 --- a/app/Http/Controllers/Api/Admin/ProviderController.php +++ b/app/Http/Controllers/Api/Admin/ProviderController.php @@ -5,58 +5,43 @@ namespace App\Http\Controllers\Api\Admin; use App\Http\Controllers\Controller; -use App\Http\Requests\ProviderRequest; +use App\Http\Requests\ApiProviderRequest; use App\Http\Resources\ProviderResource; use App\Models\Provider; use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\Storage; -use Symfony\Component\HttpFoundation\File\UploadedFile; +use Symfony\Component\HttpFoundation\Response; class ProviderController extends Controller { - public const ITEMS_PER_PAGE = 15; - public function index(): JsonResponse { - $providers = Provider::query() - ->search("name") - ->orderByName() - ->orderByTimeRange() - ->paginate(self::ITEMS_PER_PAGE) - ->withQueryString(); - + $providers = Provider::all(); return response()->json([ "providers" => ProviderResource::collection($providers), ]); } - public function store(ProviderRequest $request): JsonResponse + public function store(ApiProviderRequest $request): JsonResponse { - Provider::query()->create($request->validated()); + $provider = Provider::create($request->validated()); - $fileName = $this->getFilename($request->name, $request->file("file")); - $fileContents = $request->file("file")->get(); - - Storage::disk("public")->put("providers/" . $fileName, $fileContents); + if ($request->has("file")) { + if (!$this->processProviderImage($request->file, $provider->name)) { + return response()->json(["message" => __("The image must be 150x100 pixels.")], Response::HTTP_UNPROCESSABLE_ENTITY); + } + } - return response()->json(["message" => __("Provider created successfully.")], 201); + return response()->json(["message" => __("Provider created successfully.")], Response::HTTP_CREATED); } - public function update(ProviderRequest $request, Provider $provider): JsonResponse + public function update(ApiProviderRequest $request, Provider $provider): JsonResponse { $provider->update($request->validated()); - $imageName = $this->getFilename($request->name, $request->file("file")); - $storageImagePath = storage_path("app/public/providers/" . $imageName); - $resourceImagePath = resource_path("providers/" . $imageName); - $imageContents = $request->file("file")->get(); - - if (file_exists($resourceImagePath)) { - file_put_contents($resourceImagePath, $imageContents); - Storage::put($storageImagePath, file_get_contents($imageContents)); - } else { - Storage::put($storageImagePath, file_get_contents($imageContents)); + if ($request->has("file")) { + $this->replaceProviderImage($request->file, $provider->name); } return response()->json(["message" => __("Provider updated successfully.")]); @@ -65,7 +50,7 @@ public function update(ProviderRequest $request, Provider $provider): JsonRespon public function destroy(Provider $provider): JsonResponse { $provider->delete(); - $imagePath = storage_path("app/public/providers/" . strtolower($provider["name"]) . ".png"); + $imagePath = $this->providerImagePath($provider->name); File::delete($imagePath); return response()->json(["message" => __("Provider deleted successfully.")]); @@ -73,11 +58,7 @@ public function destroy(Provider $provider): JsonResponse public function showLogo(string $filename): JsonResponse { - $imagePath = storage_path("app/public/providers/" . $filename); - - if (!file_exists($imagePath)) { - $imagePath = storage_path("app/public/providers/unknown.png"); - } + $imagePath = $this->providerImagePath($filename, true); $imageData = base64_encode(file_get_contents($imagePath)); @@ -87,8 +68,48 @@ public function showLogo(string $filename): JsonResponse ]); } - private function getFilename(string $name, UploadedFile $file): string + private function providerImagePath(string $name, bool $useDefault = false): string + { + $path = storage_path("app/public/providers/" . strtolower($name) . ".png"); + + return file_exists($path) || !$useDefault ? $path : storage_path("app/public/providers/unknown.png"); + } + + private function processProviderImage(string $encodedFile, string $name): bool + { + [$decodedFile, $mimeType] = $this->decodeFile($encodedFile); + + if (!$this->validateImageDimensions($decodedFile)) { + return false; + } + + Storage::disk("public")->put("providers/" . strtolower($name) . "." . $mimeType, $decodedFile); + + return true; + } + + private function replaceProviderImage(string $encodedFile, string $name): void { - return strtolower($name) . "." . $file->getClientOriginalExtension(); + $oldImagePath = $this->providerImagePath($name); + Storage::disk("public")->delete($oldImagePath); + $this->processProviderImage($encodedFile, $name); + } + + private function decodeFile(string $encodedFile): array + { + preg_match('/^data:image\/(\w+);base64,/', $encodedFile, $matches); + $decodedFile = base64_decode(explode(",", $encodedFile)[1] ?? "", true); + + return [$decodedFile, $matches[1] ?? "png"]; + } + + private function validateImageDimensions(string $decodedFile): bool + { + $imageResource = imagecreatefromstring($decodedFile); + $width = imagesx($imageResource); + $height = imagesy($imageResource); + imagedestroy($imageResource); + + return $width === 150 && $height === 100; } } diff --git a/app/Http/Requests/ApiProviderRequest.php b/app/Http/Requests/ApiProviderRequest.php new file mode 100644 index 00000000..c67daae5 --- /dev/null +++ b/app/Http/Requests/ApiProviderRequest.php @@ -0,0 +1,35 @@ + ["required", "string", "regex:/^[A-Z\s]/", "max:100", $this->uniqueRuleForProvider("name")], + "color" => ["required", "string", "size:7"], + "url" => ["nullable", "url"], + "android_url" => ["nullable", "url"], + "ios_url" => ["nullable", "url"], + "file" => [ + "required", + "string", + "regex:/^data:image\/(png);base64,[a-zA-Z0-9+\/]+=*$/", + ], + ]; + } + + protected function uniqueRuleForProvider(string $column): Unique + { + $currentProviderId = $this->route(param: "provider"); + + return Rule::unique(table: "providers", column: $column)->ignore($currentProviderId); + } +} diff --git a/composer.json b/composer.json index f0b43aae..fff691b3 100644 --- a/composer.json +++ b/composer.json @@ -7,10 +7,11 @@ "require": { "php": "^8.2", "ext-dom": "*", + "ext-gd": "*", "ext-pdo": "*", - "dedoc/scramble": "^0.9.0", "guzzlehttp/guzzle": "^7.7", "inertiajs/inertia-laravel": "^0.6.9", + "intervention/image": "2.*", "laravel/framework": "^10.13.0", "laravel/sanctum": "^3.2.5", "laravel/socialite": "^5.10", diff --git a/composer.lock b/composer.lock index c90d5a06..3cde5941 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "785527ba25725291cee31cea1f845d2b", + "content-hash": "b855f256a634ad0b33f1370b2d34f81d", "packages": [ { "name": "brick/math", @@ -196,80 +196,6 @@ ], "time": "2023-12-20T15:40:13+00:00" }, - { - "name": "dedoc/scramble", - "version": "v0.9.0", - "source": { - "type": "git", - "url": "https://github.com/dedoc/scramble.git", - "reference": "6280da6809eecaa03243d726b957cc174b1ccb70" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dedoc/scramble/zipball/6280da6809eecaa03243d726b957cc174b1ccb70", - "reference": "6280da6809eecaa03243d726b957cc174b1ccb70", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^10.0|^11.0", - "nikic/php-parser": "^5.0", - "php": "^8.1", - "phpstan/phpdoc-parser": "^1.0", - "spatie/laravel-package-tools": "^1.9.2" - }, - "require-dev": { - "laravel/pint": "^v1.1.0", - "nunomaduro/collision": "^7.0|^8.0", - "orchestra/testbench": "^8.0|^9.0", - "pestphp/pest": "^2.34", - "pestphp/pest-plugin-laravel": "^2.3", - "phpunit/phpunit": "^10.5", - "spatie/pest-plugin-snapshots": "^2.1" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Dedoc\\Scramble\\ScrambleServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Dedoc\\Scramble\\": "src", - "Dedoc\\Scramble\\Database\\Factories\\": "database/factories" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Lytvynenko", - "email": "litvinenko95@gmail.com", - "role": "Developer" - } - ], - "description": "Automatic generation of API documentation for Laravel applications.", - "homepage": "https://github.com/dedoc/scramble", - "keywords": [ - "documentation", - "laravel", - "openapi" - ], - "support": { - "issues": "https://github.com/dedoc/scramble/issues", - "source": "https://github.com/dedoc/scramble/tree/v0.9.0" - }, - "funding": [ - { - "url": "https://github.com/romalytvynenko", - "type": "github" - } - ], - "time": "2024-03-11T19:27:28+00:00" - }, { "name": "dflydev/dot-access-data", "version": "v3.0.2", @@ -347,16 +273,16 @@ }, { "name": "doctrine/inflector", - "version": "2.0.9", + "version": "2.0.10", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "2930cd5ef353871c821d5c43ed030d39ac8cfe65" + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/2930cd5ef353871c821d5c43ed030d39ac8cfe65", - "reference": "2930cd5ef353871c821d5c43ed030d39ac8cfe65", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", "shasum": "" }, "require": { @@ -418,7 +344,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.9" + "source": "https://github.com/doctrine/inflector/tree/2.0.10" }, "funding": [ { @@ -434,31 +360,31 @@ "type": "tidelift" } ], - "time": "2024-01-15T18:05:13+00:00" + "time": "2024-02-18T20:23:39+00:00" }, { "name": "doctrine/lexer", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "84a527db05647743d50373e0ec53a152f2cde568" + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568", - "reference": "84a527db05647743d50373e0ec53a152f2cde568", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", "shasum": "" }, "require": { "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^10", - "phpstan/phpstan": "^1.9", - "phpunit/phpunit": "^9.5", + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^5.0" + "vimeo/psalm": "^5.21" }, "type": "library", "autoload": { @@ -495,7 +421,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/3.0.0" + "source": "https://github.com/doctrine/lexer/tree/3.0.1" }, "funding": [ { @@ -511,7 +437,7 @@ "type": "tidelift" } ], - "time": "2022-12-15T16:57:16+00:00" + "time": "2024-02-05T11:56:58+00:00" }, { "name": "dragonmantank/cron-expression", @@ -641,6 +567,69 @@ ], "time": "2023-10-06T06:47:41+00:00" }, + { + "name": "firebase/php-jwt", + "version": "v6.10.0", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "a49db6f0a5033aef5143295342f1c95521b075ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/a49db6f0a5033aef5143295342f1c95521b075ff", + "reference": "a49db6f0a5033aef5143295342f1c95521b075ff", + "shasum": "" + }, + "require": { + "php": "^7.4||^8.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^6.5||^7.4", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "psr/cache": "^1.0||^2.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" + }, + "suggest": { + "ext-sodium": "Support EdDSA (Ed25519) signatures", + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" + }, + "type": "library", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "keywords": [ + "jwt", + "php" + ], + "support": { + "issues": "https://github.com/firebase/php-jwt/issues", + "source": "https://github.com/firebase/php-jwt/tree/v6.10.0" + }, + "time": "2023-12-01T16:26:39+00:00" + }, { "name": "fruitcake/php-cors", "version": "v1.3.0", @@ -1315,18 +1304,102 @@ ], "time": "2023-10-27T10:59:02+00:00" }, + { + "name": "intervention/image", + "version": "2.7.2", + "source": { + "type": "git", + "url": "https://github.com/Intervention/image.git", + "reference": "04be355f8d6734c826045d02a1079ad658322dad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Intervention/image/zipball/04be355f8d6734c826045d02a1079ad658322dad", + "reference": "04be355f8d6734c826045d02a1079ad658322dad", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "guzzlehttp/psr7": "~1.1 || ^2.0", + "php": ">=5.4.0" + }, + "require-dev": { + "mockery/mockery": "~0.9.2", + "phpunit/phpunit": "^4.8 || ^5.7 || ^7.5.15" + }, + "suggest": { + "ext-gd": "to use GD library based image processing.", + "ext-imagick": "to use Imagick based image processing.", + "intervention/imagecache": "Caching extension for the Intervention Image library" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + }, + "laravel": { + "providers": [ + "Intervention\\Image\\ImageServiceProvider" + ], + "aliases": { + "Image": "Intervention\\Image\\Facades\\Image" + } + } + }, + "autoload": { + "psr-4": { + "Intervention\\Image\\": "src/Intervention/Image" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oliver Vogel", + "email": "oliver@intervention.io", + "homepage": "https://intervention.io/" + } + ], + "description": "Image handling and manipulation library with support for Laravel integration", + "homepage": "http://image.intervention.io/", + "keywords": [ + "gd", + "image", + "imagick", + "laravel", + "thumbnail", + "watermark" + ], + "support": { + "issues": "https://github.com/Intervention/image/issues", + "source": "https://github.com/Intervention/image/tree/2.7.2" + }, + "funding": [ + { + "url": "https://paypal.me/interventionio", + "type": "custom" + }, + { + "url": "https://github.com/Intervention", + "type": "github" + } + ], + "time": "2022-05-21T17:30:32+00:00" + }, { "name": "jean85/pretty-package-versions", - "version": "2.0.5", + "version": "2.0.6", "source": { "type": "git", "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "ae547e455a3d8babd07b96966b17d7fd21d9c6af" + "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/ae547e455a3d8babd07b96966b17d7fd21d9c6af", - "reference": "ae547e455a3d8babd07b96966b17d7fd21d9c6af", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/f9fdd29ad8e6d024f52678b570e5593759b550b4", + "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4", "shasum": "" }, "require": { @@ -1334,9 +1407,9 @@ "php": "^7.1|^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.17", + "friendsofphp/php-cs-fixer": "^3.2", "jean85/composer-provided-replaced-stub-package": "^1.0", - "phpstan/phpstan": "^0.12.66", + "phpstan/phpstan": "^1.4", "phpunit/phpunit": "^7.5|^8.5|^9.4", "vimeo/psalm": "^4.3" }, @@ -1370,22 +1443,22 @@ ], "support": { "issues": "https://github.com/Jean85/pretty-package-versions/issues", - "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.5" + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.6" }, - "time": "2021-10-08T21:21:46+00:00" + "time": "2024-03-08T09:58:59+00:00" }, { "name": "laravel/framework", - "version": "v10.43.0", + "version": "v10.48.9", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "4f7802dfc9993cb57cf69615491ce1a7eb2e9529" + "reference": "ad758500b47964d022addf119600a1b1b0230733" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/4f7802dfc9993cb57cf69615491ce1a7eb2e9529", - "reference": "4f7802dfc9993cb57cf69615491ce1a7eb2e9529", + "url": "https://api.github.com/repos/laravel/framework/zipball/ad758500b47964d022addf119600a1b1b0230733", + "reference": "ad758500b47964d022addf119600a1b1b0230733", "shasum": "" }, "require": { @@ -1433,6 +1506,8 @@ "conflict": { "carbonphp/carbon-doctrine-types": ">=3.0", "doctrine/dbal": ">=4.0", + "mockery/mockery": "1.6.8", + "phpunit/phpunit": ">=11.0.0", "tightenco/collect": "<5.5.33" }, "provide": { @@ -1488,7 +1563,7 @@ "league/flysystem-sftp-v3": "^3.0", "mockery/mockery": "^1.5.1", "nyholm/psr7": "^1.2", - "orchestra/testbench-core": "^8.18", + "orchestra/testbench-core": "^8.23.4", "pda/pheanstalk": "^4.0", "phpstan/phpstan": "^1.4.7", "phpunit/phpunit": "^10.0.7", @@ -1577,20 +1652,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-01-30T16:25:02+00:00" + "time": "2024-04-23T15:01:33+00:00" }, { "name": "laravel/prompts", - "version": "v0.1.15", + "version": "v0.1.20", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "d814a27514d99b03c85aa42b22cfd946568636c1" + "reference": "bf9a360c484976692de0f3792f30066f4f4b34a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/d814a27514d99b03c85aa42b22cfd946568636c1", - "reference": "d814a27514d99b03c85aa42b22cfd946568636c1", + "url": "https://api.github.com/repos/laravel/prompts/zipball/bf9a360c484976692de0f3792f30066f4f4b34a2", + "reference": "bf9a360c484976692de0f3792f30066f4f4b34a2", "shasum": "" }, "require": { @@ -1632,9 +1707,9 @@ ], "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.1.15" + "source": "https://github.com/laravel/prompts/tree/v0.1.20" }, - "time": "2023-12-29T22:37:42+00:00" + "time": "2024-04-18T00:45:25+00:00" }, { "name": "laravel/sanctum", @@ -1764,26 +1839,28 @@ }, { "name": "laravel/socialite", - "version": "v5.11.0", + "version": "v5.13.1", "source": { "type": "git", "url": "https://github.com/laravel/socialite.git", - "reference": "4f6a8af6f3f7c18da03d19842dd0514315501c10" + "reference": "feed1c1ccfd991bc12af59de4aa24f657d9c5cbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/4f6a8af6f3f7c18da03d19842dd0514315501c10", - "reference": "4f6a8af6f3f7c18da03d19842dd0514315501c10", + "url": "https://api.github.com/repos/laravel/socialite/zipball/feed1c1ccfd991bc12af59de4aa24f657d9c5cbe", + "reference": "feed1c1ccfd991bc12af59de4aa24f657d9c5cbe", "shasum": "" }, "require": { "ext-json": "*", + "firebase/php-jwt": "^6.4", "guzzlehttp/guzzle": "^6.0|^7.0", "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", "illuminate/http": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", "league/oauth1-client": "^1.10.1", - "php": "^7.2|^8.0" + "php": "^7.2|^8.0", + "phpseclib/phpseclib": "^3.0" }, "require-dev": { "mockery/mockery": "^1.0", @@ -1830,7 +1907,7 @@ "issues": "https://github.com/laravel/socialite/issues", "source": "https://github.com/laravel/socialite" }, - "time": "2023-12-02T18:22:36+00:00" + "time": "2024-04-24T20:36:50+00:00" }, { "name": "laravel/tinker", @@ -1900,16 +1977,16 @@ }, { "name": "league/commonmark", - "version": "2.4.1", + "version": "2.4.2", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "3669d6d5f7a47a93c08ddff335e6d945481a1dd5" + "reference": "91c24291965bd6d7c46c46a12ba7492f83b1cadf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/3669d6d5f7a47a93c08ddff335e6d945481a1dd5", - "reference": "3669d6d5f7a47a93c08ddff335e6d945481a1dd5", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/91c24291965bd6d7c46c46a12ba7492f83b1cadf", + "reference": "91c24291965bd6d7c46c46a12ba7492f83b1cadf", "shasum": "" }, "require": { @@ -1922,7 +1999,7 @@ }, "require-dev": { "cebe/markdown": "^1.0", - "commonmark/cmark": "0.30.0", + "commonmark/cmark": "0.30.3", "commonmark/commonmark.js": "0.30.0", "composer/package-versions-deprecated": "^1.8", "embed/embed": "^4.4", @@ -1932,10 +2009,10 @@ "michelf/php-markdown": "^1.4 || ^2.0", "nyholm/psr7": "^1.5", "phpstan/phpstan": "^1.8.2", - "phpunit/phpunit": "^9.5.21", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", "scrutinizer/ocular": "^1.8.1", - "symfony/finder": "^5.3 | ^6.0", - "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0", + "symfony/finder": "^5.3 | ^6.0 || ^7.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 || ^7.0", "unleashedtech/php-coding-standard": "^3.1.1", "vimeo/psalm": "^4.24.0 || ^5.0.0" }, @@ -2002,7 +2079,7 @@ "type": "tidelift" } ], - "time": "2023-08-30T16:55:00+00:00" + "time": "2024-02-02T11:59:32+00:00" }, { "name": "league/config", @@ -2088,16 +2165,16 @@ }, { "name": "league/flysystem", - "version": "3.23.1", + "version": "3.27.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "199e1aebbe3e62bd39f4d4fc8c61ce0b3786197e" + "reference": "4729745b1ab737908c7d055148c9a6b3e959832f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/199e1aebbe3e62bd39f4d4fc8c61ce0b3786197e", - "reference": "199e1aebbe3e62bd39f4d4fc8c61ce0b3786197e", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/4729745b1ab737908c7d055148c9a6b3e959832f", + "reference": "4729745b1ab737908c7d055148c9a6b3e959832f", "shasum": "" }, "require": { @@ -2117,7 +2194,7 @@ "require-dev": { "async-aws/s3": "^1.5 || ^2.0", "async-aws/simple-s3": "^1.1 || ^2.0", - "aws/aws-sdk-php": "^3.220.0", + "aws/aws-sdk-php": "^3.295.10", "composer/semver": "^3.0", "ext-fileinfo": "*", "ext-ftp": "*", @@ -2125,10 +2202,10 @@ "friendsofphp/php-cs-fixer": "^3.5", "google/cloud-storage": "^1.23", "microsoft/azure-storage-blob": "^1.1", - "phpseclib/phpseclib": "^3.0.34", + "phpseclib/phpseclib": "^3.0.36", "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^9.5.11|^10.0", - "sabre/dav": "^4.3.1" + "sabre/dav": "^4.6.0" }, "type": "library", "autoload": { @@ -2162,7 +2239,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.23.1" + "source": "https://github.com/thephpleague/flysystem/tree/3.27.0" }, "funding": [ { @@ -2174,20 +2251,20 @@ "type": "github" } ], - "time": "2024-01-26T18:42:03+00:00" + "time": "2024-04-07T19:17:50+00:00" }, { "name": "league/flysystem-local", - "version": "3.23.1", + "version": "3.25.1", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "b884d2bf9b53bb4804a56d2df4902bb51e253f00" + "reference": "61a6a90d6e999e4ddd9ce5adb356de0939060b92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/b884d2bf9b53bb4804a56d2df4902bb51e253f00", - "reference": "b884d2bf9b53bb4804a56d2df4902bb51e253f00", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/61a6a90d6e999e4ddd9ce5adb356de0939060b92", + "reference": "61a6a90d6e999e4ddd9ce5adb356de0939060b92", "shasum": "" }, "require": { @@ -2221,8 +2298,7 @@ "local" ], "support": { - "issues": "https://github.com/thephpleague/flysystem-local/issues", - "source": "https://github.com/thephpleague/flysystem-local/tree/3.23.1" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.25.1" }, "funding": [ { @@ -2234,7 +2310,7 @@ "type": "github" } ], - "time": "2024-01-26T18:25:23+00:00" + "time": "2024-03-15T19:58:44+00:00" }, { "name": "league/mime-type-detection", @@ -2370,16 +2446,16 @@ }, { "name": "masterminds/html5", - "version": "2.8.1", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/Masterminds/html5-php.git", - "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf" + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f47dcf3c70c584de14f21143c55d9939631bc6cf", - "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", "shasum": "" }, "require": { @@ -2387,7 +2463,7 @@ "php": ">=5.3.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8" + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" }, "type": "library", "extra": { @@ -2431,22 +2507,22 @@ ], "support": { "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.8.1" + "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" }, - "time": "2023-05-10T11:58:31+00:00" + "time": "2024-03-31T07:05:07+00:00" }, { "name": "monolog/monolog", - "version": "3.5.0", + "version": "3.6.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448" + "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c915e2634718dbc8a4a15c61b0e62e7a44e14448", - "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", + "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", "shasum": "" }, "require": { @@ -2469,7 +2545,7 @@ "phpstan/phpstan": "^1.9", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-strict-rules": "^1.4", - "phpunit/phpunit": "^10.1", + "phpunit/phpunit": "^10.5.17", "predis/predis": "^1.1 || ^2", "ruflin/elastica": "^7", "symfony/mailer": "^5.4 || ^6", @@ -2522,7 +2598,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.5.0" + "source": "https://github.com/Seldaek/monolog/tree/3.6.0" }, "funding": [ { @@ -2534,7 +2610,7 @@ "type": "tidelift" } ], - "time": "2023-10-27T15:32:31+00:00" + "time": "2024-04-12T21:02:21+00:00" }, { "name": "nesbot/carbon", @@ -2793,16 +2869,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.0.0", + "version": "v5.0.2", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "4a21235f7e56e713259a6f76bf4b5ea08502b9dc" + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4a21235f7e56e713259a6f76bf4b5ea08502b9dc", - "reference": "4a21235f7e56e713259a6f76bf4b5ea08502b9dc", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13", + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13", "shasum": "" }, "require": { @@ -2845,9 +2921,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.2" }, - "time": "2024-01-07T17:17:35+00:00" + "time": "2024-03-05T20:51:40+00:00" }, { "name": "nunomaduro/termwind", @@ -3013,6 +3089,123 @@ ], "time": "2023-11-13T09:31:12+00:00" }, + { + "name": "paragonie/constant_time_encoding", + "version": "v2.6.3", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "58c3f47f650c94ec05a151692652a868995d2938" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938", + "reference": "58c3f47f650c94ec05a151692652a868995d2938", + "shasum": "" + }, + "require": { + "php": "^7|^8" + }, + "require-dev": { + "phpunit/phpunit": "^6|^7|^8|^9", + "vimeo/psalm": "^1|^2|^3|^4" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2022-06-14T06:56:20+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" + }, { "name": "php-http/client-common", "version": "2.7.1", @@ -3084,16 +3277,16 @@ }, { "name": "php-http/discovery", - "version": "1.19.2", + "version": "1.19.4", "source": { "type": "git", "url": "https://github.com/php-http/discovery.git", - "reference": "61e1a1eb69c92741f5896d9e05fb8e9d7e8bb0cb" + "reference": "0700efda8d7526335132360167315fdab3aeb599" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/61e1a1eb69c92741f5896d9e05fb8e9d7e8bb0cb", - "reference": "61e1a1eb69c92741f5896d9e05fb8e9d7e8bb0cb", + "url": "https://api.github.com/repos/php-http/discovery/zipball/0700efda8d7526335132360167315fdab3aeb599", + "reference": "0700efda8d7526335132360167315fdab3aeb599", "shasum": "" }, "require": { @@ -3117,7 +3310,8 @@ "php-http/httplug": "^1.0 || ^2.0", "php-http/message-factory": "^1.0", "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", - "symfony/phpunit-bridge": "^6.2" + "sebastian/comparator": "^3.0.5 || ^4.0.8", + "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1" }, "type": "composer-plugin", "extra": { @@ -3156,9 +3350,9 @@ ], "support": { "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.19.2" + "source": "https://github.com/php-http/discovery/tree/1.19.4" }, - "time": "2023-11-30T16:49:05+00:00" + "time": "2024-03-29T13:00:05+00:00" }, { "name": "php-http/httplug", @@ -3219,16 +3413,16 @@ }, { "name": "php-http/message", - "version": "1.16.0", + "version": "1.16.1", "source": { "type": "git", "url": "https://github.com/php-http/message.git", - "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd" + "reference": "5997f3289332c699fa2545c427826272498a2088" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/message/zipball/47a14338bf4ebd67d317bf1144253d7db4ab55fd", - "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd", + "url": "https://api.github.com/repos/php-http/message/zipball/5997f3289332c699fa2545c427826272498a2088", + "reference": "5997f3289332c699fa2545c427826272498a2088", "shasum": "" }, "require": { @@ -3282,9 +3476,9 @@ ], "support": { "issues": "https://github.com/php-http/message/issues", - "source": "https://github.com/php-http/message/tree/1.16.0" + "source": "https://github.com/php-http/message/tree/1.16.1" }, - "time": "2023-05-17T06:43:38+00:00" + "time": "2024-03-07T13:22:09+00:00" }, { "name": "php-http/message-factory", @@ -3343,16 +3537,16 @@ }, { "name": "php-http/promise", - "version": "1.3.0", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/php-http/promise.git", - "reference": "2916a606d3b390f4e9e8e2b8dd68581508be0f07" + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/promise/zipball/2916a606d3b390f4e9e8e2b8dd68581508be0f07", - "reference": "2916a606d3b390f4e9e8e2b8dd68581508be0f07", + "url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83", + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83", "shasum": "" }, "require": { @@ -3389,9 +3583,9 @@ ], "support": { "issues": "https://github.com/php-http/promise/issues", - "source": "https://github.com/php-http/promise/tree/1.3.0" + "source": "https://github.com/php-http/promise/tree/1.3.1" }, - "time": "2024-01-04T18:49:48+00:00" + "time": "2024-03-15T13:55:21+00:00" }, { "name": "phpoption/phpoption", @@ -3469,51 +3663,114 @@ "time": "2023-11-12T21:59:55+00:00" }, { - "name": "phpstan/phpdoc-parser", - "version": "1.27.0", + "name": "phpseclib/phpseclib", + "version": "3.0.37", "source": { "type": "git", - "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "86e4d5a4b036f8f0be1464522f4c6b584c452757" + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "cfa2013d0f68c062055180dd4328cc8b9d1f30b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/86e4d5a4b036f8f0be1464522f4c6b584c452757", - "reference": "86e4d5a4b036f8f0be1464522f4c6b584c452757", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/cfa2013d0f68c062055180dd4328cc8b9d1f30b8", + "reference": "cfa2013d0f68c062055180dd4328cc8b9d1f30b8", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "paragonie/constant_time_encoding": "^1|^2", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": ">=5.6.1" }, "require-dev": { - "doctrine/annotations": "^2.0", - "nikic/php-parser": "^4.15", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.5", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^9.5", - "symfony/process": "^5.2" + "phpunit/phpunit": "*" + }, + "suggest": { + "ext-dom": "Install the DOM extension to load XML formatted public keys.", + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." }, "type": "library", "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], "psr-4": { - "PHPStan\\PhpDocParser\\": [ - "src/" - ] + "phpseclib3\\": "phpseclib/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "PHPDoc parser with support for nullable, intersection and generic types", + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" + } + ], + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], "support": { - "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.27.0" + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.37" }, - "time": "2024-03-21T13:14:53+00:00" + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "time": "2024-03-03T02:14:58+00:00" }, { "name": "psr/clock", @@ -3929,16 +4186,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.0", + "version": "v0.12.3", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "750bf031a48fd07c673dbe3f11f72362ea306d0d" + "reference": "b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/750bf031a48fd07c673dbe3f11f72362ea306d0d", - "reference": "750bf031a48fd07c673dbe3f11f72362ea306d0d", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73", + "reference": "b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73", "shasum": "" }, "require": { @@ -4002,9 +4259,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.0" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.3" }, - "time": "2023-12-20T15:28:09+00:00" + "time": "2024-04-02T15:57:53+00:00" }, { "name": "ralouphie/getallheaders", @@ -4480,78 +4737,18 @@ ], "time": "2023-10-12T14:38:46+00:00" }, - { - "name": "spatie/laravel-package-tools", - "version": "1.16.4", - "source": { - "type": "git", - "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "ddf678e78d7f8b17e5cdd99c0c3413a4a6592e53" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/ddf678e78d7f8b17e5cdd99c0c3413a4a6592e53", - "reference": "ddf678e78d7f8b17e5cdd99c0c3413a4a6592e53", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^9.28|^10.0|^11.0", - "php": "^8.0" - }, - "require-dev": { - "mockery/mockery": "^1.5", - "orchestra/testbench": "^7.7|^8.0", - "pestphp/pest": "^1.22", - "phpunit/phpunit": "^9.5.24", - "spatie/pest-plugin-test-time": "^1.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Spatie\\LaravelPackageTools\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "role": "Developer" - } - ], - "description": "Tools for creating Laravel packages", - "homepage": "https://github.com/spatie/laravel-package-tools", - "keywords": [ - "laravel-package-tools", - "spatie" - ], - "support": { - "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.4" - }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2024-03-20T07:29:11+00:00" - }, { "name": "spatie/laravel-permission", - "version": "6.3.0", + "version": "6.7.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-permission.git", - "reference": "4d119986c862ac0168b77338c85d8236bb559a88" + "reference": "17607924aa0aa89bc0153c2ce45ed7c55083367b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/4d119986c862ac0168b77338c85d8236bb559a88", - "reference": "4d119986c862ac0168b77338c85d8236bb559a88", + "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/17607924aa0aa89bc0153c2ce45ed7c55083367b", + "reference": "17607924aa0aa89bc0153c2ce45ed7c55083367b", "shasum": "" }, "require": { @@ -4562,7 +4759,7 @@ "php": "^8.0" }, "require-dev": { - "laravel/passport": "^11.0", + "laravel/passport": "^11.0|^12.0", "orchestra/testbench": "^6.23|^7.0|^8.0|^9.0", "phpunit/phpunit": "^9.4|^10.1" }, @@ -4612,7 +4809,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-permission/issues", - "source": "https://github.com/spatie/laravel-permission/tree/6.3.0" + "source": "https://github.com/spatie/laravel-permission/tree/6.7.0" }, "funding": [ { @@ -4620,7 +4817,7 @@ "type": "github" } ], - "time": "2023-12-24T06:58:02+00:00" + "time": "2024-04-19T12:35:28+00:00" }, { "name": "stichoza/google-translate-php", @@ -4704,16 +4901,16 @@ }, { "name": "symfony/console", - "version": "v6.4.3", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "2aaf83b4de5b9d43b93e4aec6f2f8b676f7c567e" + "reference": "a2708a5da5c87d1d0d52937bdeac625df659e11f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/2aaf83b4de5b9d43b93e4aec6f2f8b676f7c567e", - "reference": "2aaf83b4de5b9d43b93e4aec6f2f8b676f7c567e", + "url": "https://api.github.com/repos/symfony/console/zipball/a2708a5da5c87d1d0d52937bdeac625df659e11f", + "reference": "a2708a5da5c87d1d0d52937bdeac625df659e11f", "shasum": "" }, "require": { @@ -4778,7 +4975,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.3" + "source": "https://github.com/symfony/console/tree/v6.4.6" }, "funding": [ { @@ -4794,7 +4991,7 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-03-29T19:07:53+00:00" }, { "name": "symfony/css-selector", @@ -4930,16 +5127,16 @@ }, { "name": "symfony/dom-crawler", - "version": "v6.4.3", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "6db31849011fefe091e94d0bb10cba26f7919894" + "reference": "f0e7ec3fa17000e2d0cb4557b4b47c88a6a63531" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/6db31849011fefe091e94d0bb10cba26f7919894", - "reference": "6db31849011fefe091e94d0bb10cba26f7919894", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/f0e7ec3fa17000e2d0cb4557b4b47c88a6a63531", + "reference": "f0e7ec3fa17000e2d0cb4557b4b47c88a6a63531", "shasum": "" }, "require": { @@ -4977,7 +5174,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v6.4.3" + "source": "https://github.com/symfony/dom-crawler/tree/v6.4.4" }, "funding": [ { @@ -4993,20 +5190,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-02-07T09:17:57+00:00" }, { "name": "symfony/error-handler", - "version": "v6.4.3", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "6dc3c76a278b77f01d864a6005d640822c6f26a6" + "reference": "64db1c1802e3a4557e37ba33031ac39f452ac5d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/6dc3c76a278b77f01d864a6005d640822c6f26a6", - "reference": "6dc3c76a278b77f01d864a6005d640822c6f26a6", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/64db1c1802e3a4557e37ba33031ac39f452ac5d4", + "reference": "64db1c1802e3a4557e37ba33031ac39f452ac5d4", "shasum": "" }, "require": { @@ -5052,7 +5249,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.3" + "source": "https://github.com/symfony/error-handler/tree/v6.4.6" }, "funding": [ { @@ -5068,7 +5265,7 @@ "type": "tidelift" } ], - "time": "2024-01-29T15:40:36+00:00" + "time": "2024-03-19T11:56:30+00:00" }, { "name": "symfony/event-dispatcher", @@ -5152,16 +5349,16 @@ }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.4.0", + "version": "v3.4.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" + "reference": "4e64b49bf370ade88e567de29465762e316e4224" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", - "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/4e64b49bf370ade88e567de29465762e316e4224", + "reference": "4e64b49bf370ade88e567de29465762e316e4224", "shasum": "" }, "require": { @@ -5208,7 +5405,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.2" }, "funding": [ { @@ -5224,7 +5421,7 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2024-01-23T14:51:35+00:00" }, { "name": "symfony/finder", @@ -5292,22 +5489,22 @@ }, { "name": "symfony/http-client", - "version": "v7.0.3", + "version": "v7.0.6", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "3d2605c07cd14aec294f72f5bf8147702f7a5ada" + "reference": "6e70473909f46fe5dd3b994a0f1b20ecb6b2f858" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/3d2605c07cd14aec294f72f5bf8147702f7a5ada", - "reference": "3d2605c07cd14aec294f72f5bf8147702f7a5ada", + "url": "https://api.github.com/repos/symfony/http-client/zipball/6e70473909f46fe5dd3b994a0f1b20ecb6b2f858", + "reference": "6e70473909f46fe5dd3b994a0f1b20ecb6b2f858", "shasum": "" }, "require": { "php": ">=8.2", "psr/log": "^1|^2|^3", - "symfony/http-client-contracts": "^3", + "symfony/http-client-contracts": "^3.4.1", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -5325,7 +5522,7 @@ "amphp/http-client": "^4.2.1", "amphp/http-tunnel": "^1.0", "amphp/socket": "^1.1", - "guzzlehttp/promises": "^1.4", + "guzzlehttp/promises": "^1.4|^2.0", "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", "psr/http-client": "^1.0", @@ -5364,7 +5561,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v7.0.3" + "source": "https://github.com/symfony/http-client/tree/v7.0.6" }, "funding": [ { @@ -5380,20 +5577,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T15:41:16+00:00" + "time": "2024-04-01T20:49:44+00:00" }, { "name": "symfony/http-client-contracts", - "version": "v3.4.0", + "version": "v3.4.2", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "1ee70e699b41909c209a0c930f11034b93578654" + "reference": "b6b5c876b3a4ed74460e2c5ac53bbce2f12e2a7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/1ee70e699b41909c209a0c930f11034b93578654", - "reference": "1ee70e699b41909c209a0c930f11034b93578654", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/b6b5c876b3a4ed74460e2c5ac53bbce2f12e2a7e", + "reference": "b6b5c876b3a4ed74460e2c5ac53bbce2f12e2a7e", "shasum": "" }, "require": { @@ -5442,7 +5639,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/http-client-contracts/tree/v3.4.2" }, "funding": [ { @@ -5458,20 +5655,20 @@ "type": "tidelift" } ], - "time": "2023-07-30T20:28:31+00:00" + "time": "2024-04-01T18:51:09+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.4.3", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "5677bdf7cade4619cb17fc9e1e7b31ec392244a9" + "reference": "ebc713bc6e6f4b53f46539fc158be85dfcd77304" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/5677bdf7cade4619cb17fc9e1e7b31ec392244a9", - "reference": "5677bdf7cade4619cb17fc9e1e7b31ec392244a9", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ebc713bc6e6f4b53f46539fc158be85dfcd77304", + "reference": "ebc713bc6e6f4b53f46539fc158be85dfcd77304", "shasum": "" }, "require": { @@ -5519,7 +5716,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.3" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.4" }, "funding": [ { @@ -5535,20 +5732,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-02-08T15:01:18+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.3", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "9c6ec4e543044f7568a53a76ab1484ecd30637a2" + "reference": "060038863743fd0cd982be06acecccf246d35653" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9c6ec4e543044f7568a53a76ab1484ecd30637a2", - "reference": "9c6ec4e543044f7568a53a76ab1484ecd30637a2", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/060038863743fd0cd982be06acecccf246d35653", + "reference": "060038863743fd0cd982be06acecccf246d35653", "shasum": "" }, "require": { @@ -5597,7 +5794,7 @@ "symfony/process": "^5.4|^6.0|^7.0", "symfony/property-access": "^5.4.5|^6.0.5|^7.0", "symfony/routing": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.3|^7.0", + "symfony/serializer": "^6.4.4|^7.0.4", "symfony/stopwatch": "^5.4|^6.0|^7.0", "symfony/translation": "^5.4|^6.0|^7.0", "symfony/translation-contracts": "^2.5|^3", @@ -5632,7 +5829,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.3" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.6" }, "funding": [ { @@ -5648,20 +5845,20 @@ "type": "tidelift" } ], - "time": "2024-01-31T07:21:29+00:00" + "time": "2024-04-03T06:09:15+00:00" }, { "name": "symfony/mailer", - "version": "v6.4.3", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "74412c62f88a85a41b61f0b71ab0afcaad6f03ee" + "reference": "677f34a6f4b4559e08acf73ae0aec460479e5859" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/74412c62f88a85a41b61f0b71ab0afcaad6f03ee", - "reference": "74412c62f88a85a41b61f0b71ab0afcaad6f03ee", + "url": "https://api.github.com/repos/symfony/mailer/zipball/677f34a6f4b4559e08acf73ae0aec460479e5859", + "reference": "677f34a6f4b4559e08acf73ae0aec460479e5859", "shasum": "" }, "require": { @@ -5712,7 +5909,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.3" + "source": "https://github.com/symfony/mailer/tree/v6.4.6" }, "funding": [ { @@ -5728,20 +5925,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T15:01:07+00:00" + "time": "2024-03-27T21:14:17+00:00" }, { "name": "symfony/mime", - "version": "v6.4.3", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "5017e0a9398c77090b7694be46f20eb796262a34" + "reference": "14762b86918823cb42e3558cdcca62e58b5227fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/5017e0a9398c77090b7694be46f20eb796262a34", - "reference": "5017e0a9398c77090b7694be46f20eb796262a34", + "url": "https://api.github.com/repos/symfony/mime/zipball/14762b86918823cb42e3558cdcca62e58b5227fe", + "reference": "14762b86918823cb42e3558cdcca62e58b5227fe", "shasum": "" }, "require": { @@ -5762,6 +5959,7 @@ "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.4|^7.0", "symfony/property-access": "^5.4|^6.0|^7.0", "symfony/property-info": "^5.4|^6.0|^7.0", "symfony/serializer": "^6.3.2|^7.0" @@ -5796,7 +5994,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.3" + "source": "https://github.com/symfony/mime/tree/v6.4.6" }, "funding": [ { @@ -5812,7 +6010,7 @@ "type": "tidelift" } ], - "time": "2024-01-30T08:32:12+00:00" + "time": "2024-03-21T19:36:20+00:00" }, { "name": "symfony/options-resolver", @@ -5883,16 +6081,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", "shasum": "" }, "require": { @@ -5906,9 +6104,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -5945,7 +6140,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" }, "funding": [ { @@ -5961,20 +6156,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "875e90aeea2777b6f135677f618529449334a612" + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", - "reference": "875e90aeea2777b6f135677f618529449334a612", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", "shasum": "" }, "require": { @@ -5985,9 +6180,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6026,7 +6218,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" }, "funding": [ { @@ -6042,20 +6234,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "ecaafce9f77234a6a449d29e49267ba10499116d" + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d", - "reference": "ecaafce9f77234a6a449d29e49267ba10499116d", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", "shasum": "" }, "require": { @@ -6068,9 +6260,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6113,7 +6302,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" }, "funding": [ { @@ -6129,20 +6318,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:30:37+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", "shasum": "" }, "require": { @@ -6153,9 +6342,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6197,7 +6383,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" }, "funding": [ { @@ -6213,20 +6399,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "42292d99c55abe617799667f454222c54c60e229" + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", - "reference": "42292d99c55abe617799667f454222c54c60e229", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", "shasum": "" }, "require": { @@ -6240,9 +6426,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6280,7 +6463,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" }, "funding": [ { @@ -6296,20 +6479,20 @@ "type": "tidelift" } ], - "time": "2023-07-28T09:04:16+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179" + "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179", - "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25", + "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25", "shasum": "" }, "require": { @@ -6317,9 +6500,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6356,7 +6536,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.29.0" }, "funding": [ { @@ -6372,20 +6552,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", "shasum": "" }, "require": { @@ -6393,9 +6573,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6439,7 +6616,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" }, "funding": [ { @@ -6455,20 +6632,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11" + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", - "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff", + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff", "shasum": "" }, "require": { @@ -6477,9 +6654,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6519,7 +6693,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.29.0" }, "funding": [ { @@ -6535,20 +6709,20 @@ "type": "tidelift" } ], - "time": "2023-08-16T06:22:46+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "9c44518a5aff8da565c8a55dbe85d2769e6f630e" + "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/9c44518a5aff8da565c8a55dbe85d2769e6f630e", - "reference": "9c44518a5aff8da565c8a55dbe85d2769e6f630e", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/3abdd21b0ceaa3000ee950097bc3cf9efc137853", + "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853", "shasum": "" }, "require": { @@ -6562,9 +6736,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -6601,7 +6772,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.29.0" }, "funding": [ { @@ -6617,20 +6788,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/process", - "version": "v6.4.3", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "31642b0818bfcff85930344ef93193f8c607e0a3" + "reference": "710e27879e9be3395de2b98da3f52a946039f297" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/31642b0818bfcff85930344ef93193f8c607e0a3", - "reference": "31642b0818bfcff85930344ef93193f8c607e0a3", + "url": "https://api.github.com/repos/symfony/process/zipball/710e27879e9be3395de2b98da3f52a946039f297", + "reference": "710e27879e9be3395de2b98da3f52a946039f297", "shasum": "" }, "require": { @@ -6662,7 +6833,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.3" + "source": "https://github.com/symfony/process/tree/v6.4.4" }, "funding": [ { @@ -6678,7 +6849,7 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-02-20T12:31:00+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -6771,16 +6942,16 @@ }, { "name": "symfony/routing", - "version": "v6.4.3", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "3b2957ad54902f0f544df83e3d58b38d7e8e5842" + "reference": "f2591fd1f8c6e3734656b5d6b3829e8bf81f507c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/3b2957ad54902f0f544df83e3d58b38d7e8e5842", - "reference": "3b2957ad54902f0f544df83e3d58b38d7e8e5842", + "url": "https://api.github.com/repos/symfony/routing/zipball/f2591fd1f8c6e3734656b5d6b3829e8bf81f507c", + "reference": "f2591fd1f8c6e3734656b5d6b3829e8bf81f507c", "shasum": "" }, "require": { @@ -6834,7 +7005,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.3" + "source": "https://github.com/symfony/routing/tree/v6.4.6" }, "funding": [ { @@ -6850,20 +7021,20 @@ "type": "tidelift" } ], - "time": "2024-01-30T13:55:02+00:00" + "time": "2024-03-28T13:28:49+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.4.1", + "version": "v3.4.2", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0" + "reference": "11bbf19a0fb7b36345861e85c5768844c552906e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/fe07cbc8d837f60caf7018068e350cc5163681a0", - "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/11bbf19a0fb7b36345861e85c5768844c552906e", + "reference": "11bbf19a0fb7b36345861e85c5768844c552906e", "shasum": "" }, "require": { @@ -6916,7 +7087,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.4.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.4.2" }, "funding": [ { @@ -6932,20 +7103,20 @@ "type": "tidelift" } ], - "time": "2023-12-26T14:02:43+00:00" + "time": "2023-12-19T21:51:00+00:00" }, { "name": "symfony/string", - "version": "v7.0.3", + "version": "v7.0.4", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "524aac4a280b90a4420d8d6a040718d0586505ac" + "reference": "f5832521b998b0bec40bee688ad5de98d4cf111b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/524aac4a280b90a4420d8d6a040718d0586505ac", - "reference": "524aac4a280b90a4420d8d6a040718d0586505ac", + "url": "https://api.github.com/repos/symfony/string/zipball/f5832521b998b0bec40bee688ad5de98d4cf111b", + "reference": "f5832521b998b0bec40bee688ad5de98d4cf111b", "shasum": "" }, "require": { @@ -7002,7 +7173,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.0.3" + "source": "https://github.com/symfony/string/tree/v7.0.4" }, "funding": [ { @@ -7018,20 +7189,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T15:41:16+00:00" + "time": "2024-02-01T13:17:36+00:00" }, { "name": "symfony/translation", - "version": "v6.4.3", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "637c51191b6b184184bbf98937702bcf554f7d04" + "reference": "bce6a5a78e94566641b2594d17e48b0da3184a8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/637c51191b6b184184bbf98937702bcf554f7d04", - "reference": "637c51191b6b184184bbf98937702bcf554f7d04", + "url": "https://api.github.com/repos/symfony/translation/zipball/bce6a5a78e94566641b2594d17e48b0da3184a8e", + "reference": "bce6a5a78e94566641b2594d17e48b0da3184a8e", "shasum": "" }, "require": { @@ -7097,7 +7268,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.3" + "source": "https://github.com/symfony/translation/tree/v6.4.4" }, "funding": [ { @@ -7113,20 +7284,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T13:11:52+00:00" + "time": "2024-02-20T13:16:58+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.4.1", + "version": "v3.4.2", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "06450585bf65e978026bda220cdebca3f867fde7" + "reference": "43810bdb2ddb5400e5c5e778e27b210a0ca83b6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/06450585bf65e978026bda220cdebca3f867fde7", - "reference": "06450585bf65e978026bda220cdebca3f867fde7", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/43810bdb2ddb5400e5c5e778e27b210a0ca83b6b", + "reference": "43810bdb2ddb5400e5c5e778e27b210a0ca83b6b", "shasum": "" }, "require": { @@ -7175,7 +7346,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.4.1" + "source": "https://github.com/symfony/translation-contracts/tree/v3.4.2" }, "funding": [ { @@ -7191,7 +7362,7 @@ "type": "tidelift" } ], - "time": "2023-12-26T14:02:43+00:00" + "time": "2024-01-23T14:51:35+00:00" }, { "name": "symfony/uid", @@ -7269,16 +7440,16 @@ }, { "name": "symfony/var-dumper", - "version": "v6.4.3", + "version": "v6.4.6", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "0435a08f69125535336177c29d56af3abc1f69da" + "reference": "95bd2706a97fb875185b51ecaa6112ec184233d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0435a08f69125535336177c29d56af3abc1f69da", - "reference": "0435a08f69125535336177c29d56af3abc1f69da", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/95bd2706a97fb875185b51ecaa6112ec184233d4", + "reference": "95bd2706a97fb875185b51ecaa6112ec184233d4", "shasum": "" }, "require": { @@ -7334,7 +7505,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.3" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.6" }, "funding": [ { @@ -7350,7 +7521,7 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:53:30+00:00" + "time": "2024-03-19T11:56:30+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -7675,16 +7846,16 @@ }, { "name": "composer/pcre", - "version": "3.1.1", + "version": "3.1.3", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9" + "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9", - "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9", + "url": "https://api.github.com/repos/composer/pcre/zipball/5b16e25a5355f1f3afdfc2f954a0a80aec4826a8", + "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8", "shasum": "" }, "require": { @@ -7726,7 +7897,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.1.1" + "source": "https://github.com/composer/pcre/tree/3.1.3" }, "funding": [ { @@ -7742,7 +7913,7 @@ "type": "tidelift" } ], - "time": "2023-10-11T07:11:09+00:00" + "time": "2024-03-19T10:26:25+00:00" }, { "name": "composer/semver", @@ -7827,16 +7998,16 @@ }, { "name": "composer/xdebug-handler", - "version": "3.0.3", + "version": "3.0.4", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "ced299686f41dce890debac69273b47ffe98a40c" + "reference": "4f988f8fdf580d53bdb2d1278fe93d1ed5462255" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", - "reference": "ced299686f41dce890debac69273b47ffe98a40c", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/4f988f8fdf580d53bdb2d1278fe93d1ed5462255", + "reference": "4f988f8fdf580d53bdb2d1278fe93d1ed5462255", "shasum": "" }, "require": { @@ -7847,7 +8018,7 @@ "require-dev": { "phpstan/phpstan": "^1.0", "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^6.0" + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" }, "type": "library", "autoload": { @@ -7871,9 +8042,9 @@ "performance" ], "support": { - "irc": "irc://irc.freenode.org/composer", + "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" + "source": "https://github.com/composer/xdebug-handler/tree/3.0.4" }, "funding": [ { @@ -7889,7 +8060,7 @@ "type": "tidelift" } ], - "time": "2022-02-25T21:32:43+00:00" + "time": "2024-03-26T18:29:49+00:00" }, { "name": "fakerphp/faker", @@ -8027,16 +8198,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.48.0", + "version": "v3.54.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "a92472c6fb66349de25211f31c77eceae3df024e" + "reference": "2aecbc8640d7906c38777b3dcab6f4ca79004d08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/a92472c6fb66349de25211f31c77eceae3df024e", - "reference": "a92472c6fb66349de25211f31c77eceae3df024e", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/2aecbc8640d7906c38777b3dcab6f4ca79004d08", + "reference": "2aecbc8640d7906c38777b3dcab6f4ca79004d08", "shasum": "" }, "require": { @@ -8046,7 +8217,7 @@ "ext-json": "*", "ext-tokenizer": "*", "php": "^7.4 || ^8.0", - "sebastian/diff": "^4.0 || ^5.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0", "symfony/console": "^5.4 || ^6.0 || ^7.0", "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", @@ -8060,6 +8231,7 @@ }, "require-dev": { "facile-it/paraunit": "^1.3 || ^2.0", + "infection/infection": "^0.27.11", "justinrainbow/json-schema": "^5.2", "keradus/cli-executor": "^2.1", "mikey179/vfsstream": "^1.6.11", @@ -8067,7 +8239,8 @@ "php-cs-fixer/accessible-object": "^1.1", "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.4", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.4", - "phpunit/phpunit": "^9.6 || ^10.5.5", + "phpunit/phpunit": "^9.6 || ^10.5.5 || ^11.0.2", + "symfony/var-dumper": "^5.4 || ^6.0 || ^7.0", "symfony/yaml": "^5.4 || ^6.0 || ^7.0" }, "suggest": { @@ -8106,7 +8279,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.48.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.54.0" }, "funding": [ { @@ -8114,7 +8287,7 @@ "type": "github" } ], - "time": "2024-01-19T21:44:39+00:00" + "time": "2024-04-17T08:12:13+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -8169,22 +8342,22 @@ }, { "name": "kubawerlos/php-cs-fixer-custom-fixers", - "version": "v3.19.2", + "version": "v3.21.0", "source": { "type": "git", "url": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers.git", - "reference": "e17ffa5d25dafed7a8bcf545fc1b576a664c87e7" + "reference": "3d1bb75be0df6c6fba4487c75b9e425a2c1d27c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/kubawerlos/php-cs-fixer-custom-fixers/zipball/e17ffa5d25dafed7a8bcf545fc1b576a664c87e7", - "reference": "e17ffa5d25dafed7a8bcf545fc1b576a664c87e7", + "url": "https://api.github.com/repos/kubawerlos/php-cs-fixer-custom-fixers/zipball/3d1bb75be0df6c6fba4487c75b9e425a2c1d27c9", + "reference": "3d1bb75be0df6c6fba4487c75b9e425a2c1d27c9", "shasum": "" }, "require": { "ext-filter": "*", "ext-tokenizer": "*", - "friendsofphp/php-cs-fixer": "^3.47", + "friendsofphp/php-cs-fixer": "^3.50", "php": "^7.4 || ^8.0" }, "require-dev": { @@ -8209,22 +8382,22 @@ "description": "A set of custom fixers for PHP CS Fixer", "support": { "issues": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers/issues", - "source": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers/tree/v3.19.2" + "source": "https://github.com/kubawerlos/php-cs-fixer-custom-fixers/tree/v3.21.0" }, - "time": "2024-01-25T16:31:36+00:00" + "time": "2024-02-24T08:53:34+00:00" }, { "name": "laravel/telescope", - "version": "v4.17.5", + "version": "v4.17.6", "source": { "type": "git", "url": "https://github.com/laravel/telescope.git", - "reference": "2c5295261d1459e4f9b157c407a663a6685f3ddf" + "reference": "2d453dc629b27e8cf39fb1217aba062f8c54e690" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/telescope/zipball/2c5295261d1459e4f9b157c407a663a6685f3ddf", - "reference": "2c5295261d1459e4f9b157c407a663a6685f3ddf", + "url": "https://api.github.com/repos/laravel/telescope/zipball/2d453dc629b27e8cf39fb1217aba062f8c54e690", + "reference": "2d453dc629b27e8cf39fb1217aba062f8c54e690", "shasum": "" }, "require": { @@ -8280,22 +8453,22 @@ ], "support": { "issues": "https://github.com/laravel/telescope/issues", - "source": "https://github.com/laravel/telescope/tree/v4.17.5" + "source": "https://github.com/laravel/telescope/tree/v4.17.6" }, - "time": "2024-01-30T15:41:45+00:00" + "time": "2024-02-08T15:04:38+00:00" }, { "name": "mockery/mockery", - "version": "1.6.7", + "version": "1.6.11", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "0cc058854b3195ba21dc6b1f7b1f60f4ef3a9c06" + "reference": "81a161d0b135df89951abd52296adf97deb0723d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/0cc058854b3195ba21dc6b1f7b1f60f4ef3a9c06", - "reference": "0cc058854b3195ba21dc6b1f7b1f60f4ef3a9c06", + "url": "https://api.github.com/repos/mockery/mockery/zipball/81a161d0b135df89951abd52296adf97deb0723d", + "reference": "81a161d0b135df89951abd52296adf97deb0723d", "shasum": "" }, "require": { @@ -8307,8 +8480,8 @@ "phpunit/phpunit": "<8.0" }, "require-dev": { - "phpunit/phpunit": "^8.5 || ^9.6.10", - "symplify/easy-coding-standard": "^12.0.8" + "phpunit/phpunit": "^8.5 || ^9.6.17", + "symplify/easy-coding-standard": "^12.1.14" }, "type": "library", "autoload": { @@ -8365,7 +8538,7 @@ "security": "https://github.com/mockery/mockery/security/advisories", "source": "https://github.com/mockery/mockery" }, - "time": "2023-12-10T02:24:34+00:00" + "time": "2024-03-21T18:34:15+00:00" }, { "name": "myclabs/deep-copy", @@ -8524,20 +8697,21 @@ }, { "name": "phar-io/manifest", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", "shasum": "" }, "require": { "ext-dom": "*", + "ext-libxml": "*", "ext-phar": "*", "ext-xmlwriter": "*", "phar-io/version": "^3.0.1", @@ -8578,9 +8752,15 @@ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.3" + "source": "https://github.com/phar-io/manifest/tree/2.0.4" }, - "time": "2021-07-20T11:28:43+00:00" + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" }, { "name": "phar-io/version", @@ -8635,16 +8815,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.11", + "version": "10.1.14", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "78c3b7625965c2513ee96569a4dbb62601784145" + "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/78c3b7625965c2513ee96569a4dbb62601784145", - "reference": "78c3b7625965c2513ee96569a4dbb62601784145", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", + "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", "shasum": "" }, "require": { @@ -8701,7 +8881,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.11" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.14" }, "funding": [ { @@ -8709,7 +8889,7 @@ "type": "github" } ], - "time": "2023-12-21T15:38:30+00:00" + "time": "2024-03-12T15:33:41+00:00" }, { "name": "phpunit/php-file-iterator", @@ -8956,16 +9136,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.9", + "version": "10.5.20", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "0bd663704f0165c9e76fe4f06ffa6a1ca727fdbe" + "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0bd663704f0165c9e76fe4f06ffa6a1ca727fdbe", - "reference": "0bd663704f0165c9e76fe4f06ffa6a1ca727fdbe", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/547d314dc24ec1e177720d45c6263fb226cc2ae3", + "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3", "shasum": "" }, "require": { @@ -9037,7 +9217,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.9" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.20" }, "funding": [ { @@ -9053,20 +9233,20 @@ "type": "tidelift" } ], - "time": "2024-01-22T14:35:40+00:00" + "time": "2024-04-24T06:32:35+00:00" }, { "name": "sebastian/cli-parser", - "version": "2.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae" + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/efdc130dbbbb8ef0b545a994fd811725c5282cae", - "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", "shasum": "" }, "require": { @@ -9101,7 +9281,8 @@ "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.0" + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" }, "funding": [ { @@ -9109,7 +9290,7 @@ "type": "github" } ], - "time": "2023-02-03T06:58:15+00:00" + "time": "2024-03-02T07:12:49+00:00" }, { "name": "sebastian/code-unit", @@ -9359,16 +9540,16 @@ }, { "name": "sebastian/diff", - "version": "5.1.0", + "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f" + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/fbf413a49e54f6b9b17e12d900ac7f6101591b7f", - "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", "shasum": "" }, "require": { @@ -9376,7 +9557,7 @@ }, "require-dev": { "phpunit/phpunit": "^10.0", - "symfony/process": "^4.2 || ^5" + "symfony/process": "^6.4" }, "type": "library", "extra": { @@ -9414,7 +9595,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.1.0" + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" }, "funding": [ { @@ -9422,20 +9603,20 @@ "type": "github" } ], - "time": "2023-12-22T10:55:06+00:00" + "time": "2024-03-02T07:15:17+00:00" }, { "name": "sebastian/environment", - "version": "6.0.1", + "version": "6.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951" + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/43c751b41d74f96cbbd4e07b7aec9675651e2951", - "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", "shasum": "" }, "require": { @@ -9450,7 +9631,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "6.1-dev" } }, "autoload": { @@ -9478,7 +9659,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/6.0.1" + "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" }, "funding": [ { @@ -9486,20 +9667,20 @@ "type": "github" } ], - "time": "2023-04-11T05:39:26+00:00" + "time": "2024-03-23T08:47:14+00:00" }, { "name": "sebastian/exporter", - "version": "5.1.1", + "version": "5.1.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc" + "reference": "955288482d97c19a372d3f31006ab3f37da47adf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64f51654862e0f5e318db7e9dcc2292c63cdbddc", - "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf", "shasum": "" }, "require": { @@ -9556,7 +9737,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.1" + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" }, "funding": [ { @@ -9564,20 +9745,20 @@ "type": "github" } ], - "time": "2023-09-24T13:22:09+00:00" + "time": "2024-03-02T07:17:12+00:00" }, { "name": "sebastian/global-state", - "version": "6.0.1", + "version": "6.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4" + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/7ea9ead78f6d380d2a667864c132c2f7b83055e4", - "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", "shasum": "" }, "require": { @@ -9611,14 +9792,14 @@ } ], "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", "keywords": [ "global state" ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.1" + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" }, "funding": [ { @@ -9626,7 +9807,7 @@ "type": "github" } ], - "time": "2023-07-19T07:19:23+00:00" + "time": "2024-03-02T07:19:19+00:00" }, { "name": "sebastian/lines-of-code", @@ -9972,16 +10153,16 @@ }, { "name": "spatie/backtrace", - "version": "1.5.3", + "version": "1.6.1", "source": { "type": "git", "url": "https://github.com/spatie/backtrace.git", - "reference": "483f76a82964a0431aa836b6ed0edde0c248e3ab" + "reference": "8373b9d51638292e3bfd736a9c19a654111b4a23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/backtrace/zipball/483f76a82964a0431aa836b6ed0edde0c248e3ab", - "reference": "483f76a82964a0431aa836b6ed0edde0c248e3ab", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/8373b9d51638292e3bfd736a9c19a654111b4a23", + "reference": "8373b9d51638292e3bfd736a9c19a654111b4a23", "shasum": "" }, "require": { @@ -9989,6 +10170,7 @@ }, "require-dev": { "ext-json": "*", + "laravel/serializable-closure": "^1.3", "phpunit/phpunit": "^9.3", "spatie/phpunit-snapshot-assertions": "^4.2", "symfony/var-dumper": "^5.1" @@ -10018,7 +10200,7 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/backtrace/tree/1.5.3" + "source": "https://github.com/spatie/backtrace/tree/1.6.1" }, "funding": [ { @@ -10030,7 +10212,7 @@ "type": "other" } ], - "time": "2023-06-28T12:59:17+00:00" + "time": "2024-04-24T13:22:11+00:00" }, { "name": "spatie/flare-client-php", @@ -10103,16 +10285,16 @@ }, { "name": "spatie/ignition", - "version": "1.12.0", + "version": "1.14.0", "source": { "type": "git", "url": "https://github.com/spatie/ignition.git", - "reference": "5b6f801c605a593106b623e45ca41496a6e7d56d" + "reference": "80385994caed328f6f9c9952926932e65b9b774c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/ignition/zipball/5b6f801c605a593106b623e45ca41496a6e7d56d", - "reference": "5b6f801c605a593106b623e45ca41496a6e7d56d", + "url": "https://api.github.com/repos/spatie/ignition/zipball/80385994caed328f6f9c9952926932e65b9b774c", + "reference": "80385994caed328f6f9c9952926932e65b9b774c", "shasum": "" }, "require": { @@ -10182,20 +10364,20 @@ "type": "github" } ], - "time": "2024-01-03T15:49:39+00:00" + "time": "2024-04-26T08:45:51+00:00" }, { "name": "spatie/laravel-ignition", - "version": "2.4.1", + "version": "2.5.2", "source": { "type": "git", "url": "https://github.com/spatie/laravel-ignition.git", - "reference": "005e1e7b1232f3b22d7e7be3f602693efc7dba67" + "reference": "c93fcadcc4629775c839ac9a90916f07a660266f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/005e1e7b1232f3b22d7e7be3f602693efc7dba67", - "reference": "005e1e7b1232f3b22d7e7be3f602693efc7dba67", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/c93fcadcc4629775c839ac9a90916f07a660266f", + "reference": "c93fcadcc4629775c839ac9a90916f07a660266f", "shasum": "" }, "require": { @@ -10205,7 +10387,7 @@ "illuminate/support": "^10.0|^11.0", "php": "^8.1", "spatie/flare-client-php": "^1.3.5", - "spatie/ignition": "^1.9", + "spatie/ignition": "^1.13.2", "symfony/console": "^6.2.3|^7.0", "symfony/var-dumper": "^6.2.3|^7.0" }, @@ -10274,20 +10456,20 @@ "type": "github" } ], - "time": "2024-01-12T13:14:58+00:00" + "time": "2024-04-16T08:57:16+00:00" }, { "name": "symfony/filesystem", - "version": "v7.0.3", + "version": "v7.0.6", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "2890e3a825bc0c0558526c04499c13f83e1b6b12" + "reference": "408105dff4c104454100730bdfd1a9cdd993f04d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/2890e3a825bc0c0558526c04499c13f83e1b6b12", - "reference": "2890e3a825bc0c0558526c04499c13f83e1b6b12", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/408105dff4c104454100730bdfd1a9cdd993f04d", + "reference": "408105dff4c104454100730bdfd1a9cdd993f04d", "shasum": "" }, "require": { @@ -10321,7 +10503,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.0.3" + "source": "https://github.com/symfony/filesystem/tree/v7.0.6" }, "funding": [ { @@ -10337,20 +10519,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T15:02:46+00:00" + "time": "2024-03-21T19:37:36+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" + "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", - "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d", + "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d", "shasum": "" }, "require": { @@ -10358,9 +10540,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -10400,7 +10579,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.0" }, "funding": [ { @@ -10416,7 +10595,7 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/stopwatch", @@ -10482,16 +10661,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.2.2", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", "shasum": "" }, "require": { @@ -10520,7 +10699,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.2" + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" }, "funding": [ { @@ -10528,7 +10707,7 @@ "type": "github" } ], - "time": "2023-11-20T00:12:19+00:00" + "time": "2024-03-03T12:36:25+00:00" } ], "aliases": [], @@ -10539,6 +10718,7 @@ "platform": { "php": "^8.2", "ext-dom": "*", + "ext-gd": "*", "ext-pdo": "*" }, "platform-dev": [], diff --git a/environment/dev/app/Dockerfile b/environment/dev/app/Dockerfile index 68ad7d7d..822783ea 100644 --- a/environment/dev/app/Dockerfile +++ b/environment/dev/app/Dockerfile @@ -52,6 +52,18 @@ RUN apt-get update \ && docker-php-ext-enable \ redis +# Add GD extension +RUN apt-get install -y \ + libfreetype6-dev \ + libjpeg62-turbo-dev \ + libpng-dev \ + libwebp-dev \ + && docker-php-ext-configure gd \ + --with-freetype \ + --with-jpeg \ + --with-webp \ + && docker-php-ext-install gd + ARG XDEBUG_VERSION=3.3.1 ARG INSTALL_XDEBUG=true diff --git a/lang/pl.json b/lang/pl.json index 441680cb..7c5acd1b 100644 --- a/lang/pl.json +++ b/lang/pl.json @@ -171,5 +171,6 @@ "Please, rate that city": "Oceń miasto", "You can also login by:": "Możesz również zalogować się przez:", - "Results found": "Znaleziono wyników" + "Results found": "Znaleziono wyników", + "Provider does not exist.": "Dostawca nie istnieje." } diff --git a/tests/Feature/Api/CountryControllerTest.php b/tests/Feature/Api/CountryControllerTest.php index 5d303e0f..409a9daf 100644 --- a/tests/Feature/Api/CountryControllerTest.php +++ b/tests/Feature/Api/CountryControllerTest.php @@ -213,4 +213,12 @@ public function testCountryCanBeDeleted(): void $this->assertDatabaseMissing("countries", $country->toArray()); } + + public function testUnauthorizedUserCannotAccessCountries(): void + { + Sanctum::actingAs(User::factory()->create()); + $response = $this->getJson("/api/admin/countries"); + + $response->assertStatus(Response::HTTP_NOT_FOUND); + } } diff --git a/tests/Feature/Api/FavoritesControllerTest.php b/tests/Feature/Api/FavoritesControllerTest.php index 46d6b375..97d870ad 100644 --- a/tests/Feature/Api/FavoritesControllerTest.php +++ b/tests/Feature/Api/FavoritesControllerTest.php @@ -54,7 +54,7 @@ public function testUnauthenticatedUserCannotAddCityToFavourites(): void $response->assertStatus(Response::HTTP_NOT_FOUND); } - public function testNonexistentCityCannotBeAddedToFavourites(): void + public function testNonExistentCityCannotBeAddedToFavourites(): void { $user = User::factory()->create(); Sanctum::actingAs($user); diff --git a/tests/Feature/Api/LoginTest.php b/tests/Feature/Api/LoginTest.php index 0d009fe7..eb6de21d 100644 --- a/tests/Feature/Api/LoginTest.php +++ b/tests/Feature/Api/LoginTest.php @@ -40,7 +40,7 @@ public function testAuthenticatedUserCanLogout(): void ]); } - public function testUserCannotLogInWithInvalidCredentials(): void + public function testUserCannotLogInWithInvalidPassword(): void { User::query()->create([ "name" => "Test", @@ -62,4 +62,20 @@ public function testUserCannotLogInWithInvalidCredentials(): void $response->assertStatus(Response::HTTP_UNAUTHORIZED) ->assertJson(["message" => "Invalid credentials."]); } + + public function testUserCannotLogInWithInvalidEmail(): void + { + User::query()->create([ + "name" => "Test", + "email" => "email@example.com", + "password" => Hash::make("123456789"), + ]); + $response = $this->postJson("/api/login", [ + "email" => "invalid@example.com", + "password" => "123456789", + ]); + + $response->assertStatus(Response::HTTP_UNAUTHORIZED) + ->assertJson(["message" => "Invalid credentials."]); + } } diff --git a/tests/Feature/Api/ProviderControllerTest.php b/tests/Feature/Api/ProviderControllerTest.php new file mode 100644 index 00000000..a76a411f --- /dev/null +++ b/tests/Feature/Api/ProviderControllerTest.php @@ -0,0 +1,90 @@ +create(); + Sanctum::actingAs($adminUser, ["HasAdminRole"]); + } + + public function testProvidersArrayIsReturned(): void + { + $response = $this->getJson("/api/admin/providers"); + + $response->assertOk() + ->assertJsonStructure([ + "providers" => ["*" => []], + ]); + } + + public function testProviderCanBeCreated(): void + { + Storage::fake("public"); + $logo = Image::canvas(150, 100, "#000"); + $base64Logo = (string)$logo->encode("data-url"); + $provider = [ + "name" => "Provider", + "url" => "https://example.com", + "color" => "#000000", + "file" => $base64Logo, + ]; + + $response = $this->postJson("/api/admin/providers", $provider); + + $response->assertCreated(); + unset($provider["file"]); + $this->assertDatabaseHas("providers", $provider); + } + + public function testProviderCanBeUpdated(): void + { + Storage::fake("public"); + $logo = Image::canvas(150, 100, "#000"); + $base64Logo = (string)$logo->encode("data-url"); + $provider = [ + "name" => "Provider", + "url" => "https://example.com", + "color" => "#000000", + "file" => $base64Logo, + ]; + + $this->postJson("/api/admin/providers", $provider); + + unset($provider["file"]); + $this->assertDatabaseHas("providers", $provider); + + $updatedProvider = [ + "name" => "Provider", + "color" => "#FFFFFF", + "url" => "https://example.com", + "file" => $base64Logo, + ]; + + $providerName = $provider["name"]; + $response = $this->putJson("/api/admin/providers/$providerName", $updatedProvider); + $response->assertOk(); + + unset($updatedProvider["file"]); + $this->assertDatabaseHas("providers", $updatedProvider); + } + + public function testUnauthorisedUserCannotAccessProviders(): void + { + Sanctum::actingAs(User::factory()->create()); + $response = $this->getJson("/api/admin/providers"); + $response->assertNotFound(); + } +} diff --git a/tests/Feature/Api/SocialMediaLoginTest.php b/tests/Feature/Api/SocialMediaLoginTest.php index d8b8c7b9..d94d8f10 100644 --- a/tests/Feature/Api/SocialMediaLoginTest.php +++ b/tests/Feature/Api/SocialMediaLoginTest.php @@ -32,6 +32,7 @@ public function testUserIsLoggedIn(): void $response->assertOk() ->assertJsonStructure([ "access_token", + "userId", ]); } } From 0068712135270b59bf4459586c1bfc3aa74baf34 Mon Sep 17 00:00:00 2001 From: JakubKermes Date: Fri, 26 Apr 2024 20:44:57 +0200 Subject: [PATCH 07/11] Update config/app.php --- config/app.php | 1 + 1 file changed, 1 insertion(+) diff --git a/config/app.php b/config/app.php index a5ea6c8f..918124a3 100644 --- a/config/app.php +++ b/config/app.php @@ -41,6 +41,7 @@ App\Providers\AppServiceProvider::class, App\Providers\EventServiceProvider::class, App\Providers\RouteServiceProvider::class, + Intervention\Image\ImageServiceProvider::class, ])->toArray(), "aliases" => Facade::defaultAliases()->merge([ From 1b94842b83b64efa02e14f90c5d7995e869f50eb Mon Sep 17 00:00:00 2001 From: JakubKermes Date: Fri, 26 Apr 2024 20:47:19 +0200 Subject: [PATCH 08/11] separate tests in CityAlternativeNameController.php --- tests/Feature/Api/CityAlternativeNameController.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/Feature/Api/CityAlternativeNameController.php b/tests/Feature/Api/CityAlternativeNameController.php index 314ba310..e35ef7ef 100644 --- a/tests/Feature/Api/CityAlternativeNameController.php +++ b/tests/Feature/Api/CityAlternativeNameController.php @@ -52,7 +52,7 @@ public function testCityAlternativeNamesDuplicatesAreNotCreated(): void ->assertJsonValidationErrors(["name"]); } - public function testNonAdminUserCannotAddOrDeleteAlternativeNames(): void + public function testNonAdminUserCannotAddAlternativeNames(): void { Sanctum::actingAs(User::factory()->create()); @@ -62,6 +62,11 @@ public function testNonAdminUserCannotAddOrDeleteAlternativeNames(): void ]); $response->assertStatus(Response::HTTP_FORBIDDEN); + } + + public function testNonAdminUserCannotDeleteAlternativeNames() + { + Sanctum::actingAs(User::factory()->create()); $cityAlternativeName = CityAlternativeName::factory()->create(); $response = $this->deleteJson(route("city-alternative-names.destroy", $cityAlternativeName->id)); From db66a418afbe2eac5cedadb3c11ce562c32715a5 Mon Sep 17 00:00:00 2001 From: JakubKermes Date: Fri, 26 Apr 2024 20:47:35 +0200 Subject: [PATCH 09/11] csf --- app/Http/Controllers/Api/Admin/ProviderController.php | 1 + tests/Feature/Api/CityAlternativeNameController.php | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Api/Admin/ProviderController.php b/app/Http/Controllers/Api/Admin/ProviderController.php index f593edfb..5b3d35a7 100644 --- a/app/Http/Controllers/Api/Admin/ProviderController.php +++ b/app/Http/Controllers/Api/Admin/ProviderController.php @@ -18,6 +18,7 @@ class ProviderController extends Controller public function index(): JsonResponse { $providers = Provider::all(); + return response()->json([ "providers" => ProviderResource::collection($providers), ]); diff --git a/tests/Feature/Api/CityAlternativeNameController.php b/tests/Feature/Api/CityAlternativeNameController.php index e35ef7ef..ab07bfba 100644 --- a/tests/Feature/Api/CityAlternativeNameController.php +++ b/tests/Feature/Api/CityAlternativeNameController.php @@ -61,10 +61,9 @@ public function testNonAdminUserCannotAddAlternativeNames(): void "name" => "Test City Alternative Name", ]); $response->assertStatus(Response::HTTP_FORBIDDEN); - } - public function testNonAdminUserCannotDeleteAlternativeNames() + public function testNonAdminUserCannotDeleteAlternativeNames(): void { Sanctum::actingAs(User::factory()->create()); $cityAlternativeName = CityAlternativeName::factory()->create(); From 1d39d36168b3a12cf9839f750ce0f1d7ba8623a1 Mon Sep 17 00:00:00 2001 From: JakubKermes Date: Sat, 4 May 2024 10:58:00 +0200 Subject: [PATCH 10/11] Fix composer.lock --- composer.lock | 606 +++++++++++++++++++++----------------------------- 1 file changed, 249 insertions(+), 357 deletions(-) diff --git a/composer.lock b/composer.lock index 86f71d6e..28c5e7f0 100644 --- a/composer.lock +++ b/composer.lock @@ -5,29 +5,28 @@ "This file is @generated automatically" ], "content-hash": "b855f256a634ad0b33f1370b2d34f81d", - "packages": [ { "name": "brick/math", - "version": "0.11.0", + "version": "0.12.1", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478" + "reference": "f510c0a40911935b77b86859eb5223d58d660df1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/0ad82ce168c82ba30d1c01ec86116ab52f589478", - "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478", + "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1", "shasum": "" }, "require": { - "php": "^8.0" + "php": "^8.1" }, "require-dev": { "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^9.0", - "vimeo/psalm": "5.0.0" + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "5.16.0" }, "type": "library", "autoload": { @@ -47,12 +46,17 @@ "arithmetic", "bigdecimal", "bignum", + "bignumber", "brick", - "math" + "decimal", + "integer", + "math", + "mathematics", + "rational" ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.11.0" + "source": "https://github.com/brick/math/tree/0.12.1" }, "funding": [ { @@ -60,7 +64,7 @@ "type": "github" } ], - "time": "2023-01-15T23:15:59+00:00" + "time": "2023-11-29T23:19:16+00:00" }, { "name": "carbonphp/carbon-doctrine-types", @@ -1235,27 +1239,27 @@ }, { "name": "inertiajs/inertia-laravel", - "version": "v1.0.0", + "version": "v0.6.11", "source": { "type": "git", "url": "https://github.com/inertiajs/inertia-laravel.git", - "reference": "fcf3d6db1a259a55d8d18cf43fc971202c1f6b0d" + "reference": "2a1e19048f95c0e4adb2b2733f9119e49c4fc09f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/fcf3d6db1a259a55d8d18cf43fc971202c1f6b0d", - "reference": "fcf3d6db1a259a55d8d18cf43fc971202c1f6b0d", + "url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/2a1e19048f95c0e4adb2b2733f9119e49c4fc09f", + "reference": "2a1e19048f95c0e4adb2b2733f9119e49c4fc09f", "shasum": "" }, "require": { "ext-json": "*", - "laravel/framework": "^8.74|^9.0|^10.0|^11.0", - "php": "^7.3|~8.0.0|~8.1.0|~8.2.0|~8.3.0" + "laravel/framework": "^6.0|^7.0|^8.74|^9.0|^10.0", + "php": "^7.2|~8.0.0|~8.1.0|~8.2.0|~8.3.0" }, "require-dev": { "mockery/mockery": "^1.3.3", - "orchestra/testbench": "^6.4|^7.0|^8.0|^9.0", - "phpunit/phpunit": "^8.0|^9.5.8|^10.4", + "orchestra/testbench": "^4.0|^5.0|^6.4|^7.0|^8.0", + "phpunit/phpunit": "^8.0|^9.5.8", "roave/security-advisories": "dev-master" }, "suggest": { @@ -1267,9 +1271,6 @@ "providers": [ "Inertia\\ServiceProvider" ] - }, - "branch-alias": { - "dev-master": "1.x-dev" } }, "autoload": { @@ -1298,7 +1299,7 @@ ], "support": { "issues": "https://github.com/inertiajs/inertia-laravel/issues", - "source": "https://github.com/inertiajs/inertia-laravel/tree/v1.0.0" + "source": "https://github.com/inertiajs/inertia-laravel/tree/v0.6.11" }, "funding": [ { @@ -1306,7 +1307,7 @@ "type": "github" } ], - "time": "2024-03-09T00:30:58+00:00" + "time": "2023-10-27T10:59:02+00:00" }, { "name": "intervention/image", @@ -1453,17 +1454,16 @@ }, { "name": "laravel/framework", - - "version": "v10.48.8", + "version": "v10.48.10", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "8e9ab6da362f268170fe815127aed5ec7d303697" + "reference": "91e2b9e218afa4e5c377510faa11957042831ba3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/8e9ab6da362f268170fe815127aed5ec7d303697", - "reference": "8e9ab6da362f268170fe815127aed5ec7d303697", + "url": "https://api.github.com/repos/laravel/framework/zipball/91e2b9e218afa4e5c377510faa11957042831ba3", + "reference": "91e2b9e218afa4e5c377510faa11957042831ba3", "shasum": "" }, "require": { @@ -1657,21 +1657,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - - "time": "2024-04-16T14:26:04+00:00" + "time": "2024-04-30T12:52:59+00:00" }, { "name": "laravel/prompts", - "version": "v0.1.19", + "version": "v0.1.21", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "0ab75ac3434d9f610c5691758a6146a3d1940c18" + "reference": "23ea808e8a145653e0ab29e30d4385e49f40a920" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/0ab75ac3434d9f610c5691758a6146a3d1940c18", - "reference": "0ab75ac3434d9f610c5691758a6146a3d1940c18", + "url": "https://api.github.com/repos/laravel/prompts/zipball/23ea808e8a145653e0ab29e30d4385e49f40a920", + "reference": "23ea808e8a145653e0ab29e30d4385e49f40a920", "shasum": "" }, "require": { @@ -1711,12 +1710,12 @@ "license": [ "MIT" ], + "description": "Add beautiful and user-friendly forms to your command-line applications.", "support": { "issues": "https://github.com/laravel/prompts/issues", - - "source": "https://github.com/laravel/prompts/tree/v0.1.19" + "source": "https://github.com/laravel/prompts/tree/v0.1.21" }, - "time": "2024-04-16T14:20:35+00:00" + "time": "2024-04-30T12:46:16+00:00" }, { "name": "laravel/sanctum", @@ -1846,17 +1845,16 @@ }, { "name": "laravel/socialite", - - "version": "v5.13.0", + "version": "v5.13.2", "source": { "type": "git", "url": "https://github.com/laravel/socialite.git", - "reference": "a03e9b2f63d8125f61952fe4f5b75d70fd7c8286" + "reference": "278d4615f68205722b3a129135774b3764b28a90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/a03e9b2f63d8125f61952fe4f5b75d70fd7c8286", - "reference": "a03e9b2f63d8125f61952fe4f5b75d70fd7c8286", + "url": "https://api.github.com/repos/laravel/socialite/zipball/278d4615f68205722b3a129135774b3764b28a90", + "reference": "278d4615f68205722b3a129135774b3764b28a90", "shasum": "" }, "require": { @@ -1915,8 +1913,7 @@ "issues": "https://github.com/laravel/socialite/issues", "source": "https://github.com/laravel/socialite" }, - - "time": "2024-04-15T18:09:46+00:00" + "time": "2024-04-26T13:48:16+00:00" }, { "name": "laravel/tinker", @@ -3674,7 +3671,6 @@ { "name": "phpseclib/phpseclib", "version": "3.0.37", - "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", @@ -3782,103 +3778,6 @@ ], "time": "2024-03-03T02:14:58+00:00" }, - { - "name": "phpstan/phpdoc-parser", - "version": "1.28.0", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "cd06d6b1a1b3c75b0b83f97577869fd85a3cd4fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/cd06d6b1a1b3c75b0b83f97577869fd85a3cd4fb", - "reference": "cd06d6b1a1b3c75b0b83f97577869fd85a3cd4fb", - "shasum": "" - }, - "require": { - "paragonie/constant_time_encoding": "^1|^2", - "paragonie/random_compat": "^1.4|^2.0|^9.99.99", - "php": ">=5.6.1" - }, - "require-dev": { - "phpunit/phpunit": "*" - }, - "suggest": { - "ext-dom": "Install the DOM extension to load XML formatted public keys.", - "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", - "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", - "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", - "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." - }, - "type": "library", - "autoload": { - "files": [ - "phpseclib/bootstrap.php" - ], - "psr-4": { - "phpseclib3\\": "phpseclib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jim Wigginton", - "email": "terrafrost@php.net", - "role": "Lead Developer" - }, - { - "name": "Patrick Monnerat", - "email": "pm@datasphere.ch", - "role": "Developer" - }, - { - "name": "Andreas Fischer", - "email": "bantu@phpbb.com", - "role": "Developer" - }, - { - "name": "Hans-Jürgen Petrich", - "email": "petrich@tronic-media.com", - "role": "Developer" - }, - { - "name": "Graham Campbell", - "email": "graham@alt-three.com", - "role": "Developer" - } - ], - "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", - "homepage": "http://phpseclib.sourceforge.net", - "keywords": [ - "BigInteger", - "aes", - "asn.1", - "asn1", - "blowfish", - "crypto", - "cryptography", - "encryption", - "rsa", - "security", - "sftp", - "signature", - "signing", - "ssh", - "twofish", - "x.509", - "x509" - ], - "support": { - - "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.28.0" - }, - "time": "2024-04-03T18:51:33+00:00" - }, { "name": "psr/clock", "version": "1.0.0", @@ -4505,20 +4404,20 @@ }, { "name": "ramsey/uuid", - "version": "4.7.5", + "version": "4.7.6", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e" + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", - "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11", + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", "ext-json": "*", "php": "^8.0", "ramsey/collection": "^1.2 || ^2.0" @@ -4581,7 +4480,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.5" + "source": "https://github.com/ramsey/uuid/tree/4.7.6" }, "funding": [ { @@ -4593,7 +4492,7 @@ "type": "tidelift" } ], - "time": "2023-11-08T05:53:05+00:00" + "time": "2024-04-27T21:32:50+00:00" }, { "name": "sentry/sdk", @@ -4846,17 +4745,16 @@ }, { "name": "spatie/laravel-permission", - - "version": "6.4.0", + "version": "6.7.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-permission.git", - "reference": "05cce017fe3ac78f60a3fce78c07fe6e8e6e6e52" + "reference": "17607924aa0aa89bc0153c2ce45ed7c55083367b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/05cce017fe3ac78f60a3fce78c07fe6e8e6e6e52", - "reference": "05cce017fe3ac78f60a3fce78c07fe6e8e6e6e52", + "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/17607924aa0aa89bc0153c2ce45ed7c55083367b", + "reference": "17607924aa0aa89bc0153c2ce45ed7c55083367b", "shasum": "" }, "require": { @@ -4917,8 +4815,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-permission/issues", - - "source": "https://github.com/spatie/laravel-permission/tree/6.4.0" + "source": "https://github.com/spatie/laravel-permission/tree/6.7.0" }, "funding": [ { @@ -4926,8 +4823,7 @@ "type": "github" } ], - - "time": "2024-02-28T08:11:20+00:00" + "time": "2024-04-19T12:35:28+00:00" }, { "name": "stichoza/google-translate-php", @@ -5011,16 +4907,16 @@ }, { "name": "symfony/console", - "version": "v6.4.6", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "a2708a5da5c87d1d0d52937bdeac625df659e11f" + "reference": "a170e64ae10d00ba89e2acbb590dc2e54da8ad8f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/a2708a5da5c87d1d0d52937bdeac625df659e11f", - "reference": "a2708a5da5c87d1d0d52937bdeac625df659e11f", + "url": "https://api.github.com/repos/symfony/console/zipball/a170e64ae10d00ba89e2acbb590dc2e54da8ad8f", + "reference": "a170e64ae10d00ba89e2acbb590dc2e54da8ad8f", "shasum": "" }, "require": { @@ -5085,7 +4981,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.6" + "source": "https://github.com/symfony/console/tree/v6.4.7" }, "funding": [ { @@ -5101,20 +4997,20 @@ "type": "tidelift" } ], - "time": "2024-03-29T19:07:53+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "symfony/css-selector", - "version": "v7.0.3", + "version": "v7.0.7", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "ec60a4edf94e63b0556b6a0888548bb400a3a3be" + "reference": "b08a4ad89e84b29cec285b7b1f781a7ae51cf4bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/ec60a4edf94e63b0556b6a0888548bb400a3a3be", - "reference": "ec60a4edf94e63b0556b6a0888548bb400a3a3be", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/b08a4ad89e84b29cec285b7b1f781a7ae51cf4bc", + "reference": "b08a4ad89e84b29cec285b7b1f781a7ae51cf4bc", "shasum": "" }, "require": { @@ -5150,7 +5046,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.0.3" + "source": "https://github.com/symfony/css-selector/tree/v7.0.7" }, "funding": [ { @@ -5166,20 +5062,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T15:02:46+00:00" + "time": "2024-04-18T09:29:19+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.4.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", "shasum": "" }, "require": { @@ -5188,7 +5084,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -5217,7 +5113,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" }, "funding": [ { @@ -5233,20 +5129,20 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/dom-crawler", - "version": "v6.4.4", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "f0e7ec3fa17000e2d0cb4557b4b47c88a6a63531" + "reference": "2088c5da700b1e7a8689fffc10dda6c1f643deea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/f0e7ec3fa17000e2d0cb4557b4b47c88a6a63531", - "reference": "f0e7ec3fa17000e2d0cb4557b4b47c88a6a63531", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/2088c5da700b1e7a8689fffc10dda6c1f643deea", + "reference": "2088c5da700b1e7a8689fffc10dda6c1f643deea", "shasum": "" }, "require": { @@ -5284,7 +5180,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v6.4.4" + "source": "https://github.com/symfony/dom-crawler/tree/v6.4.7" }, "funding": [ { @@ -5300,20 +5196,20 @@ "type": "tidelift" } ], - "time": "2024-02-07T09:17:57+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "symfony/error-handler", - "version": "v6.4.6", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "64db1c1802e3a4557e37ba33031ac39f452ac5d4" + "reference": "667a072466c6a53827ed7b119af93806b884cbb3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/64db1c1802e3a4557e37ba33031ac39f452ac5d4", - "reference": "64db1c1802e3a4557e37ba33031ac39f452ac5d4", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/667a072466c6a53827ed7b119af93806b884cbb3", + "reference": "667a072466c6a53827ed7b119af93806b884cbb3", "shasum": "" }, "require": { @@ -5359,7 +5255,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.6" + "source": "https://github.com/symfony/error-handler/tree/v6.4.7" }, "funding": [ { @@ -5375,20 +5271,20 @@ "type": "tidelift" } ], - "time": "2024-03-19T11:56:30+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.0.3", + "version": "v7.0.7", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "834c28d533dd0636f910909d01b9ff45cc094b5e" + "reference": "db2a7fab994d67d92356bb39c367db115d9d30f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/834c28d533dd0636f910909d01b9ff45cc094b5e", - "reference": "834c28d533dd0636f910909d01b9ff45cc094b5e", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/db2a7fab994d67d92356bb39c367db115d9d30f9", + "reference": "db2a7fab994d67d92356bb39c367db115d9d30f9", "shasum": "" }, "require": { @@ -5439,7 +5335,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.0.3" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.0.7" }, "funding": [ { @@ -5455,20 +5351,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T15:02:46+00:00" + "time": "2024-04-18T09:29:19+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.4.2", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "4e64b49bf370ade88e567de29465762e316e4224" + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/4e64b49bf370ade88e567de29465762e316e4224", - "reference": "4e64b49bf370ade88e567de29465762e316e4224", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", "shasum": "" }, "require": { @@ -5478,7 +5374,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -5515,7 +5411,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.2" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" }, "funding": [ { @@ -5531,20 +5427,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/finder", - "version": "v6.4.0", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "11d736e97f116ac375a81f96e662911a34cd50ce" + "reference": "511c48990be17358c23bf45c5d71ab85d40fb764" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/11d736e97f116ac375a81f96e662911a34cd50ce", - "reference": "11d736e97f116ac375a81f96e662911a34cd50ce", + "url": "https://api.github.com/repos/symfony/finder/zipball/511c48990be17358c23bf45c5d71ab85d40fb764", + "reference": "511c48990be17358c23bf45c5d71ab85d40fb764", "shasum": "" }, "require": { @@ -5579,7 +5475,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.0" + "source": "https://github.com/symfony/finder/tree/v6.4.7" }, "funding": [ { @@ -5595,20 +5491,20 @@ "type": "tidelift" } ], - "time": "2023-10-31T17:30:12+00:00" + "time": "2024-04-23T10:36:43+00:00" }, { "name": "symfony/http-client", - "version": "v7.0.6", + "version": "v7.0.7", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "6e70473909f46fe5dd3b994a0f1b20ecb6b2f858" + "reference": "6ce3c4c899051b3d7326ea1a1dda3729e29ae6d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/6e70473909f46fe5dd3b994a0f1b20ecb6b2f858", - "reference": "6e70473909f46fe5dd3b994a0f1b20ecb6b2f858", + "url": "https://api.github.com/repos/symfony/http-client/zipball/6ce3c4c899051b3d7326ea1a1dda3729e29ae6d7", + "reference": "6ce3c4c899051b3d7326ea1a1dda3729e29ae6d7", "shasum": "" }, "require": { @@ -5671,7 +5567,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v7.0.6" + "source": "https://github.com/symfony/http-client/tree/v7.0.7" }, "funding": [ { @@ -5687,20 +5583,20 @@ "type": "tidelift" } ], - "time": "2024-04-01T20:49:44+00:00" + "time": "2024-04-18T09:29:19+00:00" }, { "name": "symfony/http-client-contracts", - "version": "v3.4.2", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "b6b5c876b3a4ed74460e2c5ac53bbce2f12e2a7e" + "reference": "20414d96f391677bf80078aa55baece78b82647d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/b6b5c876b3a4ed74460e2c5ac53bbce2f12e2a7e", - "reference": "b6b5c876b3a4ed74460e2c5ac53bbce2f12e2a7e", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/20414d96f391677bf80078aa55baece78b82647d", + "reference": "20414d96f391677bf80078aa55baece78b82647d", "shasum": "" }, "require": { @@ -5709,7 +5605,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -5749,7 +5645,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.4.2" + "source": "https://github.com/symfony/http-client-contracts/tree/v3.5.0" }, "funding": [ { @@ -5765,20 +5661,20 @@ "type": "tidelift" } ], - "time": "2024-04-01T18:51:09+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.4.4", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "ebc713bc6e6f4b53f46539fc158be85dfcd77304" + "reference": "b4db6b833035477cb70e18d0ae33cb7c2b521759" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ebc713bc6e6f4b53f46539fc158be85dfcd77304", - "reference": "ebc713bc6e6f4b53f46539fc158be85dfcd77304", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/b4db6b833035477cb70e18d0ae33cb7c2b521759", + "reference": "b4db6b833035477cb70e18d0ae33cb7c2b521759", "shasum": "" }, "require": { @@ -5826,7 +5722,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.4" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.7" }, "funding": [ { @@ -5842,20 +5738,20 @@ "type": "tidelift" } ], - "time": "2024-02-08T15:01:18+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.6", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "060038863743fd0cd982be06acecccf246d35653" + "reference": "b7b5e6cdef670a0c82d015a966ffc7e855861a98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/060038863743fd0cd982be06acecccf246d35653", - "reference": "060038863743fd0cd982be06acecccf246d35653", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b7b5e6cdef670a0c82d015a966ffc7e855861a98", + "reference": "b7b5e6cdef670a0c82d015a966ffc7e855861a98", "shasum": "" }, "require": { @@ -5910,6 +5806,7 @@ "symfony/translation-contracts": "^2.5|^3", "symfony/uid": "^5.4|^6.0|^7.0", "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.4|^7.0", "symfony/var-exporter": "^6.2|^7.0", "twig/twig": "^2.13|^3.0.4" }, @@ -5939,7 +5836,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.6" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.7" }, "funding": [ { @@ -5955,20 +5852,20 @@ "type": "tidelift" } ], - "time": "2024-04-03T06:09:15+00:00" + "time": "2024-04-29T11:24:44+00:00" }, { "name": "symfony/mailer", - "version": "v6.4.6", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "677f34a6f4b4559e08acf73ae0aec460479e5859" + "reference": "2c446d4e446995bed983c0b5bb9ff837e8de7dbd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/677f34a6f4b4559e08acf73ae0aec460479e5859", - "reference": "677f34a6f4b4559e08acf73ae0aec460479e5859", + "url": "https://api.github.com/repos/symfony/mailer/zipball/2c446d4e446995bed983c0b5bb9ff837e8de7dbd", + "reference": "2c446d4e446995bed983c0b5bb9ff837e8de7dbd", "shasum": "" }, "require": { @@ -6019,7 +5916,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.6" + "source": "https://github.com/symfony/mailer/tree/v6.4.7" }, "funding": [ { @@ -6035,20 +5932,20 @@ "type": "tidelift" } ], - "time": "2024-03-27T21:14:17+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "symfony/mime", - "version": "v6.4.6", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "14762b86918823cb42e3558cdcca62e58b5227fe" + "reference": "decadcf3865918ecfcbfa90968553994ce935a5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/14762b86918823cb42e3558cdcca62e58b5227fe", - "reference": "14762b86918823cb42e3558cdcca62e58b5227fe", + "url": "https://api.github.com/repos/symfony/mime/zipball/decadcf3865918ecfcbfa90968553994ce935a5e", + "reference": "decadcf3865918ecfcbfa90968553994ce935a5e", "shasum": "" }, "require": { @@ -6104,7 +6001,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.6" + "source": "https://github.com/symfony/mime/tree/v6.4.7" }, "funding": [ { @@ -6120,20 +6017,20 @@ "type": "tidelift" } ], - "time": "2024-03-21T19:36:20+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "symfony/options-resolver", - "version": "v7.0.0", + "version": "v7.0.7", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "700ff4096e346f54cb628ea650767c8130f1001f" + "reference": "23cc173858776ad451e31f053b1c9f47840b2cfa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/700ff4096e346f54cb628ea650767c8130f1001f", - "reference": "700ff4096e346f54cb628ea650767c8130f1001f", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/23cc173858776ad451e31f053b1c9f47840b2cfa", + "reference": "23cc173858776ad451e31f053b1c9f47840b2cfa", "shasum": "" }, "require": { @@ -6171,7 +6068,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v7.0.0" + "source": "https://github.com/symfony/options-resolver/tree/v7.0.7" }, "funding": [ { @@ -6187,7 +6084,7 @@ "type": "tidelift" } ], - "time": "2023-08-08T10:20:21+00:00" + "time": "2024-04-18T09:29:19+00:00" }, { "name": "symfony/polyfill-ctype", @@ -6902,16 +6799,16 @@ }, { "name": "symfony/process", - "version": "v6.4.4", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "710e27879e9be3395de2b98da3f52a946039f297" + "reference": "cdb1c81c145fd5aa9b0038bab694035020943381" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/710e27879e9be3395de2b98da3f52a946039f297", - "reference": "710e27879e9be3395de2b98da3f52a946039f297", + "url": "https://api.github.com/repos/symfony/process/zipball/cdb1c81c145fd5aa9b0038bab694035020943381", + "reference": "cdb1c81c145fd5aa9b0038bab694035020943381", "shasum": "" }, "require": { @@ -6943,7 +6840,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.4" + "source": "https://github.com/symfony/process/tree/v6.4.7" }, "funding": [ { @@ -6959,7 +6856,7 @@ "type": "tidelift" } ], - "time": "2024-02-20T12:31:00+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -7052,16 +6949,16 @@ }, { "name": "symfony/routing", - "version": "v6.4.6", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "f2591fd1f8c6e3734656b5d6b3829e8bf81f507c" + "reference": "276e06398f71fa2a973264d94f28150f93cfb907" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/f2591fd1f8c6e3734656b5d6b3829e8bf81f507c", - "reference": "f2591fd1f8c6e3734656b5d6b3829e8bf81f507c", + "url": "https://api.github.com/repos/symfony/routing/zipball/276e06398f71fa2a973264d94f28150f93cfb907", + "reference": "276e06398f71fa2a973264d94f28150f93cfb907", "shasum": "" }, "require": { @@ -7115,7 +7012,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.6" + "source": "https://github.com/symfony/routing/tree/v6.4.7" }, "funding": [ { @@ -7131,25 +7028,26 @@ "type": "tidelift" } ], - "time": "2024-03-28T13:28:49+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.4.2", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "11bbf19a0fb7b36345861e85c5768844c552906e" + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/11bbf19a0fb7b36345861e85c5768844c552906e", - "reference": "11bbf19a0fb7b36345861e85c5768844c552906e", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", "shasum": "" }, "require": { "php": ">=8.1", - "psr/container": "^1.1|^2.0" + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "ext-psr": "<1.1|>=2" @@ -7157,7 +7055,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -7197,7 +7095,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.4.2" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" }, "funding": [ { @@ -7213,20 +7111,20 @@ "type": "tidelift" } ], - "time": "2023-12-19T21:51:00+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/string", - "version": "v7.0.4", + "version": "v7.0.7", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "f5832521b998b0bec40bee688ad5de98d4cf111b" + "reference": "e405b5424dc2528e02e31ba26b83a79fd4eb8f63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/f5832521b998b0bec40bee688ad5de98d4cf111b", - "reference": "f5832521b998b0bec40bee688ad5de98d4cf111b", + "url": "https://api.github.com/repos/symfony/string/zipball/e405b5424dc2528e02e31ba26b83a79fd4eb8f63", + "reference": "e405b5424dc2528e02e31ba26b83a79fd4eb8f63", "shasum": "" }, "require": { @@ -7283,7 +7181,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.0.4" + "source": "https://github.com/symfony/string/tree/v7.0.7" }, "funding": [ { @@ -7299,20 +7197,20 @@ "type": "tidelift" } ], - "time": "2024-02-01T13:17:36+00:00" + "time": "2024-04-18T09:29:19+00:00" }, { "name": "symfony/translation", - "version": "v6.4.4", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "bce6a5a78e94566641b2594d17e48b0da3184a8e" + "reference": "7495687c58bfd88b7883823747b0656d90679123" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/bce6a5a78e94566641b2594d17e48b0da3184a8e", - "reference": "bce6a5a78e94566641b2594d17e48b0da3184a8e", + "url": "https://api.github.com/repos/symfony/translation/zipball/7495687c58bfd88b7883823747b0656d90679123", + "reference": "7495687c58bfd88b7883823747b0656d90679123", "shasum": "" }, "require": { @@ -7378,7 +7276,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.4" + "source": "https://github.com/symfony/translation/tree/v6.4.7" }, "funding": [ { @@ -7394,20 +7292,20 @@ "type": "tidelift" } ], - "time": "2024-02-20T13:16:58+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.4.2", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "43810bdb2ddb5400e5c5e778e27b210a0ca83b6b" + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/43810bdb2ddb5400e5c5e778e27b210a0ca83b6b", - "reference": "43810bdb2ddb5400e5c5e778e27b210a0ca83b6b", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", "shasum": "" }, "require": { @@ -7416,7 +7314,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -7456,7 +7354,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.4.2" + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" }, "funding": [ { @@ -7472,20 +7370,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/uid", - "version": "v6.4.3", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "1d31267211cc3a2fff32bcfc7c1818dac41b6fc0" + "reference": "a66efcb71d8bc3a207d9d78e0bd67f3321510355" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/1d31267211cc3a2fff32bcfc7c1818dac41b6fc0", - "reference": "1d31267211cc3a2fff32bcfc7c1818dac41b6fc0", + "url": "https://api.github.com/repos/symfony/uid/zipball/a66efcb71d8bc3a207d9d78e0bd67f3321510355", + "reference": "a66efcb71d8bc3a207d9d78e0bd67f3321510355", "shasum": "" }, "require": { @@ -7530,7 +7428,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v6.4.3" + "source": "https://github.com/symfony/uid/tree/v6.4.7" }, "funding": [ { @@ -7546,20 +7444,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.6", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "95bd2706a97fb875185b51ecaa6112ec184233d4" + "reference": "7a9cd977cd1c5fed3694bee52990866432af07d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/95bd2706a97fb875185b51ecaa6112ec184233d4", - "reference": "95bd2706a97fb875185b51ecaa6112ec184233d4", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7a9cd977cd1c5fed3694bee52990866432af07d7", + "reference": "7a9cd977cd1c5fed3694bee52990866432af07d7", "shasum": "" }, "require": { @@ -7615,7 +7513,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.6" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.7" }, "funding": [ { @@ -7631,7 +7529,7 @@ "type": "tidelift" } ], - "time": "2024-03-19T11:56:30+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -8308,17 +8206,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - - "version": "v3.53.0", + "version": "v3.54.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "69a19093a9ded8d1baac62ed6c009b8bc148d008" + "reference": "2aecbc8640d7906c38777b3dcab6f4ca79004d08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/69a19093a9ded8d1baac62ed6c009b8bc148d008", - "reference": "69a19093a9ded8d1baac62ed6c009b8bc148d008", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/2aecbc8640d7906c38777b3dcab6f4ca79004d08", + "reference": "2aecbc8640d7906c38777b3dcab6f4ca79004d08", "shasum": "" }, "require": { @@ -8390,7 +8287,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.53.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.54.0" }, "funding": [ { @@ -8398,8 +8295,7 @@ "type": "github" } ], - - "time": "2024-04-08T15:03:00+00:00" + "time": "2024-04-17T08:12:13+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -9248,17 +9144,16 @@ }, { "name": "phpunit/phpunit", - - "version": "10.5.18", + "version": "10.5.20", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "835df1709ac6c968ba34bf23f3c30e5d5a266de8" + "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/835df1709ac6c968ba34bf23f3c30e5d5a266de8", - "reference": "835df1709ac6c968ba34bf23f3c30e5d5a266de8", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/547d314dc24ec1e177720d45c6263fb226cc2ae3", + "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3", "shasum": "" }, "require": { @@ -9330,8 +9225,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.18" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.20" }, "funding": [ { @@ -9347,8 +9241,7 @@ "type": "tidelift" } ], - - "time": "2024-04-14T07:05:31+00:00" + "time": "2024-04-24T06:32:35+00:00" }, { "name": "sebastian/cli-parser", @@ -10331,16 +10224,16 @@ }, { "name": "spatie/flare-client-php", - "version": "1.4.4", + "version": "1.5.1", "source": { "type": "git", "url": "https://github.com/spatie/flare-client-php.git", - "reference": "17082e780752d346c2db12ef5d6bee8e835e399c" + "reference": "e27977d534eefe04c154c6fd8460217024054c05" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/17082e780752d346c2db12ef5d6bee8e835e399c", - "reference": "17082e780752d346c2db12ef5d6bee8e835e399c", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/e27977d534eefe04c154c6fd8460217024054c05", + "reference": "e27977d534eefe04c154c6fd8460217024054c05", "shasum": "" }, "require": { @@ -10388,7 +10281,7 @@ ], "support": { "issues": "https://github.com/spatie/flare-client-php/issues", - "source": "https://github.com/spatie/flare-client-php/tree/1.4.4" + "source": "https://github.com/spatie/flare-client-php/tree/1.5.1" }, "funding": [ { @@ -10396,21 +10289,20 @@ "type": "github" } ], - "time": "2024-01-31T14:18:45+00:00" + "time": "2024-05-03T15:43:14+00:00" }, { "name": "spatie/ignition", - - "version": "1.13.2", + "version": "1.14.1", "source": { "type": "git", "url": "https://github.com/spatie/ignition.git", - "reference": "952798e239d9969e4e694b124c2cc222798dbb28" + "reference": "c23cc018c5f423d2f413b99f84655fceb6549811" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/ignition/zipball/952798e239d9969e4e694b124c2cc222798dbb28", - "reference": "952798e239d9969e4e694b124c2cc222798dbb28", + "url": "https://api.github.com/repos/spatie/ignition/zipball/c23cc018c5f423d2f413b99f84655fceb6549811", + "reference": "c23cc018c5f423d2f413b99f84655fceb6549811", "shasum": "" }, "require": { @@ -10480,21 +10372,20 @@ "type": "github" } ], - - "time": "2024-04-16T08:49:17+00:00" + "time": "2024-05-03T15:56:16+00:00" }, { "name": "spatie/laravel-ignition", - "version": "2.5.2", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-ignition.git", - "reference": "c93fcadcc4629775c839ac9a90916f07a660266f" + "reference": "f52124d50122611e8a40f628cef5c19ff6cc5b57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/c93fcadcc4629775c839ac9a90916f07a660266f", - "reference": "c93fcadcc4629775c839ac9a90916f07a660266f", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/f52124d50122611e8a40f628cef5c19ff6cc5b57", + "reference": "f52124d50122611e8a40f628cef5c19ff6cc5b57", "shasum": "" }, "require": { @@ -10503,8 +10394,8 @@ "ext-mbstring": "*", "illuminate/support": "^10.0|^11.0", "php": "^8.1", - "spatie/flare-client-php": "^1.3.5", - "spatie/ignition": "^1.13.2", + "spatie/flare-client-php": "^1.5", + "spatie/ignition": "^1.14", "symfony/console": "^6.2.3|^7.0", "symfony/var-dumper": "^6.2.3|^7.0" }, @@ -10512,11 +10403,11 @@ "livewire/livewire": "^2.11|^3.3.5", "mockery/mockery": "^1.5.1", "openai-php/client": "^0.8.1", - "orchestra/testbench": "^8.0|^9.0", - "pestphp/pest": "^2.30", - "phpstan/extension-installer": "^1.2", + "orchestra/testbench": "8.22.3|^9.0", + "pestphp/pest": "^2.34", + "phpstan/extension-installer": "^1.3.1", "phpstan/phpstan-deprecation-rules": "^1.1.1", - "phpstan/phpstan-phpunit": "^1.3.3", + "phpstan/phpstan-phpunit": "^1.3.16", "vlucas/phpdotenv": "^5.5" }, "suggest": { @@ -10573,26 +10464,27 @@ "type": "github" } ], - "time": "2024-04-16T08:57:16+00:00" + "time": "2024-05-02T13:42:49+00:00" }, { "name": "symfony/filesystem", - "version": "v7.0.6", + "version": "v7.0.7", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "408105dff4c104454100730bdfd1a9cdd993f04d" + "reference": "cc168be6fbdcdf3401f50ae863ee3818ed4338f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/408105dff4c104454100730bdfd1a9cdd993f04d", - "reference": "408105dff4c104454100730bdfd1a9cdd993f04d", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/cc168be6fbdcdf3401f50ae863ee3818ed4338f5", + "reference": "cc168be6fbdcdf3401f50ae863ee3818ed4338f5", "shasum": "" }, "require": { "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8" + "symfony/polyfill-mbstring": "~1.8", + "symfony/process": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -10620,7 +10512,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.0.6" + "source": "https://github.com/symfony/filesystem/tree/v7.0.7" }, "funding": [ { @@ -10636,7 +10528,7 @@ "type": "tidelift" } ], - "time": "2024-03-21T19:37:36+00:00" + "time": "2024-04-18T09:29:19+00:00" }, { "name": "symfony/polyfill-php81", @@ -10716,16 +10608,16 @@ }, { "name": "symfony/stopwatch", - "version": "v7.0.3", + "version": "v7.0.7", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "983900d6fddf2b0cbaacacbbad07610854bd8112" + "reference": "41a7a24aa1dc82adf46a06bc292d1923acfe6b84" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/983900d6fddf2b0cbaacacbbad07610854bd8112", - "reference": "983900d6fddf2b0cbaacacbbad07610854bd8112", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/41a7a24aa1dc82adf46a06bc292d1923acfe6b84", + "reference": "41a7a24aa1dc82adf46a06bc292d1923acfe6b84", "shasum": "" }, "require": { @@ -10758,7 +10650,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.0.3" + "source": "https://github.com/symfony/stopwatch/tree/v7.0.7" }, "funding": [ { @@ -10774,7 +10666,7 @@ "type": "tidelift" } ], - "time": "2024-01-23T15:02:46+00:00" + "time": "2024-04-18T09:29:19+00:00" }, { "name": "theseer/tokenizer", From 8a7574cf0ebaa7fdf83b1e7a0e526d0179ffcdfd Mon Sep 17 00:00:00 2001 From: JakubKermes Date: Tue, 7 May 2024 11:33:23 +0200 Subject: [PATCH 11/11] unify assertions --- tests/Feature/Api/CityControllerTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Feature/Api/CityControllerTest.php b/tests/Feature/Api/CityControllerTest.php index 1db0c22a..7939ca98 100644 --- a/tests/Feature/Api/CityControllerTest.php +++ b/tests/Feature/Api/CityControllerTest.php @@ -27,7 +27,7 @@ public function testCitiesArrayIsReturned(): void $response = $this->getJson("/api/admin/cities"); - $response->assertStatus(200)->assertJsonStructure([ + $response->assertOk()->assertJsonStructure([ "cities" => ["*" => []], "providers" => ["*" => []], "countries" => ["*" => []], @@ -164,7 +164,7 @@ public function testCityCannotBeUpdatedBecauseNameAlreadyExistInOtherCity(): voi "country_id" => 1, ]); - $response->assertStatus(422)->assertJsonValidationErrorFor("name"); + $response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY)->assertJsonValidationErrorFor("name"); } public function testCityCanBeDeleted(): void