set_code( $string_code_1 ); $coupon_1->save(); // Coupon with a string code that is the same as coupon 1's ID. $coupon_2 = new WC_Coupon(); $coupon_2->set_code( (string) $coupon_1->get_id() ); $coupon_2->save(); $int_id_1 = $coupon_1->get_id(); $int_id_2 = $coupon_2->get_id(); $string_code_2 = $coupon_2->get_code(); // Test getting a coupon by integer ID. $test_coupon = new WC_Coupon( $int_id_1 ); $this->assertEquals( $int_id_1, $test_coupon->get_id() ); $test_coupon = new WC_Coupon( $int_id_2 ); $this->assertEquals( $int_id_2, $test_coupon->get_id() ); // Test getting a coupon by string code. $test_coupon = new WC_Coupon( $string_code_1 ); $this->assertEquals( $string_code_1, $test_coupon->get_code() ); $test_coupon = new WC_Coupon( $string_code_2 ); $this->assertEquals( $string_code_2, $test_coupon->get_code() ); // Test getting a coupon by string id. // Required for backwards compatibility, but will try and initialize coupon by code if possible first. $test_coupon = new WC_Coupon( (string) $coupon_2->get_id() ); $this->assertEquals( $coupon_2->get_id(), $test_coupon->get_id() ); // Test getting a coupon by coupon object $test_coupon = new WC_Coupon( $coupon_1 ); $this->assertEquals( $test_coupon->get_id(), $coupon_1->get_id() ); } /** * Test add_discount method. * * @since 2.3 */ public function test_add_discount() { // Create coupon $coupon = WC_Helper_Coupon::create_coupon(); // Add coupon, test return statement $this->assertTrue( WC()->cart->add_discount( $coupon->get_code() ) ); // Test if total amount of coupons is 1 $this->assertEquals( 1, count( WC()->cart->get_applied_coupons() ) ); // Clean up the cart WC()->cart->empty_cart(); // Remove coupons WC()->cart->remove_coupons(); // Delete coupon WC_Helper_Coupon::delete_coupon( $coupon->get_id() ); } /** * Test add_discount method. * * @since 2.3 */ public function test_add_discount_duplicate() { // Create coupon $coupon = WC_Helper_Coupon::create_coupon(); // Add coupon $this->assertTrue( WC()->cart->add_discount( $coupon->get_code() ) ); // Add coupon again, test return statement $this->assertFalse( WC()->cart->add_discount( $coupon->get_code() ) ); // Test if total amount of coupons is 1 $this->assertEquals( 1, count( WC()->cart->get_applied_coupons() ) ); // Clearing WC notices wc_clear_notices(); // Clean up the cart WC()->cart->empty_cart(); // Remove coupons WC()->cart->remove_coupons(); // Delete coupon WC_Helper_Coupon::delete_coupon( $coupon->get_id() ); } /** * Test fixed cart discount method. * * @since 2.3 */ public function test_fixed_cart_discount() { // Create product $product = WC_Helper_Product::create_simple_product(); update_post_meta( $product->get_id(), '_price', '10' ); update_post_meta( $product->get_id(), '_regular_price', '10' ); // Create coupon $coupon = WC_Helper_Coupon::create_coupon(); update_post_meta( $coupon->get_id(), 'discount_type', 'fixed_cart' ); update_post_meta( $coupon->get_id(), 'coupon_amount', '5' ); // Create a flat rate method WC_Helper_Shipping::create_simple_flat_rate(); // We need this to have the calculate_totals() method calculate totals if ( ! defined( 'WOOCOMMERCE_CHECKOUT' ) ) { define( 'WOOCOMMERCE_CHECKOUT', true ); } // Add product to cart WC()->cart->add_to_cart( $product->get_id(), 1 ); // Add coupon WC()->cart->add_discount( $coupon->get_code() ); // Set the flat_rate shipping method WC()->session->set( 'chosen_shipping_methods', array( 'flat_rate' ) ); WC()->cart->calculate_totals(); // Test if the cart total amount is equal 15 $this->assertEquals( 15, WC()->cart->total ); // Clearing WC notices wc_clear_notices(); // Clean up the cart WC()->cart->empty_cart(); // Remove coupons WC()->cart->remove_coupons(); // Delete the flat rate method WC()->session->set( 'chosen_shipping_methods', array() ); WC_Helper_Shipping::delete_simple_flat_rate(); // Delete coupon WC_Helper_Coupon::delete_coupon( $coupon->get_id() ); // Delete product WC_Helper_Product::delete_product( $product->get_id() ); } /** * Test fixed product discount method. * * @since 2.3 */ public function test_fixed_product_discount() { // Create product $product = WC_Helper_Product::create_simple_product(); update_post_meta( $product->get_id(), '_price', '10' ); update_post_meta( $product->get_id(), '_regular_price', '10' ); // Create coupon $coupon = WC_Helper_Coupon::create_coupon(); update_post_meta( $coupon->get_id(), 'discount_type', 'fixed_product' ); update_post_meta( $coupon->get_id(), 'coupon_amount', '5' ); // Create a flat rate method - $10 WC_Helper_Shipping::create_simple_flat_rate(); // We need this to have the calculate_totals() method calculate totals if ( ! defined( 'WOOCOMMERCE_CHECKOUT' ) ) { define( 'WOOCOMMERCE_CHECKOUT', true ); } // Add fee - $10 WC_Helper_Fee::add_cart_fee(); // Add product to cart WC()->cart->add_to_cart( $product->get_id(), 1 ); // Add coupon WC()->cart->add_discount( $coupon->get_code() ); // Set the flat_rate shipping method WC()->session->set( 'chosen_shipping_methods', array( 'flat_rate' ) ); WC()->cart->calculate_totals(); // Test if the cart total amount is equal 25 $this->assertEquals( 25, WC()->cart->total ); // Clearing WC notices wc_clear_notices(); // Clean up the cart WC()->cart->empty_cart(); // Remove coupons WC()->cart->remove_coupons(); // Remove fee WC_Helper_Fee::remove_cart_fee(); // Delete the flat rate method WC()->session->set( 'chosen_shipping_methods', array() ); WC_Helper_Shipping::delete_simple_flat_rate(); // Delete coupon WC_Helper_Coupon::delete_coupon( $coupon->get_id() ); // Delete product WC_Helper_Product::delete_product( $product->get_id() ); } /** * Test percent product discount method. * * @since 2.3 */ public function test_percent_discount() { // Create product $product = WC_Helper_Product::create_simple_product(); update_post_meta( $product->get_id(), '_price', '10' ); update_post_meta( $product->get_id(), '_regular_price', '10' ); // Create coupon $coupon = WC_Helper_Coupon::create_coupon(); update_post_meta( $coupon->get_id(), 'discount_type', 'percent' ); update_post_meta( $coupon->get_id(), 'coupon_amount', '5' ); // Create a flat rate method WC_Helper_Shipping::create_simple_flat_rate(); // We need this to have the calculate_totals() method calculate totals if ( ! defined( 'WOOCOMMERCE_CHECKOUT' ) ) { define( 'WOOCOMMERCE_CHECKOUT', true ); } // Add fee WC_Helper_Fee::add_cart_fee(); // Add product to cart WC()->cart->add_to_cart( $product->get_id(), 1 ); // Add coupon WC()->cart->add_discount( $coupon->get_code() ); // Set the flat_rate shipping method WC()->session->set( 'chosen_shipping_methods', array( 'flat_rate' ) ); WC()->cart->calculate_totals(); // Test if the cart total amount is equal 29.5 $this->assertEquals( 29.5, WC()->cart->total ); // Clearing WC notices wc_clear_notices(); // Clean up the cart WC()->cart->empty_cart(); // Remove coupons WC()->cart->remove_coupons(); // Remove fee WC_Helper_Fee::remove_cart_fee(); // Delete the flat rate method WC()->session->set( 'chosen_shipping_methods', array() ); WC_Helper_Shipping::delete_simple_flat_rate(); // Delete coupon WC_Helper_Coupon::delete_coupon( $coupon->get_id() ); // Delete product WC_Helper_Product::delete_product( $product->get_id() ); } /** * Test date setters/getters. * * @since 3.0.0 */ public function test_dates() { $valid_coupon = WC_Helper_Coupon::create_coupon(); $valid_coupon->set_date_expires( time() + 1000 ); $valid_coupon->set_date_created( time() ); $valid_coupon->set_date_modified( time() ); $expired_coupon = WC_Helper_Coupon::create_coupon(); $expired_coupon->set_date_expires( time() - 10 ); $expired_coupon->set_date_created( time() - 20 ); $expired_coupon->set_date_modified( time() - 20 ); $this->assertInstanceOf( 'WC_DateTime', $valid_coupon->get_date_created() ); $this->assertTrue( $valid_coupon->is_valid() ); $this->assertFalse( $expired_coupon->is_valid() ); $this->assertEquals( $expired_coupon->get_error_message(), $expired_coupon->get_coupon_error( WC_Coupon::E_WC_COUPON_EXPIRED ) ); } /** * Test an item limit for percent discounts. */ public function test_percent_discount_item_limit() { // Create product $product = WC_Helper_Product::create_simple_product(); update_post_meta( $product->get_id(), '_price', '10' ); update_post_meta( $product->get_id(), '_regular_price', '10' ); // Create coupon $coupon = WC_Helper_Coupon::create_coupon( 'dummycoupon', array( 'discount_type' => 'percent', 'coupon_amount' => '5', 'limit_usage_to_x_items' => 1, ) ); // We need this to have the calculate_totals() method calculate totals. if ( ! defined( 'WOOCOMMERCE_CHECKOUT' ) ) { define( 'WOOCOMMERCE_CHECKOUT', true ); } // Add 2 products and coupon to cart. WC()->cart->add_to_cart( $product->get_id(), 2 ); WC()->cart->add_discount( $coupon->get_code() ); WC()->cart->calculate_totals(); // Test if the cart total amount is equal 19.5 (coupon only applying to one item). $this->assertEquals( 19.5, WC()->cart->total ); // Clean up wc_clear_notices(); WC()->cart->empty_cart(); WC()->cart->remove_coupons(); WC_Helper_Coupon::delete_coupon( $coupon->get_id() ); WC_Helper_Product::delete_product( $product->get_id() ); } public function test_custom_discount_item_limit() { // Register custom discount type. WC_Helper_Coupon::register_custom_type( __FUNCTION__ ); // Create product $product = WC_Helper_Product::create_simple_product(); update_post_meta( $product->get_id(), '_price', '10' ); update_post_meta( $product->get_id(), '_regular_price', '10' ); // Create coupon $coupon = WC_Helper_Coupon::create_coupon( 'dummycoupon', array( 'discount_type' => __FUNCTION__, 'coupon_amount' => '5', 'limit_usage_to_x_items' => 1, ) ); // We need this to have the calculate_totals() method calculate totals. if ( ! defined( 'WOOCOMMERCE_CHECKOUT' ) ) { define( 'WOOCOMMERCE_CHECKOUT', true ); } // Add 4 products and coupon to cart. WC()->cart->add_to_cart( $product->get_id(), 4 ); WC()->cart->add_discount( $coupon->get_code() ); WC()->cart->calculate_totals(); // Test if the cart total amount is equal 39.5 (coupon only applying to one item). $this->assertEquals( 39.5, WC()->cart->total ); // Clean up wc_clear_notices(); WC()->cart->empty_cart(); WC()->cart->remove_coupons(); WC_Helper_Coupon::delete_coupon( $coupon->get_id() ); WC_Helper_Product::delete_product( $product->get_id() ); WC_Helper_Coupon::unregister_custom_type( __FUNCTION__ ); } }