diff --git a/tests/performance/config.js b/tests/performance/config.js index e700bf777ba..38dbde52cd1 100644 --- a/tests/performance/config.js +++ b/tests/performance/config.js @@ -38,6 +38,8 @@ export const product_url = __ENV.P_URL || 'beanie'; export const product_id = __ENV.P_ID || '13'; export const product_search_term = __ENV.P_TERM || 'beanie'; +export const coupon_code = 'testing'; + export const add_product_title = 'Test Product'; export const add_product_regular_price = '12'; diff --git a/tests/performance/requests/shopper/cart-apply-coupon.js b/tests/performance/requests/shopper/cart-apply-coupon.js new file mode 100644 index 00000000000..c0c04df8afc --- /dev/null +++ b/tests/performance/requests/shopper/cart-apply-coupon.js @@ -0,0 +1,153 @@ +import { sleep, check, group } from "k6"; +import http from "k6/http"; +import { Trend } from "k6/metrics"; +import { randomIntBetween } from "https://jslib.k6.io/k6-utils/1.1.0/index.js"; +import { findBetween } from "https://jslib.k6.io/k6-utils/1.1.0/index.js"; +import { + base_url, + product_sku, + product_id, + coupon_code, + think_time_min, + think_time_max, +} from "../../config.js"; +import { + htmlRequestHeader, + jsonRequestHeader, + commonRequestHeaders, + commonGetRequestHeaders, + commonPostRequestHeaders, + commonNonStandardHeaders, + contentTypeRequestHeader, +} from "../../headers.js"; + +// Custom metrics to add to standard results output. +let addToCartTrend = new Trend("wc_post_wc-ajax_add_to_cart"); +let viewCartTrend = new Trend("wc_get_cart"); +let applyCouponTrend = new Trend("wc_post_wc-ajax_apply_coupon"); +let applyCouponCartTrend = new Trend("wc_post_cart"); + +export function cartApplyCoupon() { + let response; + let apply_coupon_nonce; + let item_name; + let woocommerce_cart_nonce; + + group("Product Page Add to cart", function () { + var requestheaders = Object.assign({}, + jsonRequestHeader, + commonRequestHeaders, + commonPostRequestHeaders, + commonNonStandardHeaders + ); + + response = http.post( + `${base_url}/?wc-ajax=add_to_cart`, + { + product_sku: `${product_sku}`, + product_id: `${product_id}`, + quantity: "1", + }, + { + headers: requestheaders, + } + ); + addToCartTrend.add(response.timings.duration); + check(response, { + "is status 200": (r) => r.status === 200, + }); + }); + + sleep(randomIntBetween(`${think_time_min}`, `${think_time_max}`)); + + group("View Cart", function () { + var requestheaders = Object.assign({}, + htmlRequestHeader, + commonRequestHeaders, + commonGetRequestHeaders, + commonNonStandardHeaders + ); + + response = http.get(`${base_url}/cart`, { + headers: requestheaders, + }); + viewCartTrend.add(response.timings.duration); + check(response, { + "is status 200": (r) => r.status === 200, + "body does not contain: 'your cart is currently empty'": ( + response + ) => !response.body.includes("Your cart is currently empty."), + }); + + // Correlate cart item value for use in subsequent requests. + apply_coupon_nonce = findBetween( + response.body, + 'apply_coupon_nonce":"', + '","' + ); + item_name = findBetween( + response.body, + 'name="cart[', + '][qty]' + ); + woocommerce_cart_nonce = response + .html() + .find("input[name=woocommerce-cart-nonce]") + .first() + .attr("value"); + }); + + sleep(randomIntBetween(`${think_time_min}`, `${think_time_max}`)); + + group("Apply Coupon", function () { + var requestheaders = Object.assign({}, + jsonRequestHeader, + commonRequestHeaders, + commonPostRequestHeaders, + commonNonStandardHeaders, + contentTypeRequestHeader + ); + + response = http.post( + `${base_url}/?wc-ajax=apply_coupon`, + { + coupon_code: `${coupon_code}`, + security: `${apply_coupon_nonce}`, + }, + { + headers: requestheaders, + } + ); + + applyCouponTrend.add(response.timings.duration); + check(response, { + "is status 200": (r) => r.status === 200, + "body contains: 'Coupon code applied successfully'": (response) => + response.body.includes("Coupon code applied successfully"), + }); + + response = http.post(`${base_url}/cart`, + { + _wp_http_referer: "%2Fcart", + //"cart["+`${item_name}`+"][qty]": "1", + coupon_code: "", + "woocommerce-cart-nonce": `${woocommerce_cart_nonce}`, + }, + { + headers: requestheaders, + } + ); + applyCouponCartTrend.add(response.timings.duration); + check(response, { + "is status 200": (r) => r.status === 200, + "body contains: 'woocommerce-remove-coupon' class": (response) => + response.body.includes('class="woocommerce-remove-coupon"'), + }); + }); + + sleep(randomIntBetween(`${think_time_min}`, `${think_time_max}`)); +} + +export default function () { + cartApplyCoupon(); +}