Skip to content

Commit c1afd18

Browse files
Merge pull request #83 from liberu-genealogy/copilot/fix-gedcom-import-job
Fix: GedcomImporter never dispatches a queue job; GEDCOM files silently unprocessed after upload
2 parents 8f9c93d + 88fce6c commit c1afd18

3 files changed

Lines changed: 89 additions & 9 deletions

File tree

src/Jobs/GedcomImportJob.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace FamilyTree365\LaravelGedcom\Jobs;
4+
5+
use FamilyTree365\LaravelGedcom\Facades\GedcomParserFacade;
6+
use Illuminate\Bus\Queueable;
7+
use Illuminate\Contracts\Queue\ShouldQueue;
8+
use Illuminate\Foundation\Bus\Dispatchable;
9+
use Illuminate\Queue\InteractsWithQueue;
10+
use Illuminate\Queue\SerializesModels;
11+
12+
class GedcomImportJob implements ShouldQueue
13+
{
14+
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
15+
16+
public function __construct(
17+
public readonly string $conn,
18+
public readonly string $filename,
19+
public readonly string $slug,
20+
) {
21+
}
22+
23+
public function handle(): void
24+
{
25+
GedcomParserFacade::parse($this->conn, $this->filename, $this->slug, true);
26+
}
27+
}

src/Utils/GedcomImporter.php

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,15 @@
22

33
namespace FamilyTree365\LaravelGedcom\Utils;
44

5-
use FamilyTree365\LaravelGedcom\Facades\GedcomParserFacade;
6-
use FamilyTree365\LaravelGedcom\Models\Person;
7-
use Illuminate\Support\Facades\DB;
8-
use Illuminate\Support\Facades\Storage;
9-
use Illuminate\Support\Facades\View;
5+
use FamilyTree365\LaravelGedcom\Jobs\GedcomImportJob;
106

117
class GedcomImporter
128
{
13-
public static function importData($filename)
9+
public static function importData(string $filename): void
1410
{
15-
$gedFile = $filename . '.GED';
11+
$gedFile = $filename . '.ged';
1612
$slug = $filename;
1713

18-
// Code extracted from GedcomImporter.php handle() function (lines 41-42)
19-
GedcomParserFacade::parse('mysql', $gedFile, $slug, true);
14+
GedcomImportJob::dispatch('mysql', $gedFile, $slug);
2015
}
2116
}

tests/Unit/GedcomImportJobTest.php

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?php
2+
3+
namespace Tests\Unit;
4+
5+
use Tests\TestCase;
6+
use FamilyTree365\LaravelGedcom\Facades\GedcomParserFacade;
7+
use FamilyTree365\LaravelGedcom\Jobs\GedcomImportJob;
8+
use Illuminate\Support\Facades\Queue;
9+
10+
class GedcomImportJobTest extends TestCase
11+
{
12+
protected function getPackageProviders($app): array
13+
{
14+
return ['FamilyTree365\LaravelGedcom\ServiceProvider'];
15+
}
16+
17+
public function testJobIsDispatchedByGedcomImporter(): void
18+
{
19+
Queue::fake();
20+
21+
\FamilyTree365\LaravelGedcom\Utils\GedcomImporter::importData('family');
22+
23+
Queue::assertPushed(GedcomImportJob::class, function ($job) {
24+
return $job->conn === 'mysql'
25+
&& $job->filename === 'family.ged'
26+
&& $job->slug === 'family';
27+
});
28+
}
29+
30+
public function testGedcomImporterDispatchesWithLowercaseGedExtension(): void
31+
{
32+
Queue::fake();
33+
34+
\FamilyTree365\LaravelGedcom\Utils\GedcomImporter::importData('family');
35+
36+
Queue::assertPushed(GedcomImportJob::class, function ($job) {
37+
return str_ends_with($job->filename, '.ged')
38+
&& !str_ends_with($job->filename, '.GED');
39+
});
40+
}
41+
42+
public function testJobHandleCallsParser(): void
43+
{
44+
GedcomParserFacade::shouldReceive('parse')
45+
->once()
46+
->with('mysql', 'family.ged', 'family', true)
47+
->andReturn(null);
48+
49+
$job = new GedcomImportJob('mysql', 'family.ged', 'family');
50+
$job->handle();
51+
}
52+
53+
public function testJobImplementsShouldQueue(): void
54+
{
55+
$job = new GedcomImportJob('mysql', 'test.ged', 'test');
56+
$this->assertInstanceOf(\Illuminate\Contracts\Queue\ShouldQueue::class, $job);
57+
}
58+
}

0 commit comments

Comments
 (0)