Skip to content

CC-39280 Port the Robot UI journeys of twelve domains to Cypress - #392

Draft
stereomon wants to merge 138 commits into
masterfrom
feature/cc-39273/cc-39280-sunset-robot-framework-coverage-map-one-clean-cutover
Draft

stereomon wants to merge 138 commits into
masterfrom
feature/cc-39273/cc-39280-sunset-robot-framework-coverage-map-one-clean-cutover

Conversation

@stereomon

@stereomon stereomon commented Aug 21, 2026 •

Copy link
Copy Markdown
Collaborator

Accumulating branch for the Robot UI retirement. Each domain batch is proven locally and merged in here; this pull request is what goes to master once the round closes.

https://spryker.atlassian.net/browse/CC-39280

86 of 86 in-scope scenarios are ported and verified. 0 are still to port and 0 are authored but not yet verified. The per-scenario state, including which pull request each row landed in, is in the matrix on the source branch's checklist.

The Robot originals are not deleted. The lane that runs them is switched off in CI instead, which is what suite#1087 does, so every row below keeps pr_source unset and the sources stay in spryker/robotframework-suite-tests as a record.

Counts

Verdict Rows Verified
MIGRATE 84 84
RESHAPE 2 2
OBSOLETE 14 0
DROP 4 0
DEFER 1 0

1 scenario parked, not migrated

Each one is recorded as DEFER with the reason it cannot be ported yet. None is counted as migrated, and none carries a skipped placeholder — a skipped target would read as coverage that nothing actually runs.

Domain Scenario Blocked by
administration Payment_method_update Deactivates the Invoice payment method globally to prove it disappears from checkout. dummyPaymentInvoice is depended on by the checkout, order-amendment and recurring-order specs, Cypress shards run concurrently against one application, and shard packing is nondeterministic, so whichever of those is packed alongside would fail. A fixture-created payment method is not a way round it: with no storefront plugin behind it, it does not render in checkout. Needs a serial lane or per-test payment-method state.

Test plan

  • Every verified spec below was proven by a headless Cypress run against the local docker/sdk stack. The Run column carries the counts and durations, except where a green focused CI run exists for the row and is linked instead.
  • npx tsc --noEmit and npx prettier --check — both clean.
  • python3 gate.py on the matrix branch — gates clean.

Checklists

administration — 6 scenarios

administration · robot-ui-to-cypress · CC-39280 · 6 scenarios

MIGRATE 4 · OBSOLETE 1 · DEFER 1 ▸ 4/4 verified

Batches: administration

Target PR: #392

MIGRATE / RESHAPE — port these

✓ Scenario Var Contract Target Eff Run
[x] Glossary ×5 Create + edit glossary translation in BO. (yves) cypress/e2e/backoffice/administration/glossary-management.cy.ts::should create a translation and list it L local 2026-08-24 · 2 passing · 13s
[x] Zed_navigation_ordering_and_naming ×5 Verifies each left navigation node can be opened. DMS ON: https://spryker.atlassian.net/browse/FRW-7394. (backoffice) cypress/e2e/backoffice/navigation/navigation-smoke.cy.ts::should open every left navigation node without an error M run
[x] Agent_Assist ×5 Checks customer data and checkout as an agent. (yves) cypress/e2e/yves/agent-assist/customer-impersonation.cy.ts::agent should be able to place an order for the impersonated customer L local 2026-08-24 · 4 passing · 40s
[x] User_Control ×5 Create a user with limited access. (backoffice) cypress/e2e/backoffice/acl/acl-navigation-access.cy.ts::should deny an action for a role with an explicit deny rule M run

OBSOLETE / DROP — delete the source, do not port

✓ Scenario Reason Covered by
[ ] Minimum_Order_Value Duplicate journey — retired by the port of platform/Minimum_Order_Value; delete it in that sibling's batch, it needs no port of its own. robot:tests/parallel_ui/suite/misc/static_demodata_set.robot::Minimum_Order_Value

DEFER — parked, not counted as migrated

Scenario Placeholder Blocked by
Payment_method_update — Deactivates the Invoice payment method globally to prove it disappears from checkout. dummyPaymentInvoice is depended on by the checkout, order-amendment and recurring-order specs, Cypress shards run concurrently against one application, and shard packing is nondeterministic, so whichever of those is packed alongside would fail. A fixture-created payment method is not a way round it: with no storefront plugin behind it, it does not render in checkout. Needs a serial lane or per-test payment-method state.
checkout — 16 scenarios

checkout · robot-ui-to-cypress · CC-39280 · 16 scenarios

MIGRATE 13 · OBSOLETE 3 ▸ 13/13 verified

Batches: checkout

Target PR: #397

MIGRATE / RESHAPE — port these

✓ Scenario Var Contract Target Eff Run
[x] Unique_URL ×3 Bug: https://spryker.atlassian.net/browse/CC-12380. (yves) cypress/e2e/yves/cart/shared-cart-external-link.cy.ts::given a cart shared by external link when an anonymous visitor opens it then the cart is shown as a read-only preview M local 2026-08-24 · 1 passing · 9s
[x] Approval_Process ×2 Checks role permissions on checkout and Approval process. (yves) cypress/e2e/yves/checkout/cart-approval-process.cy.ts::given a cart above the buyer spend limit when the approver approves the request then the buyer can place the order L local 2026-08-24 · 1 passing · 23s
[x] Business_Unit_Address_on_Checkout ×3 Checks that business unit address can be used during checkout. (yves) cypress/e2e/yves/company-account/business-unit-address-checkout.cy.ts::given a company user with no personal address when the business unit address is chosen at checkout then the order ships to it L local 2026-08-24 · 1 passing · 16s
[x] Checkout_Address_Management ×5 Bug: CC-30439. Checks that user can change address during the checkout and save new into the address book. (yves) cypress/e2e/yves/checkout/checkout-address-management.cy.ts::given a separate billing address when the customer returns to the address step and changes both addresses then the order takes the changed ones and only the address marked for saving is added to the address book L local 2026-08-24 · 1 passing · 28s
[x] Click_and_collect ×2 checks that product offer is successfully replaced with a target product offer. (yves) cypress/e2e/yves/checkout/click-and-collect.cy.ts::given an offer collected at a service point when the order is placed then it ships to the service point as a single pickup shipment L local 2026-08-24 · 1 passing · 25s
[x] Comments_in_Cart ×3 Add comments to cart and verify comments in Yves and Zed. (yves) cypress/e2e/yves/comments/cart-comments.cy.ts::given a cart carrying a comment when the order is placed then the comment is on the order in the storefront and in the back office L local 2026-08-24 · 7 passing · 48s
[x] Guest_Checkout ×2 Guest checkout with bundles, discounts and OMS. (yves) cypress/e2e/yves/discount/discounts-and-promotions.cy.ts::given a guest cart holding a product bundle when a voucher and a cart rule both collect then both discounts apply and the guest order is placed L local 2026-08-24 · 2 passing · 41s
[x] Guest_Checkout_Addresses ×2 Guest checkout with different addresses and OMS. (yves) cypress/e2e/yves/checkout/split-delivery.cy.ts::given a guest cart of three items when each item is given its own delivery address then the order is split into one shipment per address L local 2026-08-24 · 2 passing · 1m06s
[x] Login_during_checkout ×2 Login during checkout (yves) cypress/e2e/yves/checkout/checkout-authentication.cy.ts::given a guest cart when the customer logs in at the checkout customer step then the order is placed on that account L local 2026-08-24 · 2 passing · 28s
[x] Multiple_Merchants_Order ×3 Checks that order with products and offers of multiple merchants could be placed and it will be split per merchant. (yves) cypress/e2e/yves/checkout/multi-merchant-order.cy.ts::given a cart holding the main merchant product and an offer from each of two merchants when the order is placed then it is split into one shipment per merchant L local 2026-08-24 · 1 passing · 27s
[x] Register_during_checkout ×2 Guest user email should be whitelisted from the AWS side before running the test. (yves) cypress/e2e/yves/checkout/checkout-authentication.cy.ts::given a guest cart when the customer registers at the checkout customer step then the account is created and the order is placed on it L local 2026-08-24 · 2 passing · 28s
[x] Request_for_Quote ×3 Checks user can request and receive quote. (yves) cypress/e2e/yves/quote-request/quote-request-lifecycle.cy.ts::given a quote request sent to an agent when the agent revises the item price then the customer converts it to a cart and orders at the revised price L local 2026-08-24 · 1 passing · 25s
[x] Split_Delivery ×5 Checks split delivery in checkout. (yves) cypress/e2e/yves/checkout/split-delivery.cy.ts::should create one shipment per delivery address when the cart is split L run

