@shopware-ag/acceptance-test-suite 12.20.1 → 12.21.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
@@ -138,6 +138,13 @@ interface ApiContextTypes {
138
138
  MailpitApiContext: MailpitApiContext;
139
139
  }
140
140
 
141
+ type NewsletterRecipient = components["schemas"]["NewsletterRecipient"] & {
142
+ id: string;
143
+ email: string;
144
+ salesChannelId: string;
145
+ firstName: string;
146
+ lastName: string;
147
+ };
141
148
  type SalesChannel = components["schemas"]["SalesChannel"] & {
142
149
  id: string;
143
150
  };
@@ -259,6 +266,11 @@ type Tag = components["schemas"]["Tag"] & {
259
266
  type Rule = components["schemas"]["Rule"] & {
260
267
  id: string;
261
268
  };
269
+ interface BasicRuleCondition {
270
+ type: string;
271
+ value: Record<string, unknown>;
272
+ children?: BasicRuleCondition[];
273
+ }
262
274
  type Currency$2 = components["schemas"]["Currency"] & {
263
275
  id: string;
264
276
  };
@@ -334,6 +346,16 @@ type Promotion = Omit<components["schemas"]["Promotion"], "discounts"> & {
334
346
  type PromotionDiscount = components["schemas"]["PromotionDiscount"] & {
335
347
  id: string;
336
348
  };
349
+ interface PromotionWithConditionRuleOptions {
350
+ id: string;
351
+ name: string;
352
+ ruleId: string;
353
+ useCode?: boolean;
354
+ discountValue?: number;
355
+ discountScope?: string;
356
+ discountType?: string;
357
+ salesChannelId?: string;
358
+ }
337
359
  type OrderLineItem = components["schemas"]["OrderLineItem"] & {
338
360
  id: string;
339
361
  };
@@ -583,6 +605,14 @@ declare class TestDataService {
583
605
  */
584
606
  private createdSalesChannelRecords;
585
607
  constructor(AdminApiClient: AdminApiContext, IdProvider: IdProvider, options: DataServiceOptions);
608
+ /**
609
+ * Creates a newsletter recipient for a customer in the default sales channel.
610
+ * If a matching recipient already exists, it will be reused and registered for cleanup.
611
+ *
612
+ * @param customer - The customer whose email and profile data will be used for the newsletter recipient.
613
+ * @param overrides - Specific data overrides that will be applied to the newsletter recipient payload.
614
+ */
615
+ createNewsletterRecipient(customer: Customer, overrides?: Partial<NewsletterRecipient>): Promise<NewsletterRecipient>;
586
616
  /**
587
617
  * Creates a basic product without images or other special configuration.
588
618
  * The product will be added to the default sales channel category if configured.
@@ -755,6 +785,13 @@ declare class TestDataService {
755
785
  * @param salesChannelId - The uuid of the sales channel in which the promotion should be active.
756
786
  */
757
787
  createPromotionWithCode(overrides?: Partial<Promotion>, salesChannelId?: string): Promise<Promotion>;
788
+ /**
789
+ * Creates a promotion with one discount and assigns a condition rule as a persona rule.
790
+ * The created promotion and assigned rule are both registered for cleanup.
791
+ *
792
+ * @param promotionConfig - Promotion configuration, including the promotion id, name, and assigned rule id.
793
+ */
794
+ createPromotionWithConditionRule(promotionConfig: PromotionWithConditionRuleOptions): Promise<Promotion>;
758
795
  /**
759
796
  * Creates a new basic payment method.
760
797
  *
@@ -780,11 +817,13 @@ declare class TestDataService {
780
817
  */
781
818
  createShippingMethodWithImage(overrides?: Partial<ShippingMethod$1>): Promise<ShippingMethod$1>;
782
819
  /**
783
- * Creates a new basic rule with the condition cart amount >= 1.
820
+ * Creates a new basic rule with the condition cart amount >= 1 by default.
821
+ * Pass a condition object to create the same basic rule structure with another condition.
784
822
  *
785
823
  * @param overrides - Specific data overrides that will be applied to the basic rule data struct.
824
+ * @param condition - The condition object or condition type used in the generated rule.
786
825
  */
787
- createBasicRule(overrides?: Partial<Rule>, conditionType?: string, operator?: string, amount?: number): Promise<Rule>;
826
+ createBasicRule(overrides?: Partial<Rule>, condition?: BasicRuleCondition | string, operator?: string, amount?: number): Promise<Rule>;
788
827
  /**
789
828
  * Creates a new basic page layout.
790
829
  *
@@ -970,6 +1009,11 @@ declare class TestDataService {
970
1009
 
971
1010
  */
972
1011
  assignAclRoleUser(aclRoleId: string, adminUserId: string): Promise<any>;
1012
+ /**
1013
+ * Retrieves a newsletter recipient by customer email and the default sales channel.
1014
+ * @param customer - The customer whose email will be used to search for a newsletter recipient.
1015
+ */
1016
+ getNewsletterRecipient(customer: Customer): Promise<NewsletterRecipient | undefined>;
973
1017
  /**
974
1018
  * Retrieves a language based on its code.
975
1019
  * @param languageCode
@@ -1153,7 +1197,7 @@ declare class TestDataService {
1153
1197
  getCountryStruct(overrides?: Partial<Country$1>): Partial<Country$1>;
1154
1198
  getCurrencyStruct(overrides: Partial<Currency$2> | undefined, roundingDecimals: number): Partial<Currency$2>;
1155
1199
  getBasicProductStruct(taxId?: string, currencyId?: string, overrides?: Partial<Product>): Partial<Product>;
1156
- getBasicRuleStruct(overrides: Partial<Rule> | undefined, conditionType: string, operator: string, amount: number): Partial<Rule>;
1200
+ getBasicRuleStruct(overrides?: Partial<Rule>, condition?: BasicRuleCondition | string, operator?: string, amount?: number): Partial<Rule>;
1157
1201
  getProductPriceRangeStruct(currencyId: string, ruleId: string): Partial<Product>;
1158
1202
  getBasicManufacturerStruct(overrides?: Partial<Manufacturer>): Partial<Manufacturer>;
1159
1203
  getBasicPaymentMethodStruct(overrides?: Partial<PaymentMethod$1>): {
@@ -1530,6 +1574,7 @@ declare const BUNDLED_RESOURCES: {
1530
1574
  };
1531
1575
  userMenu: {
1532
1576
  logout: string;
1577
+ offCanvasToggle: string;
1533
1578
  };
1534
1579
  order: {
1535
1580
  orderTitle: string;
@@ -2432,6 +2477,7 @@ declare const BUNDLED_RESOURCES: {
2432
2477
  };
2433
2478
  userMenu: {
2434
2479
  logout: string;
2480
+ offCanvasToggle: string;
2435
2481
  };
2436
2482
  order: {
2437
2483
  orderTitle: string;
@@ -3662,6 +3708,7 @@ declare const baseNamespaces: {
3662
3708
  };
3663
3709
  userMenu: {
3664
3710
  logout: string;
3711
+ offCanvasToggle: string;
3665
3712
  };
3666
3713
  order: {
3667
3714
  orderTitle: string;
@@ -4662,6 +4709,7 @@ declare class OffCanvasCart implements PageObject {
4662
4709
  constructor(page: Page);
4663
4710
  url(): string;
4664
4711
  getLineItemByProductNumber(productNumber: string): Promise<Record<string, Locator>>;
4712
+ getLineItemByPromotionName(name: string): Promise<Record<string, Locator>>;
4665
4713
  }
4666
4714
 
4667
4715
  declare class CheckoutConfirm implements PageObject {
@@ -4696,7 +4744,10 @@ declare class CheckoutConfirm implements PageObject {
4696
4744
  */
4697
4745
  readonly cartLineItemImages: Locator;
4698
4746
  readonly page: Page;
4747
+ readonly confirmProductTable: Locator;
4699
4748
  constructor(page: Page);
4749
+ getLineItemByProductName(productName: string): Record<string, Locator>;
4750
+ getLineItemByPromotionName(promotionName: string): Record<string, Locator>;
4700
4751
  url(): string;
4701
4752
  }
4702
4753
 
@@ -5554,6 +5605,7 @@ declare class DataSharing implements PageObject {
5554
5605
  declare class Dashboard implements PageObject {
5555
5606
  readonly contentView: Locator;
5556
5607
  readonly adminMenuView: Locator;
5608
+ readonly adminMenuOffCanvasToggle: Locator;
5557
5609
  readonly adminMenuCatalog: Locator;
5558
5610
  readonly adminMenuOrder: Locator;
5559
5611
  readonly adminMenuOrderOverview: Locator;
@@ -6891,4 +6943,4 @@ declare const test: playwright_test.TestType<playwright_test.PlaywrightTestArgs
6891
6943
  }>;
6892
6944
 
6893
6945
  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 };
6894
- export type { AccountData, AclRole, Address, 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, Options, Order, OrderDelivery, OrderLineItem, OrderStatus, PageObject, PaymentMethod$1 as PaymentMethod, Price, Product, ProductCrossSelling, ProductPrice, ProductReview, Promotion, PromotionDiscount, 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 };
6946
+ 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, ProductCrossSelling, 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
@@ -138,6 +138,13 @@ interface ApiContextTypes {
138
138
  MailpitApiContext: MailpitApiContext;
139
139
  }
140
140
 
141
+ type NewsletterRecipient = components["schemas"]["NewsletterRecipient"] & {
142
+ id: string;
143
+ email: string;
144
+ salesChannelId: string;
145
+ firstName: string;
146
+ lastName: string;
147
+ };
141
148
  type SalesChannel = components["schemas"]["SalesChannel"] & {
142
149
  id: string;
143
150
  };
@@ -259,6 +266,11 @@ type Tag = components["schemas"]["Tag"] & {
259
266
  type Rule = components["schemas"]["Rule"] & {
260
267
  id: string;
261
268
  };
269
+ interface BasicRuleCondition {
270
+ type: string;
271
+ value: Record<string, unknown>;
272
+ children?: BasicRuleCondition[];
273
+ }
262
274
  type Currency$2 = components["schemas"]["Currency"] & {
263
275
  id: string;
264
276
  };
@@ -334,6 +346,16 @@ type Promotion = Omit<components["schemas"]["Promotion"], "discounts"> & {
334
346
  type PromotionDiscount = components["schemas"]["PromotionDiscount"] & {
335
347
  id: string;
336
348
  };
349
+ interface PromotionWithConditionRuleOptions {
350
+ id: string;
351
+ name: string;
352
+ ruleId: string;
353
+ useCode?: boolean;
354
+ discountValue?: number;
355
+ discountScope?: string;
356
+ discountType?: string;
357
+ salesChannelId?: string;
358
+ }
337
359
  type OrderLineItem = components["schemas"]["OrderLineItem"] & {
338
360
  id: string;
339
361
  };
@@ -583,6 +605,14 @@ declare class TestDataService {
583
605
  */
584
606
  private createdSalesChannelRecords;
585
607
  constructor(AdminApiClient: AdminApiContext, IdProvider: IdProvider, options: DataServiceOptions);
608
+ /**
609
+ * Creates a newsletter recipient for a customer in the default sales channel.
610
+ * If a matching recipient already exists, it will be reused and registered for cleanup.
611
+ *
612
+ * @param customer - The customer whose email and profile data will be used for the newsletter recipient.
613
+ * @param overrides - Specific data overrides that will be applied to the newsletter recipient payload.
614
+ */
615
+ createNewsletterRecipient(customer: Customer, overrides?: Partial<NewsletterRecipient>): Promise<NewsletterRecipient>;
586
616
  /**
587
617
  * Creates a basic product without images or other special configuration.
588
618
  * The product will be added to the default sales channel category if configured.
@@ -755,6 +785,13 @@ declare class TestDataService {
755
785
  * @param salesChannelId - The uuid of the sales channel in which the promotion should be active.
756
786
  */
757
787
  createPromotionWithCode(overrides?: Partial<Promotion>, salesChannelId?: string): Promise<Promotion>;
788
+ /**
789
+ * Creates a promotion with one discount and assigns a condition rule as a persona rule.
790
+ * The created promotion and assigned rule are both registered for cleanup.
791
+ *
792
+ * @param promotionConfig - Promotion configuration, including the promotion id, name, and assigned rule id.
793
+ */
794
+ createPromotionWithConditionRule(promotionConfig: PromotionWithConditionRuleOptions): Promise<Promotion>;
758
795
  /**
759
796
  * Creates a new basic payment method.
760
797
  *
@@ -780,11 +817,13 @@ declare class TestDataService {
780
817
  */
781
818
  createShippingMethodWithImage(overrides?: Partial<ShippingMethod$1>): Promise<ShippingMethod$1>;
782
819
  /**
783
- * Creates a new basic rule with the condition cart amount >= 1.
820
+ * Creates a new basic rule with the condition cart amount >= 1 by default.
821
+ * Pass a condition object to create the same basic rule structure with another condition.
784
822
  *
785
823
  * @param overrides - Specific data overrides that will be applied to the basic rule data struct.
824
+ * @param condition - The condition object or condition type used in the generated rule.
786
825
  */
787
- createBasicRule(overrides?: Partial<Rule>, conditionType?: string, operator?: string, amount?: number): Promise<Rule>;
826
+ createBasicRule(overrides?: Partial<Rule>, condition?: BasicRuleCondition | string, operator?: string, amount?: number): Promise<Rule>;
788
827
  /**
789
828
  * Creates a new basic page layout.
790
829
  *
@@ -970,6 +1009,11 @@ declare class TestDataService {
970
1009
 
971
1010
  */
972
1011
  assignAclRoleUser(aclRoleId: string, adminUserId: string): Promise<any>;
1012
+ /**
1013
+ * Retrieves a newsletter recipient by customer email and the default sales channel.
1014
+ * @param customer - The customer whose email will be used to search for a newsletter recipient.
1015
+ */
1016
+ getNewsletterRecipient(customer: Customer): Promise<NewsletterRecipient | undefined>;
973
1017
  /**
974
1018
  * Retrieves a language based on its code.
975
1019
  * @param languageCode
@@ -1153,7 +1197,7 @@ declare class TestDataService {
1153
1197
  getCountryStruct(overrides?: Partial<Country$1>): Partial<Country$1>;
1154
1198
  getCurrencyStruct(overrides: Partial<Currency$2> | undefined, roundingDecimals: number): Partial<Currency$2>;
1155
1199
  getBasicProductStruct(taxId?: string, currencyId?: string, overrides?: Partial<Product>): Partial<Product>;
1156
- getBasicRuleStruct(overrides: Partial<Rule> | undefined, conditionType: string, operator: string, amount: number): Partial<Rule>;
1200
+ getBasicRuleStruct(overrides?: Partial<Rule>, condition?: BasicRuleCondition | string, operator?: string, amount?: number): Partial<Rule>;
1157
1201
  getProductPriceRangeStruct(currencyId: string, ruleId: string): Partial<Product>;
1158
1202
  getBasicManufacturerStruct(overrides?: Partial<Manufacturer>): Partial<Manufacturer>;
1159
1203
  getBasicPaymentMethodStruct(overrides?: Partial<PaymentMethod$1>): {
@@ -1530,6 +1574,7 @@ declare const BUNDLED_RESOURCES: {
1530
1574
  };
1531
1575
  userMenu: {
1532
1576
  logout: string;
1577
+ offCanvasToggle: string;
1533
1578
  };
1534
1579
  order: {
1535
1580
  orderTitle: string;
@@ -2432,6 +2477,7 @@ declare const BUNDLED_RESOURCES: {
2432
2477
  };
2433
2478
  userMenu: {
2434
2479
  logout: string;
2480
+ offCanvasToggle: string;
2435
2481
  };
2436
2482
  order: {
2437
2483
  orderTitle: string;
@@ -3662,6 +3708,7 @@ declare const baseNamespaces: {
3662
3708
  };
3663
3709
  userMenu: {
3664
3710
  logout: string;
3711
+ offCanvasToggle: string;
3665
3712
  };
3666
3713
  order: {
3667
3714
  orderTitle: string;
@@ -4662,6 +4709,7 @@ declare class OffCanvasCart implements PageObject {
4662
4709
  constructor(page: Page);
4663
4710
  url(): string;
4664
4711
  getLineItemByProductNumber(productNumber: string): Promise<Record<string, Locator>>;
4712
+ getLineItemByPromotionName(name: string): Promise<Record<string, Locator>>;
4665
4713
  }
4666
4714
 
4667
4715
  declare class CheckoutConfirm implements PageObject {
@@ -4696,7 +4744,10 @@ declare class CheckoutConfirm implements PageObject {
4696
4744
  */
4697
4745
  readonly cartLineItemImages: Locator;
4698
4746
  readonly page: Page;
4747
+ readonly confirmProductTable: Locator;
4699
4748
  constructor(page: Page);
4749
+ getLineItemByProductName(productName: string): Record<string, Locator>;
4750
+ getLineItemByPromotionName(promotionName: string): Record<string, Locator>;
4700
4751
  url(): string;
4701
4752
  }
4702
4753
 
@@ -5554,6 +5605,7 @@ declare class DataSharing implements PageObject {
5554
5605
  declare class Dashboard implements PageObject {
5555
5606
  readonly contentView: Locator;
5556
5607
  readonly adminMenuView: Locator;
5608
+ readonly adminMenuOffCanvasToggle: Locator;
5557
5609
  readonly adminMenuCatalog: Locator;
5558
5610
  readonly adminMenuOrder: Locator;
5559
5611
  readonly adminMenuOrderOverview: Locator;
@@ -6891,4 +6943,4 @@ declare const test: playwright_test.TestType<playwright_test.PlaywrightTestArgs
6891
6943
  }>;
6892
6944
 
6893
6945
  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 };
6894
- export type { AccountData, AclRole, Address, 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, Options, Order, OrderDelivery, OrderLineItem, OrderStatus, PageObject, PaymentMethod$1 as PaymentMethod, Price, Product, ProductCrossSelling, ProductPrice, ProductReview, Promotion, PromotionDiscount, 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 };
6946
+ 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, ProductCrossSelling, 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
@@ -1317,7 +1317,8 @@ const shopwareServices$1 = {
1317
1317
  exploreNow: "Explore now"
1318
1318
  };
1319
1319
  const userMenu$1 = {
1320
- logout: "Logout"
1320
+ logout: "Logout",
1321
+ offCanvasToggle: "Expand menu"
1321
1322
  };
1322
1323
  const order$1 = {
1323
1324
  orderTitle: "Orders",
@@ -2423,7 +2424,8 @@ const shopwareServices = {
2423
2424
  exploreNow: "Jetzt erkunden"
2424
2425
  };
2425
2426
  const userMenu = {
2426
- logout: "Abmelden"
2427
+ logout: "Abmelden",
2428
+ offCanvasToggle: "Menü ausklappen"
2427
2429
  };
2428
2430
  const order = {
2429
2431
  orderTitle: "Bestellungen",
@@ -4276,6 +4278,35 @@ class TestDataService {
4276
4278
  this.nameSuffix = options.nameSuffix;
4277
4279
  }
4278
4280
  }
4281
+ /**
4282
+ * Creates a newsletter recipient for a customer in the default sales channel.
4283
+ * If a matching recipient already exists, it will be reused and registered for cleanup.
4284
+ *
4285
+ * @param customer - The customer whose email and profile data will be used for the newsletter recipient.
4286
+ * @param overrides - Specific data overrides that will be applied to the newsletter recipient payload.
4287
+ */
4288
+ async createNewsletterRecipient(customer, overrides = {}) {
4289
+ const hash = this.IdProvider.getIdPair();
4290
+ const recipientPayload = {
4291
+ email: customer.email,
4292
+ salesChannelId: this.defaultSalesChannel.id,
4293
+ firstName: customer.firstName ?? `Test ${hash.id}`,
4294
+ lastName: customer.lastName ?? `User ${hash.id}`,
4295
+ hash: customer.id || hash.uuid,
4296
+ status: "direct",
4297
+ languageId: customer.languageId ?? this.defaultLanguageId,
4298
+ salutationId: customer.salutationId,
4299
+ confirmedAt: this.convertDateTime(/* @__PURE__ */ new Date()),
4300
+ ...overrides
4301
+ };
4302
+ const resp = await this.AdminApiClient.post("newsletter-recipient?_response=detail", {
4303
+ data: recipientPayload
4304
+ });
4305
+ expect(resp.ok()).toBeTruthy();
4306
+ const { data: recipient } = await resp.json();
4307
+ this.addCreatedRecord("newsletter_recipient", recipient.id);
4308
+ return recipient;
4309
+ }
4279
4310
  /**
4280
4311
  * Creates a basic product without images or other special configuration.
4281
4312
  * The product will be added to the default sales channel category if configured.
@@ -4805,6 +4836,48 @@ class TestDataService {
4805
4836
  this.addCreatedRecord("promotion", promotion.id);
4806
4837
  return promotionWithDiscount;
4807
4838
  }
4839
+ /**
4840
+ * Creates a promotion with one discount and assigns a condition rule as a persona rule.
4841
+ * The created promotion and assigned rule are both registered for cleanup.
4842
+ *
4843
+ * @param promotionConfig - Promotion configuration, including the promotion id, name, and assigned rule id.
4844
+ */
4845
+ async createPromotionWithConditionRule(promotionConfig) {
4846
+ const useCode = promotionConfig.useCode ?? false;
4847
+ const basicPromotion = this.getBasicPromotionStruct(promotionConfig.salesChannelId, {
4848
+ id: promotionConfig.id,
4849
+ name: promotionConfig.name,
4850
+ useCodes: useCode,
4851
+ useIndividualCodes: useCode,
4852
+ discounts: [
4853
+ {
4854
+ scope: promotionConfig.discountScope ?? "cart",
4855
+ type: promotionConfig.discountType ?? "percentage",
4856
+ value: promotionConfig.discountValue ?? 10,
4857
+ considerAdvancedRules: false
4858
+ }
4859
+ ]
4860
+ });
4861
+ if (!useCode) {
4862
+ delete basicPromotion.code;
4863
+ }
4864
+ const promotionWithConditionRule = {
4865
+ ...basicPromotion,
4866
+ personaRules: [
4867
+ {
4868
+ id: promotionConfig.ruleId
4869
+ }
4870
+ ]
4871
+ };
4872
+ const promotionResponse = await this.AdminApiClient.post("promotion?_response=detail", {
4873
+ data: promotionWithConditionRule
4874
+ });
4875
+ expect(promotionResponse.ok()).toBeTruthy();
4876
+ const { data: promotion } = await promotionResponse.json();
4877
+ this.addCreatedRecord("promotion", promotionConfig.id);
4878
+ this.addCreatedRecord("rule", promotionConfig.ruleId);
4879
+ return promotion;
4880
+ }
4808
4881
  /**
4809
4882
  * Creates a new basic payment method.
4810
4883
  *
@@ -4860,12 +4933,14 @@ class TestDataService {
4860
4933
  return shippingMethod;
4861
4934
  }
4862
4935
  /**
4863
- * Creates a new basic rule with the condition cart amount >= 1.
4936
+ * Creates a new basic rule with the condition cart amount >= 1 by default.
4937
+ * Pass a condition object to create the same basic rule structure with another condition.
4864
4938
  *
4865
4939
  * @param overrides - Specific data overrides that will be applied to the basic rule data struct.
4940
+ * @param condition - The condition object or condition type used in the generated rule.
4866
4941
  */
4867
- async createBasicRule(overrides = {}, conditionType = "cartCartAmount", operator = ">=", amount = 1) {
4868
- const basicRule = this.getBasicRuleStruct(overrides, conditionType, operator, amount);
4942
+ async createBasicRule(overrides = {}, condition = "cartCartAmount", operator = ">=", amount = 1) {
4943
+ const basicRule = this.getBasicRuleStruct(overrides, condition, operator, amount);
4869
4944
  const ruleResponse = await this.AdminApiClient.post("rule?_response=detail", {
4870
4945
  data: basicRule
4871
4946
  });
@@ -5410,6 +5485,32 @@ class TestDataService {
5410
5485
  const { data: aclUser } = await syncAclUserResponse.json();
5411
5486
  return aclUser;
5412
5487
  }
5488
+ /**
5489
+ * Retrieves a newsletter recipient by customer email and the default sales channel.
5490
+ * @param customer - The customer whose email will be used to search for a newsletter recipient.
5491
+ */
5492
+ async getNewsletterRecipient(customer) {
5493
+ const response = await this.AdminApiClient.post("search/newsletter-recipient", {
5494
+ data: {
5495
+ limit: 1,
5496
+ filter: [
5497
+ {
5498
+ type: "equals",
5499
+ field: "email",
5500
+ value: customer.email
5501
+ },
5502
+ {
5503
+ type: "equals",
5504
+ field: "salesChannelId",
5505
+ value: this.defaultSalesChannel.id
5506
+ }
5507
+ ]
5508
+ }
5509
+ });
5510
+ expect(response.ok()).toBeTruthy();
5511
+ const { data: result } = await response.json();
5512
+ return result[0];
5513
+ }
5413
5514
  /**
5414
5515
  * Retrieves a language based on its code.
5415
5516
  * @param languageCode
@@ -6029,9 +6130,16 @@ class TestDataService {
6029
6130
  }
6030
6131
  return Object.assign({}, basicProduct, overrides);
6031
6132
  }
6032
- getBasicRuleStruct(overrides = {}, conditionType, operator, amount) {
6133
+ getBasicRuleStruct(overrides = {}, condition = "cartCartAmount", operator = ">=", amount = 1) {
6033
6134
  const { id: ruleId, uuid: ruleUuid } = this.IdProvider.getIdPair();
6034
6135
  const ruleName = `${this.namePrefix}Rule-${ruleId}${this.nameSuffix}`;
6136
+ const ruleCondition = typeof condition === "string" ? {
6137
+ type: condition,
6138
+ value: {
6139
+ operator,
6140
+ amount
6141
+ }
6142
+ } : condition;
6035
6143
  const description = `
6036
6144
  Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
6037
6145
  At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
@@ -6048,15 +6156,7 @@ class TestDataService {
6048
6156
  children: [
6049
6157
  {
6050
6158
  type: "andContainer",
6051
- children: [
6052
- {
6053
- type: conditionType,
6054
- value: {
6055
- operator,
6056
- amount
6057
- }
6058
- }
6059
- ]
6159
+ children: [ruleCondition]
6060
6160
  }
6061
6161
  ]
6062
6162
  }
@@ -7372,6 +7472,16 @@ class OffCanvasCart {
7372
7472
  lineItemGaranLabel
7373
7473
  };
7374
7474
  }
7475
+ async getLineItemByPromotionName(name) {
7476
+ const promotionItem = this.page.locator(".line-item-promotion", { hasText: name });
7477
+ const promotionLabel = promotionItem.locator(".line-item-label");
7478
+ const promotionPrice = promotionItem.locator(".line-item-total-price-value");
7479
+ return {
7480
+ promotionItem,
7481
+ promotionLabel,
7482
+ promotionPrice
7483
+ };
7484
+ }
7375
7485
  }
7376
7486
 
7377
7487
  class CheckoutConfirm {
@@ -7406,6 +7516,7 @@ class CheckoutConfirm {
7406
7516
  */
7407
7517
  cartLineItemImages;
7408
7518
  page;
7519
+ confirmProductTable;
7409
7520
  constructor(page) {
7410
7521
  this.page = page;
7411
7522
  this.headline = page.getByRole("heading", { name: translate("storefront:checkout:confirm.completeOrder") });
@@ -7427,6 +7538,27 @@ class CheckoutConfirm {
7427
7538
  this.termsAndConditionsWithLegalGuaranteeRightsLabel = page.getByLabel(translate("storefront:checkout:confirm.termsAndConditionsWithLegalGuaranteeRights"));
7428
7539
  this.legalGuaranteeNoticeLink = page.locator("#legalGuaranteeNoticeModal a");
7429
7540
  this.lineItemGaranLabel = page.locator(".line-item-garan-label");
7541
+ this.confirmProductTable = page.locator(".confirm-product");
7542
+ }
7543
+ getLineItemByProductName(productName) {
7544
+ const productLineItem = this.confirmProductTable.locator(".line-item-product", { hasText: productName });
7545
+ const productNameLabel = productLineItem.locator(".line-item-label");
7546
+ const productTotalPrice = productLineItem.locator(".line-item-total-price-value");
7547
+ return {
7548
+ productLineItem,
7549
+ productNameLabel,
7550
+ productTotalPrice
7551
+ };
7552
+ }
7553
+ getLineItemByPromotionName(promotionName) {
7554
+ const promotionLineItem = this.confirmProductTable.locator(".line-item-promotion", { hasText: promotionName });
7555
+ const promotionNameLabel = promotionLineItem.locator(".line-item-label");
7556
+ const promotionTotalPrice = promotionLineItem.locator(".line-item-total-price-value");
7557
+ return {
7558
+ promotionLineItem,
7559
+ promotionNameLabel,
7560
+ promotionTotalPrice
7561
+ };
7430
7562
  }
7431
7563
  url() {
7432
7564
  return "checkout/confirm";
@@ -9366,6 +9498,7 @@ class DataSharing {
9366
9498
  class Dashboard {
9367
9499
  contentView;
9368
9500
  adminMenuView;
9501
+ adminMenuOffCanvasToggle;
9369
9502
  adminMenuCatalog;
9370
9503
  adminMenuOrder;
9371
9504
  adminMenuOrderOverview;
@@ -9398,6 +9531,7 @@ class Dashboard {
9398
9531
  constructor(page) {
9399
9532
  this.page = page;
9400
9533
  this.adminMenuView = page.locator(".sw-admin-menu");
9534
+ this.adminMenuOffCanvasToggle = page.getByRole("button", { name: translate("administration:dashboard:userMenu.offCanvasToggle") });
9401
9535
  this.contentView = page.locator(".sw-desktop__content");
9402
9536
  this.adminMenuCatalog = page.locator(".sw-catalogue");
9403
9537
  this.adminMenuOrder = page.locator(".sw-order");
@@ -9428,7 +9562,7 @@ class Dashboard {
9428
9562
  name: translate("administration:dashboard:shopwareServices.exploreNow")
9429
9563
  });
9430
9564
  this.adminMenuUserActions = page.locator(".sw-admin-menu__user-actions-toggle");
9431
- this.adminMenuLogoutButton = page.locator(".sw-admin-menu__user-actions").getByRole("link", { name: translate("administration:dashboard:userMenu.logout") });
9565
+ this.adminMenuLogoutButton = page.getByText(translate("administration:dashboard:userMenu.logout"));
9432
9566
  }
9433
9567
  url() {
9434
9568
  return "#/sw/dashboard/index";
@@ -12144,7 +12278,7 @@ const BulkEditCustomers = test$e.extend({
12144
12278
  if (accountData.language) {
12145
12279
  await AdminCustomerBulkEdit.changeLanguageCheckbox.click();
12146
12280
  await AdminCustomerBulkEdit.changeLanguageInput.click();
12147
- await AdminCustomerBulkEdit.page.getByText(accountData.language).click();
12281
+ await AdminCustomerBulkEdit.filtersResultPopoverItemList.getByText(accountData.language, { exact: true }).click();
12148
12282
  }
12149
12283
  if (accountData.replyToCustomerGroupRequest) {
12150
12284
  await AdminCustomerBulkEdit.replyToCustomerGroupRequest.click();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shopware-ag/acceptance-test-suite",
3
- "version": "12.20.1",
3
+ "version": "12.21.0",
4
4
  "description": "Shopware Acceptance Test Suite",
5
5
  "keywords": [
6
6
  "fixtures",