Skip to content

Commit

Permalink
Merge pull request wp-graphql#57 from kidunot89/feature/remove-item-f…
Browse files Browse the repository at this point in the history
…rom-cart-mutation

removeItemFromCart mutation
  • Loading branch information
kidunot89 committed May 3, 2019
2 parents bd1d365 + 94eb026 commit ec9058d
Show file tree
Hide file tree
Showing 7 changed files with 180 additions and 9 deletions.
2 changes: 2 additions & 0 deletions src/class-actions.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
use WPGraphQL\Extensions\WooCommerce\Connection\Shipping_Methods;
use WPGraphQL\Extensions\WooCommerce\Connection\Cart_Items;
use WPGraphQL\Extensions\WooCommerce\Mutation\Cart_Add_Item;
use WPGraphQL\Extensions\WooCommerce\Mutation\Cart_Remove_Item;

/**
* Class Actions
Expand Down Expand Up @@ -131,5 +132,6 @@ public static function graphql_register_types() {

// Mutations.
Cart_Add_Item::register_mutation();
Cart_Remove_Item::register_mutation();
}
}
95 changes: 95 additions & 0 deletions src/mutation/class-cart-remove-item.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
<?php
/**
* Mutation - removeItemFromCart
*
* Registers mutation for removing a cart item from the cart.
*
* @package WPGraphQL\Extensions\WooCommerce\Mutation
* @since 0.1.0
*/

namespace WPGraphQL\Extensions\WooCommerce\Mutation;

use GraphQL\Error\UserError;
use GraphQL\Type\Definition\ResolveInfo;
use WPGraphQL\AppContext;

/**
* Class - Cart_Remove_Item
*/
class Cart_Remove_Item {
/**
* Registers mutation
*/
public static function register_mutation() {
register_graphql_mutation(
'removeItemFromCart',
array(
'inputFields' => self::get_input_fields(),
'outputFields' => self::get_output_fields(),
'mutateAndGetPayload' => self::mutate_and_get_payload(),
)
);
}

/**
* Defines the mutation input field configuration
*
* @return array
*/
public static function get_input_fields() {
$input_fields = array(
'key' => array(
'type' => array( 'non_null' => 'ID' ),
'description' => __( 'Cart item key of the item being removed', 'wp-graphql-woocommerce' ),
),
);

return $input_fields;
}

/**
* Defines the mutation output field configuration
*
* @return array
*/
public static function get_output_fields() {
return array(
'cartItem' => array(
'type' => 'CartItem',
'resolve' => function ( $item ) {
return $item;
},
),
);
}

/**
* Defines the mutation data modification closure.
*
* @return callable
*/
public static function mutate_and_get_payload() {
return function( $input, AppContext $context, ResolveInfo $info ) {
// Retrieve product database ID if relay ID provided.
if ( empty( $input['key'] ) ) {
throw new UserError( __( 'No cart item key provided', 'wp-graphql-woocommerce' ) );
}

// Get WC_Cart instance.
$cart = WC()->cart;

$cart_item = $cart->get_cart_item( $input['key'] );
if ( empty( $cart_item ) ) {
/* translators: Cart item not found message */
throw new UserError( sprintf( __( 'No cart item found with the key: %s', 'wp-graphql-woocommerce' ), $input['key'] ) );
}

// Add item to cart and get item key.
$cart->remove_cart_item( $input['key'] );

// Return payload.
return $cart_item;
};
}
}
72 changes: 72 additions & 0 deletions tests/wpunit/CartMutationsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -152,4 +152,76 @@ public function testAddToCartMutationWithProductVariation() {
);
$this->assertEqualSets( $expected, $actual );
}

public function testRemoveItemFromCartMutation() {
$ids = $this->variation->create( $this->product->create_variable() );
$cart = WC()->cart;
$cart_item = $cart->get_cart_item(
$cart->add_to_cart( $ids['product'], 2, $ids['variations'][0] )
);

$mutation = '
mutation removeItemFromCart( $input: RemoveItemFromCartInput! ) {
removeItemFromCart( input: $input ) {
clientMutationId
cartItem {
key
product {
id
}
variation {
id
}
quantity
subtotal
subtotalTax
total
tax
}
}
}
';

$variables = array(
'input' => array(
'clientMutationId' => 'someId',
'key' => $cart_item['key'],
),
);
$actual = graphql(
array(
'query' => $mutation,
'operation_name' => 'removeItemFromCart',
'variables' => $variables,
)
);

// use --debug flag to view.
codecept_debug( $actual );

$expected = array(
'data' => array(
'removeItemFromCart' => array(
'clientMutationId' => 'someId',
'cartItem' => array(
'key' => $cart_item['key'],
'product' => array(
'id' => $this->product->to_relay_id( $cart_item['product_id'] ),
),
'variation' => array(
'id' => $this->variation->to_relay_id( $cart_item['variation_id'] ),
),
'quantity' => $cart_item['quantity'],
'subtotal' => floatval( $cart_item['line_subtotal'] ),
'subtotalTax' => floatval( $cart_item['line_subtotal_tax'] ),
'total' => floatval( $cart_item['line_total'] ),
'tax' => floatval( $cart_item['line_tax'] ),
),
),
),
);

$this->assertEqualSets( $expected, $actual );
$this->assertEmpty( \WC()->cart->get_cart_item( $cart_item['key'] ) );
}
}
2 changes: 1 addition & 1 deletion vendor/autoload.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@