OBSOLETE / DROP — delete the source, do not port

✓ Scenario Reason Covered by
[ ] Guest_Checkout_and_Addresses Duplicate journey — retired by the port of checkout/Guest_Checkout_Addresses; delete it in that sibling's batch, it needs no port of its own. Also folds into checkout/Guest_Checkout; both siblings together cover this journey. robot:tests/ui/suite/checkout/checkout.robot::Guest_Checkout_Addresses
[ ] Comment_Management_in_the_Cart Add, edit and delete a cart comment with a visibility assertion after each step — identical to the Cypress cart-comment edit and remove tests; the highest-scoring pair in the duplication report. spryker/cypress-tests:cypress/e2e/yves/comments/cart-comments.cy.ts
[ ] Configurable_Product_Checkout Duplicate journey — retired by the port of product/Configurable_Product_Checkout; delete it in that sibling's batch, it needs no port of its own. robot:tests/parallel_ui/suite/catalog/catalog_configurable_product.robot::Configurable_Product_Checkout
company — 2 scenarios

company · robot-ui-to-cypress · CC-39280 · 2 scenarios

MIGRATE 2 ▸ 2/2 verified

Batches: company

Target PR: #394

MIGRATE / RESHAPE — port these

✓ Scenario Var Contract Target Eff Run
[x] Create_new_company_user_with_linked_entities_in_storefront ×3 Create a new company user on Storefront. (yves) cypress/e2e/yves/company-account/company-structure-creation.cy.ts::company administrator should be able to create a business unit and a company user in it M local 2026-08-24 · 2 passing · 13s
[x] Create_new_company_with_linked_entities_and_customer_in_backoffice ×3 Create a new company with linked entities and new customer in backoffice. (yves) cypress/e2e/backoffice/company-account/company-structure-creation.cy.ts::should list the new company user under its company when the company structure is built in the back office M local 2026-08-24 · 2 passing · 24s
content — 1 scenarios

content · robot-ui-to-cypress · CC-39280 · 1 scenarios

MIGRATE 1 ▸ 1/1 verified

Batches: content

Target PR: #392

MIGRATE / RESHAPE — port these

✓ Scenario Var Contract Target Eff Run
[x] Content_Management ×5 Checks cms content can be edited in zed and that correct cms elements are present on homepage. (yves) cypress/e2e/yves/cms/cms-page-publish.cy.ts::should render a published cms page with its title and content under its localized storefront url M run
customer — 14 scenarios

customer · robot-ui-to-cypress · CC-39280 · 14 scenarios

MIGRATE 10 · OBSOLETE 3 · DROP 1 ▸ 10/10 verified

Batches: customer

Target PR: #399

MIGRATE / RESHAPE — port these

✓ Scenario Var Contract Target Eff Run
[x] Add_to_Wishlist ×3 Check creation of wishlist and adding to different wishlists. (yves) cypress/e2e/yves/wishlist/wishlist-management.cy.ts::given a customer owning two wishlists when a product is added to each of them then each wishlist holds only its own product M local 2026-08-25 · 2 passing · 18s
[x] Business_on_Behalf ×3 Check that BoB user has possibility to change the business unit. (yves) cypress/e2e/yves/company-account/business-on-behalf.cy.ts::given a customer attached to two business units when they use the selector then they can act for either one L local 2026-08-25 · 1 passing · 7s
[x] Guest_User_Access_Restrictions ×5 Checks that guest users see products info and cart but not profile. (yves) cypress/e2e/yves/customer-account-management/guest-access-restrictions.cy.ts::given a guest when a product is added from its detail page then the cart holds the product and its total S local 2026-08-25 · 3 passing · 9s
[x] Quick_Order suite Checks Quick Order, checkout and Reorder. (yves) cypress/e2e/yves/quick-order/quick-order-to-checkout.cy.ts::given a pasted quick order of two products sold by different merchants when it is bought and reordered then every destination keeps both merchants L local 2026-08-25 · 1 passing · 23s
[x] Share_Shopping_Carts ×3 Checks that cart can be shared and used for checkout. (yves) cypress/e2e/yves/cart/shared-cart-checkout.cy.ts::given a cart shared with a colleague at full access when the colleague orders it then the order is placed and keeps the merchant relation L local 2026-08-25 · 1 passing · 24s
[x] Share_Shopping_Lists ×3 Checks that shopping list can be shared. (yves) cypress/e2e/yves/shopping-list/shopping-list-sharing.cy.ts::given a shopping list shared with a colleague at full access when the colleague opens it then it is on their overview and its products reach their cart L local 2026-08-25 · 1 passing · 20s
[x] Shopping_List_Contains_Offers suite Checks that customer is able to add merchant products and offers to list and merchant relation won't be lost in list and afterwards in cart. (yves) cypress/e2e/yves/shopping-list/shopping-list-product-offers.cy.ts::given a product sold by two merchants when both offers are added to one shopping list then the list and the cart keep a line per merchant L local 2026-08-25 · 1 passing · 19s
[x] Update_Customer_Data ×5 Checks customer data can be updated from Yves and Zed. (yves) cypress/e2e/yves/customer-account-management/customer-profile-management.cy.ts::customer should see a profile change an administrator made in the back office M run
[x] User_Account ×5 Checks user account pages work + address management. (yves) cypress/e2e/yves/customer-account-management/customer-address-management.cy.ts::customer should see an address an administrator added in the back office M run
[x] Wishlist_List_Supports_Offers ×2 Checks that customer is able to add merchant products and offers to list and merchant relation won't be lost in list and afterwards in cart. (yves) cypress/e2e/yves/wishlist/wishlist-product-offers.cy.ts::given a product sold by two merchants when both offers are added to one wishlist then the wishlist and the cart keep a line per merchant L local 2026-08-25 · 1 passing · 16s

