Skip to content

Commit

Permalink
Merge 9ce7253 into f4b53a5
Browse files Browse the repository at this point in the history
  • Loading branch information
kidunot89 committed May 7, 2019
2 parents f4b53a5 + 9ce7253 commit c43471b
Show file tree
Hide file tree
Showing 8 changed files with 203 additions and 10 deletions.
2 changes: 2 additions & 0 deletions src/class-actions.php
Expand Up @@ -60,6 +60,7 @@
use WPGraphQL\Extensions\WooCommerce\Mutation\Cart_Empty;
use WPGraphQL\Extensions\WooCommerce\Mutation\Cart_Apply_Coupon;
use WPGraphQL\Extensions\WooCommerce\Mutation\Cart_Remove_Coupon;
use WPGraphQL\Extensions\WooCommerce\Mutation\Cart_Add_Fee;

/**
* Class Actions
Expand Down Expand Up @@ -141,5 +142,6 @@ public static function graphql_register_types() {
Cart_Empty::register_mutation();
Cart_Apply_Coupon::register_mutation();
Cart_Remove_Coupon::register_mutation();
Cart_Add_Fee::register_mutation();
}
}
22 changes: 21 additions & 1 deletion src/data/mutation/class-cart-mutation.php
Expand Up @@ -13,7 +13,7 @@
*/
class Cart_Mutation {
/**
* Return array of data to be when defining a cart item
* Return array of data to be when defining a cart item.
*
* @param array $input input data describing cart item.
* @param AppContext $context AppContext instance.
Expand All @@ -32,4 +32,24 @@ public static function prepare_cart_item( $input, $context, $info ) {

return apply_filters( 'woocommerce_new_cart_item_data', $cart_item_args, $input, $context, $info );
}

/**
* Return array of data to be when defining a cart fee.
*
* @param array $input input data describing cart item.
* @param AppContext $context AppContext instance.
* @param ResolveInfo $info query info.
*
* @return array
*/
public static function prepare_cart_fee( $input, $context, $info ) {
$cart_item_args = array(
$input['name'],
$input['amount'],
! empty( $input['taxable'] ) ? $input['taxable'] : false,
! empty( $input['taxClass'] ) ? $input['taxClass'] : '',
);

return apply_filters( 'woocommerce_new_cart_fee_data', $cart_item_args, $input, $context, $info );
}
}
106 changes: 106 additions & 0 deletions src/mutation/class-cart-add-fee.php
@@ -0,0 +1,106 @@
<?php
/**
* Mutation - addFee
*
* Registers mutation for add an additional fee to 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;
use WPGraphQL\Extensions\WooCommerce\Data\Mutation\Cart_Mutation;

/**
* Class - Cart_Add_Fee
*/
class Cart_Add_Fee {
/**
* Registers mutation
*/
public static function register_mutation() {
register_graphql_mutation(
'addFee',
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(
'name' => array(
'type' => array( 'non_null' => 'String' ),
'description' => __( 'Unique name for the fee.', 'wp-graphql-woocommerce' ),
),
'amount' => array(
'type' => 'Float',
'description' => __( 'Fee amount', 'wp-graphql-woocommerce' ),
),
'taxable' => array(
'type' => 'Boolean',
'description' => __( 'Is the fee taxable?', 'wp-graphql-woocommerce' ),
),
'taxClass' => array(
'type' => 'TaxClassEnum',
'description' => __( 'The tax class for the fee if taxable.', 'wp-graphql-woocommerce' ),
),
);

return $input_fields;
}

/**
* Defines the mutation output field configuration
*
* @return array
*/
public static function get_output_fields() {
return array(
'cartFee' => array(
'type' => 'CartFee',
'resolve' => function ( $payload ) {
$fees = \WC()->cart->get_fees();
return $fees[ $payload['id'] ];
},
),
);
}

/**
* 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['name'] ) ) {
throw new UserError( __( 'No name provided for fee', 'wp-graphql-woocommerce' ) );
}
if ( ! isset( $input['amount'] ) ) {
throw new UserError( __( 'No amount set for the fee', 'wp-graphql-woocommerce' ) );
}

// Get cart fee args.
$cart_fee_args = Cart_Mutation::prepare_cart_fee( $input, $context, $info );

// Add cart fee.
\WC()->cart->add_fee( ...$cart_fee_args );

// Return payload.
return array( 'id' => \sanitize_title( $input['name'] ) );
};
}
}
63 changes: 63 additions & 0 deletions tests/wpunit/CartMutationsTest.php
Expand Up @@ -5,6 +5,7 @@ class CartMutationsTest extends \Codeception\TestCase\WPTestCase {
private $coupon;
private $product;
private $variation;
private $cart;

public function setUp() {
parent::setUp();
Expand All @@ -13,6 +14,7 @@ public function setUp() {
$this->coupon = $this->getModule('\Helper\Wpunit')->coupon();
$this->product = $this->getModule('\Helper\Wpunit')->product();
$this->variation = $this->getModule('\Helper\Wpunit')->product_variation();
$this->cart = $this->getModule('\Helper\Wpunit')->cart();
}

public function tearDown() {
Expand Down Expand Up @@ -591,4 +593,65 @@ public function testRemoveCouponMutation() {

$this->assertEqualSets( $expected, $actual );
}

public function testAddFeeMutation() {
$cart = WC()->cart;

// Create product and coupon.
$product_id = $this->product->create_simple();
$coupon_code = wc_get_coupon_code_by_id(
$this->coupon->create(
array( 'product_ids' => array( $product_id ) )
)
);

// Add item and coupon to cart.
$cart->add_to_cart( $product_id, 3 );
$cart->apply_coupon( $coupon_code );

$mutation = '
mutation addFee( $input: AddFeeInput! ) {
addFee( input: $input ) {
clientMutationId
cartFee {
id
name
taxClass
taxable
amount
total
}
}
}
';

$variables = array(
'input' => array(
'clientMutationId' => 'someId',
'name' => 'extra_fee',
'amount' => 49.99,
),
);
$actual = graphql(
array(
'query' => $mutation,
'operation_name' => 'addFee',
'variables' => $variables,
)
);

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

$expected = array(
'data' => array(
'addFee' => array(
'clientMutationId' => 'someId',
'cartFee' => $this->cart->print_fee_query( 'extra_fee' ),
),
),
);

$this->assertEqualSets( $expected, $actual );
}
}
2 changes: 1 addition & 1 deletion vendor/autoload.php
Expand Up @@ -4,4 +4,4 @@

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

return ComposerAutoloaderInitb86120d91acd1402be294c91a0f7a14a::getLoader();
return ComposerAutoloaderInit06470672ea9b323ccc46fe10fea7d4d7::getLoader();
1 change: 1 addition & 0 deletions vendor/composer/autoload_classmap.php
Expand Up @@ -51,6 +51,7 @@
'WPGraphQL\\Extensions\\WooCommerce\\Model\\Shipping_Method' => $baseDir . '/src/model/class-shipping-method.php',
'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_Fee' => $baseDir . '/src/mutation/class-cart-add-fee.php',
'WPGraphQL\\Extensions\\WooCommerce\\Mutation\\Cart_Add_Item' => $baseDir . '/src/mutation/class-cart-add-item.php',
'WPGraphQL\\Extensions\\WooCommerce\\Mutation\\Cart_Apply_Coupon' => $baseDir . '/src/mutation/class-cart-apply-coupon.php',
'WPGraphQL\\Extensions\\WooCommerce\\Mutation\\Cart_Empty' => $baseDir . '/src/mutation/class-cart-empty.php',
Expand Down
8 changes: 4 additions & 4 deletions vendor/composer/autoload_real.php
Expand Up @@ -2,7 +2,7 @@

// autoload_real.php @generated by Composer

class ComposerAutoloaderInitb86120d91acd1402be294c91a0f7a14a
class ComposerAutoloaderInit06470672ea9b323ccc46fe10fea7d4d7
{
private static $loader;

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

spl_autoload_register(array('ComposerAutoloaderInitb86120d91acd1402be294c91a0f7a14a', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInit06470672ea9b323ccc46fe10fea7d4d7', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
spl_autoload_unregister(array('ComposerAutoloaderInitb86120d91acd1402be294c91a0f7a14a', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInit06470672ea9b323ccc46fe10fea7d4d7', '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\ComposerStaticInitb86120d91acd1402be294c91a0f7a14a::getInitializer($loader));
call_user_func(\Composer\Autoload\ComposerStaticInit06470672ea9b323ccc46fe10fea7d4d7::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
Expand Up @@ -4,7 +4,7 @@

namespace Composer\Autoload;

class ComposerStaticInitb86120d91acd1402be294c91a0f7a14a
class ComposerStaticInit06470672ea9b323ccc46fe10fea7d4d7
{
public static $prefixLengthsPsr4 = array (
'W' =>
Expand Down Expand Up @@ -66,6 +66,7 @@ class ComposerStaticInitb86120d91acd1402be294c91a0f7a14a
'WPGraphQL\\Extensions\\WooCommerce\\Model\\Shipping_Method' => __DIR__ . '/../..' . '/src/model/class-shipping-method.php',
'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_Fee' => __DIR__ . '/../..' . '/src/mutation/class-cart-add-fee.php',
'WPGraphQL\\Extensions\\WooCommerce\\Mutation\\Cart_Add_Item' => __DIR__ . '/../..' . '/src/mutation/class-cart-add-item.php',
'WPGraphQL\\Extensions\\WooCommerce\\Mutation\\Cart_Apply_Coupon' => __DIR__ . '/../..' . '/src/mutation/class-cart-apply-coupon.php',
'WPGraphQL\\Extensions\\WooCommerce\\Mutation\\Cart_Empty' => __DIR__ . '/../..' . '/src/mutation/class-cart-empty.php',
Expand Down Expand Up @@ -108,9 +109,9 @@ class ComposerStaticInitb86120d91acd1402be294c91a0f7a14a
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInitb86120d91acd1402be294c91a0f7a14a::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInitb86120d91acd1402be294c91a0f7a14a::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInitb86120d91acd1402be294c91a0f7a14a::$classMap;
$loader->prefixLengthsPsr4 = ComposerStaticInit06470672ea9b323ccc46fe10fea7d4d7::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit06470672ea9b323ccc46fe10fea7d4d7::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInit06470672ea9b323ccc46fe10fea7d4d7::$classMap;

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

0 comments on commit c43471b

Please sign in to comment.