create([ 'name' => 'Test Device', ]); expect($device)->toBeInstanceOf(Device::class) ->and($device->name)->toBe('Test Device'); }); test('battery percentage is calculated correctly', function (): void { $cases = [ ['voltage' => 3.0, 'expected' => 0], // Min voltage ['voltage' => 4.2, 'expected' => 100], // Max voltage ['voltage' => 2.9, 'expected' => 0], // Below min ['voltage' => 4.3, 'expected' => 100], // Above max ['voltage' => 3.6, 'expected' => 50.0], // Middle voltage ['voltage' => 3.3, 'expected' => 25.0], // Quarter voltage ]; foreach ($cases as $case) { $device = Device::factory()->create([ 'last_battery_voltage' => $case['voltage'], ]); expect($device->battery_percent)->toBe($case['expected']) ->and($device->last_battery_voltage)->toBe($case['voltage']); } }); test('wifi strength is determined correctly', function (): void { $cases = [ ['rssi' => 0, 'expected' => 0], // No signal ['rssi' => -90, 'expected' => 1], // Weak signal ['rssi' => -70, 'expected' => 2], // Moderate signal ['rssi' => -50, 'expected' => 3], // Strong signal ]; foreach ($cases as $case) { $device = Device::factory()->create([ 'last_rssi_level' => $case['rssi'], ]); expect($device->wifi_strength)->toBe($case['expected']) ->and($device->last_rssi_level)->toBe($case['rssi']); } }); test('proxy cloud attribute is properly cast to boolean', function (): void { $device = Device::factory()->create([ 'proxy_cloud' => true, ]); expect($device->proxy_cloud)->toBeTrue(); $device->update(['proxy_cloud' => false]); expect($device->proxy_cloud)->toBeFalse(); }); test('last log request is properly cast to json', function (): void { $logData = ['status' => 'success', 'timestamp' => '2024-03-04 12:00:00']; $device = Device::factory()->create([ 'last_log_request' => $logData, ]); expect($device->last_log_request) ->toBeArray() ->toHaveKey('status') ->toHaveKey('timestamp'); }); test('getSleepModeEndsInSeconds returns correct value for overnight sleep window', function (): void { // Set the current time to 12:13 Carbon::setTestNow(Carbon::create(2024, 1, 1, 12, 13, 0)); $device = Device::factory()->create([ 'sleep_mode_enabled' => true, 'sleep_mode_from' => Carbon::create(2024, 1, 1, 22, 0, 0), // 22:00 'sleep_mode_to' => Carbon::create(2024, 1, 1, 13, 0, 0), // 13:00 ]); $seconds = $device->getSleepModeEndsInSeconds(); // 47 minutes = 2820 seconds expect($seconds)->toBe(2820); Carbon::setTestNow(); // Clear test time });