Replace create() with forceCreate() across internal model creation operations to bypass mass assignment protection. This is appropriate for internal code that constructs complete model state without user input. Add InternalModelCreationMassAssignmentTest to ensure internal model creation behavior is properly tested. Optimize imports by using shortened Livewire attribute references and removing unused imports.
57 lines
3 KiB
PHP
57 lines
3 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Unit tests to verify that service parser correctly handles image updates
|
|
* without creating duplicate ServiceApplication or ServiceDatabase records.
|
|
*
|
|
* These tests verify the fix for the issue where changing an image in a
|
|
* docker-compose file would create a new service instead of updating the existing one.
|
|
*/
|
|
it('ensures service parser does not include image in trusted service creation query', function () {
|
|
// Read the serviceParser function from parsers.php
|
|
$parsersFile = file_get_contents(__DIR__.'/../../bootstrap/helpers/parsers.php');
|
|
|
|
// Check that trusted creation only uses name and service_id
|
|
// and does not include image in the creation payload
|
|
expect($parsersFile)
|
|
->toContain("\$databaseFound = ServiceDatabase::where('name', \$serviceName)->where('service_id', \$resource->id)->first();")
|
|
->toContain("\$applicationFound = ServiceApplication::where('name', \$serviceName)->where('service_id', \$resource->id)->first();")
|
|
->toContain("forceCreate([\n 'name' => \$serviceName,\n 'service_id' => \$resource->id,\n ]);")
|
|
->not->toContain("forceCreate([\n 'name' => \$serviceName,\n 'image' => \$image,\n 'service_id' => \$resource->id,\n ]);");
|
|
});
|
|
|
|
it('ensures service parser updates image after finding or creating service', function () {
|
|
// Read the serviceParser function from parsers.php
|
|
$parsersFile = file_get_contents(__DIR__.'/../../bootstrap/helpers/parsers.php');
|
|
|
|
// Check that image update logic exists after the trusted create/find branch
|
|
expect($parsersFile)
|
|
->toContain('// Update image if it changed')
|
|
->toContain('if ($savedService->image !== $image) {')
|
|
->toContain('$savedService->image = $image;')
|
|
->toContain('$savedService->save();');
|
|
});
|
|
|
|
it('ensures parseDockerComposeFile does not create duplicates on null savedService', function () {
|
|
// Read the parseDockerComposeFile function from shared.php
|
|
$sharedFile = file_get_contents(__DIR__.'/../../bootstrap/helpers/shared.php');
|
|
|
|
// Check that the duplicate creation logic after is_null check has been fixed
|
|
// The old code would create a duplicate if savedService was null
|
|
// The new code checks for null within the else block and creates only if needed
|
|
expect($sharedFile)
|
|
->toContain('if (is_null($savedService)) {')
|
|
->toContain('$savedService = ServiceDatabase::create([');
|
|
});
|
|
|
|
it('verifies image update logic is present in parseDockerComposeFile', function () {
|
|
// Read the parseDockerComposeFile function from shared.php
|
|
$sharedFile = file_get_contents(__DIR__.'/../../bootstrap/helpers/shared.php');
|
|
|
|
// Verify the image update logic exists
|
|
expect($sharedFile)
|
|
->toContain('// Check if image changed')
|
|
->toContain('if ($savedService->image !== $image) {')
|
|
->toContain('$savedService->image = $image;')
|
|
->toContain('$savedService->save();');
|
|
});
|