This commit is contained in:
Your Name
2026-09-07 10:07:47 +08:00
parent cf3fbdc5ef
commit d5164b7369
388 changed files with 19863 additions and 18720 deletions
@@ -21,26 +21,25 @@ conversionFanDetailExpect(is_string($conversionSource), 'Unable to read Conversi
$buildDetailRows = (new ReflectionClass(ConversionLogic::class))->getMethod('buildFanDetailRows');
$buildDetailRows->setAccessible(true);
$detailRows = $buildDetailRows->invoke(null, [
['user_id' => 'staff-a', 'external_userid' => 'readded', 'add_time' => 100],
['user_id' => 'staff-a', 'external_userid' => 'readded', 'add_time' => 200],
['user_id' => 'staff-b', 'external_userid' => 'deleted', 'add_time' => 300],
], [
['user_id' => 'staff-a', 'external_userid' => 'readded', 'add_time' => 200],
['add_event_id' => 10, 'user_id' => 'staff-a', 'external_userid' => 'shared', 'add_time' => 100, 'is_deleted' => false],
['add_event_id' => 11, 'user_id' => 'staff-a', 'external_userid' => 'shared', 'add_time' => 200, 'is_deleted' => false],
['add_event_id' => 12, 'user_id' => 'staff-b', 'external_userid' => 'shared', 'add_time' => 300, 'is_deleted' => true],
]);
conversionFanDetailExpect(
count($detailRows) === 2
&& (int) ($detailRows[0]['add_time'] ?? 0) === 100
&& empty($detailRows[0]['is_deleted'])
&& (string) ($detailRows[1]['user_id'] ?? '') === 'staff-b'
&& !empty($detailRows[1]['is_deleted']),
'Delete/re-add details must retain the first counted add time and final deletion state'
'Details must deduplicate the same employee/customer while retaining the same customer under another employee'
);
conversionFanDetailExpect(
str_contains($conversionSource, 'self::loadFanDetailRows($startTimestamp, $endTimestamp, $mediaChannel, $adminIds)')
&& str_contains($conversionSource, 'MIN(e.event_time) AS add_time')
&& str_contains($conversionSource, 'e.id AS add_event_id')
&& str_contains($conversionSource, "->where('e.event_time', 'between', [\$startTimestamp, \$endTimestamp])")
&& str_contains($conversionSource, 'EXISTS (SELECT 1 FROM `')
&& str_contains($conversionSource, 'MAX(event_time) AS delete_time'),
'Aggregate and detail results must share the same distinct fan-pair loader and expose event times'
'Aggregate and detail results must share the same employee/customer loader and expose event times'
);
conversionFanDetailExpect(
str_contains($conversionSource, "'external_userid' => \$externalUserId")