OBSOLETE / DROP — delete the source, do not port

✓ Scenario Reason Covered by
[ ] Authorized_User_Access Navigation smoke: header icons and page-is-displayed assertions with one add-to-cart; no state change, and login is already covered by yves/customer-account-management/customer-auth.cy.ts. —
[ ] Email_Confirmation Asserts that an unconfirmed customer cannot log in, which suite's configuration does not do: isDoubleOptInEnabled() defaults to false and suite adds no override, so registration is followed by a successful login. The sibling Cypress test proves exactly that in the same run. The gate itself is covered by the facade test, whose data provider mocks the config on and off and includes the unconfirmed-login case. A browser test cannot assert it without flipping a config the E2E environment does not flip. src/Spryker/Customer/tests/SprykerTest/Zed/Customer/Business/Facade/TryAuthorizeCustomerByEmailAndPasswordTest.php::testTryAuthorizeCustomerByEmailAndPassword
[ ] New_Customer_Registration Already covered. That test registers a customer through the storefront form and asserts getRegistrationCompletedMessage(), which is verbatim the flash string this Robot test asserts. Confirmed passing in suite run 32512608457. cypress/e2e/yves/customer-account-management/customer-auth.cy.ts::guest should be able to register and login as new customer
[ ] Reorder Both halves of this journey are already covered, in the repositories the Robot copies run in. The mp_b2c copy asserts merchant preservation, and reorder-product-offers.cy.ts skips only b2c and b2b, so it still runs in b2c-mp. The b2c-demo-shop copy does not assert a merchant at all despite its documentation line — it replaces that assertion with a plain product-presence check — and reorder-concrete-products.cy.ts covers exactly that, ungated, with an isB2c() helper that explicitly handles b2c and b2c-mp. No port needed. spryker/cypress-tests:cypress/e2e/yves/reorder/reorder-concrete-products.cy.ts + cypress/e2e/yves/reorder/reorder-product-offers.cy.ts
merchandising — 6 scenarios

merchandising · robot-ui-to-cypress · CC-39280 · 6 scenarios

MIGRATE 5 · OBSOLETE 1 ▸ 5/5 verified

Batches: merchandising

Target PR: #400

MIGRATE / RESHAPE — port these

✓ Scenario Var Contract Target Eff Run
[x] CRUD_Product_Set ×3 CRUD operations for product sets. DMS-ON: https://spryker.atlassian.net/browse/FRW-7393. (yves) cypress/e2e/backoffice/merchandising/product-set-management.cy.ts::given three products when a product set is created for them in the back office then the storefront serves the set and its whole content reaches the cart, and deleting the set retires the page L local 2026-08-25 · 1 passing · 34s
[x] Configurable_Bundle ×3 Check the usage of configurable bundles (includes authorized checkout). (yves) cypress/e2e/yves/product-bundle/configurable-bundle-checkout.cy.ts::given two configurations of one bundle template when one of them is doubled in the cart and the order is placed then the order carries three bundles L local 2026-08-25 · 1 passing · 30s
[x] Product_Relations ×5 Checks related product on PDP and upsell products in cart. (yves) cypress/e2e/yves/merchandising/product-relations.cy.ts::given one product carries a related-products relation and another carries none when both detail pages are opened then only the first shows the related products carousel M local 2026-08-25 · 1 passing · 18s
[x] Product_Sets ×3 Check the usage of product sets. (yves) cypress/e2e/yves/merchandising/product-sets.cy.ts::given a product set holding a variant product and a simple one when the set is opened from the overview and the variant is picked then the whole set reaches the cart with the picked variant M local 2026-08-25 · 1 passing · 31s
[x] Product_labels ×5 Checks that products have labels on PLP and PDP. (yves) cypress/e2e/yves/merchandising/product-labels.cy.ts::given a published label is assigned to a product when the catalog listing and the detail page are opened then both render the label M local 2026-08-25 · 1 passing · 13s

OBSOLETE / DROP — delete the source, do not port

✓ Scenario Reason Covered by
[ ] Discounts Duplicate journey — retired by the port of platform/Discounts; delete it in that sibling's batch, it needs no port of its own. robot:tests/parallel_ui/suite/misc/static_demodata_set.robot::Discounts
merchant — 22 scenarios

merchant · robot-ui-to-cypress · CC-39280 · 22 scenarios

MIGRATE 18 · OBSOLETE 1 · DROP 3 ▸ 18/18 verified

Batches: merchant

Target PR: #392

MIGRATE / RESHAPE — port these

