Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 7 additions & 38 deletions facebook-commerce.php
Original file line number Diff line number Diff line change
Expand Up @@ -1230,7 +1230,7 @@ public function on_variable_product_publish( $wp_id, $woo_product = null ) {
$this->update_product_group( $woo_product );
} else {
$retailer_id = WC_Facebookcommerce_Utils::get_fb_retailer_id( $woo_product->woo_product );
$this->create_product_group( $woo_product, $retailer_id, true );
$this->create_product_group( $woo_product, $retailer_id );
}

$variation_ids = [];
Expand Down Expand Up @@ -1275,29 +1275,9 @@ public function on_simple_product_publish( $wp_id, $woo_product = null, &$parent
if ( $fb_product_item_id ) {
$woo_product->fb_visibility = Products::is_product_visible( $woo_product->woo_product );
$this->update_product_item_batch_api( $woo_product, $fb_product_item_id );

return $fb_product_item_id;
} else {
// Check if this is a new product item for an existing product group
if ( $woo_product->get_parent_id() ) {
$fb_product_group_id = $this->get_product_fbid(
self::FB_PRODUCT_GROUP_ID,
$woo_product->get_parent_id(),
$woo_product
);
// New variant added
if ( $fb_product_group_id ) {
return $this->create_product_simple( $woo_product, $fb_product_group_id );
} else {
WC_Facebookcommerce_Utils::fblog(
'Wrong! simple_product_publish called without group ID for a variable product!',
[],
true
);
}
} else {
return $this->create_product_simple( $woo_product ); // new product
}
return $this->create_product_simple( $woo_product ); // new product
}
}

