[FEAT] 重構機台狀態判定邏輯並優化全站多語系支援
All checks were successful
star-cloud-deploy-demo / deploy-demo (push) Successful in 1m18s
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 標籤一致性。
This commit is contained in:
86
tests/Feature/MachineStatusTest.php
Normal file
86
tests/Feature/MachineStatusTest.php
Normal file
@@ -0,0 +1,86 @@
|
||||
<?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));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user