@shopware-ag/acceptance-test-suite 12.23.1 → 12.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -368,6 +368,9 @@ type DeliveryTime = components["schemas"]["DeliveryTime"] & {
368
368
  type CmsPage = components["schemas"]["CmsPage"] & {
369
369
  id: string;
370
370
  };
371
+ type LandingPage = components["schemas"]["LandingPage"] & {
372
+ id: string;
373
+ };
371
374
  type CustomerGroup = components["schemas"]["CustomerGroup"] & {
372
375
  id: string;
373
376
  };
@@ -842,6 +845,20 @@ declare class TestDataService {
842
845
  * @param overrides - Specific data overrides that will be applied to the cms page layout data struct.
843
846
  */
844
847
  createBasicPageLayout(cmsPageType: string, overrides?: Partial<CmsPage>): Promise<CmsPage>;
848
+ /**
849
+ * Creates a landing page category
850
+ *
851
+ * @param salesChannelId - The uuid of the sales channel in which the landing page should be active.
852
+ * @param overrides - Specific data overrides applied to the landing page payload.
853
+ */
854
+ createLandingPage(overrides?: Partial<LandingPage>, salesChannelId?: string): Promise<LandingPage>;
855
+ /**
856
+ * Assigns a CMS landing page layout to a landing page category
857
+ *
858
+ * @param landingPageId - The uuid of the landing page category.
859
+ * @param cmsPageId - The uuid of the CMS landing page layout.
860
+ */
861
+ assignLandingPageLayout(landingPageId: string, cmsPageId: string): Promise<LandingPage>;
845
862
  /**
846
863
  * Creates a random country
847
864
  *
@@ -1311,6 +1328,15 @@ declare class TestDataService {
1311
1328
  } & Partial<OrderLineItem>;
1312
1329
  getBasicPromotionStruct(salesChannelId?: string, overrides?: Partial<Promotion>): Partial<Promotion>;
1313
1330
  getBasicCmsStruct(cmsType: string, overrides: Partial<CmsPage>): Partial<CmsPage>;
1331
+ getBasicLandingPageStruct(salesChannelId: string, overrides?: Partial<LandingPage>): {
1332
+ id: string;
1333
+ name: string;
1334
+ url: string;
1335
+ active: boolean;
1336
+ salesChannels: {
1337
+ id: string;
1338
+ }[];
1339
+ } & Partial<LandingPage>;
1314
1340
  getBasicCustomerGroupStruct(overrides?: Partial<CustomerGroup>): Partial<CustomerGroup>;
1315
1341
  getBasicCustomerAddressStruct(customerId: string, overrides?: Partial<Address>): Partial<Address>;
1316
1342
  getSalesChannelAnalyticsStruct(overrides?: Partial<SalesChannelAnalytics>): Partial<SalesChannelAnalytics>;
@@ -5488,6 +5514,7 @@ declare class CustomerDetail implements PageObject {
5488
5514
  readonly customFieldCard: Locator;
5489
5515
  readonly customFieldSetTabs: Locator;
5490
5516
  readonly customFieldSetTabCustomContent: Locator;
5517
+ readonly customerGroupRegistrationAlert: Locator;
5491
5518
  readonly customerGroupRequestMessage: Locator;
5492
5519
  readonly customerGroupAcceptButton: Locator;
5493
5520
  readonly customerGroupDeclineButton: Locator;
@@ -7097,4 +7124,4 @@ declare const test: playwright_test.TestType<playwright_test.PlaywrightTestArgs
7097
7124
  }>;
7098
7125
 
7099
7126
  export { Actor, AdminPageObjects, BUNDLED_RESOURCES, COUNTRY_ADDRESS_DATA, FeatureService, IdProvider, LanguageHelper, RuleType, StorefrontPageObjects, TestDataService, assertScreenshot, baseNamespaces, clearDelayedCache, compareFlowTemplateWithFlow, createNewAdminPageContext, createRandomImage, createSolidColorImage, encodeImage, expandAdminMenu, extractIdFromUrl, formatPrice, getCountryAddressData, getCountryCodeFromLocale, getCountryId, getCurrency, getCurrencyCodeFromLocale, getCurrencySymbolFromLocale, getCurrentContext, getDefaultShippingMethodId, getFlow, getFlowId, getFlowTemplate, getLanguageCode, getLanguageData, getLocale, getMediaId, getOrderTransactionId, getPaymentMethodId, getPromotionWithDiscount, getSalutationId, getShippingMethodId, getSnippetSetId, getStateMachineId, getStateMachineStateId, getTaxId, getThemeId, hideElements, hideSymfonyToolbarOnReload, isPaaSInstance, isSaaSInstance, isThemeCompiled, loginToAdministration, mockApiCalls, replaceElements, replaceElementsIndividually, setCurrentContext, setOrderStatus, setViewport, test, translate, updateAdminUser, uploadRandomPngMedia };
7100
- export type { AccountData, AclRole, Address, BasicRuleCondition, CalculatedTaxes, Category$1 as Category, CategoryCustomizableLinkData, CategoryData, CmsPage, Country$1 as Country, CreatedRecord, Currency$2 as Currency, CustomField, CustomFieldData, CustomFieldSet, Customer, CustomerAddress, CustomerGroup, DataServiceOptions, DeliveryTime, FixtureTypes, Flow, FlowConfig, FlowTemplate, Image, Language$2 as Language, Manufacturer, Media$1 as Media, NewsletterRecipient, Options, Order, OrderDelivery, OrderLineItem, OrderStatus, PageObject, PaymentMethod$1 as PaymentMethod, Price, Product, ProductCreationType, ProductCrossSelling, ProductFormData, ProductPrice, ProductReview, Promotion, PromotionDiscount, PromotionWithConditionRuleOptions, PropertyGroup, PropertyGroupOption, RegistrationData, ReplaceTarget, Rule, RuleAssignmentEntity, SalesChannel, SalesChannelAnalytics, SalesChannelDomain, SalesChannelRecord, Salutation, ShippingMethod$1 as ShippingMethod, SimpleLineItem, StateMachine, StateMachineState, SyncApiOperation, SystemConfig, Tag, TagData, Task, Tax$1 as Tax, TaxRules, TranslateFn, TranslationKey, UploadMediaTarget, User, VariantListingConfig };
7127
+ export type { AccountData, AclRole, Address, BasicRuleCondition, CalculatedTaxes, Category$1 as Category, CategoryCustomizableLinkData, CategoryData, CmsPage, Country$1 as Country, CreatedRecord, Currency$2 as Currency, CustomField, CustomFieldData, CustomFieldSet, Customer, CustomerAddress, CustomerGroup, DataServiceOptions, DeliveryTime, FixtureTypes, Flow, FlowConfig, FlowTemplate, Image, LandingPage, Language$2 as Language, Manufacturer, Media$1 as Media, NewsletterRecipient, Options, Order, OrderDelivery, OrderLineItem, OrderStatus, PageObject, PaymentMethod$1 as PaymentMethod, Price, Product, ProductCreationType, ProductCrossSelling, ProductFormData, ProductPrice, ProductReview, Promotion, PromotionDiscount, PromotionWithConditionRuleOptions, PropertyGroup, PropertyGroupOption, RegistrationData, ReplaceTarget, Rule, RuleAssignmentEntity, SalesChannel, SalesChannelAnalytics, SalesChannelDomain, SalesChannelRecord, Salutation, ShippingMethod$1 as ShippingMethod, SimpleLineItem, StateMachine, StateMachineState, SyncApiOperation, SystemConfig, Tag, TagData, Task, Tax$1 as Tax, TaxRules, TranslateFn, TranslationKey, UploadMediaTarget, User, VariantListingConfig };
package/dist/index.d.ts CHANGED
@@ -368,6 +368,9 @@ type DeliveryTime = components["schemas"]["DeliveryTime"] & {
368
368
  type CmsPage = components["schemas"]["CmsPage"] & {
369
369
  id: string;
370
370
  };
371
+ type LandingPage = components["schemas"]["LandingPage"] & {
372
+ id: string;
373
+ };
371
374
  type CustomerGroup = components["schemas"]["CustomerGroup"] & {
372
375
  id: string;
373
376
  };
@@ -842,6 +845,20 @@ declare class TestDataService {
842
845
  * @param overrides - Specific data overrides that will be applied to the cms page layout data struct.
843
846
  */
844
847
  createBasicPageLayout(cmsPageType: string, overrides?: Partial<CmsPage>): Promise<CmsPage>;
848
+ /**
849
+ * Creates a landing page category
850
+ *
851
+ * @param salesChannelId - The uuid of the sales channel in which the landing page should be active.
852
+ * @param overrides - Specific data overrides applied to the landing page payload.
853
+ */
854
+ createLandingPage(overrides?: Partial<LandingPage>, salesChannelId?: string): Promise<LandingPage>;
855
+ /**
856
+ * Assigns a CMS landing page layout to a landing page category
857
+ *
858
+ * @param landingPageId - The uuid of the landing page category.
859
+ * @param cmsPageId - The uuid of the CMS landing page layout.
860
+ */
861
+ assignLandingPageLayout(landingPageId: string, cmsPageId: string): Promise<LandingPage>;
845
862
  /**
846
863
  * Creates a random country
847
864
  *
@@ -1311,6 +1328,15 @@ declare class TestDataService {
1311
1328
  } & Partial<OrderLineItem>;
1312
1329
  getBasicPromotionStruct(salesChannelId?: string, overrides?: Partial<Promotion>): Partial<Promotion>;
1313
1330
  getBasicCmsStruct(cmsType: string, overrides: Partial<CmsPage>): Partial<CmsPage>;
1331
+ getBasicLandingPageStruct(salesChannelId: string, overrides?: Partial<LandingPage>): {
1332
+ id: string;
1333
+ name: string;
1334
+ url: string;
1335
+ active: boolean;
1336
+ salesChannels: {
1337
+ id: string;
1338
+ }[];
1339
+ } & Partial<LandingPage>;
1314
1340
  getBasicCustomerGroupStruct(overrides?: Partial<CustomerGroup>): Partial<CustomerGroup>;
1315
1341
  getBasicCustomerAddressStruct(customerId: string, overrides?: Partial<Address>): Partial<Address>;
1316
1342
  getSalesChannelAnalyticsStruct(overrides?: Partial<SalesChannelAnalytics>): Partial<SalesChannelAnalytics>;
@@ -5488,6 +5514,7 @@ declare class CustomerDetail implements PageObject {
5488
5514
  readonly customFieldCard: Locator;
5489
5515
  readonly customFieldSetTabs: Locator;
5490
5516
  readonly customFieldSetTabCustomContent: Locator;
5517
+ readonly customerGroupRegistrationAlert: Locator;
5491
5518
  readonly customerGroupRequestMessage: Locator;
5492
5519
  readonly customerGroupAcceptButton: Locator;
5493
5520
  readonly customerGroupDeclineButton: Locator;
@@ -7097,4 +7124,4 @@ declare const test: playwright_test.TestType<playwright_test.PlaywrightTestArgs
7097
7124
  }>;
7098
7125
 
7099
7126
  export { Actor, AdminPageObjects, BUNDLED_RESOURCES, COUNTRY_ADDRESS_DATA, FeatureService, IdProvider, LanguageHelper, RuleType, StorefrontPageObjects, TestDataService, assertScreenshot, baseNamespaces, clearDelayedCache, compareFlowTemplateWithFlow, createNewAdminPageContext, createRandomImage, createSolidColorImage, encodeImage, expandAdminMenu, extractIdFromUrl, formatPrice, getCountryAddressData, getCountryCodeFromLocale, getCountryId, getCurrency, getCurrencyCodeFromLocale, getCurrencySymbolFromLocale, getCurrentContext, getDefaultShippingMethodId, getFlow, getFlowId, getFlowTemplate, getLanguageCode, getLanguageData, getLocale, getMediaId, getOrderTransactionId, getPaymentMethodId, getPromotionWithDiscount, getSalutationId, getShippingMethodId, getSnippetSetId, getStateMachineId, getStateMachineStateId, getTaxId, getThemeId, hideElements, hideSymfonyToolbarOnReload, isPaaSInstance, isSaaSInstance, isThemeCompiled, loginToAdministration, mockApiCalls, replaceElements, replaceElementsIndividually, setCurrentContext, setOrderStatus, setViewport, test, translate, updateAdminUser, uploadRandomPngMedia };
7100
- export type { AccountData, AclRole, Address, BasicRuleCondition, CalculatedTaxes, Category$1 as Category, CategoryCustomizableLinkData, CategoryData, CmsPage, Country$1 as Country, CreatedRecord, Currency$2 as Currency, CustomField, CustomFieldData, CustomFieldSet, Customer, CustomerAddress, CustomerGroup, DataServiceOptions, DeliveryTime, FixtureTypes, Flow, FlowConfig, FlowTemplate, Image, Language$2 as Language, Manufacturer, Media$1 as Media, NewsletterRecipient, Options, Order, OrderDelivery, OrderLineItem, OrderStatus, PageObject, PaymentMethod$1 as PaymentMethod, Price, Product, ProductCreationType, ProductCrossSelling, ProductFormData, ProductPrice, ProductReview, Promotion, PromotionDiscount, PromotionWithConditionRuleOptions, PropertyGroup, PropertyGroupOption, RegistrationData, ReplaceTarget, Rule, RuleAssignmentEntity, SalesChannel, SalesChannelAnalytics, SalesChannelDomain, SalesChannelRecord, Salutation, ShippingMethod$1 as ShippingMethod, SimpleLineItem, StateMachine, StateMachineState, SyncApiOperation, SystemConfig, Tag, TagData, Task, Tax$1 as Tax, TaxRules, TranslateFn, TranslationKey, UploadMediaTarget, User, VariantListingConfig };
7127
+ export type { AccountData, AclRole, Address, BasicRuleCondition, CalculatedTaxes, Category$1 as Category, CategoryCustomizableLinkData, CategoryData, CmsPage, Country$1 as Country, CreatedRecord, Currency$2 as Currency, CustomField, CustomFieldData, CustomFieldSet, Customer, CustomerAddress, CustomerGroup, DataServiceOptions, DeliveryTime, FixtureTypes, Flow, FlowConfig, FlowTemplate, Image, LandingPage, Language$2 as Language, Manufacturer, Media$1 as Media, NewsletterRecipient, Options, Order, OrderDelivery, OrderLineItem, OrderStatus, PageObject, PaymentMethod$1 as PaymentMethod, Price, Product, ProductCreationType, ProductCrossSelling, ProductFormData, ProductPrice, ProductReview, Promotion, PromotionDiscount, PromotionWithConditionRuleOptions, PropertyGroup, PropertyGroupOption, RegistrationData, ReplaceTarget, Rule, RuleAssignmentEntity, SalesChannel, SalesChannelAnalytics, SalesChannelDomain, SalesChannelRecord, Salutation, ShippingMethod$1 as ShippingMethod, SimpleLineItem, StateMachine, StateMachineState, SyncApiOperation, SystemConfig, Tag, TagData, Task, Tax$1 as Tax, TaxRules, TranslateFn, TranslationKey, UploadMediaTarget, User, VariantListingConfig };
package/dist/index.mjs CHANGED
@@ -3982,6 +3982,8 @@ async function loginToAdministration(adminLoginPage, merchant, AdminApiContext)
3982
3982
  return adminLoginPage;
3983
3983
  }
3984
3984
 
3985
+ const THEME_SETUP_SAFETY_MARGIN = 15e3;
3986
+ const THEME_ASSIGN_MAX_ATTEMPTS = 5;
3985
3987
  const test$b = test$e.extend({
3986
3988
  AdminSession: [
3987
3989
  async ({ IdProvider, AdminApiContext, SalesChannelBaseConfig, browser }, use) => {
@@ -4025,7 +4027,7 @@ const test$b = test$e.extend({
4025
4027
  await page.close();
4026
4028
  setCurrentContext(null);
4027
4029
  },
4028
- StorefrontPage: async ({ DefaultSalesChannel, SalesChannelBaseConfig, browser, AdminApiContext, StoreApiContext, InstanceMeta, CustomTranslationResources }, use) => {
4030
+ StorefrontPage: async ({ DefaultSalesChannel, SalesChannelBaseConfig, browser, AdminApiContext, StoreApiContext, CustomTranslationResources }, use) => {
4029
4031
  const { url, salesChannel } = DefaultSalesChannel;
4030
4032
  const locale = getLocale();
4031
4033
  const languageHelper = await LanguageHelper.createInstance(locale, CustomTranslationResources);
@@ -4039,14 +4041,27 @@ const test$b = test$e.extend({
4039
4041
  let page;
4040
4042
  if (!await isThemeCompiled(StoreApiContext, DefaultSalesChannel.url)) {
4041
4043
  test$e.slow();
4042
- await AdminApiContext.post(`./_action/theme/${SalesChannelBaseConfig.defaultThemeId}/assign/${salesChannel.id}`);
4044
+ const deadline = Date.now() + (test$e.info().timeout || 18e4) - THEME_SETUP_SAFETY_MARGIN;
4045
+ const assignUrl = `./_action/theme/${SalesChannelBaseConfig.defaultThemeId}/assign/${salesChannel.id}`;
4046
+ let response = await AdminApiContext.post(assignUrl);
4047
+ for (let attempt = 1; attempt < THEME_ASSIGN_MAX_ATTEMPTS && response.status() >= 500 && Date.now() < deadline; attempt++) {
4048
+ console.warn(
4049
+ `[Warning] Theme assign for sales channel ${salesChannel.id} failed with HTTP ${response.status()} (attempt ${attempt}), retrying: ${(await response.text()).slice(0, 500)}`
4050
+ );
4051
+ await new Promise((resolve) => setTimeout(resolve, 2e3 * attempt));
4052
+ response = await AdminApiContext.post(assignUrl);
4053
+ }
4054
+ if (!response.ok()) {
4055
+ throw new Error(`Theme assign for sales channel ${salesChannel.id} failed with HTTP ${response.status()}: ${(await response.text()).slice(0, 500)}`);
4056
+ }
4043
4057
  await clearDelayedCache(AdminApiContext);
4044
4058
  page = await context.newPage();
4045
- if (InstanceMeta.isSaaS) {
4046
- while (!await isThemeCompiled(StoreApiContext, DefaultSalesChannel.url)) {
4047
- await clearDelayedCache(AdminApiContext);
4048
- await page.waitForTimeout(4e3);
4059
+ while (!await isThemeCompiled(StoreApiContext, DefaultSalesChannel.url)) {
4060
+ if (Date.now() > deadline) {
4061
+ throw new Error(`Theme for sales channel ${salesChannel.id} is still not compiled within the test timeout (${DefaultSalesChannel.url}).`);
4049
4062
  }
4063
+ await clearDelayedCache(AdminApiContext);
4064
+ await page.waitForTimeout(4e3);
4050
4065
  }
4051
4066
  } else {
4052
4067
  page = await context.newPage();
@@ -4994,6 +5009,38 @@ class TestDataService {
4994
5009
  this.addCreatedRecord("cms_page", layout.id);
4995
5010
  return layout;
4996
5011
  }
5012
+ /**
5013
+ * Creates a landing page category
5014
+ *
5015
+ * @param salesChannelId - The uuid of the sales channel in which the landing page should be active.
5016
+ * @param overrides - Specific data overrides applied to the landing page payload.
5017
+ */
5018
+ async createLandingPage(overrides = {}, salesChannelId = this.defaultSalesChannel.id) {
5019
+ const basicLandingPage = this.getBasicLandingPageStruct(salesChannelId, overrides);
5020
+ const response = await this.AdminApiClient.post("landing-page?_response=detail", {
5021
+ data: basicLandingPage
5022
+ });
5023
+ expect(response.ok()).toBeTruthy();
5024
+ const { data: landingPage } = await response.json();
5025
+ this.addCreatedRecord("landing_page", landingPage.id);
5026
+ return landingPage;
5027
+ }
5028
+ /**
5029
+ * Assigns a CMS landing page layout to a landing page category
5030
+ *
5031
+ * @param landingPageId - The uuid of the landing page category.
5032
+ * @param cmsPageId - The uuid of the CMS landing page layout.
5033
+ */
5034
+ async assignLandingPageLayout(landingPageId, cmsPageId) {
5035
+ const response = await this.AdminApiClient.patch(`landing-page/${landingPageId}?_response=detail`, {
5036
+ data: {
5037
+ cmsPageId
5038
+ }
5039
+ });
5040
+ expect(response.ok()).toBeTruthy();
5041
+ const { data: landingPage } = await response.json();
5042
+ return landingPage;
5043
+ }
4997
5044
  /**
4998
5045
  * Creates a random country
4999
5046
  *
@@ -6707,6 +6754,18 @@ class TestDataService {
6707
6754
  };
6708
6755
  return Object.assign({}, basicCmsPage, overrides);
6709
6756
  }
6757
+ getBasicLandingPageStruct(salesChannelId, overrides = {}) {
6758
+ const landingPageUuid = this.IdProvider.getIdPair().uuid;
6759
+ const landingPageName = `${this.namePrefix}LandingPage-${landingPageUuid}${this.nameSuffix}`;
6760
+ const basicLandingPage = {
6761
+ id: landingPageUuid,
6762
+ name: landingPageName,
6763
+ url: `${this.namePrefix}landing-page-${landingPageUuid}${this.nameSuffix}`,
6764
+ active: true,
6765
+ salesChannels: [{ id: salesChannelId }]
6766
+ };
6767
+ return Object.assign({}, basicLandingPage, overrides);
6768
+ }
6710
6769
  getBasicCustomerGroupStruct(overrides = {}) {
6711
6770
  const customerGroupUuid = this.IdProvider.getIdPair().uuid;
6712
6771
  const customerGroupName = `${this.namePrefix}CustomerGroup-${customerGroupUuid}${this.nameSuffix}`;
@@ -6855,6 +6914,7 @@ class TestDataService {
6855
6914
  title: productReviewName,
6856
6915
  content: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.",
6857
6916
  points: 5,
6917
+ externalUser: "Peter Venkman",
6858
6918
  status: true,
6859
6919
  salesChannelId: this.defaultSalesChannel.id
6860
6920
  };
@@ -9093,6 +9153,7 @@ class CustomerDetail {
9093
9153
  customFieldCard;
9094
9154
  customFieldSetTabs;
9095
9155
  customFieldSetTabCustomContent;
9156
+ customerGroupRegistrationAlert;
9096
9157
  customerGroupRequestMessage;
9097
9158
  customerGroupAcceptButton;
9098
9159
  customerGroupDeclineButton;
@@ -9117,10 +9178,11 @@ class CustomerDetail {
9117
9178
  }
9118
9179
  this.customFieldSetTabs = this.customFieldCard.locator(".sw-tabs-item");
9119
9180
  this.customFieldSetTabCustomContent = this.customFieldCard.locator(".sw-tabs__custom-content");
9181
+ this.customerGroupRegistrationAlert = page.locator(".sw-customer-detail__customer-registration-alert");
9120
9182
  if (satisfies(instanceMeta.version, "<6.7")) {
9121
- this.customerGroupRequestMessage = page.locator(".sw-alert__message");
9183
+ this.customerGroupRequestMessage = this.customerGroupRegistrationAlert.locator(".sw-alert__message");
9122
9184
  } else {
9123
- this.customerGroupRequestMessage = page.locator(".mt-banner__message");
9185
+ this.customerGroupRequestMessage = this.customerGroupRegistrationAlert.locator(".mt-banner__message");
9124
9186
  }
9125
9187
  this.customerGroupAcceptButton = page.getByRole("button", { name: translate("administration:customer:detail.accept") });
9126
9188
  this.customerGroupDeclineButton = page.getByRole("button", { name: translate("administration:customer:detail.decline") });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shopware-ag/acceptance-test-suite",
3
- "version": "12.23.1",
3
+ "version": "12.24.0",
4
4
  "description": "Shopware Acceptance Test Suite",
5
5
  "keywords": [
6
6
  "fixtures",