Expand Down Expand Up @@ -1327,18 +1307,9 @@ public function product_should_be_synced( WC_Product $product ): bool {
*
* @return string
*/
public function create_product_simple( WC_Facebook_Product $woo_product, string $fb_product_group_id = null ): string {
public function create_product_simple( WC_Facebook_Product $woo_product): string {
$retailer_id = WC_Facebookcommerce_Utils::get_fb_retailer_id( $woo_product );

if ( ! $fb_product_group_id ) {
$fb_product_group_id = $this->create_product_group( $woo_product, $retailer_id );
}

if ( $fb_product_group_id ) {
return $this->create_product_item_batch_api( $woo_product, $retailer_id, $fb_product_group_id );
}

return '';
return $this->create_product_item_batch_api( $woo_product, $retailer_id );
}

/**
Expand All @@ -1348,13 +1319,11 @@ public function create_product_simple( WC_Facebook_Product $woo_product, string
*
* @return ?string
*/
public function create_product_group( WC_Facebook_Product $woo_product, string $retailer_id, bool $variants = false ): ?string {
public function create_product_group( WC_Facebook_Product $woo_product, string $retailer_id ): ?string {
$product_group_data = [
'retailer_id' => $retailer_id,
];
if ( $variants ) {
$product_group_data['variants'] = $woo_product->prepare_variants_for_group();
}
$product_group_data['variants'] = $woo_product->prepare_variants_for_group();

try {
$create_product_group_result = $this->facebook_for_woocommerce->get_api()->create_product_group(
Expand Down Expand Up @@ -1454,7 +1423,7 @@ public function update_product_group( WC_Facebook_Product $woo_product ) {
* @param string $retailer_id
**@since 3.1.7
*/
public function create_product_item_batch_api( $woo_product, $retailer_id, $product_group_id ): string {
public function create_product_item_batch_api( $woo_product, $retailer_id ): string {
try {
$product_data = $woo_product->prepare_product( $retailer_id, \WC_Facebook_Product::PRODUCT_PREP_TYPE_ITEMS_BATCH );
$requests = WC_Facebookcommerce_Utils::prepare_product_requests_items_batch( $product_data );
Expand Down
139 changes: 3 additions & 136 deletions tests/Unit/WCFacebookCommerceIntegrationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -1061,55 +1061,6 @@ public function test_on_simple_product_publish_existing_product_updates_product(
$this->assertEquals( 'facebook-simple-product-item-id', $facebook_product_item_id );
}

/**
* Tests on simple product publish update callback/hook creates new product.
*
* @return void
*/
public function test_on_simple_product_publish_existing_product_creates_product() {
add_option( WC_Facebookcommerce_Integration::OPTION_PRODUCT_CATALOG_ID, '1234567891011121314' );

$product = WC_Helper_Product::create_simple_product();
$facebook_product = new WC_Facebook_Product( $product->get_id() );
$facebook_product_data = $facebook_product->prepare_product(null, \WC_Facebook_Product::PRODUCT_PREP_TYPE_ITEMS_BATCH );
$requests = WC_Facebookcommerce_Utils::prepare_product_requests_items_batch($facebook_product_data);

/* Product should be synced with all its variations. So seven calls expected. */
$validator = $this->createMock( ProductValidator::class );
$validator->expects( $this->once() )
->method( 'validate' );
$this->facebook_for_woocommerce->expects( $this->once() )
->method( 'get_product_sync_validator' )
->with( $facebook_product->woo_product )
->willReturn( $validator );

update_option( 'woocommerce_hide_out_of_stock_items', 'yes' );
$facebook_product->woo_product->set_stock_status( 'instock' );
add_post_meta( $product->get_id(), WC_Facebookcommerce_Integration::FB_PRODUCT_ITEM_ID, '' );

$this->api->expects( $this->once() )
->method( 'create_product_group' )
->with(
'1234567891011121314',
[ 'retailer_id' => WC_Facebookcommerce_Utils::get_fb_retailer_id( $facebook_product ) ]
)
->willReturn( new API\ProductCatalog\ProductGroups\Create\Response( '{"id":"facebook-simple-product-group-item-id"}' ) );
$this->api->expects( $this->once() )
->method( 'send_item_updates' )
->with(
$this->integration->get_product_catalog_id(),
$requests
)
->willReturn( new API\ProductCatalog\ItemsBatch\Create\Response( '{"handles":"abcxyz"}' ) );

$this->integration->on_simple_product_publish( $product->get_id(), $facebook_product );

$this->assertEquals(
'facebook-simple-product-group-item-id',
get_post_meta( $facebook_product->get_id(), WC_Facebookcommerce_Integration::FB_PRODUCT_GROUP_ID, true )
);
}

/**
* Tests product should be synced calls to return success.
*
Expand Down Expand Up @@ -1153,41 +1104,6 @@ public function test_product_should_be_synced_calls_facebook_api_with_exception(
$this->assertFalse( $output );
}

/**
* Tests create simple product creates product group and the product itself.
*
* @return void
*/
public function test_create_product_simple_creates_product_group_before_creating_product_item() {
add_option( WC_Facebookcommerce_Integration::OPTION_PRODUCT_CATALOG_ID, '123456789101112' );

$product = WC_Helper_Product::create_simple_product();
$facebook_product = new WC_Facebook_Product( $product->get_id() );
$facebook_product_data = $facebook_product->prepare_product(null, \WC_Facebook_Product::PRODUCT_PREP_TYPE_ITEMS_BATCH );
$requests = WC_Facebookcommerce_Utils::prepare_product_requests_items_batch($facebook_product_data);
$retailer_id = WC_Facebookcommerce_Utils::get_fb_retailer_id( $facebook_product );

$data = [
'retailer_id' => $retailer_id,
];
$this->api->expects( $this->once() )
->method( 'create_product_group' )
->with( '123456789101112', $data )
->willReturn( new API\ProductCatalog\ProductGroups\Create\Response( '{"id":"facebook-simple-product-group-id"}' ) );

$this->api->expects( $this->once() )
->method( 'send_item_updates' )
->with(
$this->integration->get_product_catalog_id(),
$requests
)
->willReturn( new API\ProductCatalog\ItemsBatch\Create\Response( '{"handles":"abcxyz"}' ) );

$this->integration->create_product_simple( $facebook_product );

$this->assertEquals( 'facebook-simple-product-group-id', get_post_meta( $facebook_product->get_id(), WC_Facebookcommerce_Integration::FB_PRODUCT_GROUP_ID, true ) );
}

/**
* Tests create simple product with provided product group id.
*
Expand All @@ -1212,57 +1128,6 @@ public function test_create_product_simple_creates_product_with_provided_product
$facebook_product_item_id = $this->integration->create_product_simple( $facebook_product, 'facebook-simple-product-group-id' );
}

/**
* Tests create simple product fails to create product group and returns empty product item id.
*
* @return void
*/
public function test_create_product_simple_with_failed_create_product_group_returns_empty_product_item() {
add_option( WC_Facebookcommerce_Integration::OPTION_PRODUCT_CATALOG_ID, '123456789101112' );

$product = WC_Helper_Product::create_simple_product();
$facebook_product = new WC_Facebook_Product( $product->get_id() );
$retailer_id = WC_Facebookcommerce_Utils::get_fb_retailer_id( $facebook_product );
$data = [
'retailer_id' => $retailer_id,
];
$this->api->expects( $this->once() )
->method( 'create_product_group' )
->with( '123456789101112', $data )
->willReturn( new API\ProductCatalog\ProductGroups\Create\Response( '{"error":{"message":"Unsupported post request. Object with ID \'4964146013695812\' does not exist, cannot be loaded due to missing permissions, or does not support this operation. Please read the Graph API documentation at https:\/\/developers.facebook.com\/docs\/graph-api","type":"GraphMethodException","code":100,"error_subcode":33,"fbtrace_id":"AtmMkt0H2dwNBhdRfcYqzVY"}}' ) );

$facebook_product_item_id = $this->integration->create_product_simple( $facebook_product );

$this->assertEquals( '', get_post_meta( $facebook_product->get_id(), WC_Facebookcommerce_Integration::FB_PRODUCT_GROUP_ID, true ) );
$this->assertEquals( '', get_post_meta( $facebook_product->get_id(), WC_Facebookcommerce_Integration::FB_PRODUCT_ITEM_ID, true ) );
$this->assertEquals( '', $facebook_product_item_id );
}

/**
* Tests create product group fpr product w/o variants.
*
* @return void
*/
public function test_create_product_group_creates_group_no_variants() {
add_option( WC_Facebookcommerce_Integration::OPTION_PRODUCT_CATALOG_ID, '123456789101112' );

$product = WC_Helper_Product::create_simple_product();
$facebook_product = new WC_Facebook_Product( $product->get_id() );
$retailer_id = 'product-retailer-id';
$data = [
'retailer_id' => $retailer_id,
];
$this->api->expects( $this->once() )
->method( 'create_product_group' )
->with( '123456789101112', $data )
->willReturn( new API\ProductCatalog\ProductGroups\Create\Response( '{"id":"facebook-product-group-id"}' ) );

$facebook_product_group_id = $this->integration->create_product_group( $facebook_product, $retailer_id );

$this->assertEquals( 'facebook-product-group-id', $facebook_product_group_id );
$this->assertEquals( 'facebook-product-group-id', get_post_meta( $facebook_product->get_id(), WC_Facebookcommerce_Integration::FB_PRODUCT_GROUP_ID, true ) );
}

/**
* Tests create product group for product with variants.
*
Expand Down Expand Up @@ -1297,11 +1162,13 @@ public function test_create_product_group_creates_group_with_variants() {
public function test_create_product_group_fails_to_create_group() {
add_option( WC_Facebookcommerce_Integration::OPTION_PRODUCT_CATALOG_ID, '123456789101112' );

$product = WC_Helper_Product::create_simple_product();
$product = WC_Helper_Product::create_variation_product();
$facebook_product = new WC_Facebook_Product( $product->get_id() );
add_post_meta( $facebook_product->get_id(), WC_Facebookcommerce_Integration::FB_PRODUCT_GROUP_ID, 'facebook-product-group-id' );
$retailer_id = 'product-retailer-id';
$data = [
'retailer_id' => $retailer_id,
'variants' => $facebook_product->prepare_variants_for_group(),
];
$this->api->expects( $this->once() )
->method( 'create_product_group' )
Expand Down