✓ Scenario Var Contract Target Eff Run
[x] Create_New_Offer ×2 Checks that merchant is able to create new offer and it will be displayed on Yves. (yves) cypress/e2e/mp/product-offer/offer-creation.cy.ts::given a product owned by another merchant when a merchant creates an offer on it then the storefront sells it under that merchant at the offer price L local 2026-09-21 · 1 passing · 30s
[x] Create_and_Approve_New_Merchant_Product ×2 Checks that merchant is able to create new multi-SKU product and marketplace operator is able to approve it in BO. (yves) cypress/e2e/mp/marketplace-product-concretes/product-concrete-management.cy.ts::given a merchant that created a multi sku product when the back office approves it then the storefront serves it, and denying it takes the detail page away L local 2026-09-21 · 2 passing · 59s
[x] Approve_Offer ×3 Checks that marketplace operator is able to approve or deny merchant's offer and it will be available or not in store due to this status. (yves) cypress/e2e/backoffice/product-offer/offer-approval.cy.ts::given an approved offer on the storefront when the back office denies it then it leaves the detail page, and approving it again brings it back L local 2026-09-21 · 1 passing · 43s
[x] Fulfill_Order_from_Merchant_Portal ×3 Checks that merchant is able to process his order through OMS from merchant portal. (yves) cypress/e2e/mp/marketplace-order-management/order-fulfilment.cy.ts::given an order with two of a merchant's items when the merchant ships it and delivers one item then each item carries its own state L local 2026-09-21 · 1 passing · 4m
[x] Manage_Merchant_Product ×3 Checks that MU and BO user can manage merchant abstract and concrete products + add new concrete product. (yves) cypress/e2e/mp/marketplace-product-concretes/merchant-product-management.cy.ts::given a merchant product with one variant when the merchant adds another concrete and the back office renames the product then the storefront serves both changes L local 2026-09-21 · 1 passing · 37s
[x] Manage_Merchant_Users ×3 Checks that backoffice admin is able to create, activate, edit and delete merchant users. DMS-ON: https://spryker.atlassian.net/browse/FRW-7395. (backoffice) cypress/e2e/backoffice/merchant-management/merchant-user-management.cy.ts::given a merchant when the back office adds a user to it then the user can be activated, renamed, deactivated and deleted M local 2026-09-21 · 1 passing · 25s
[x] Manage_Merchants_from_Backoffice ×3 Checks that backoffice admin is able to create, approve, edit merchants. (yves) cypress/e2e/backoffice/merchant-management/merchant-crud.cy.ts::given a merchant created in the back office when it is approved and renamed then the storefront serves it, and unassigning its store retires the page L local 2026-09-21 · 1 passing · 42s
[x] Merchant_Portal_Customer_Specific_Prices ×2 Checks that customer will see product/offer prices specified by merchant for his business unit. (yves) cypress/e2e/mp/merchant-portal/customer-specific-prices.cy.ts::given a merchant relation to a business unit when the merchant prices a product for it then only that business unit is charged that price, and deleting the row restores the default one L local 2026-09-21 · 1 passing · 50s
[x] Merchant_Portal_My_Account ×3 Checks that MU can edit personal data in MP. DMS-ON: https://spryker.atlassian.net/browse/FRW-7395. (backoffice) cypress/e2e/mp/merchant-portal/merchant-user-account.cy.ts::given a merchant user when it edits its own name and password in the portal then the new password signs it in and the back office lists the new name M local 2026-09-21 · 1 passing · 3m
[x] Merchant_Portal_Offer_Volume_Prices ×3 Checks that merchant is able to create new offer with volume prices and it will be displayed on Yves. Fallback to default price after delete. (yves) cypress/e2e/mp/product-offer/offer-volume-prices.cy.ts::given an offer carrying a volume price when the merchant deletes that price row then the storefront falls back to the offer default price L local 2026-09-21 · 1 passing · 36s
[x] Merchant_Portal_Product_Volume_Prices ×3 Checks that merchant is able to create new multi-SKU product with volume prices. Fallback to default price after delete. (yves) cypress/e2e/mp/merchant-portal/product-volume-prices.cy.ts::given a merchant product carrying a volume price when the merchant deletes that price row then the storefront falls back to the default price L local 2026-09-21 · 1 passing · 37s
[x] Merchant_Product_Offer_in_Backoffice ×3 Check View action and filtration for Mproduct and Moffer in backoffice. (backoffice) cypress/e2e/backoffice/product-offer/offer-view-and-filter.cy.ts::given two merchants each owning an offer when the offer table is filtered by one of them then only its offer is listed and the view action shows the merchant, its sku and the offer status L local 2026-09-21 · 2 passing · 16s
[x] Merchant_Product_Original_Price ×3 checks that Original price is displayed on the PDP and in Catalog. (yves) cypress/e2e/yves/product/merchant-product-original-price.cy.ts::given a merchant product priced below its original price when the catalog is searched then the card and the detail page both show the two prices L local 2026-09-21 · 1 passing · 22s
[x] Merchant_Profile_Set_to_Inactive_from_Backoffice ×3 Checks that backoffice admin is able to deactivate merchant and then it's profile, products and offers won't be displayed on Yves. (yves) cypress/e2e/backoffice/merchant-management/merchant-deactivation.cy.ts::given a merchant offered on the storefront when the back office deactivates it then its profile and its products leave the storefront L local 2026-09-21 · 1 passing · 98s
[x] Merchant_Profile_Set_to_Offline_from_MP ×3 Checks that merchant is able to set store offline and then his profile, products and offers won't be displayed on Yves. (yves) cypress/e2e/mp/merchant-portal/merchant-store-status.cy.ts::given an online merchant when it sets its store offline then its profile and its products leave the storefront L local 2026-09-21 · 1 passing · 43s
[x] Merchant_Profile_Update ×3 Checks that merchant profile could be updated from merchant portal and that changes will be displayed on Yves. (yves) cypress/e2e/mp/merchant-portal/merchant-profile-update.cy.ts::given a merchant profile edited in the merchant portal when it is published then the storefront serves the new values L local 2026-09-21 · 1 passing · 19s
[x] Offer_Availability_Calculation suite check offer availability. (yves) cypress/e2e/yves/product-offer/offer-availability.cy.ts::given an offer with a limited stock when part of it is ordered and that order is then cancelled then the offer availability falls and is restored with it L local 2026-09-21 · 1 passing · 40s
[x] Search_for_Merchant_Offers_and_Products ×3 Checks that through search customer is able to see the list of merchant's products and offers. (yves) cypress/e2e/yves/catalog/merchant-search.cy.ts::given two merchants offering a product of the same name when the merchant facet is applied then only that merchant's product is listed L local 2026-09-21 · 1 passing · 1m

OBSOLETE / DROP — delete the source, do not port

✓ Scenario Reason Covered by
[ ] Shopping_List_Contains_Offers Duplicate journey — retired by the port of customer/Shopping_List_Contains_Offers; delete it in that sibling's batch, it needs no port of its own. robot:tests/ui/suite/customers/customer.robot::Shopping_List_Contains_Offers
[ ] Default_Merchants Opens the back-office merchant table and asserts three seeded merchant names are present; a demo-data presence assertion, not a journey. —
[ ] Merchant_Portal_Dashboard After a large back-office setup it clicks three dashboard buttons and checks URL fragments; a navigation smoke with no state change. —
[ ] Merchant_Portal_Unauthorized_Access_Redirects_To_Login_Page Deletes cookies, opens the Merchant Portal root and asserts a login div plus the URL; a bare redirect check, and Merchant Portal login is covered by smoke/merchant-portal/login.cy.ts. —
order — 6 scenarios

order · robot-ui-to-cypress · CC-39280 · 6 scenarios

MIGRATE 6 ▸ 6/6 verified

Batches: order

Target PR: #402

MIGRATE / RESHAPE — port these

✓ Scenario Var Contract Target Eff Run
[x] Configurable_Product_OMS ×2 Conf Product OMS check and reorder. (yves) cypress/e2e/backoffice/order-management/configurable-product-oms.cy.ts::given a configured product ordered and shipped when the order is reordered then the configuration is on the order but not in the new cart L local 2026-08-25 · 1 passing · 36s
[x] Comment_Management_in_Order ×3 Add comments in Yves and check in Zed. (yves) cypress/e2e/yves/comments/order-comments.cy.ts::given a placed order when the customer comments on it in the storefront then the comment is shown there and in the back office L local 2026-08-25 · 1 passing · 24s
[x] Manage_Shipments ×5 Checks create/edit shipment functions from backoffice. (yves) cypress/e2e/backoffice/order-management/shipment-management.cy.ts::given an order delivered as one shipment when a second shipment is created and then edited then the item moves and the edited address is kept L local 2026-08-25 · 1 passing · 31s
[x] Order_Cancellation ×5 Check that customer is able to cancel order. (yves) cypress/e2e/yves/order-management/order-cancellation.cy.ts::given every item of an order is cancellable when the customer cancels it then the order is cancelled L local 2026-08-25 · 2 passing · 36s
[x] Refunds ×5 Checks that refund can be created for one item and the whole order. (yves) cypress/e2e/backoffice/order-management/order-refund.cy.ts::given a delivered order of three items when they are refunded one by one then each refund is recorded and the grand total reaches zero L local 2026-08-25 · 1 passing · 36s
[x] Return_Management ×5 Checks that returns work and oms process is checked. (yves) cypress/e2e/yves/return-management/return-creation-storefront.cy.ts::given a shipped order of three items when the customer returns two of them then only those move to waiting for return L local 2026-08-25 · 1 passing · 1m33s
platform — 6 scenarios

