diff --git a/docker-compose.local.yml b/docker-compose.local.yml index ba7cc4f..05feeec 100644 --- a/docker-compose.local.yml +++ b/docker-compose.local.yml @@ -1,5 +1,3 @@ -version: '3.4' - services: k6: container_name: "loadtesting_environment" diff --git a/docker-compose.yml b/docker-compose.yml index a710f6d..75c6558 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,3 @@ -version: '3.4' - services: k6: container_name: "loadtesting_environment" diff --git a/helpers/auth-token-manager.js b/helpers/auth-token-manager.js new file mode 100644 index 0000000..bdfe68a --- /dev/null +++ b/helpers/auth-token-manager.js @@ -0,0 +1,63 @@ +export class AuthTokenManager { + constructor(http, urlHelper, assertionsHelper) { + if (AuthTokenManager.instance) { + return AuthTokenManager.instance; + } + + if (!http || !urlHelper || !assertionsHelper) { + throw new Error('Http, UrlHelper, and AssertionsHelper must be provided.'); + } + + this.http = http; + this.urlHelper = urlHelper; + this.assertionsHelper = assertionsHelper; + + // Token cache: { ':': 'Bearer ' } + this.tokenCache = {}; + + AuthTokenManager.instance = this; + } + + static getInstance(http, urlHelper, assertionsHelper) { + if (!AuthTokenManager.instance) { + AuthTokenManager.instance = new AuthTokenManager(http, urlHelper, assertionsHelper); + } + return AuthTokenManager.instance; + } + + getAuthToken(email, password) { + const cacheKey = `${email}:${password}`; + + // Return cached token if exists + if (this.tokenCache[cacheKey]) { + return this.tokenCache[cacheKey]; + } + + // Fetch new token from the API + const urlAccessTokens = `${this.urlHelper.getStorefrontApiBaseUrl()}/access-tokens`; + const response = this.http.sendPostRequest( + this.http.url`${urlAccessTokens}`, + JSON.stringify({ + data: { + type: 'access-tokens', + attributes: { + username: email, + password: password, + }, + }, + }), + { headers: { Accept: 'application/json' } }, + false + ); + + this.assertionsHelper.assertResponseStatus(response, 201, 'Auth Token'); + + const responseJson = JSON.parse(response.body); + this.assertionsHelper.assertSingleResourceResponseBodyStructure(responseJson, 'Auth Token'); + + const token = `${responseJson.data.attributes.tokenType} ${responseJson.data.attributes.accessToken}`; + this.tokenCache[cacheKey] = token; + + return token; + } +} diff --git a/helpers/cart-helper.js b/helpers/cart-helper.js index 992a91f..05ba966 100644 --- a/helpers/cart-helper.js +++ b/helpers/cart-helper.js @@ -1,9 +1,10 @@ export class CartHelper { - constructor(urlHelper, http, customerHelper, assertionsHelper) { + constructor(urlHelper, http, customerHelper, assertionsHelper, authTokenManager) { this.urlHelper = urlHelper; this.http = http; this.customerHelper = customerHelper; this.assertionsHelper = assertionsHelper; + this.authTokenManager = authTokenManager; } haveCartWithProducts(quantity = 1, sku = '100429') { @@ -48,28 +49,8 @@ export class CartHelper { 'Accept': 'application/json' }, }; - const urlAccessTokens = `${this.urlHelper.getStorefrontApiBaseUrl()}/access-tokens`; - const response = this.http.sendPostRequest( - this.http.url`${urlAccessTokens}`, - JSON.stringify({ - data: { - type: 'access-tokens', - attributes: { - username: email, - password: password - } - } - }), - defaultParams, - false - ); - this.assertionsHelper.assertResponseStatus(response, 201, 'Auth Token'); - - const responseJson = JSON.parse(response.body); - this.assertionsHelper.assertSingleResourceResponseBodyStructure(responseJson, 'Auth Token'); - - defaultParams.headers.Authorization = `${responseJson.data.attributes.tokenType} ${responseJson.data.attributes.accessToken}`; + defaultParams.headers.Authorization = this.authTokenManager.getAuthToken(email, password); return defaultParams; } @@ -78,8 +59,13 @@ export class CartHelper { return `${this.urlHelper.getStorefrontApiBaseUrl()}/carts`; } - getCarts(params) { + getCarts(email) { + const params = this.getParamsWithAuthorization(email); const getCartsResponse = this.http.sendGetRequest(this.http.url`${this.getCartsUrl()}`, params, false); + + console.log(JSON.parse(getCartsResponse.body)); + throw Error('test'); + this.assertionsHelper.assertResponseStatus(getCartsResponse, 200, 'Get Carts'); const getCartsResponseJson = JSON.parse(getCartsResponse.body); @@ -98,13 +84,13 @@ export class CartHelper { } } - deleteCart(customerEmail, cartId) { - this.http.sendDeleteRequest( - this.http.url`${this.getCartsUrl()}/${cartId}`, - null, - this.getParamsWithAuthorization(customerEmail), - false - ) + deleteCart(customerEmail, cartId, thresholdTag = null) { + const requestParams = this.getParamsWithAuthorization(customerEmail); + if (thresholdTag) { + requestParams.tags = { name: thresholdTag }; + } + + this.http.sendDeleteRequest(this.http.url`${this.getCartsUrl()}/${cartId}`, null, requestParams, false); } addItemToCart(cartId, quantity, params, sku) { diff --git a/tests/abstract-scenario.js b/tests/abstract-scenario.js index 25a66ad..957baba 100644 --- a/tests/abstract-scenario.js +++ b/tests/abstract-scenario.js @@ -10,6 +10,7 @@ import { AssertionsHelper } from '../helpers/assertions-helper.js'; import { BapiHelper } from '../helpers/bapi-helper.js'; import AdminHelper from '../helpers/admin-helper.js'; import { DynamicFixturesHelper } from '../helpers/dynamic-fixtures-helper.js'; +import { AuthTokenManager } from '../helpers/auth-token-manager.js'; export class AbstractScenario { // eslint-disable-next-line no-unused-vars @@ -30,7 +31,8 @@ export class AbstractScenario { this.customerHelper = new CustomerHelper(); this.adminHelper = new AdminHelper(); this.assertionsHelper = new AssertionsHelper(); - this.cartHelper = new CartHelper(this.urlHelper, this.http, this.customerHelper, this.assertionsHelper); + this.authTokenManager = AuthTokenManager.getInstance(this.http, this.urlHelper, this.assertionsHelper); + this.cartHelper = new CartHelper(this.urlHelper, this.http, this.customerHelper, this.assertionsHelper, this.authTokenManager); this.bapiHelper = new BapiHelper(this.urlHelper, this.http, this.adminHelper, this.assertionsHelper); this.storefrontHelper = new StorefrontHelper(this.urlHelper, this.http, this.customerHelper, this.assertionsHelper); this.browserHelper = new BrowserHelper(this.urlHelper, this.customerHelper, this.assertionsHelper); diff --git a/tests/cross-product/sapi/scenarios/cart-reorder/shared-cart-reorder-scenario.js b/tests/cross-product/sapi/scenarios/cart-reorder/shared-cart-reorder-scenario.js index d2b405e..ee28e4d 100644 --- a/tests/cross-product/sapi/scenarios/cart-reorder/shared-cart-reorder-scenario.js +++ b/tests/cross-product/sapi/scenarios/cart-reorder/shared-cart-reorder-scenario.js @@ -2,18 +2,23 @@ import { AbstractScenario } from '../../../../abstract-scenario.js'; import { group } from 'k6'; export class SharedCartReorderScenario extends AbstractScenario { - execute(customerEmail, orderId) { + execute(customerEmail, orderId, thresholdTag = null) { let self = this; group('Cart Reorder', function () { - self.haveReorder(customerEmail, orderId); + self.haveReorder(customerEmail, orderId, thresholdTag); }); } - haveReorder(customerEmail, orderId) { + haveReorder(customerEmail, orderId, thresholdTag = null) { + const requestParams = this.cartHelper.getParamsWithAuthorization(customerEmail); + if (thresholdTag) { + requestParams.tags = { name: thresholdTag }; + } + const cartReorderResponse = this.http.sendPostRequest( this.http.url`${this.getStorefrontApiBaseUrl()}/cart-reorder`, JSON.stringify(this._getCartReorderAttributes(orderId)), - this.cartHelper.getParamsWithAuthorization(customerEmail), + requestParams, false ); diff --git a/tests/cross-product/sapi/scenarios/checkout/shared-checkout-scenario.js b/tests/cross-product/sapi/scenarios/checkout/shared-checkout-scenario.js index 3e95c0f..2a14abb 100644 --- a/tests/cross-product/sapi/scenarios/checkout/shared-checkout-scenario.js +++ b/tests/cross-product/sapi/scenarios/checkout/shared-checkout-scenario.js @@ -20,17 +20,27 @@ export class SharedCheckoutScenario extends AbstractScenario { }); } - haveOrder(customerEmail, cartId, isMpPaymentProvider = true) { + haveOrder(customerEmail, cartId, isMpPaymentProvider = true, thresholdTag = null) { + const requestParams = this.cartHelper.getParamsWithAuthorization(customerEmail); + if (thresholdTag) { + requestParams.tags = { name: thresholdTag }; + } + const checkoutResponse = this.http.sendPostRequest( this.http.url`${this.getStorefrontApiBaseUrl()}/checkout?include=orders`, JSON.stringify(this._getCheckoutData(cartId, customerEmail, isMpPaymentProvider)), - this.cartHelper.getParamsWithAuthorization(customerEmail), + requestParams, false ); this.assertionsHelper.assertResponseStatus(checkoutResponse, 201); - return JSON.parse(checkoutResponse.body); + try { + return JSON.parse(checkoutResponse.body); + } catch (e) { + console.log(checkoutResponse.body); + throw Error('Failed to parse response during SharedCheckoutScenario::placeOrder()'); + } } _getCheckoutData(cartId, defaultCustomerEmail = this.customerHelper.getDefaultCustomerEmail(), isMpPaymentProvider = true) { diff --git a/tests/cross-product/sapi/scenarios/order-amendment/shared-order-amendment-scenario.js b/tests/cross-product/sapi/scenarios/order-amendment/shared-order-amendment-scenario.js index 1d42c50..c1ea222 100644 --- a/tests/cross-product/sapi/scenarios/order-amendment/shared-order-amendment-scenario.js +++ b/tests/cross-product/sapi/scenarios/order-amendment/shared-order-amendment-scenario.js @@ -2,26 +2,36 @@ import { AbstractScenario } from '../../../../abstract-scenario.js'; import { group } from 'k6'; export class SharedOrderAmendmentScenario extends AbstractScenario { - execute(customerEmail, orderId) { + execute(customerEmail, orderId, thresholdTag = null) { let self = this; group('Order Amendment', function () { - self.haveOrderAmendment(customerEmail, orderId); + self.haveOrderAmendment(customerEmail, orderId, thresholdTag); }); } - haveOrderAmendment(customerEmail, orderId) { + haveOrderAmendment(customerEmail, orderId, thresholdTag = null) { this._ensureOrderState(customerEmail, orderId, 'payment pending'); + const requestParams = this.cartHelper.getParamsWithAuthorization(customerEmail); + if (thresholdTag) { + requestParams.tags = { name: thresholdTag }; + } + const cartReorderResponse = this.http.sendPostRequest( this.http.url`${this.getStorefrontApiBaseUrl()}/cart-reorder`, JSON.stringify(this._getCartReorderAttributes(orderId)), - this.cartHelper.getParamsWithAuthorization(customerEmail), + requestParams, false ); this.assertionsHelper.assertResponseStatus(cartReorderResponse, 201); - return JSON.parse(cartReorderResponse.body); + try { + return JSON.parse(cartReorderResponse.body); + } catch (e) { + console.log(cartReorderResponse.body); + throw Error('Failed to parse response during SharedOrderAmendmentScenario::haveOrderAmendment()'); + } } _ensureOrderState(customerEmail, orderId, state, maxRetries = 5) { @@ -50,7 +60,12 @@ export class SharedOrderAmendmentScenario extends AbstractScenario { ); self.assertionsHelper.assertResponseStatus(orderResponse, 200); - return JSON.parse(orderResponse.body); + try { + return JSON.parse(orderResponse.body); + } catch (e) { + console.log(orderResponse.body); + throw Error('Failed to parse response during SharedOrderAmendmentScenario::_getOrder()'); + } } _getCartReorderAttributes(orderId) { diff --git a/tests/suite/sapi/tests/cart-reorder/SUITE-TEST_ID-per-vu-iterations-cart-reorder.js b/tests/suite/sapi/tests/cart-reorder/SUITE-SAPI15-cart-reorder.js similarity index 72% rename from tests/suite/sapi/tests/cart-reorder/SUITE-TEST_ID-per-vu-iterations-cart-reorder.js rename to tests/suite/sapi/tests/cart-reorder/SUITE-SAPI15-cart-reorder.js index 769389b..5dff886 100644 --- a/tests/suite/sapi/tests/cart-reorder/SUITE-TEST_ID-per-vu-iterations-cart-reorder.js +++ b/tests/suite/sapi/tests/cart-reorder/SUITE-SAPI15-cart-reorder.js @@ -5,33 +5,38 @@ import { import { SharedCheckoutScenario } from '../../../../cross-product/sapi/scenarios/checkout/shared-checkout-scenario.js'; export { handleSummary } from '../../../../../helpers/summary-helper.js'; -const iterations = 10; -const virtualUsersCount = 10; +const vus = 10; +const iterations = 1; +const itemCount = 70; +const defaultItemPrice = 1000; // 10.00 EUR const environment = 'SUITE'; +const thresholdTag = 'cart_reorder'; + const sharedCheckoutScenario = new SharedCheckoutScenario(environment); const sharedCartReorderScenario = new SharedCartReorderScenario(environment); export const options = loadDefaultOptions(); options.scenarios = { - TEST_ID_Cart_Reorder: { + SAPI15_cart_reorder: { exec: 'execute', executor: 'per-vu-iterations', tags: { - testId: 'TEST_ID', + testId: 'SAPI15', testGroup: 'Cart Reorder', }, + vus: vus, iterations: iterations, - vus: virtualUsersCount, }, }; -options.thresholds[`http_req_duration{url:${sharedCartReorderScenario.getStorefrontApiBaseUrl()}/cart-reorder}`] = ['avg<409']; +options.thresholds[`http_req_duration{name:${thresholdTag}}`] = ['avg<300']; export function setup() { - return sharedCheckoutScenario.dynamicFixturesHelper.haveCustomersWithQuotes(virtualUsersCount, iterations); + return sharedCheckoutScenario.dynamicFixturesHelper.haveCustomersWithQuotes(vus, iterations, itemCount, defaultItemPrice); } export function execute(data) { - const customerIndex = __VU % data.length; + const vus = __VU - 1; + const customerIndex = vus % data.length; const { customerEmail, quoteIds } = data[customerIndex]; const quoteIndex = __ITER % quoteIds.length; @@ -39,5 +44,5 @@ export function execute(data) { const checkoutResponseJson = sharedCheckoutScenario.haveOrder(customerEmail, quoteIds[quoteIndex], false); // Reorder - sharedCartReorderScenario.execute(customerEmail, checkoutResponseJson.data.relationships.orders.data[0].id); + sharedCartReorderScenario.execute(customerEmail, checkoutResponseJson.data.relationships.orders.data[0].id, thresholdTag); } diff --git a/tests/suite/sapi/tests/cart-reorder/SUITE-TEST_ID-cart-reorder.js b/tests/suite/sapi/tests/cart-reorder/SUITE-TEST_ID-cart-reorder.js deleted file mode 100644 index 396f70e..0000000 --- a/tests/suite/sapi/tests/cart-reorder/SUITE-TEST_ID-cart-reorder.js +++ /dev/null @@ -1,40 +0,0 @@ -import { loadDefaultOptions } from '../../../../../lib/utils.js'; -import { - SharedCartReorderScenario -} from '../../../../cross-product/sapi/scenarios/cart-reorder/shared-cart-reorder-scenario.js'; -import { SharedCheckoutScenario } from '../../../../cross-product/sapi/scenarios/checkout/shared-checkout-scenario.js'; -export { handleSummary } from '../../../../../helpers/summary-helper.js'; - -const iterations = 10; -const environment = 'SUITE'; -const sharedCheckoutScenario = new SharedCheckoutScenario(environment); -const sharedCartReorderScenario = new SharedCartReorderScenario(environment); - -export const options = loadDefaultOptions(); -options.scenarios = { - TEST_ID_Cart_Reorder: { - exec: 'execute', - executor: 'shared-iterations', - tags: { - testId: 'TEST_ID', - testGroup: 'Cart Reorder', - }, - iterations: iterations - }, -}; -options.thresholds[`http_req_duration{url:${sharedCartReorderScenario.getStorefrontApiBaseUrl()}/cart-reorder}`] = ['avg<409']; - -export function setup() { - return sharedCheckoutScenario.dynamicFixturesHelper.haveCustomersWithQuotes(iterations); -} - -export function execute(data) { - const customerIndex = __ITER % data.length; - const { customerEmail, quoteIds } = data[customerIndex]; - - // Place an order - const checkoutResponseJson = sharedCheckoutScenario.haveOrder(customerEmail, quoteIds[0], false); - - // Reorder - sharedCartReorderScenario.execute(customerEmail, checkoutResponseJson.data.relationships.orders.data[0].id); -} diff --git a/tests/suite/sapi/tests/cart-reorder/SUITE-TEST_ID-ramping-vus-cart-reorder.js b/tests/suite/sapi/tests/cart-reorder/SUITE-TEST_ID-ramping-vus-cart-reorder.js deleted file mode 100644 index d9ddbdc..0000000 --- a/tests/suite/sapi/tests/cart-reorder/SUITE-TEST_ID-ramping-vus-cart-reorder.js +++ /dev/null @@ -1,47 +0,0 @@ -import { loadDefaultOptions } from '../../../../../lib/utils.js'; -import { - SharedCartReorderScenario -} from '../../../../cross-product/sapi/scenarios/cart-reorder/shared-cart-reorder-scenario.js'; -import { SharedCheckoutScenario } from '../../../../cross-product/sapi/scenarios/checkout/shared-checkout-scenario.js'; -export { handleSummary } from '../../../../../helpers/summary-helper.js'; - -const virtualUsersCount = 10 -const iterations = 20 -const environment = 'SUITE'; -const sharedCheckoutScenario = new SharedCheckoutScenario(environment); -const sharedCartReorderScenario = new SharedCartReorderScenario(environment); - -export const options = loadDefaultOptions(); -options.scenarios = { - TEST_ID_Cart_Reorder: { - exec: 'execute', - executor: 'ramping-vus', - tags: { - testId: 'TEST_ID', - testGroup: 'Cart Reorder', - }, - startVUs: 0, - stages: [ - { duration: '20s', target: virtualUsersCount }, - { duration: '10s', target: 0 }, - ], - gracefulRampDown: '0s', - }, -}; -options.thresholds[`http_req_duration{url:${sharedCartReorderScenario.getStorefrontApiBaseUrl()}/cart-reorder}`] = ['avg<409']; - -export function setup() { - return sharedCheckoutScenario.dynamicFixturesHelper.haveCustomersWithQuotes(virtualUsersCount, iterations); -} - -export function execute(data) { - const customerIndex = __VU % data.length; - const { customerEmail, quoteIds } = data[customerIndex]; - const quoteIndex = __ITER % quoteIds.length; - - // Place an order - const checkoutResponseJson = sharedCheckoutScenario.haveOrder(customerEmail, quoteIds[quoteIndex], false); - - // Reorder - sharedCartReorderScenario.execute(customerEmail, checkoutResponseJson.data.relationships.orders.data[0].id); -} diff --git a/tests/suite/sapi/tests/order-amendment/SUITE-TEST_ID-start-order-amendment.js b/tests/suite/sapi/tests/order-amendment/SUITE-SAPI16-start-order-amendment.js similarity index 62% rename from tests/suite/sapi/tests/order-amendment/SUITE-TEST_ID-start-order-amendment.js rename to tests/suite/sapi/tests/order-amendment/SUITE-SAPI16-start-order-amendment.js index 85bd50f..d642c2c 100644 --- a/tests/suite/sapi/tests/order-amendment/SUITE-TEST_ID-start-order-amendment.js +++ b/tests/suite/sapi/tests/order-amendment/SUITE-SAPI16-start-order-amendment.js @@ -5,36 +5,44 @@ import { } from '../../../../cross-product/sapi/scenarios/order-amendment/shared-order-amendment-scenario.js'; export { handleSummary } from '../../../../../helpers/summary-helper.js'; -const iterations = 10; +const vus = 10; +const iterations = 1; +const itemCount = 70; +const defaultItemPrice = 1000; // 10.00 EUR const environment = 'SUITE'; +const thresholdTag = 'start_order_amendment'; + const sharedCheckoutScenario = new SharedCheckoutScenario(environment); const sharedOrderAmendmentScenario = new SharedOrderAmendmentScenario(environment); export const options = loadDefaultOptions(); options.scenarios = { - TEST_ID_Start_Order_Amendment: { + SAPI16_start_order_amendment: { exec: 'execute', - executor: 'shared-iterations', + executor: 'per-vu-iterations', tags: { - testId: 'TEST_ID', + testId: 'SAPI16', testGroup: 'Order Amendment', }, - iterations: iterations + vus: vus, + iterations: iterations, }, }; -options.thresholds[`http_req_duration{url:${sharedOrderAmendmentScenario.getStorefrontApiBaseUrl()}/cart-reorder}`] = ['avg<500']; +options.thresholds[`http_req_duration{name:${thresholdTag}}`] = ['avg<300']; export function setup() { - return sharedCheckoutScenario.dynamicFixturesHelper.haveCustomersWithQuotes(iterations); + return sharedCheckoutScenario.dynamicFixturesHelper.haveCustomersWithQuotes(vus, iterations, itemCount, defaultItemPrice); } export function execute(data) { - const customerIndex = __ITER % data.length; + const vus = __VU - 1; + const customerIndex = vus % data.length; const { customerEmail, quoteIds } = data[customerIndex]; + const quoteIndex = __ITER % quoteIds.length; // Place an order - const checkoutResponseJson = sharedCheckoutScenario.haveOrder(customerEmail, quoteIds[0], false); + const checkoutResponseJson = sharedCheckoutScenario.haveOrder(customerEmail, quoteIds[quoteIndex], false); // Edit an order - sharedOrderAmendmentScenario.execute(customerEmail, checkoutResponseJson.data.relationships.orders.data[0].id); + sharedOrderAmendmentScenario.execute(customerEmail, checkoutResponseJson.data.relationships.orders.data[0].id, thresholdTag); } diff --git a/tests/suite/sapi/tests/order-amendment/SUITE-TEST_ID-cancel-order-amendment.js b/tests/suite/sapi/tests/order-amendment/SUITE-SAPI17-cancel-order-amendment.js similarity index 66% rename from tests/suite/sapi/tests/order-amendment/SUITE-TEST_ID-cancel-order-amendment.js rename to tests/suite/sapi/tests/order-amendment/SUITE-SAPI17-cancel-order-amendment.js index 583e22c..e54de59 100644 --- a/tests/suite/sapi/tests/order-amendment/SUITE-TEST_ID-cancel-order-amendment.js +++ b/tests/suite/sapi/tests/order-amendment/SUITE-SAPI17-cancel-order-amendment.js @@ -5,35 +5,43 @@ import { } from '../../../../cross-product/sapi/scenarios/order-amendment/shared-order-amendment-scenario.js'; export { handleSummary } from '../../../../../helpers/summary-helper.js'; -const iterations = 10; +const vus = 10; +const iterations = 1; +const itemCount = 70; +const defaultItemPrice = 1000; // 10.00 EUR const environment = 'SUITE'; +const thresholdTag = 'cancel_order_amendment'; + const sharedCheckoutScenario = new SharedCheckoutScenario(environment); const sharedOrderAmendmentScenario = new SharedOrderAmendmentScenario(environment); export const options = loadDefaultOptions(); options.scenarios = { - TEST_ID_Cancel_Order_Amendment: { + SAPI17_cancel_order_amendment: { exec: 'execute', - executor: 'shared-iterations', + executor: 'per-vu-iterations', tags: { - testId: 'TEST_ID', + testId: 'SAPI17', testGroup: 'Order Amendment', }, - iterations: iterations + vus: vus, + iterations: iterations, }, }; -options.thresholds[`http_req_duration{method:DELETE,url:${sharedCheckoutScenario.getStorefrontApiBaseUrl()}/carts/\${}}`] = ['avg<327']; +options.thresholds[`http_req_duration{name:${thresholdTag}}`] = ['avg<300']; export function setup() { - return sharedCheckoutScenario.dynamicFixturesHelper.haveCustomersWithQuotes(iterations); + return sharedCheckoutScenario.dynamicFixturesHelper.haveCustomersWithQuotes(vus, iterations, itemCount, defaultItemPrice); } export function execute(data) { - const customerIndex = __ITER % data.length; + const vus = __VU - 1; + const customerIndex = vus % data.length; const { customerEmail, quoteIds } = data[customerIndex]; + const quoteIndex = __ITER % quoteIds.length; // Place an order - const checkoutResponseJson = sharedCheckoutScenario.haveOrder(customerEmail, quoteIds[0], false); + const checkoutResponseJson = sharedCheckoutScenario.haveOrder(customerEmail, quoteIds[quoteIndex], false); // Edit an order const cartReorderResponseJson = sharedOrderAmendmentScenario.haveOrderAmendment( @@ -42,5 +50,5 @@ export function execute(data) { ); // Delete reordered cart - sharedOrderAmendmentScenario.cartHelper.deleteCart(cartReorderResponseJson.id, customerEmail); + sharedOrderAmendmentScenario.cartHelper.deleteCart(cartReorderResponseJson.id, customerEmail, thresholdTag); } diff --git a/tests/suite/sapi/tests/order-amendment/SUITE-TEST_ID-finish-order-amendment.js b/tests/suite/sapi/tests/order-amendment/SUITE-SAPI18-finish-order-amendment.js similarity index 67% rename from tests/suite/sapi/tests/order-amendment/SUITE-TEST_ID-finish-order-amendment.js rename to tests/suite/sapi/tests/order-amendment/SUITE-SAPI18-finish-order-amendment.js index ddea9d7..1dadc96 100644 --- a/tests/suite/sapi/tests/order-amendment/SUITE-TEST_ID-finish-order-amendment.js +++ b/tests/suite/sapi/tests/order-amendment/SUITE-SAPI18-finish-order-amendment.js @@ -5,35 +5,43 @@ import { } from '../../../../cross-product/sapi/scenarios/order-amendment/shared-order-amendment-scenario.js'; export { handleSummary } from '../../../../../helpers/summary-helper.js'; -const iterations = 10; +const vus = 10; +const iterations = 1; +const itemCount = 50; +const defaultItemPrice = 1000; // 10.00 EUR const environment = 'SUITE'; +const thresholdTag = 'finish_order_amendment'; + const sharedCheckoutScenario = new SharedCheckoutScenario(environment); const sharedOrderAmendmentScenario = new SharedOrderAmendmentScenario(environment); export const options = loadDefaultOptions(); options.scenarios = { - TEST_ID_Finish_Order_Amendment: { + SAPI18_finish_order_amendment: { exec: 'execute', - executor: 'shared-iterations', + executor: 'per-vu-iterations', tags: { - testId: 'TEST_ID', + testId: 'SAPI18', testGroup: 'Order Amendment', }, - iterations: iterations + vus: vus, + iterations: iterations, }, }; -options.thresholds[`http_req_duration{url:${sharedCheckoutScenario.getStorefrontApiBaseUrl()}/checkout?include=orders}`] = ['avg<927']; +options.thresholds[`http_req_duration{name:${thresholdTag}}`] = ['avg<300']; export function setup() { - return sharedCheckoutScenario.dynamicFixturesHelper.haveCustomersWithQuotes(iterations); + return sharedCheckoutScenario.dynamicFixturesHelper.haveCustomersWithQuotes(vus, iterations, itemCount, defaultItemPrice); } export function execute(data) { - const customerIndex = __ITER % data.length; + const vus = __VU - 1; + const customerIndex = vus % data.length; const { customerEmail, quoteIds } = data[customerIndex]; + const quoteIndex = __ITER % quoteIds.length; // Place an order - const checkoutResponseJson = sharedCheckoutScenario.haveOrder(customerEmail, quoteIds[0], false); + const checkoutResponseJson = sharedCheckoutScenario.haveOrder(customerEmail, quoteIds[quoteIndex], false); // Edit an order const cartReorderResponseJson = sharedOrderAmendmentScenario.haveOrderAmendment( @@ -42,5 +50,5 @@ export function execute(data) { ); // Place an updated order - sharedCheckoutScenario.haveOrder(customerEmail, cartReorderResponseJson.data.id, false); + sharedCheckoutScenario.haveOrder(customerEmail, cartReorderResponseJson.data.id, false, thresholdTag); }