Files
onboard/tests/Feature/Reports/EloquentReportRepositoryTest.php

151 lines
5.5 KiB
PHP

<?php
use App\Domain\Reports\Models\ReportSnapshot;
use App\Infrastructure\Reports\Adapters\LegacyReportServiceAdapter;
use App\Infrastructure\Reports\Repositories\EloquentReportRepository;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
beforeEach(function () {
foreach ([
'users',
'departments',
'department_metrika_defaults',
'reports',
'metrika_results',
'observation_patients',
'unwanted_events',
] as $table) {
Schema::dropIfExists($table);
}
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name')->nullable();
$table->string('login')->nullable();
$table->string('password')->nullable();
$table->timestamps();
});
Schema::create('departments', function (Blueprint $table) {
$table->id('department_id');
$table->string('name_full')->nullable();
$table->string('name_short')->nullable();
$table->integer('rf_mis_department_id')->nullable();
$table->integer('rf_department_type')->nullable();
});
Schema::create('department_metrika_defaults', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('rf_department_id');
$table->unsignedBigInteger('rf_metrika_item_id');
$table->string('value')->nullable();
});
Schema::create('reports', function (Blueprint $table) {
$table->id('report_id');
$table->dateTime('created_at');
$table->dateTime('sent_at')->nullable();
$table->unsignedBigInteger('rf_department_id');
$table->unsignedBigInteger('rf_user_id')->nullable();
$table->unsignedBigInteger('rf_lpudoctor_id')->nullable();
$table->dateTime('period_start')->nullable();
$table->dateTime('period_end')->nullable();
$table->string('status')->default('draft');
});
Schema::create('metrika_results', function (Blueprint $table) {
$table->id('metrika_result_id');
$table->unsignedBigInteger('rf_report_id');
$table->unsignedBigInteger('rf_metrika_item_id');
$table->string('value')->nullable();
});
Schema::create('observation_patients', function (Blueprint $table) {
$table->id('observation_patient_id');
$table->unsignedBigInteger('rf_report_id')->nullable();
$table->unsignedBigInteger('rf_department_id')->nullable();
$table->unsignedBigInteger('rf_medicalhistory_id')->nullable();
$table->unsignedBigInteger('rf_department_patient_id')->nullable();
$table->text('comment')->nullable();
});
Schema::create('unwanted_events', function (Blueprint $table) {
$table->id('unwanted_event_id');
$table->unsignedBigInteger('rf_report_id')->nullable();
$table->text('comment')->nullable();
$table->string('title')->nullable();
$table->boolean('is_visible')->default(true);
$table->timestamps();
});
DB::table('users')->insert([
'id' => 15,
'name' => 'Doctor',
'login' => 'doc',
'password' => 'secret',
'created_at' => now(),
'updated_at' => now(),
]);
DB::table('departments')->insert([
'department_id' => 10,
'name_full' => 'Department',
'name_short' => 'Dept',
'rf_mis_department_id' => 100,
]);
DB::table('department_metrika_defaults')->insert([
'rf_department_id' => 10,
'rf_metrika_item_id' => 1,
'value' => '30',
]);
});
afterEach(function () {
\Mockery::close();
});
it('saves report snapshot idempotently through eloquent repository', function () {
$adapter = \Mockery::mock(LegacyReportServiceAdapter::class);
$adapter->shouldReceive('prepareMemoryForHeavySave')->twice();
$adapter->shouldReceive('createPatientSnapshots')->twice();
$adapter->shouldReceive('syncCalculatedMetrics')->twice();
$adapter->shouldReceive('saveLethalMetricFromSnapshots')->twice();
$adapter->shouldReceive('clearCacheAfterReportCreation')->twice();
$repository = new EloquentReportRepository($adapter);
$snapshot = new ReportSnapshot(
departmentId: 10,
userId: 5015,
actorUserId: 15,
periodStart: new DateTimeImmutable('2026-04-08 06:00:00'),
periodEnd: new DateTimeImmutable('2026-04-09 06:00:00'),
status: 'draft',
metrics: [4 => 11],
observationPatients: [['medical_history_id' => 100, 'comment' => 'watch']],
unwantedEvents: [['title' => 'event', 'comment' => 'test', 'is_visible' => true]],
);
$first = $repository->save($snapshot);
$second = $repository->save(new ReportSnapshot(
departmentId: 10,
userId: 5015,
actorUserId: 15,
periodStart: new DateTimeImmutable('2026-04-08 06:00:00'),
periodEnd: new DateTimeImmutable('2026-04-09 06:00:00'),
status: 'draft',
metrics: [4 => 12],
observationPatients: [['medical_history_id' => 100, 'comment' => 'watch-2']],
unwantedEvents: [['title' => 'event-2', 'comment' => 'test-2', 'is_visible' => true]],
reportId: $first->reportId,
));
expect($first->reportId)->toBe($second->reportId)
->and(DB::table('reports')->count())->toBe(1)
->and(DB::table('metrika_results')->where('rf_report_id', $first->reportId)->where('rf_metrika_item_id', 4)->value('value'))->toBe('12')
->and(DB::table('observation_patients')->where('rf_report_id', $first->reportId)->value('comment'))->toBe('watch-2');
});