platform · robot-ui-to-cypress · CC-39280 · 6 scenarios

MIGRATE 3 · RESHAPE 1 · OBSOLETE 2 ▸ 4/4 verified

Batches: platform

Target PR: #396

MIGRATE / RESHAPE — port these

✓ Scenario Var Contract Target Eff Run
[x] Discounts ×5 Discounts, Promo Products, and Coupon Codes (includes guest checkout). (yves) cypress/e2e/yves/discount/discounts-and-promotions.cy.ts::given a cart rule, a voucher and a promotional product discount when the voucher is redeemed and the promotional product is added then all three are applied and the order is placed L local 2026-08-24 · 1 passing · 31s
[x] Minimum_Order_Value ×5 checks that global minimum and maximum order thresholds can be applied. (yves) cypress/e2e/yves/checkout/minimum-order-value.cy.ts::given global order thresholds when the cart is above the maximum and then below it then checkout is blocked and the soft threshold fee is charged L local 2026-08-24 · 1 passing · 32s
[x] Data_exchange_API_Configuration_in_Zed ×5 DMS-ON: https://spryker.atlassian.net/browse/FRW-7396. (backoffice) cypress/e2e/backoffice/data-exchange/dynamic-entity-configuration.cy.ts::given a data exchange api configuration for a table when its resource fields are configured and saved then the reloaded form renders back what was saved L local 2026-08-24 · 1 passing · 22s
[x] Data_exchange_API_download_specification ×5 DMS-ON: https://spryker.atlassian.net/browse/FRW-7396. (backoffice) cypress/e2e/backoffice/data-exchange/api-specification-download.cy.ts::given a table is not exposed when its data exchange api configuration is enabled and the specification is regenerated then the downloaded specification gains its resource M local 2026-08-24 · 1 passing · 44s

OBSOLETE / DROP — delete the source, do not port

✓ Scenario Reason Covered by
[ ] Click_and_collect Duplicate journey — retired by the port of checkout/Click_and_collect; delete it in that sibling's batch, it needs no port of its own. robot:tests/ui/suite/checkout/checkout.robot::Click_and_collect
[ ] Fulfillment_app_e2e Duplicate journey — retired by the port of fulfillment_app/Fulfillment_app_e2e; delete it in that sibling's batch, it needs no port of its own. Same warehouse-user checkbox, same BAPI warehouse assignment, same Glue order, same back-office OMS walk to ready for picking, same variants; only the SKUs differ. The sibling's port walks Pay and Skip timeout through the UI rather than updating the database, so it covers this variant's browser half in full. robot:tests/ui/b2c/fulfillment_app/fultillment_app.robot::Fulfillment_app_e2e
product — 21 scenarios

product · robot-ui-to-cypress · CC-39280 · 21 scenarios

MIGRATE 18 · OBSOLETE 3 ▸ 18/18 verified

Batches: product

Target PR: #403

MIGRATE / RESHAPE — port these

✓ Scenario Var Contract Target Eff Run
[x] Configurable_Product_Checkout ×3 Configurable product checkout (yves) cypress/e2e/yves/product-configurator/configurable-product-checkout.cy.ts::given a configurable product when it is configured on its detail page then the configuration completes and the chosen option reaches the cart L local 2026-08-25 · 2 passing · 24s
[x] Back_in_Stock_Notification ×5 Back in stock notification is sent and availability check. (yves) cypress/e2e/yves/product/back-in-stock-notification.cy.ts::given a product with no stock left when its detail page is opened then it reads as out of stock and offers a back in stock notification M local 2026-08-25 · 3 passing · 15s
[x] Catalog ×5 Checks that catalog options and search work. (yves) cypress/e2e/yves/catalog/catalog-browsing.cy.ts::given a search result when a colour facet is applied then the catalog narrows to fewer products without emptying L local 2026-08-25 · 4 passing · 9s
[x] Catalog_Actions ×3 Checks quick add to cart and product groups. (yves) cypress/e2e/yves/catalog/quick-add-to-cart.cy.ts::given a buyable product in the catalog when it is quick added from its card then it lands in the cart L local 2026-08-25 · 3 passing · 11s
[x] Configurable_Product_PDP_Shopping_List ×3 Configure products from both the PDP and the Shopping List. Verify the availability of five items. Ensure that products that have not been configured cannot be purchased. (yves) cypress/e2e/yves/product-configurator/configurable-product-shopping-list.cy.ts::given a configurable product when it is added to the cart without being configured then the cart states that it cannot be processed M local 2026-08-25 · 3 passing · 26s
[x] Configurable_Product_PDP_Wishlist_Availability ×2 Configure product from PDP and Wishlist + availability case. (yves) cypress/e2e/yves/product-configurator/configurable-product-wishlist.cy.ts::given a configurable product configured on its detail page when it is wishlisted and configured again from the wishlist then the wishlist carries the newer configuration M local 2026-08-25 · 2 passing · 24s
[x] Configurable_Product_RfQ_OMS ×3 Conf Product in RfQ, OMS, Merchant OMS and reorder. (yves) cypress/e2e/yves/quote-request/configurable-product-rfq.cy.ts::given a configured product submitted as a quote request when an agent returns it and the customer converts it then the cart still carries the configuration L local 2026-08-25 · 1 passing · 1m27s
[x] Customer_Specific_Prices ×3 Checks that product price can be different for different customers. (yves) cypress/e2e/yves/product/customer-specific-prices.cy.ts::given a customer whose company has no merchant specific price when the product is browsed then the default price is shown in the catalog and on the product detail page M local 2026-08-25 · 2 passing · 9s
[x] Discontinued_Alternative_Products ×5 Checks discontinued and alternative products. (yves) cypress/e2e/yves/product/discontinued-alternative-products.cy.ts::given a discontinued product carrying an alternative when its product detail page is opened then the alternative is offered there L local 2026-08-25 · 2 passing · 27s
[x] Manage_Product ×3 checks that BO user can manage abstract and concrete products + create new. (yves) cypress/e2e/backoffice/product-management/product-lifecycle-management.cy.ts::given an abstract product created and approved in the back office when the catalog is searched then the storefront lists it L local 2026-08-25 · 2 passing · 1m48s
[x] Measurement_Units ×3 Checks checkout with Measurement Unit product. (yves) cypress/e2e/yves/product-measurement-unit/measurement-unit-checkout.cy.ts::given a measurement unit product when the quantity falls between two base units then the storefront says so rather than accepting it L local 2026-08-25 · 2 passing · 25s
[x] Packaging_Units ×3 Checks checkout with Packaging Unit product. (yves) cypress/e2e/yves/product-measurement-unit/packaging-unit-checkout.cy.ts::given a packaging unit product when an amount outside its rules is entered then the storefront says so rather than accepting it L local 2026-08-25 · 2 passing · 24s
[x] Product_Availability_Calculation ×5 Check product availability + multistore. (yves) cypress/e2e/yves/product/availability-calculation.cy.ts::given a product with a limited stock when part of it is ordered and that order is then cancelled then availability falls and is restored with it L local 2026-08-25 · 1 passing · 41s
[x] Product_Bundles ×4 Checks checkout with Bundle product. (yves) cypress/e2e/yves/product/product-bundle-checkout.cy.ts::given a bundle product when its product detail page is opened then the products it bundles are listed on it L local 2026-08-25 · 2 passing · 20s
[x] Product_Original_Price ×3 checks that Original price is displayed on the PDP and in Catalog. (yves) cypress/e2e/yves/product/original-price.cy.ts::given an abstract product priced above its default price when the catalog is searched then the card shows the default and the original price side by side L local 2026-08-25 · 2 passing · 18s
[x] Product_PDP ×5 Checks that PDP contains required elements. (yves) cypress/e2e/yves/product/product-detail-visibility.cy.ts::given a guest when a product variant is selected then the price, add to cart and the product options are shown and no wishlist form is M local 2026-08-25 · 3 passing · 5s
[x] Product_Restrictions ×3 Checks White and Black lists. (yves) cypress/e2e/yves/catalog/product-restrictions.cy.ts::given a whitelist scoped to a customer merchant relationship when that customer searches then only the whitelisted product is offered L local 2026-08-25 · 2 passing · 14s
[x] Volume_Prices ×5 Checks that volume prices are applied in cart. (yves) cypress/e2e/yves/product/volume-prices.cy.ts::given a product priced in volume tiers when the quantity on the detail page reaches a tier then the tier price replaces the unit price L local 2026-08-25 · 2 passing · 15s

