feat: add comprehensive tests for Medium, OtpCode, Shift models and various Enums
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature\Models;
|
||||
|
||||
use App\Enums\MediaDiskEnum;
|
||||
use App\Models\Medium;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Tests\TestCase;
|
||||
|
||||
class MediumTest extends TestCase
|
||||
{
|
||||
use RefreshDatabase;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
Storage::fake('public');
|
||||
Storage::fake('private');
|
||||
}
|
||||
|
||||
public function test_is_public_and_is_private_reflect_disk(): void
|
||||
{
|
||||
$public = Medium::factory()->public()->create();
|
||||
$private = Medium::factory()->private()->create();
|
||||
|
||||
$this->assertTrue($public->isPublic());
|
||||
$this->assertFalse($public->isPrivate());
|
||||
$this->assertTrue($private->isPrivate());
|
||||
$this->assertFalse($private->isPublic());
|
||||
}
|
||||
|
||||
public function test_get_storage_disk_matches_medium_disk(): void
|
||||
{
|
||||
$private = Medium::factory()->private()->create(['path' => 'a.txt']);
|
||||
Storage::disk('private')->put('a.txt', 'x');
|
||||
|
||||
$this->assertTrue($private->getStorageDisk()->exists('a.txt'));
|
||||
$this->assertFalse(Storage::disk('public')->exists('a.txt'));
|
||||
}
|
||||
|
||||
public function test_full_url_returns_absolute_path_on_matching_disk(): void
|
||||
{
|
||||
$public = Medium::factory()->public()->create(['path' => 'files/a.png']);
|
||||
$private = Medium::factory()->private()->create(['path' => 'files/b.png']);
|
||||
|
||||
$this->assertSame(Storage::disk('public')->path('files/a.png'), $public->full_url);
|
||||
$this->assertSame(Storage::disk('private')->path('files/b.png'), $private->full_url);
|
||||
}
|
||||
|
||||
public function test_exists_get_contents_and_delete_file(): void
|
||||
{
|
||||
$medium = Medium::factory()->private()->create(['path' => 'files/c.txt']);
|
||||
Storage::disk('private')->put('files/c.txt', 'hello');
|
||||
|
||||
$this->assertTrue($medium->exists());
|
||||
$this->assertSame('hello', $medium->getContents());
|
||||
$this->assertTrue($medium->deleteFile());
|
||||
$this->assertFalse($medium->exists());
|
||||
$this->assertFalse($medium->deleteFile());
|
||||
}
|
||||
|
||||
public function test_human_size_formats_bytes_into_units(): void
|
||||
{
|
||||
$this->assertSame('512 B', Medium::factory()->make(['size' => 512])->human_size);
|
||||
$this->assertSame('1 KB', Medium::factory()->make(['size' => 1025])->human_size);
|
||||
$this->assertSame('1.5 MB', Medium::factory()->make(['size' => 1572864])->human_size);
|
||||
$this->assertSame('2 GB', Medium::factory()->make(['size' => 2147483648])->human_size);
|
||||
}
|
||||
|
||||
public function test_disk_is_cast_to_enum(): void
|
||||
{
|
||||
$this->assertSame(MediaDiskEnum::Private, Medium::factory()->private()->create()->fresh()->disk);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature\Models;
|
||||
|
||||
use App\Models\OtpCode;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Illuminate\Support\Carbon;
|
||||
use Tests\TestCase;
|
||||
|
||||
class OtpCodeTest extends TestCase
|
||||
{
|
||||
use RefreshDatabase;
|
||||
|
||||
public function test_is_expired_is_false_before_expiry(): void
|
||||
{
|
||||
$this->assertFalse(OtpCode::factory()->create()->isExpired());
|
||||
}
|
||||
|
||||
public function test_is_expired_is_true_after_expiry(): void
|
||||
{
|
||||
$this->assertTrue(OtpCode::factory()->expired()->create()->isExpired());
|
||||
}
|
||||
|
||||
public function test_is_expired_is_false_at_exact_expiry_moment(): void
|
||||
{
|
||||
Carbon::setTestNow('2026-09-21 10:00:00');
|
||||
$otp = OtpCode::factory()->create(['expires_at' => now()]);
|
||||
|
||||
$this->assertFalse($otp->isExpired());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature\Models;
|
||||
|
||||
use App\Models\Shift;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Tests\TestCase;
|
||||
|
||||
class ShiftTest extends TestCase
|
||||
{
|
||||
use RefreshDatabase;
|
||||
|
||||
public function test_active_scope_returns_only_active_shifts(): void
|
||||
{
|
||||
$active = Shift::factory()->create();
|
||||
Shift::factory()->inactive()->create();
|
||||
|
||||
$this->assertSame([$active->id], Shift::active()->pluck('id')->all());
|
||||
}
|
||||
|
||||
public function test_open_scope_returns_only_unassigned_shifts(): void
|
||||
{
|
||||
$open = Shift::factory()->create();
|
||||
Shift::factory()->forDoctor()->create();
|
||||
|
||||
$this->assertSame([$open->id], Shift::open()->pluck('id')->all());
|
||||
}
|
||||
|
||||
public function test_scopes_can_be_chained(): void
|
||||
{
|
||||
$target = Shift::factory()->create();
|
||||
Shift::factory()->inactive()->create();
|
||||
Shift::factory()->forDoctor()->create();
|
||||
Shift::factory()->forDoctor()->inactive()->create();
|
||||
|
||||
$this->assertSame([$target->id], Shift::active()->open()->pluck('id')->all());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Unit\Enums;
|
||||
|
||||
use App\Enums\DocumentModalityEnum;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class DocumentModalityEnumTest extends TestCase
|
||||
{
|
||||
public function test_price_per_modality(): void
|
||||
{
|
||||
$this->assertSame(1000000, DocumentModalityEnum::CtScan->price());
|
||||
$this->assertSame(1200000, DocumentModalityEnum::Mri->price());
|
||||
$this->assertSame(500000, DocumentModalityEnum::Sonography->price());
|
||||
$this->assertSame(700000, DocumentModalityEnum::Echo->price());
|
||||
$this->assertSame(400000, DocumentModalityEnum::Radiology->price());
|
||||
}
|
||||
|
||||
public function test_every_case_has_a_positive_price(): void
|
||||
{
|
||||
foreach (DocumentModalityEnum::cases() as $modality) {
|
||||
$this->assertGreaterThan(0, $modality->price(), $modality->name);
|
||||
}
|
||||
}
|
||||
|
||||
public function test_values_are_slugs_used_by_forms(): void
|
||||
{
|
||||
$this->assertSame(['ct-scan', 'mri', 'sonography', 'echo', 'radiology'], DocumentModalityEnum::values());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Unit\Enums;
|
||||
|
||||
use App\Enums\DocumentPriorityEnum;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class DocumentPriorityEnumTest extends TestCase
|
||||
{
|
||||
public function test_processing_hours_per_priority(): void
|
||||
{
|
||||
$this->assertSame(24, DocumentPriorityEnum::Medium->processingHours());
|
||||
$this->assertSame(3, DocumentPriorityEnum::High->processingHours());
|
||||
}
|
||||
|
||||
public function test_high_priority_is_processed_faster_than_medium(): void
|
||||
{
|
||||
$this->assertLessThan(DocumentPriorityEnum::Medium->processingHours(), DocumentPriorityEnum::High->processingHours());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Unit\Enums;
|
||||
|
||||
use App\Enums\DocumentPriorityEnum;
|
||||
use App\Enums\ShiftDayEnum;
|
||||
use Tests\TestCase;
|
||||
|
||||
class EnumHasOptionsTest extends TestCase
|
||||
{
|
||||
public function test_values_returns_backing_values_in_declaration_order(): void
|
||||
{
|
||||
$this->assertSame(['عادی', 'اورژانسی'], DocumentPriorityEnum::values());
|
||||
}
|
||||
|
||||
public function test_keys_returns_case_names_in_declaration_order(): void
|
||||
{
|
||||
$this->assertSame(['Medium', 'High'], DocumentPriorityEnum::keys());
|
||||
}
|
||||
|
||||
public function test_from_name_resolves_case_by_name(): void
|
||||
{
|
||||
$this->assertSame(DocumentPriorityEnum::High, DocumentPriorityEnum::fromName('High'));
|
||||
$this->assertSame(ShiftDayEnum::Friday, ShiftDayEnum::fromName('Friday'));
|
||||
}
|
||||
|
||||
public function test_from_name_returns_null_for_unknown_or_value_input(): void
|
||||
{
|
||||
$this->assertNull(DocumentPriorityEnum::fromName('Urgent'));
|
||||
$this->assertNull(DocumentPriorityEnum::fromName(DocumentPriorityEnum::High->value));
|
||||
$this->assertNull(DocumentPriorityEnum::fromName('high'));
|
||||
}
|
||||
|
||||
public function test_options_is_keyed_by_value_with_translation_per_case(): void
|
||||
{
|
||||
$options = DocumentPriorityEnum::options();
|
||||
|
||||
$this->assertSame(['عادی', 'اورژانسی'], array_keys($options));
|
||||
$this->assertSame(__('enums.DocumentPriorityEnum.Medium'), $options['عادی']);
|
||||
$this->assertSame(__('enums.DocumentPriorityEnum.High'), $options['اورژانسی']);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Unit\Enums;
|
||||
|
||||
use App\Enums\ShiftDayEnum;
|
||||
use Carbon\Carbon;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class ShiftDayEnumTest extends TestCase
|
||||
{
|
||||
public function test_carbon_day_maps_each_case_to_carbon_constant(): void
|
||||
{
|
||||
$this->assertSame(Carbon::SATURDAY, ShiftDayEnum::Saturday->carbonDay());
|
||||
$this->assertSame(Carbon::SUNDAY, ShiftDayEnum::Sunday->carbonDay());
|
||||
$this->assertSame(Carbon::MONDAY, ShiftDayEnum::Monday->carbonDay());
|
||||
$this->assertSame(Carbon::TUESDAY, ShiftDayEnum::Tuesday->carbonDay());
|
||||
$this->assertSame(Carbon::WEDNESDAY, ShiftDayEnum::Wednesday->carbonDay());
|
||||
$this->assertSame(Carbon::THURSDAY, ShiftDayEnum::Thursday->carbonDay());
|
||||
$this->assertSame(Carbon::FRIDAY, ShiftDayEnum::Friday->carbonDay());
|
||||
}
|
||||
|
||||
public function test_from_date_resolves_weekday_of_given_date(): void
|
||||
{
|
||||
$this->assertSame(ShiftDayEnum::Saturday, ShiftDayEnum::fromDate(Carbon::parse('2026-09-26')));
|
||||
$this->assertSame(ShiftDayEnum::Sunday, ShiftDayEnum::fromDate(Carbon::parse('2026-09-20')));
|
||||
$this->assertSame(ShiftDayEnum::Monday, ShiftDayEnum::fromDate(Carbon::parse('2026-09-21')));
|
||||
$this->assertSame(ShiftDayEnum::Friday, ShiftDayEnum::fromDate(Carbon::parse('2026-09-25')));
|
||||
}
|
||||
|
||||
public function test_from_date_and_carbon_day_round_trip_for_every_case(): void
|
||||
{
|
||||
foreach (ShiftDayEnum::cases() as $day) {
|
||||
$date = Carbon::parse('2026-09-21')->next($day->carbonDay());
|
||||
|
||||
$this->assertSame($day, ShiftDayEnum::fromDate($date));
|
||||
}
|
||||
}
|
||||
|
||||
public function test_values_follow_persian_week_order_starting_saturday(): void
|
||||
{
|
||||
$this->assertSame(['شنبه', 'یکشنبه', 'دوشنبه', 'سهشنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه'], ShiftDayEnum::values());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user