'live'], $attributes)); $order->id = $attributes['id'] ?? 4711; $order->setRelation('user_invoice', null); return $order; } function metadataShoppingUser(array $attributes = []): ShoppingUser { $shoppingUser = new ShoppingUser(array_merge([ 'billing_firstname' => 'Erika', 'billing_lastname' => 'Mustermann', ], $attributes)); $shoppingUser->id = 99; return $shoppingUser; } function metadataPayment(): ShoppingPayment { $payment = new ShoppingPayment(['reference' => 'mref123']); $payment->id = 555; return $payment; } it('builds the full metadata set for a checkout', function () { $metadata = StripeMetadataBuilder::forCheckout( metadataOrder(), metadataPayment(), metadataShoppingUser(['number' => 1234, 'member_id' => 77]), 'mref123', ); expect($metadata)->toBe([ 'shopping_order_id' => '4711', 'shopping_payment_id' => '555', 'reference' => 'mref123', 'mode' => 'live', 'order_type' => 'shop', 'customer_name' => 'Erika Mustermann', 'customer_number' => '1234', 'member_id' => '77', ]); }); it('flags abo and recovery orders by order_type', function () { expect(StripeMetadataBuilder::forCheckout( metadataOrder(['is_abo' => true]), metadataPayment(), metadataShoppingUser(), 'r1' )['order_type'])->toBe('abo'); $recovery = StripeMetadataBuilder::forCheckout( metadataOrder(['recovery_user_abo_id' => 42]), metadataPayment(), metadataShoppingUser(), 'r2' ); expect($recovery['order_type'])->toBe('abo_recovery') ->and($recovery['user_abo_id'])->toBe('42'); }); it('names the person first and the company in brackets', function () { $metadata = StripeMetadataBuilder::forCheckout( metadataOrder(), metadataPayment(), metadataShoppingUser(['billing_company' => 'Muster GmbH']), 'mref123', ); expect($metadata['customer_name'])->toBe('Erika Mustermann (Muster GmbH)'); }); it('uses the company alone when no person name is stored', function () { $metadata = StripeMetadataBuilder::forCheckout( metadataOrder(), metadataPayment(), metadataShoppingUser(['billing_firstname' => null, 'billing_lastname' => null, 'billing_company' => 'Muster GmbH']), 'mref123', ); expect($metadata['customer_name'])->toBe('Muster GmbH'); }); it('drops empty values so no null strings reach the reports', function () { $metadata = StripeMetadataBuilder::sanitize([ 'a' => null, 'b' => '', 'c' => 0, 'd' => 'wert', 'e' => 12, ]); expect($metadata)->toBe(['d' => 'wert', 'e' => '12']); }); it('truncates values to the stripe metadata limit', function () { $metadata = StripeMetadataBuilder::sanitize(['lang' => str_repeat('x', 700)]); expect(mb_strlen($metadata['lang']))->toBe(StripeMetadataBuilder::MAX_VALUE_LENGTH); }); it('builds a searchable description with order number, reference and name', function () { $description = StripeMetadataBuilder::description(metadataOrder(), 'mref123', metadataShoppingUser()); expect($description)->toBe('Bestellung #4711 · mref123 · Erika Mustermann'); }); it('works without a shopping user', function () { expect(StripeMetadataBuilder::description(metadataOrder(), 'mref123', null)) ->toBe('Bestellung #4711 · mref123'); });