OBSOLETE / DROP — delete the source, do not port

✓ Scenario Reason Covered by
[ ] Configurable_Product_OMS Duplicate journey — retired by the port of order/Configurable_Product_OMS; delete it in that sibling's batch, it needs no port of its own. robot:tests/ui/b2c/sales/sales.robot::Configurable_Product_OMS
[ ] Quick_Order Duplicate journey — retired by the port of customer/Quick_Order; delete it in that sibling's batch, it needs no port of its own. robot:tests/ui/suite/customers/customer.robot::Quick_Order
[ ] Offer_Availability_Calculation Duplicate journey — retired by the port of merchant/Offer_Availability_Calculation; delete it in that sibling's batch, it needs no port of its own. robot:tests/ui/suite/marketplace/marketplace.robot::Offer_Availability_Calculation
store — 4 scenarios

store · robot-ui-to-cypress · CC-39280 · 4 scenarios

MIGRATE 4 ▸ 4/4 verified

Batches: store

Target PR: #404

MIGRATE / RESHAPE — port these

✓ Scenario Var Contract Target Eff Run
[x] Dynamic_multistore ×5 This test should exclusively run for dynamic multi-store scenarios. The test verifies that the user can successfully create a new store, assign a product and CMS page, and register a customer within the new store. (yves) cypress/e2e/backoffice/core/dynamic-store-creation.cy.ts::given a store is created in the back office when a shopper opens the storefront then the store switcher offers it L local 2026-08-26 · 4 passing · 47s
[x] Multistore_CMS ×5 check CMS multistore functionality. (yves) cypress/e2e/yves/core/multistore-cms-page.cy.ts::given a cms page is unassigned from a store when a shopper opens its url on that store then the page is not found L local 2026-08-26 · 2 passing · 43s
[x] Multistore_Product ×3 check product multistore functionality. (yves) cypress/e2e/yves/core/multistore-product.cy.ts::given a product is unassigned from a store when a shopper opens its detail page on that store then the page is not found L local 2026-08-26 · 2 passing · 43s
[x] Multistore_Product_Offer ×3 check product and offer multistore functionality. (yves) cypress/e2e/yves/core/multistore-product-offer.cy.ts::given a store is unassigned from a product offer when a shopper opens the detail page then only the remaining store still lists that offer L local 2026-08-26 · 2 passing · 43s
warehouse — 1 scenarios

warehouse · robot-ui-to-cypress · CC-39280 · 1 scenarios

RESHAPE 1 ▸ 1/1 verified

Batches: warehouse

Target PR: #393

MIGRATE / RESHAPE — port these

✓ Scenario Var Contract Target Eff Run
[x] Fulfillment_app_e2e ×3 DMS-ON: https://spryker.atlassian.net/browse/FRW-7463. (yves) cypress/e2e/backoffice/warehouse/warehouse-picking-oms.cy.ts::should move the order item to ready for picking when picking list generation is scheduled L local 2026-08-24 · 2 passing · 28s

Ports the content domain's one Robot UI scenario. The back-office half --
create a page with translated placeholders and publish it -- is already
covered by backoffice/cms/cms-page-management.cy.ts, so the delta is the
part no Cypress spec asserts: that the published page is reachable under
its localized storefront url and renders its title.

cms-page-search-dms.cy.ts reaches a page through the search suggestions,
which is a different journey and only runs with dynamic store enabled, so
CmsContentPage gains a url-based visit rather than reusing that helper.

Publishing is not enough on its own -- the page stays invisible to the
storefront until the queue drains, hence shouldTriggerPublishAndSync.

Fixtures are per repository, so all five carry the pair. Typecheck, eslint
and prettier are clean locally; the run verdict is still outstanding.
The Robot scenario this replaces sets a distinct title and content
placeholder and asserts both storefront elements. The first pass only
covered the title, so deactivating Robot against it would have left the
content placeholder unasserted anywhere.

CmsPlaceholderEditPage gains updateTitleAndContent; the existing update
path is unchanged, both now share one localized-fill helper. The content
placeholder lives on a second tab whose fields stay inert until it is
opened, which is why the tab is clicked first.

Test titles follow this repository's subject-and-should convention rather
than Given/When/Then, which nothing here uses.
The existing ACL spec proves a role reaches only what it was allowed. Two things
it never asserted: that a deny rule beats a wildcard allow on the same user, and
that a deactivated user cannot log in at all.

The deny user holds two roles, one allowing every bundle, so a denial can only
come from the deny rule. A deactivated user is status "blocked" in spy_user,
which is what the back office writes when an administrator deactivates one.
Replaces the Robot navigation smoke test. Rather than clicking each node by
index, the spec reads every navigable href out of the side menu and visits it.
The collapsed second level is already in the DOM, so nothing has to be expanded
first, and there is no click-order fragility to inherit.

A node counts as opened when the back-office chrome renders, which is what the
Robot version was really asserting when it waited for the user-navigation
toggler.
The storefront half of this journey was already covered; what was missing is the
cross-surface direction, where an administrator edits a customer in the back
office and the customer sees it on their own profile page.

Needed a back-office customer edit page object and an edit action on the customer
index, which previously only knew how to remove multi-factor authentication.
Two gaps in the customer account area. Nothing asserted that a deleted address
is actually gone, only that adding one reports success. And the overview spec
checked four sidebar destinations by name, leaving whatever else the navigation
offers unvisited.

The crawl reads the links out of the navigation rather than naming destinations,
so a repository with more account pages gets them covered for free. The link
container differs per repository, so that selector stays in the repository while
the path extraction is shared.

Deleting walks up from the address entry to the nearest ancestor holding exactly
one delete form. That finds the card in every repository without naming any of
them, and cannot reach a neighbouring address's button.
Completes the account-area journey: an administrator adds an address through the
back office and the customer sees it in their own address list.

