$this->assertNotEmpty($result['street'], "street не пустой для: $input");
}
}
+
+ // --- Тесты на реальные данные из прода ---
+
+ /**
+ * Прод #4497: OBJECT без street, но с district (marketplace_id=2, YM API)
+ */
+ public function testFillFallback_ProdOrder4497_NoStreetWithDistrict(): void
+ {
+ $rawData = json_encode([
+ 'delivery' => [
+ 'address' => [
+ 'gps' => ['latitude' => 56.38352, 'longitude' => 44.02022],
+ 'city' => 'Бор',
+ 'floor' => '4',
+ 'house' => '21к2',
+ 'country' => 'Россия',
+ 'district' => 'микрорайон Красногорка',
+ 'entrance' => '2',
+ 'postcode' => '606446',
+ 'apartment' => '30',
+ ],
+ ],
+ ]);
+
+ $result = MarketplaceService::fillDeliveryAddressFallback($rawData);
+
+ $this->assertEquals('Бор', $result['city']);
+ $this->assertEquals('21к2', $result['house']);
+ $this->assertNotEmpty($result['street'], 'street должен быть заполнен (из district)');
+ $this->assertEquals('микрорайон Красногорка', $result['street']);
+ $this->assertEquals(56.38352, $result['latitude']);
+ }
+
+ /**
+ * Прод #3519: OBJECT со street (marketplace_id=2, YM API)
+ */
+ public function testFillFallback_ProdOrder3519_HasStreet(): void
+ {
+ $rawData = json_encode([
+ 'delivery' => [
+ 'address' => [
+ 'gps' => ['latitude' => 56.32424, 'longitude' => 43.94137],
+ 'city' => 'Нижний Новгород',
+ 'house' => '6',
+ 'street' => 'улица Генерала Зимина',
+ 'country' => 'Россия',
+ 'entrance' => '3',
+ 'postcode' => '603116',
+ 'apartment' => 'При звонке он выйдет,заберет.',
+ ],
+ ],
+ ]);
+
+ $result = MarketplaceService::fillDeliveryAddressFallback($rawData);
+
+ $this->assertEquals('Нижний Новгород', $result['city']);
+ $this->assertEquals('улица Генерала Зимина', $result['street']);
+ $this->assertEquals('6', $result['house']);
+ }
+
+ /**
+ * Прод #4328: OBJECT без street, с district "микрорайон Щербинки-1"
+ */
+ public function testFillFallback_ProdOrder4328_DistrictOnly(): void
+ {
+ $rawData = json_encode([
+ 'delivery' => [
+ 'address' => [
+ 'gps' => ['latitude' => 56.24084, 'longitude' => 43.97071],
+ 'city' => 'Нижний Новгород',
+ 'floor' => '1',
+ 'house' => '7',
+ 'country' => 'Россия',
+ 'district' => 'микрорайон Щербинки-1',
+ 'entrance' => '1',
+ 'postcode' => '603107',
+ 'apartment' => '1',
+ ],
+ ],
+ ]);
+
+ $result = MarketplaceService::fillDeliveryAddressFallback($rawData);
+
+ $this->assertEquals('Нижний Новгород', $result['city']);
+ $this->assertEquals('микрорайон Щербинки-1', $result['street']);
+ $this->assertEquals('7', $result['house']);
+ }
+
+ /**
+ * Прод #4297: OBJECT без street и без district
+ */
+ public function testFillFallback_ProdOrder4297_NoStreetNoDistrict(): void
+ {
+ $rawData = json_encode([
+ 'delivery' => [
+ 'address' => [
+ 'gps' => ['latitude' => 56.24145, 'longitude' => 44.04773],
+ 'city' => 'деревня Анкудиновка',
+ 'floor' => '7',
+ 'house' => '18',
+ 'country' => 'Россия',
+ 'apartment' => '64',
+ ],
+ ],
+ ]);
+
+ $result = MarketplaceService::fillDeliveryAddressFallback($rawData);
+
+ $this->assertEquals('деревня Анкудиновка', $result['city']);
+ $this->assertEquals('18', $result['house']);
+ $this->assertEquals('Уточняется', $result['street']);
+ }
+
+ /**
+ * Прод #4311: STRING формат "Уточните время доставки у получателя"
+ */
+ public function testParseProd_AskTimeFromRecipient(): void
+ {
+ $text = 'Доставка: сегодня, 23 февраля 2026 в 10:00—11:00, Нижний Новгород, проспект Ленина, 51к3, 1 подъезд Квартиру уточнить у получателя';
+
+ $result = MarketplaceService::parseAddressFromDeliveryText($text);
+
+ $this->assertNotEquals('Уточняется', $result['city']);
+ $this->assertNotEquals('Уточняется', $result['street']);
+ }
+
+ /**
+ * Прод: marketplace_id=1, delivery=NULL — самый частый случай
+ */
+ public function testFillFallback_NullDeliveryInRawData(): void
+ {
+ // raw_data не содержит delivery вообще (YM API не вернул)
+ $rawData = json_encode(['items' => [], 'status' => 'PROCESSING']);
+
+ $result = MarketplaceService::fillDeliveryAddressFallback($rawData);
+
+ $this->assertEquals('Уточняется', $result['street']);
+ $this->assertEquals('Уточняется', $result['city']);
+ }
}