require_once __DIR__ . '/composer/autoload_real.php';

return ComposerAutoloaderInitced0ad5f23d05f710e81b6f8d889d8af::getLoader();
return ComposerAutoloaderInit65062e14ff260f49f0940e1a9ea00e57::getLoader();
1 change: 1 addition & 0 deletions vendor/composer/autoload_classmap.php
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
'WPGraphQL\\Extensions\\WooCommerce\\Model\\Shop_Manager_Caps' => $baseDir . '/src/model/trait-shop-manager-caps.php',
'WPGraphQL\\Extensions\\WooCommerce\\Model\\Tax_Rate' => $baseDir . '/src/model/class-tax-rate.php',
'WPGraphQL\\Extensions\\WooCommerce\\Mutation\\Cart_Add_Item' => $baseDir . '/src/mutation/class-cart-add-item.php',
'WPGraphQL\\Extensions\\WooCommerce\\Mutation\\Cart_Remove_Item' => $baseDir . '/src/mutation/class-cart-remove-item.php',
'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Backorders' => $baseDir . '/src/type/enum/class-backorders.php',
'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Catalog_Visibility' => $baseDir . '/src/type/enum/class-catalog-visibility.php',
'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Customer_Connection_Orderby_Enum' => $baseDir . '/src/type/enum/class-customer-connection-orderby-enum.php',
Expand Down
8 changes: 4 additions & 4 deletions vendor/composer/autoload_real.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

// autoload_real.php @generated by Composer

class ComposerAutoloaderInitced0ad5f23d05f710e81b6f8d889d8af
class ComposerAutoloaderInit65062e14ff260f49f0940e1a9ea00e57
{
private static $loader;

Expand All @@ -19,15 +19,15 @@ public static function getLoader()
return self::$loader;
}

spl_autoload_register(array('ComposerAutoloaderInitced0ad5f23d05f710e81b6f8d889d8af', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInit65062e14ff260f49f0940e1a9ea00e57', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
spl_autoload_unregister(array('ComposerAutoloaderInitced0ad5f23d05f710e81b6f8d889d8af', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInit65062e14ff260f49f0940e1a9ea00e57', 'loadClassLoader'));

$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
if ($useStaticLoader) {
require_once __DIR__ . '/autoload_static.php';

call_user_func(\Composer\Autoload\ComposerStaticInitced0ad5f23d05f710e81b6f8d889d8af::getInitializer($loader));
call_user_func(\Composer\Autoload\ComposerStaticInit65062e14ff260f49f0940e1a9ea00e57::getInitializer($loader));
} else {
$map = require __DIR__ . '/autoload_namespaces.php';
foreach ($map as $namespace => $path) {
Expand Down
9 changes: 5 additions & 4 deletions vendor/composer/autoload_static.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

namespace Composer\Autoload;

class ComposerStaticInitced0ad5f23d05f710e81b6f8d889d8af
class ComposerStaticInit65062e14ff260f49f0940e1a9ea00e57
{
public static $prefixLengthsPsr4 = array (
'W' =>
Expand Down Expand Up @@ -67,6 +67,7 @@ class ComposerStaticInitced0ad5f23d05f710e81b6f8d889d8af
'WPGraphQL\\Extensions\\WooCommerce\\Model\\Shop_Manager_Caps' => __DIR__ . '/../..' . '/src/model/trait-shop-manager-caps.php',
'WPGraphQL\\Extensions\\WooCommerce\\Model\\Tax_Rate' => __DIR__ . '/../..' . '/src/model/class-tax-rate.php',
'WPGraphQL\\Extensions\\WooCommerce\\Mutation\\Cart_Add_Item' => __DIR__ . '/../..' . '/src/mutation/class-cart-add-item.php',
'WPGraphQL\\Extensions\\WooCommerce\\Mutation\\Cart_Remove_Item' => __DIR__ . '/../..' . '/src/mutation/class-cart-remove-item.php',
'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Backorders' => __DIR__ . '/../..' . '/src/type/enum/class-backorders.php',
'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Catalog_Visibility' => __DIR__ . '/../..' . '/src/type/enum/class-catalog-visibility.php',
'WPGraphQL\\Extensions\\WooCommerce\\Type\\WPEnum\\Customer_Connection_Orderby_Enum' => __DIR__ . '/../..' . '/src/type/enum/class-customer-connection-orderby-enum.php',
Expand Down Expand Up @@ -103,9 +104,9 @@ class ComposerStaticInitced0ad5f23d05f710e81b6f8d889d8af
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInitced0ad5f23d05f710e81b6f8d889d8af::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInitced0ad5f23d05f710e81b6f8d889d8af::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInitced0ad5f23d05f710e81b6f8d889d8af::$classMap;
$loader->prefixLengthsPsr4 = ComposerStaticInit65062e14ff260f49f0940e1a9ea00e57::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit65062e14ff260f49f0940e1a9ea00e57::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInit65062e14ff260f49f0940e1a9ea00e57::$classMap;

}, null, ClassLoader::class);
}
Expand Down

0 comments on commit ec9058d

Please sign in to comment.