The create form fills only the fields it marks NotBlank, plus salutation, which
the storefront prints. Country is selected by name rather than by key, because
the field holds a country id that differs per environment.
…ce named

The crawl asserted that every link in the customer account navigation opens. In
suite it does not: the navigation renders a Shopping Lists entry that a plain
customer cannot open, and the application answers "Only company users are
allowed to access this page". That is the application's own behaviour, not a
broken page, and the Robot test never claimed otherwise -- it visited a fixed
list of account pages.

So the assertion is now that list. The overview spec already covered five of
those destinations; wishlist and returns are what it was missing. The per-repository
navigation selectors added for the crawl go with it, since nothing reads them now.
Ports the back-office half of the Robot glossary test: create a translation, see
it listed, edit it, and read the change back off the form.

The storefront half is deliberately not ported. It edited a translation key the
storefront actually renders, then undid it in a teardown. Cypress shards pack
nondeterministically, so any spec rendering that page in a neighbouring shard
would race with the edit. A test that has to be the only thing running is not
worth the coverage.

Each run uses a key of its own, so nothing shared is touched. Every locale
textarea the form renders is filled rather than naming locales, because the
collection is NotBlank and which locales exist depends on the store.
There was no way for a Cypress spec to act as a customer it has no password for.
That blocked three Robot rows, all of which use agent impersonation as the vehicle
rather than the subject: the agent-assist row and both company rows, where the
company user is created through a form and nothing knows its password.

Driving the control bar is not optional. The visible search field carries no name;
the form submits a hidden _switch_user input that the autocomplete fills when a
suggestion is chosen, so the suggestion has to be clicked. The scenario waits on
the autocomplete response rather than the list appearing, which removes the race
the Robot version papered over with retries.

Only the older agent-control-bar component exists in this package version, so the
two UI generations the Robot keyword branches on collapse to one, and the injected
JavaScript click it needed for the newer one is not required.
Completes the agent-assist journey. Reuses the existing add-to-cart and checkout
scenarios unchanged, which is the point: acting through an impersonated session
should be indistinguishable from the customer acting for themselves, and nothing
in the checkout path needed a special case for it.
Two new storefront page objects, business unit create and company user create,
and the spec that drives them: an administrator builds a business unit and a
company user inside it, then the new user is checked against its own role.

Impersonation is what makes the second half possible at all. A company user
created through a form has no password anyone knows, so the agent switches into
its session instead. Its role grants company users and nothing else, so the
company-role page has to refuse it.

The company, its roles and the agent come from fixtures; the business unit and the
company user are the part driven through the storefront, which is what the row is
about. Business units need no permission of their own, so only the role and user
permissions are seeded.
Multi-shipment checkout was already covered, but only up to the order being
placed. What the Robot test actually ended on was never checked: that three items
sent to three addresses become three shipments.

ShipmentGui renders one order-item table per shipment on the order detail page, so
counting them is the shipment count. The order is looked up by its own reference
rather than taking the first row of the sales table, because the shards run
concurrently and the newest order is not reliably this test's.

Named per-shipment shipping methods are not asserted. The radio ids carry the
method's position, not its name, and which method sits at which position depends
on the store, so an index-based assertion would be checking the wrong thing.
My assertion was wrong and CI caught it. Ending assistance does not bounce the
agent to the login form: the agent is still authenticated, just no longer a
customer, so the account area answers 500. The merchant-portal impersonation spec
already encodes that same behaviour.

Asserting the 500 would be asserting an incident rather than an intention. The
control bar shows the customer search only when nobody is being assisted and the
exit link only while somebody is, so the swap between them is what actually proves
the session was handed back.

The three tests that matter all passed: impersonation itself, the customer's own
profile data, and placing an order on their behalf.
Two failures from the same root cause: taking a widget at face value instead of
reading what it renders.

The business-unit options are labelled "<name> (ID: <id>)", so selecting by the
bare name could never match. The Robot keyword said "Select From List By Label
Contains" and that Contains was the tell I walked past. The page object now reads
the id off the option carrying the name and selects by that.

The glossary edit test opened whichever row the table happened to be showing,
which is how it read back a real German cart translation instead of its own. It
passed once and failed twice on retry, so it was never reliably green. Both
lookups now assert the key is in the table before taking a row, which is what the
shared find() helper offers and I had not used.
The Arrange asserted the warehouse-user checkbox was unchecked, but the Act
persists the flag. With retries.runMode 2 a transient failure after the save
made every later attempt fail on that precondition, so the test could never
recover. The `.check()` in the Act is idempotent, so the precondition only cost
retry protection.

The Assert used `.contains(...).should('have.length', 1)`. `.contains()` yields
the first match only, so the length assertion could not fail and the
"exactly one action" claim was never verified. Assert on the row's text instead,
matching what BackofficePage.find already does.

The state wait moves into SalesDetailPage. In the spec it duplicated the retry
budget and OMS command list triggerOms owns, and it reloaded the raw cy.url(),
which drops the basic-auth credentials SE envs need. Both call sites now share
the constants and the url helper, and the repository selector no longer leaks
through a page-object pass-through.
The b2c and b2c-mp dynamic fixtures called haveFullOrder, haveShipmentType and
haveShipmentMethod. None of the three is reachable in those repositories:
haveFullOrder ships in spryker-feature/self-service-portal, which is not
installed there, and the two shipment helpers are registered only in suite's
DynamicFixture suite. Fixtures load from a global before() keyed by spec path
regardless of skip, so the files alone broke every test in the spec on both
demoshop lanes while the suite-only focused run stayed green.

The demoshop fixtures now build the two back-office users and nothing else, and
the order-backed OMS walk is gated to suite. The warehouse-user flag test, which
needs no order, still runs on all three repositories.
getOrderItemStateSelector matched `td.state-history a` anywhere on the order
detail page. The Robot source it ports scopes the same lookup to one shipment
table and one SKU row before reading the state link, and dropping that mattered
twice: the wait could be satisfied by a state-history link belonging to a
different order item, and reloadUntilFound counts anything other than exactly
one match as not-found, so an order with two items in the state never converges
and dies after the full retry budget on `exhausted retries looking for body`.

The batch's fixture builds a single-item order, so the local run stayed green;
the defect was in the shared page object, not in this spec.
The title claimed "the order items" while the spec proves one. The fixture
order cannot hold more: haveFullOrder delegates to haveOrder, whose
createQuoteTransfer calls withItem() once and whose override key is `item`,
singular — the Robot source's two-item assertion needs a quote-building path
this reshape does not add. Naming one item keeps the title, and the
target_test recorded against it, honest about the coverage that shipped.
The picking order's stock targets the demodata Warehouse1 by name because haveStock
persists only the name, so a fresh stock lands with picking_list_strategy = NULL and the
generate-picking-lists onEnter command throws inside requirePickingListStrategy(), parking
the item in picking list generation scheduled with no error the spec can see. Warehouse1
carries multi-shipment, the only generator strategy Pyz registers.

The source waits for two order items to reach ready for picking; the port waits for one,
because haveFullOrder builds a strictly single-item order.
Ports the back office half of company.robot: the company is created, activated
and approved, then a business unit, a company role granting only company users,
and a company user whose customer the form creates. The storefront half is the
permission check, driven through agent impersonation because nothing knows the
new user's password.

