80 lines
3.1 KiB
PHP
80 lines
3.1 KiB
PHP
<?php
|
|
|
|
use App\Models\ImportEntity;
|
|
use App\Services\ImportProcessor;
|
|
|
|
it('groups multiple items per root when supports_multiple is true', function (): void {
|
|
// Arrange: ensure ImportEntity supports_multiple for email
|
|
ImportEntity::updateOrCreate(['key' => 'emails'], [
|
|
'key' => 'emails',
|
|
'canonical_root' => 'email',
|
|
'label' => 'Emails',
|
|
'fields' => ['value'],
|
|
'aliases' => ['email', 'emails'],
|
|
'supports_multiple' => true,
|
|
]);
|
|
|
|
// Fake mappings: two email.value fields with groups 1 and 2
|
|
$mappings = collect([
|
|
(object) ['source_column' => 'Email 1', 'target_field' => 'email.value', 'transform' => null, 'apply_mode' => 'both', 'options' => ['group' => '1']],
|
|
(object) ['source_column' => 'Email 2', 'target_field' => 'email.value', 'transform' => null, 'apply_mode' => 'both', 'options' => ['group' => '2']],
|
|
]);
|
|
|
|
$proc = new class extends ImportProcessor
|
|
{
|
|
public function pubLoad(): array
|
|
{
|
|
return $this->loadImportEntityConfig();
|
|
}
|
|
|
|
public function pubApply(array $raw, $mappings, array $supports): array
|
|
{
|
|
return $this->applyMappings($raw, $mappings, $supports);
|
|
}
|
|
};
|
|
|
|
[, , , $supports] = $proc->pubLoad();
|
|
|
|
$raw = ['Email 1' => 'a@example.test', 'Email 2' => 'b@example.test'];
|
|
[, $mapped] = $proc->pubApply($raw, $mappings, $supports);
|
|
|
|
expect($mapped)
|
|
->toHaveKey('email')
|
|
->and($mapped['email'])
|
|
->toBeArray()
|
|
->and($mapped['email']['1']['value'] ?? null)->toBe('a@example.test')
|
|
->and($mapped['email']['2']['value'] ?? null)->toBe('b@example.test');
|
|
});
|
|
|
|
it('deduplicates grouped items within a single row', function (): void {
|
|
ImportEntity::updateOrCreate(['key' => 'emails'], [
|
|
'key' => 'emails', 'canonical_root' => 'email', 'label' => 'Emails', 'fields' => ['value'], 'aliases' => ['email', 'emails'], 'supports_multiple' => true,
|
|
]);
|
|
$mappings = collect([
|
|
(object) ['source_column' => 'Email 1', 'target_field' => 'email.value', 'transform' => null, 'apply_mode' => 'both', 'options' => ['group' => '1']],
|
|
(object) ['source_column' => 'Email 2', 'target_field' => 'email.value', 'transform' => null, 'apply_mode' => 'both', 'options' => ['group' => '2']],
|
|
]);
|
|
$proc = new class extends ImportProcessor
|
|
{
|
|
public function pubLoad(): array
|
|
{
|
|
return $this->loadImportEntityConfig();
|
|
}
|
|
|
|
public function pubApply(array $raw, $mappings, array $supports): array
|
|
{
|
|
return $this->applyMappings($raw, $mappings, $supports);
|
|
}
|
|
|
|
public function pubDedupe(array $grouped): array
|
|
{
|
|
return $this->dedupeGroupedItems($grouped, 'value', fn ($v) => is_null($v) ? null : mb_strtolower(trim((string) $v)));
|
|
}
|
|
};
|
|
[, , , $supports] = $proc->pubLoad();
|
|
$raw = ['Email 1' => 'a@example.test', 'Email 2' => 'A@EXAMPLE.TEST'];
|
|
[, $mapped] = $proc->pubApply($raw, $mappings, $supports);
|
|
$deduped = $proc->pubDedupe($mapped['email']);
|
|
expect($deduped)->toHaveCount(1);
|
|
});
|