@@ -1247,6 +1247,126 @@ private function create_woocommerce_default_pages(): array {
12471247 return $ page_ids ;
12481248 }
12491249
1250+ /**
1251+ * Test the determine_suggested_product_type method with various scenarios.
1252+ *
1253+ * @dataProvider data_determine_suggested_product_type
1254+ */
1255+ public function test_determine_suggested_product_type ( $ order_items , $ expected_product_type ) {
1256+ // Create a mock order.
1257+ $ mock_order = $ this ->getMockBuilder ( 'WC_Order ' )
1258+ ->disableOriginalConstructor ()
1259+ ->setMethods ( [ 'get_items ' ] )
1260+ ->getMock ();
1261+
1262+ $ mock_order ->method ( 'get_items ' )->willReturn ( $ order_items );
1263+
1264+ // Use reflection to call the private method.
1265+ $ reflection = new ReflectionClass ( $ this ->payments_api_client );
1266+ $ method = $ reflection ->getMethod ( 'determine_suggested_product_type ' );
1267+ $ method ->setAccessible ( true );
1268+
1269+ $ result = $ method ->invoke ( $ this ->payments_api_client , $ mock_order );
1270+
1271+ $ this ->assertEquals ( $ expected_product_type , $ result );
1272+ }
1273+
1274+ /**
1275+ * Data provider for test_determine_suggested_product_type.
1276+ */
1277+ public function data_determine_suggested_product_type () {
1278+ return [
1279+ 'empty_order ' => [
1280+ 'order_items ' => [],
1281+ 'expected_product_type ' => 'physical_product ' ,
1282+ ],
1283+ 'single_physical_product ' => [
1284+ 'order_items ' => [
1285+ $ this ->create_mock_order_item_product ( false ), // not virtual.
1286+ ],
1287+ 'expected_product_type ' => 'physical_product ' ,
1288+ ],
1289+ 'single_virtual_product ' => [
1290+ 'order_items ' => [
1291+ $ this ->create_mock_order_item_product ( true ), // virtual.
1292+ ],
1293+ 'expected_product_type ' => 'digital_product_or_service ' ,
1294+ ],
1295+ 'multiple_products_mixed ' => [
1296+ 'order_items ' => [
1297+ $ this ->create_mock_order_item_product ( false ), // physical.
1298+ $ this ->create_mock_order_item_product ( true ), // virtual.
1299+ ],
1300+ 'expected_product_type ' => 'multiple ' ,
1301+ ],
1302+ 'multiple_physical_products ' => [
1303+ 'order_items ' => [
1304+ $ this ->create_mock_order_item_product ( false ), // physical.
1305+ $ this ->create_mock_order_item_product ( false ), // physical.
1306+ ],
1307+ 'expected_product_type ' => 'multiple ' ,
1308+ ],
1309+ 'multiple_virtual_products ' => [
1310+ 'order_items ' => [
1311+ $ this ->create_mock_order_item_product ( true ), // virtual.
1312+ $ this ->create_mock_order_item_product ( true ), // virtual.
1313+ ],
1314+ 'expected_product_type ' => 'multiple ' ,
1315+ ],
1316+ 'order_with_non_product_items ' => [
1317+ 'order_items ' => [
1318+ $ this ->create_mock_order_item_product ( true ), // virtual product.
1319+ $ this ->create_mock_order_item_shipping (), // shipping item (not a product).
1320+ ],
1321+ 'expected_product_type ' => 'digital_product_or_service ' ,
1322+ ],
1323+ 'order_with_invalid_product ' => [
1324+ 'order_items ' => [
1325+ $ this ->create_mock_order_item_product ( true , false ), // virtual but invalid product.
1326+ ],
1327+ 'expected_product_type ' => 'physical_product ' ,
1328+ ],
1329+ ];
1330+ }
1331+
1332+ /**
1333+ * Create a mock order item product for testing.
1334+ *
1335+ * @param bool $is_virtual Whether the product is virtual.
1336+ * @param bool $is_valid Whether the product is valid (can be retrieved).
1337+ * @return MockObject
1338+ */
1339+ private function create_mock_order_item_product ( $ is_virtual = false , $ is_valid = true ) {
1340+ $ mock_product = $ this ->getMockBuilder ( 'WC_Product ' )
1341+ ->disableOriginalConstructor ()
1342+ ->setMethods ( [ 'is_virtual ' ] )
1343+ ->getMock ();
1344+
1345+ $ mock_product ->method ( 'is_virtual ' )->willReturn ( $ is_virtual );
1346+
1347+ $ mock_order_item = $ this ->getMockBuilder ( 'WC_Order_Item_Product ' )
1348+ ->disableOriginalConstructor ()
1349+ ->setMethods ( [ 'get_product ' ] )
1350+ ->getMock ();
1351+
1352+ $ mock_order_item ->method ( 'get_product ' )->willReturn ( $ is_valid ? $ mock_product : false );
1353+
1354+ return $ mock_order_item ;
1355+ }
1356+
1357+ /**
1358+ * Create a mock order item that is not a product (e.g., shipping).
1359+ *
1360+ * @return MockObject
1361+ */
1362+ private function create_mock_order_item_shipping () {
1363+ $ mock_order_item = $ this ->getMockBuilder ( 'WC_Order_Item_Shipping ' )
1364+ ->disableOriginalConstructor ()
1365+ ->getMock ();
1366+
1367+ return $ mock_order_item ;
1368+ }
1369+
12501370 /**
12511371 * Delete test posts that were created during a unit test.
12521372 *
0 commit comments