Enable `HasFactory` on `Environment`, `Project`, `ScheduledTask`, and `StandaloneDocker`, and add dedicated factories for related models to stabilize feature/unit tests. Also bump `visus/cuid2` to `^6.0` and refresh `composer.lock` with the resulting dependency updates.
113 lines
3.6 KiB
PHP
113 lines
3.6 KiB
PHP
<?php
|
|
|
|
use App\Notifications\Server\HetznerDeletionFailed;
|
|
|
|
afterEach(function () {
|
|
Mockery::close();
|
|
});
|
|
|
|
it('can be instantiated with correct properties', function () {
|
|
$notification = new HetznerDeletionFailed(
|
|
hetznerServerId: 12345,
|
|
teamId: 1,
|
|
errorMessage: 'Hetzner API error: Server not found'
|
|
);
|
|
|
|
expect($notification)->toBeInstanceOf(HetznerDeletionFailed::class)
|
|
->and($notification->hetznerServerId)->toBe(12345)
|
|
->and($notification->teamId)->toBe(1)
|
|
->and($notification->errorMessage)->toBe('Hetzner API error: Server not found');
|
|
});
|
|
|
|
it('uses hetzner_deletion_failed event for channels', function () {
|
|
$notification = new HetznerDeletionFailed(
|
|
hetznerServerId: 12345,
|
|
teamId: 1,
|
|
errorMessage: 'Test error'
|
|
);
|
|
|
|
$mockNotifiable = Mockery::mock();
|
|
$mockNotifiable->shouldReceive('getEnabledChannels')
|
|
->with('hetzner_deletion_failed')
|
|
->once()
|
|
->andReturn([]);
|
|
|
|
$channels = $notification->via($mockNotifiable);
|
|
|
|
expect($channels)->toBeArray();
|
|
});
|
|
|
|
it('generates correct mail content', function () {
|
|
$notification = new HetznerDeletionFailed(
|
|
hetznerServerId: 67890,
|
|
teamId: 1,
|
|
errorMessage: 'Connection timeout'
|
|
);
|
|
|
|
$mail = $notification->toMail();
|
|
|
|
expect($mail->subject)->toBe('Coolify: [ACTION REQUIRED] Failed to delete Hetzner server #67890')
|
|
->and($mail->view)->toBe('emails.hetzner-deletion-failed')
|
|
->and($mail->viewData['hetznerServerId'])->toBe(67890)
|
|
->and($mail->viewData['errorMessage'])->toBe('Connection timeout');
|
|
});
|
|
|
|
it('generates correct discord content', function () {
|
|
$notification = new HetznerDeletionFailed(
|
|
hetznerServerId: 11111,
|
|
teamId: 1,
|
|
errorMessage: 'API rate limit exceeded'
|
|
);
|
|
|
|
$discord = $notification->toDiscord();
|
|
|
|
expect($discord->title)->toContain('Failed to delete Hetzner server')
|
|
->and($discord->description)->toContain('#11111')
|
|
->and($discord->description)->toContain('API rate limit exceeded')
|
|
->and($discord->description)->toContain('may still exist in your Hetzner Cloud account');
|
|
});
|
|
|
|
it('generates correct telegram content', function () {
|
|
$notification = new HetznerDeletionFailed(
|
|
hetznerServerId: 22222,
|
|
teamId: 1,
|
|
errorMessage: 'Invalid token'
|
|
);
|
|
|
|
$telegram = $notification->toTelegram();
|
|
|
|
expect($telegram)->toBeArray()
|
|
->and($telegram)->toHaveKey('message')
|
|
->and($telegram['message'])->toContain('#22222')
|
|
->and($telegram['message'])->toContain('Invalid token')
|
|
->and($telegram['message'])->toContain('ACTION REQUIRED');
|
|
});
|
|
|
|
it('generates correct pushover content', function () {
|
|
$notification = new HetznerDeletionFailed(
|
|
hetznerServerId: 33333,
|
|
teamId: 1,
|
|
errorMessage: 'Network error'
|
|
);
|
|
|
|
$pushover = $notification->toPushover();
|
|
|
|
expect($pushover->title)->toBe('Hetzner Server Deletion Failed')
|
|
->and($pushover->level)->toBe('error')
|
|
->and($pushover->message)->toContain('#33333')
|
|
->and($pushover->message)->toContain('Network error');
|
|
});
|
|
|
|
it('generates correct slack content', function () {
|
|
$notification = new HetznerDeletionFailed(
|
|
hetznerServerId: 44444,
|
|
teamId: 1,
|
|
errorMessage: 'Permission denied'
|
|
);
|
|
|
|
$slack = $notification->toSlack();
|
|
|
|
expect($slack->title)->toContain('Hetzner Server Deletion Failed')
|
|
->and($slack->description)->toContain('#44444')
|
|
->and($slack->description)->toContain('Permission denied');
|
|
});
|