Four new back office page objects. Two ordering constraints are load bearing and
are why the company is picked first and alone: changing the company select
re-fetches the role checkboxes, which do not exist at all before that request,
and it resets the business unit select, which stays disabled until a company is
chosen.

Also fixes the storefront row's post-create assertion, which looked for the new
company user's email in a users table that renders name, business unit and role
and no email at all. It now matches the row by its run-unique business unit.
The back-office test title listed what it sets up and never said what it
proves. What it asserts is that the new company user shows up in the
back-office company-user list under its company, which is now the title.

Also drops two helpers the spec never used. getStatusCellSelector and
getRow were written for a company-status assertion that was dropped;
Activate and Approve are already load-bearing without one, because the
company-user form refuses a company that is not active and approved.
Both specs reach the new company user only by impersonating them, which is the
Agent Assist feature, and readme.md requires a tag per covered feature. The
Robot source carried agent-assist in its suite-level Test Tags; the port dropped
it. Shape follows agent-mfa-auth.cy.ts: surface and primary feature @-prefixed,
further covered features bare.

Both halves of the row are tagged, not just the new back-office spec — leaving
the two disagreeing is worse than the omission.

Also drops the yves spec's comment about the users table having no email column.
The repository that owns the selector says the same thing one line from the
selector itself, and that is where the reasoning belongs.
The create() docblock, the cy.wait in selectCompany() and the role-checkbox
getter each explained that changing the company re-renders the role list.
Each now carries only its own job: the docblock the ordering contract, the
inline comment the mechanism behind the wait, the repository the label shape
its cy.contains depends on.
The company field of the company-role create form is a Select2ComboBoxType with
data-autocomplete-url '/company-gui/suggest' and a minimum input length of two
(CompanyGui's CompanyToCompanyRoleCreateForm, wired by Pyz CompanyRoleGui's
dependency provider), so typing the name fires an HTTP round-trip. Without the
intercept the only budget covering it was cy.contains' 4s defaultCommandTimeout,
and with retries.runMode at 2 a slow suggest would have surfaced as a rerun
rather than a failure.

Every other page object driving this widget already waits on the intercept -
cost-center-create-page, ssp-asset-add-page, ssp-asset-update-page and the
company-user-create-page added by this same branch. The business-unit page stays
wait-free on purpose: its fk_company is a plain ChoiceType with the choices
rendered server side.
@stereomon stereomon changed the title CC-39280 Port the Robot UI journeys of six domains to Cypress CC-39280 Port the Robot UI journeys of twelve domains to Cypress Sep 22, 2026
…um order value

All four fail only under the concurrent CI lane and pass locally every run, and
none of their Robot sources was ever executed by suite's Robot UI lane: the
three merchant scenarios sit outside the lane's test set and carry no smoke tag,
and the order-threshold scenario carries the static-set tag the lane runs
serially, with no smoke tag either. Quarantining them gives up no coverage that
the lane used to have; each spec records why above its describe.
@stereomon

Copy link
Copy Markdown
Collaborator Author

Four specs land quarantined, on purpose

ecc12cbf tags four of the ported specs @quarantine, so they are excluded from the blocking Cypress shards and run in the non-blocking quarantine lane instead:

  • cypress/e2e/mp/merchant-portal/merchant-profile-update.cy.ts
  • cypress/e2e/mp/merchant-portal/merchant-store-status.cy.ts
  • cypress/e2e/backoffice/merchant-management/merchant-deactivation.cy.ts
  • cypress/e2e/yves/checkout/minimum-order-value.cy.ts

Each carries the reason above its describe, and the matrix rationale in robotframework-suite-tests#1096 records the same.

No coverage is given up

None of these four Robot sources was ever executed by suite's Robot UI lane. The lane is pinned to TEST_SET: parallel_ui (.github/workflows/_robot-ui.yml), so compute-shard-slice.sh only discovers */tests/parallel_ui/suite/*.robot, and both test phases require --include smoke.

Spec Robot source Why the lane never ran it
the three merchant ones tests/ui/suite/marketplace/marketplace.robot outside the lane's test set, and no smoke tag — the parallel_ui twin marketplace_manage_merchant.robot has none either
minimum-order-value tests/parallel_ui/suite/misc/static_demodata_set.robot right tree, but tagged order-threshold cart checkout only — no smoke, so neither --include smoke nor --include static-setANDsmoke selects it

These are journeys the Robot lane never proved green here. Quarantining them takes nothing away that CI used to have; it keeps them running and visible while the two underlying problems are fixed.

That also explains the shape of this branch's CI. The lane executes 44 Robot scenarios, covering 40 of the 86 rows this PR ports. Every red on this branch has been one of the other 46 — not one failure among the 40 whose source the lane actually executed.

Why each fails, and what has to change

minimum-order-value — owns global state. It rewrites the store's order thresholds, so it cannot share an application with the shards beside it: a maximum left at 350.00 blocks every other checkout in the environment, and a reset by anything else mid-run takes its own assertion away. The Robot original encoded exactly this by carrying the static-set tag, which the lane runs in its serial phase with plain robot rather than under pabot. It needs a serial lane or per-test threshold state, not a repair — the same constraint as the one DEFER row, administration.robot::Payment_method_update.

The three merchant specs — a Merchant Portal bundle defect. They die in ProfilePage.openOnlineProfileTab on button.ant-tabs-tab-btn, only under CI load, passing locally every run. The ng-version upgrade gate from 816c0548 passes, so the page arrives and web-mp-profile upgrades — the tab strip itself never renders.

TabsComponent does not use ContentChildren. It discovers tabs through SelectComponentsDirective (@spryker/web-components), which snapshots elemRef.nativeElement.children once, after a debounceTime(0), and never re-queries — spySelectComponentsObserve defaults to false and the tabs template does not set it. It then does forkJoin(components.map(c => c.whenInit())). If the projected web-spy-tab children are not yet NgWebComponents at that one instant, forkJoin([]) completes without emitting, tabs$ stays [], and the @for renders zero nz-tab — no tab buttons, permanently. One-shot, unrecoverable, load-dependent: exactly the CI-only shape, and it matches the run where Business Info reached body text while Online Profile never did.

That is a defect in the portal's own bundle, not in these specs, and out of scope for a test migration. More waits cannot reach it.

Before merge

Two follow-up tickets:

  1. A serial lane (or per-test threshold state) for global-state specs — would also unblock the DEFER row.
  2. The web-spy-tabs discovery race — re-query on content changes, or set spySelectComponentsObserve.

@stereomon

Copy link
Copy Markdown
Collaborator Author

Both follow-ups are raised:

  • CC-40646 — Cypress specs that rewrite global store state need a home. Covers minimum-order-value and the DEFER row administration.robot::Payment_method_update. Left open on purpose: it may be that these journeys are written in a shape our testing strategy does not want, rather than that the lane needs a serial slot.
  • CC-40647 — Merchant Portal tab strip does not render when the page loads under load. Covers the three merchant profile specs. Every page built on web-spy-tabs is exposed, not just the profile page.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants