Merge pull request #31338 from woocommerce/fix/28166-coupon-item-meta-data

Consistently Store Coupon Data in Order Item Meta
This commit is contained in:
Peter Fabian 2021-12-07 18:35:08 +01:00 committed by GitHub
commit edcffa9912
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 178 additions and 123 deletions

View File

@ -35,7 +35,9 @@ describe('Coupons API tests', () => {
it( 'can retrieve a coupon', async () => { it( 'can retrieve a coupon', async () => {
const response = await couponsApi.retrieve.coupon( couponId ); const response = await couponsApi.retrieve.coupon( couponId );
expect(response.statusCode).toEqual(couponsApi.retrieve.responseCode); expect( response.statusCode ).toEqual(
couponsApi.retrieve.responseCode
);
expect( response.body.id ).toEqual( couponId ); expect( response.body.id ).toEqual( couponId );
} ); } );
@ -223,7 +225,9 @@ describe('Coupons API tests', () => {
const actualCouponIdsList = listedCoupons.map( ( { id } ) => id ); const actualCouponIdsList = listedCoupons.map( ( { id } ) => id );
const expectedCouponIdsList = allCoupons.map( ( { id } ) => id ); const expectedCouponIdsList = allCoupons.map( ( { id } ) => id );
expect(response.status).toEqual(couponsApi.listAll.responseCode); expect( response.status ).toEqual(
couponsApi.listAll.responseCode
);
expect( actualCouponIdsList ).toEqual( expect( actualCouponIdsList ).toEqual(
expect.arrayContaining( expectedCouponIdsList ) expect.arrayContaining( expectedCouponIdsList )
); );
@ -232,7 +236,9 @@ describe('Coupons API tests', () => {
it( 'can limit result set to matching code', async () => { it( 'can limit result set to matching code', async () => {
const matchingCoupon = allCoupons[ 1 ]; const matchingCoupon = allCoupons[ 1 ];
const payload = { code: matchingCoupon.code }; const payload = { code: matchingCoupon.code };
const { status, body } = await couponsApi.listAll.coupons(payload); const { status, body } = await couponsApi.listAll.coupons(
payload
);
expect( status ).toEqual( couponsApi.listAll.responseCode ); expect( status ).toEqual( couponsApi.listAll.responseCode );
expect( body ).toHaveLength( 1 ); expect( body ).toHaveLength( 1 );
@ -245,7 +251,9 @@ describe('Coupons API tests', () => {
page: 1, page: 1,
per_page: pageSize, per_page: pageSize,
}; };
const { status, body } = await couponsApi.listAll.coupons(payload); const { status, body } = await couponsApi.listAll.coupons(
payload
);
expect( status ).toEqual( couponsApi.listAll.responseCode ); expect( status ).toEqual( couponsApi.listAll.responseCode );
expect( body ).toHaveLength( pageSize ); expect( body ).toHaveLength( pageSize );
@ -259,7 +267,9 @@ describe('Coupons API tests', () => {
search: matchingString, search: matchingString,
}; };
const { status, body } = await couponsApi.listAll.coupons(payload); const { status, body } = await couponsApi.listAll.coupons(
payload
);
expect( status ).toEqual( couponsApi.listAll.responseCode ); expect( status ).toEqual( couponsApi.listAll.responseCode );
expect( body ).toHaveLength( 1 ); expect( body ).toHaveLength( 1 );
@ -302,6 +312,18 @@ describe('Coupons API tests', () => {
expect( status ).toEqual( ordersApi.create.responseCode ); expect( status ).toEqual( ordersApi.create.responseCode );
expect( body.coupon_lines ).toHaveLength( 1 ); expect( body.coupon_lines ).toHaveLength( 1 );
expect( body.coupon_lines[ 0 ].code ).toEqual( testCoupon.code ); expect( body.coupon_lines[ 0 ].code ).toEqual( testCoupon.code );
// Test that the coupon meta data exists.
// See: https://github.com/woocommerce/woocommerce/issues/28166.
expect( body.coupon_lines[ 0 ].meta_data ).toEqual(
expect.arrayContaining( [
expect.objectContaining( {
key: 'coupon_data',
value: expect.objectContaining( {
code: testCoupon.code,
} ),
} ),
] )
);
} ); } );
} ); } );
} ); } );

View File

@ -1323,6 +1323,16 @@ abstract class WC_Abstract_Order extends WC_Abstract_Legacy_Order {
if ( ! $item_id ) { if ( ! $item_id ) {
$coupon_item = new WC_Order_Item_Coupon(); $coupon_item = new WC_Order_Item_Coupon();
$coupon_item->set_code( $coupon_code ); $coupon_item->set_code( $coupon_code );
// Add coupon data.
$coupon_id = wc_get_coupon_id_by_code( $coupon_code );
$coupon = new WC_Coupon( $coupon_id );
// Avoid storing used_by - it's not needed and can get large.
$coupon_data = $coupon->get_data();
unset( $coupon_data['used_by'] );
$coupon_item->add_meta_data( 'coupon_data', $coupon_data );
} else { } else {
$coupon_item = $this->get_item( $item_id, false ); $coupon_item = $this->get_item( $item_id, false );
} }

View File

@ -246,4 +246,27 @@ class WC_Abstract_Order_Test extends WC_Unit_Test_Case {
$this->assertEquals( 0, ( new WC_Coupon( $coupon_code_2 ) )->get_usage_count() ); $this->assertEquals( 0, ( new WC_Coupon( $coupon_code_2 ) )->get_usage_count() );
$this->assertEquals( 0, ( new WC_Coupon( $coupon_code_3 ) )->get_usage_count() ); $this->assertEquals( 0, ( new WC_Coupon( $coupon_code_3 ) )->get_usage_count() );
} }
/**
* Test apply_coupon() stores coupon meta data.
* See: https://github.com/woocommerce/woocommerce/issues/28166.
*/
public function test_apply_coupon_stores_meta_data() {
$coupon_code = 'coupon_test_meta_data';
$coupon = WC_Helper_Coupon::create_coupon( $coupon_code );
$order = WC_Helper_Order::create_order();
$order->set_status( 'processing' );
$order->save();
$order->apply_coupon( $coupon_code );
$coupon_items = $order->get_items( 'coupon' );
$this->assertCount( 1, $coupon_items );
$coupon_data = ( current( $coupon_items ) )->get_meta( 'coupon_data' );
$this->assertNotEmpty( $coupon_data, 'WC_Order_Item_Coupon missing `coupon_data` meta.' );
$this->assertArrayHasKey( 'id', $coupon_data );
$this->assertArrayHasKey( 'code', $coupon_data );
$this->assertEquals( $coupon->get_id(), $coupon_data['id'] );
$this->assertEquals( $coupon_code, $coupon_data['code'] );
}
} }