All checks were successful
star-cloud-deploy-demo / deploy-demo (push) Successful in 1m18s
1. 重構機台在線狀態判定機制:移除資料庫 status 欄位,改由 Model 根據心跳時間動態計算。 2. 修正儀表板 (Dashboard) 與機台管理頁面的多語系顯示問題,解決換行導致翻譯失效的 Bug。 3. 修正個人檔案頁面的麵包屑 (Breadcrumbs) 導航,補齊「個人設定」層級。 4. 更新 IoT API (B010, B600) 的認證機制與日誌處理邏輯。 5. 同步更新繁中、英文、日文語言檔,確保 UI 標籤一致性。
87 lines
2.7 KiB
PHP
87 lines
2.7 KiB
PHP
<?php
|
|
|
|
namespace Tests\Feature;
|
|
|
|
use App\Models\Machine\Machine;
|
|
use App\Models\Machine\MachineLog;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use Tests\TestCase;
|
|
|
|
class MachineStatusTest extends TestCase
|
|
{
|
|
use RefreshDatabase;
|
|
|
|
/**
|
|
* Test machine is online with recent heartbeat and no errors.
|
|
*/
|
|
public function test_machine_is_online_with_recent_heartbeat(): void
|
|
{
|
|
$machine = Machine::factory()->create([
|
|
'last_heartbeat_at' => now()->subSeconds(10),
|
|
]);
|
|
|
|
$this->assertEquals('online', $machine->calculated_status);
|
|
}
|
|
|
|
/**
|
|
* Test machine is error with recent heartbeat but recent errors.
|
|
*/
|
|
public function test_machine_is_error_with_recent_logs(): void
|
|
{
|
|
$machine = Machine::factory()->create([
|
|
'last_heartbeat_at' => now()->subSeconds(10),
|
|
]);
|
|
|
|
// Add an error log 10 mins ago
|
|
MachineLog::create([
|
|
'machine_id' => $machine->id,
|
|
'level' => 'error',
|
|
'created_at' => now()->subMinutes(10),
|
|
'message' => 'Test error',
|
|
]);
|
|
|
|
$this->assertEquals('error', $machine->calculated_status);
|
|
}
|
|
|
|
/**
|
|
* Test machine is offline with old heartbeat (30s+).
|
|
*/
|
|
public function test_machine_is_offline_with_old_heartbeat(): void
|
|
{
|
|
$machine = Machine::factory()->create([
|
|
'last_heartbeat_at' => now()->subSeconds(35),
|
|
]);
|
|
|
|
$this->assertEquals('offline', $machine->calculated_status);
|
|
}
|
|
|
|
/**
|
|
* Test machine scopes (online, offline, hasError).
|
|
*/
|
|
public function test_machine_scopes(): void
|
|
{
|
|
// 1. Online machine
|
|
$onlineMachine = Machine::factory()->create(['last_heartbeat_at' => now()->subSeconds(10)]);
|
|
|
|
// 2. Offline machine
|
|
$offlineMachine = Machine::factory()->create(['last_heartbeat_at' => now()->subSeconds(40)]);
|
|
|
|
// 3. Online machine with error
|
|
$errorMachine = Machine::factory()->create(['last_heartbeat_at' => now()->subSeconds(5)]);
|
|
MachineLog::create([
|
|
'machine_id' => $errorMachine->id,
|
|
'level' => 'error',
|
|
'created_at' => now()->subMinutes(5),
|
|
'message' => 'Error log',
|
|
]);
|
|
|
|
$this->assertEquals(2, Machine::online()->count());
|
|
$this->assertEquals(1, Machine::offline()->count());
|
|
$this->assertEquals(1, Machine::online()->hasError()->count());
|
|
|
|
$this->assertTrue(Machine::online()->get()->contains($onlineMachine));
|
|
$this->assertTrue(Machine::offline()->get()->contains($offlineMachine));
|
|
$this->assertTrue(Machine::online()->hasError()->get()->contains($errorMachine));
|
|
}
|
|
}
|