@jetshop/template-trend 5.8.4 → 5.11.1

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.
Files changed (92) hide show
  1. package/.linaria-cache/packages/template-trend/src/components/Layout/Header/ChannelSelector/ChannelSelector.linaria.css +1 -1
  2. package/.linaria-cache/packages/template-trend/src/components/SearchPage/CategoryList.linaria.css +7 -0
  3. package/.linaria-cache/packages/template-trend/src/components/StartPage/CategoryList.linaria.css +6 -6
  4. package/.linaria-cache/packages/template-trend/src/components/StartPage/StartPage.linaria.css +0 -1
  5. package/.linaria-cache/packages/ui/ChannelSelector/Region.linaria.css +3 -0
  6. package/README.md +118 -1944
  7. package/cypress/integration/essentials.spec.js +50 -0
  8. package/package.json +5 -5
  9. package/schema.graphql +1 -0
  10. package/src/components/Auth/ForgotPassword.js +3 -8
  11. package/src/components/Auth/README.md +5 -0
  12. package/src/components/Cart/CartButton.js +40 -44
  13. package/src/components/Cart/CartFlyout.js +8 -5
  14. package/src/components/Cart/CartItem.js +12 -15
  15. package/src/components/Cart/{addMultipleToCart.gql → queries/addMultipleToCart.gql} +1 -1
  16. package/src/components/Cart/{addToCart.gql → queries/addToCart.gql} +1 -1
  17. package/src/components/Cart/{CartFragment.gql → queries/cartFragment.gql} +9 -0
  18. package/src/components/Cart/{CartQuery.gql → queries/cartQuery.gql} +1 -1
  19. package/src/components/Cart/{decrementQuantity.gql → queries/decrementQuantity.gql} +1 -1
  20. package/src/components/Cart/{incrementQuantity.gql → queries/incrementQuantity.gql} +1 -1
  21. package/src/components/Cart/{removeFromCart.gql → queries/removeFromCart.gql} +1 -1
  22. package/src/components/CategoryPage/CategoryPage.js +1 -0
  23. package/src/components/CategoryPage/Filters/ListFilters.js +1 -2
  24. package/src/components/CategoryPage/ProductCard.js +2 -0
  25. package/src/components/CategoryPage/ProductGrid.js +5 -0
  26. package/src/components/CategoryPage/ProductGridFragment.gql +8 -0
  27. package/src/components/CategoryPage/ProductGridWindow.js +19 -12
  28. package/src/components/CategoryPage/README.md +11 -0
  29. package/src/components/CategoryPage/WindowedCategoryPage.js +6 -5
  30. package/src/components/Forms/Input.js +3 -6
  31. package/src/components/Layout/Header/ChannelSelector/ChannelSelector.js +3 -0
  32. package/src/components/Layout/Header/ChannelSelector/ChannelSelectorModal.js +4 -3
  33. package/src/components/Layout/Header/ChannelSelector/Selector.js +2 -0
  34. package/src/components/Layout/Header/RecommendedChannel/RecommendedChannelSelector.js +3 -1
  35. package/src/components/Layout/Header/TopNav.js +13 -11
  36. package/src/components/LogOut.loadable.js +10 -0
  37. package/src/components/MyPages/MyPagesSidebar.js +0 -1
  38. package/src/components/PreviewRoute.loadable.js +10 -0
  39. package/src/components/ProductList/AddToCart.js +8 -5
  40. package/src/components/ProductList/Favourite.js +2 -2
  41. package/src/components/ProductList/FavouriteCount.js +2 -2
  42. package/src/components/ProductList/Favourites.js +17 -12
  43. package/src/components/ProductList/Lister.js +44 -0
  44. package/src/components/ProductList/Product.js +5 -4
  45. package/src/components/ProductList/ProductLists.gql +8 -5
  46. package/src/components/ProductList/SelectVariant.js +6 -10
  47. package/src/components/ProductList/productListQueries.js +5 -0
  48. package/src/components/ProductPage/AddToCart/AddToCartForm.js +19 -18
  49. package/src/components/ProductPage/AddToCart/ProductToast.js +7 -4
  50. package/src/components/ProductPage/PackageProduct/PackageProduct.js +8 -6
  51. package/src/components/ProductPage/VariantSelector.js +1 -1
  52. package/src/components/{StartPage → SearchPage}/CategoryList.js +6 -4
  53. package/src/components/SearchPage/EmptySearchResults.js +1 -1
  54. package/src/components/Shop.js +52 -76
  55. package/src/components/StartPage/Content/Row.js +0 -37
  56. package/src/components/StartPage/Content/StartPageHero.js +9 -1
  57. package/src/components/StartPage/StartPage.js +0 -13
  58. package/src/components/StartPage/StartPageProductGridFragment.gql +8 -0
  59. package/cypress/constants.js +0 -5
  60. package/cypress/integration/addToCart/addToCart.spec.js +0 -27
  61. package/cypress/integration/addToCart/disabledVariations.spec.js +0 -17
  62. package/cypress/integration/addToCart/newslettersubscriber.spec.js +0 -24
  63. package/cypress/integration/addToCart/notifyWhenBackInStock.spec.js +0 -20
  64. package/cypress/integration/addToCart/productConfigurations.spec.js +0 -35
  65. package/cypress/integration/addToCart/productVariations.spec.js +0 -42
  66. package/cypress/integration/addToCart/sizePriceChange.spec.js +0 -20
  67. package/cypress/integration/analytics/gtag.spec.js +0 -90
  68. package/cypress/integration/analytics/releware.spec.js +0 -95
  69. package/cypress/integration/auth/login.spec.js +0 -18
  70. package/cypress/integration/auth/signup.spec.js +0 -98
  71. package/cypress/integration/category_page_spec.js +0 -73
  72. package/cypress/integration/filters.spec.js +0 -103
  73. package/cypress/integration/getbyarticlenumber.spec.js +0 -28
  74. package/cypress/integration/packages.spec.js +0 -85
  75. package/cypress/integration/prefetch_headers_spec.js +0 -26
  76. package/cypress/integration/product_browsing_spec.js +0 -17
  77. package/cypress/integration/search/autocomplete.spec.js +0 -28
  78. package/cypress/integration/search/search_page.spec.js +0 -39
  79. package/cypress/integration/ssr/categorySSR.js +0 -9
  80. package/cypress/integration/ssr/productSSR.js +0 -9
  81. package/cypress/integration/ssr/startPageSSR.js +0 -5
  82. package/cypress/integration/start_page_spec.js +0 -5
  83. package/cypress/integration/stores_page.spec.js +0 -5
  84. package/src/components/StartPage/Campaign.js +0 -162
  85. package/src/components/StartPage/CampaignHeader.js +0 -101
  86. package/src/components/StartPage/ExtraDetails.js +0 -72
  87. package/src/components/StartPage/Readme.md +0 -88
  88. package/src/components/StartPage/campaign.json +0 -20
  89. package/src/components/StartPage/campaignHeader.json +0 -5
  90. package/src/components/StartPage/categoryList.json +0 -65
  91. package/src/components/StartPage/extraDetails.json +0 -6
  92. package/src/components/StartPage/title.json +0 -3
@@ -1,95 +0,0 @@
1
- import { PRODUCT_URL } from '../../constants';
2
-
3
- // const BASE_EVENT = {
4
- // itemId: '155',
5
- // accountId: 'jetshop',
6
- // siteId: 'localhost'
7
- // };
8
-
9
- function getRelewareCalls(spy) {
10
- return spy
11
- .getCalls()
12
- .filter(call => call.args[0].indexOf('log.releware.net') > -1)
13
- .map(call => {
14
- const query = new URL(call.args[0]).searchParams;
15
- return {
16
- itemId: query.get('_item_id'),
17
- accountId: query.get('aid'),
18
- event: query.get('o'),
19
- siteId: query.get('sid')
20
- };
21
- });
22
- }
23
-
24
- describe('Analytics: Releware', () => {
25
- beforeEach(function() {
26
- // Stub window.fetch before any app code runs
27
- cy.on('window:before:load', win => {
28
- const doFetch = win.fetch;
29
- cy.stub(win, 'fetch', (path, options) => {
30
- if (path.indexOf('log.releware.net') > -1) {
31
- return Promise.resolve();
32
- }
33
- return doFetch(path, options);
34
- }).as('fetch');
35
- });
36
- });
37
-
38
- // FIXME: The heed_recommendation event is not implemented in this template
39
- // yet. This test (modified to target the correct list) should pass
40
- // once it is.
41
- //
42
- // it('Category Page: Should trigger click events for recommendations', () => {
43
- // cy.visit(CATEGORY_URL);
44
-
45
- // cy.getByTestId('product')
46
- // .first()
47
- // .click();
48
-
49
- // cy.get('@fetch').should(spy => {
50
- // const calls = getRelewareCalls(spy);
51
-
52
- // expect(calls).to.have.lengthOf(1);
53
- // expect(calls).to.deep.equal([
54
- // { ...BASE_EVENT, event: 'heed_recommendation' }
55
- // ]);
56
- // });
57
- // });
58
-
59
- it('Product Page: Should trigger view events', () => {
60
- cy.visit(PRODUCT_URL);
61
- cy.get('@fetch').should(spy => {
62
- const calls = getRelewareCalls(spy);
63
-
64
- expect(calls).to.have.lengthOf(1);
65
- expect(calls[0].event).to.equal('view_item');
66
- });
67
- });
68
-
69
- it('Product Page: Should trigger cart events', () => {
70
- cy.visit(PRODUCT_URL);
71
- cy.findByTestId('add-to-cart').click();
72
-
73
- cy.get('@fetch').should(spy => {
74
- const calls = getRelewareCalls(spy);
75
- expect(calls).to.have.lengthOf(2);
76
- expect(calls[1].event).to.equal('pick_item');
77
- });
78
-
79
- // FIXME: How to implement this is not mentioned in any of the releware
80
- // docs, it might be so that they only track add events.
81
- //
82
- // cy.getByTestId('header-cart')
83
- // .click({ force: true })
84
- // .getByTestId('remove-from-cart')
85
- // .first()
86
- // .click();
87
- // cy.get('@fetch').should(spy => {
88
- // const calls = getRelewareCalls(spy);
89
- // expect(calls).to.have.lengthOf(3);
90
- // expect(calls.slice(2)).to.deep.equal([
91
- // { ...BASE_EVENT, event: '???' }
92
- // ]);
93
- // });
94
- });
95
- });
@@ -1,18 +0,0 @@
1
- describe('Log In', () => {
2
- it('Will show an error when the user enters bad credentials', () => {
3
- cy.visit('/se/login');
4
- cy.get('#email').type('test@test.com');
5
- cy.get('#password').type('iamanonsensepassword');
6
- cy.get('button[type="submit"]').contains('Log in').click();
7
- cy.findByText('Login failed. Please try again').should('exist');
8
- });
9
-
10
- it('Will log a user in with correct credentials', () => {
11
- cy.visit('/se/login');
12
- cy.get('#email').type('wolverine@jetshop.se');
13
- cy.get('#password').type('jetshop');
14
- cy.get('button[type="submit"]').contains('Log in').click();
15
- cy.findByText('Login failed. Please try again').should('not.exist');
16
- cy.url().should('contain', 'my-pages');
17
- });
18
- });
@@ -1,98 +0,0 @@
1
- function randomString() {
2
- return Math.random().toString(25);
3
- }
4
-
5
- describe('User can sign up', () => {
6
- it('as a private customer', () => {
7
- cy.visit('/se/signup');
8
-
9
- cy.get("input[name='pid']").type('test');
10
- cy.get("input[name='firstName']").type('Private');
11
- cy.get("input[name='lastName']").type('Customer');
12
- cy.get("input[name='streetName']").type('test');
13
- cy.get("input[name='postalCode']").type('51234');
14
- cy.get("input[name='city']").type('test');
15
- cy.get("input[name='emailAddress']").type(`${randomString()}@test.com`);
16
- cy.get("input[name='password']").type('cypresstest');
17
- cy.get('[data-testid="sign-up-button"]').click();
18
-
19
- cy.get('h2[data-testid="customer-name"]').should(
20
- 'contain',
21
- 'Private Customer'
22
- );
23
-
24
- cy.get('a[href="/se/my-pages/profile"]').click();
25
-
26
- cy.get('input[type="checkbox"][name="confirm"]').click({ force: true });
27
-
28
- cy.get('button[type="submit"]').contains('Delete account').click();
29
- });
30
- it('as a business customer', () => {
31
- cy.visit('/se/signup');
32
-
33
- cy.get('input[type="radio"][value="company"]').click({ force: true });
34
- cy.get("input[name='organizationNumber']").type('test');
35
- cy.get("input[name='company']").type('test');
36
- cy.get("input[name='companyAtt']").type('test');
37
- cy.get("input[name='department']").type('test');
38
- cy.get("input[name='firstName']").type('test');
39
- cy.get("input[name='lastName']").type('test');
40
- cy.get("input[name='streetName']").type('test');
41
- cy.get("input[name='postalCode']").type('51234');
42
- cy.get("input[name='city']").type('test');
43
- cy.get("input[name='emailAddress']").type(
44
- `${randomString()}@business-test.com`
45
- );
46
- cy.get("input[name='password']").type('cypresstest');
47
- cy.get('[data-testid="sign-up-button"]').click();
48
-
49
- cy.get('a[href="/se/my-pages/profile"]').click();
50
-
51
- cy.get('input[type="checkbox"][name="confirm"]').click({ force: true });
52
-
53
- cy.get('button[type="submit"]').contains('Delete account').click();
54
-
55
- cy.get('span').contains('Log in').should('be.visible');
56
- });
57
- it('with encrypted values', () => {
58
- cy.visit('/se/signup');
59
-
60
- cy.get("input[name='pid']").type('test');
61
- cy.get("input[name='firstName']").type('eTZ7FGaVn/RAThBesp3unQ==');
62
- cy.get("input[name='lastName']").type('Pehrers');
63
- cy.get("input[name='streetName']").type('test');
64
- cy.get("input[name='postalCode']").type('51234');
65
- cy.get("input[name='city']").type('test');
66
- cy.get("input[name='emailAddress']").type(`${randomString()}@test.com`);
67
- cy.get("input[name='password']").type('cypresstest');
68
- cy.get('[data-testid="sign-up-button"]').click();
69
-
70
- cy.get('a[href="/se/my-pages/profile"]').click();
71
- cy.get('h2[data-testid="customer-name"]').should('contain', 'Erik Pehrers');
72
-
73
- cy.get('input[type="checkbox"][name="confirm"]').click({ force: true });
74
-
75
- cy.get('button[type="submit"]').contains('Delete account').click();
76
-
77
- cy.get('span').contains('Log in').should('be.visible');
78
- });
79
-
80
- it('Displays email validation error', () => {
81
- cy.visit('/se/signup');
82
-
83
- cy.get("input[name='pid']").type('test');
84
- cy.get("input[name='firstName']").type('integrationtest');
85
- cy.get("input[name='lastName']").type('E god');
86
- cy.get("input[name='streetName']").type('test');
87
- cy.get("input[name='postalCode']").type('51234');
88
- cy.get("input[name='city']").type('test');
89
- cy.get("input[name='emailAddress']").type('kantarellen@egod.com');
90
- cy.get("input[name='password']").type('cypresstest');
91
- cy.get('[data-testid="sign-up-button"]').click();
92
-
93
- cy.get('div[data-testid="validation-error"]').should(
94
- 'contain',
95
- 'The specified e-mail address is already registered.'
96
- );
97
- });
98
- });
@@ -1,73 +0,0 @@
1
- import { CATEGORY_URL } from '../constants';
2
-
3
- const ACCESSORIES_URL = '/accessories';
4
- const FURNITURE_URL = '/furniture';
5
- const CAMPAIGN_URL = '/campaigns';
6
-
7
- describe('Category Page', () => {
8
- beforeEach(() => cy.visit(`${ACCESSORIES_URL}?channelCountry=US`));
9
- it('Loads the right header', () => {
10
- cy.findByTestId('page-header').should('contain', 'Accessories');
11
- });
12
-
13
- it('Can handle pagination', () => {
14
- cy.visit(`${ACCESSORIES_URL}?channelCountry=US&standardPagination=true`);
15
- cy.get('a')
16
- .contains('Next')
17
- .click();
18
- cy.url().should('contain', 'page=2');
19
- cy.get('#root').should('contain', 'Page 2 of 2');
20
- cy.get('a')
21
- .contains('Prev')
22
- .click();
23
- cy.url().should('not.contain', 'page=2');
24
- });
25
- });
26
-
27
- describe('Infinite pagination', () => {
28
- it('has non moving scroll position on fetch', () => {
29
- let yOffset;
30
- cy.visit(CAMPAIGN_URL);
31
- cy.scrollTo('bottom');
32
- cy.window()
33
- .then(win => {
34
- yOffset = win.pageYOffset;
35
- })
36
- .then(() => {
37
- cy.get('a')
38
- .contains('Show more')
39
- .click();
40
- cy.wait(2000);
41
- cy.window()
42
- .its('pageYOffset')
43
- .should('equal', yOffset);
44
- });
45
- });
46
- it('paginates correctly when retreiving more products', () => {
47
- cy.visit(FURNITURE_URL);
48
- cy.get('a')
49
- .contains('Show more')
50
- .click();
51
- cy.wait(2000);
52
- cy.scrollTo('bottom');
53
- cy.url().should('contain', 'page=2');
54
- cy.scrollTo('top');
55
- cy.url().should('not.contain', 'page=2');
56
- });
57
- });
58
-
59
- describe('product browsing', () => {
60
- describe('news category', () => {
61
- beforeEach(() => cy.visit(`${CATEGORY_URL}?channelCountry=US`));
62
-
63
- it('contains a category description', () => {
64
- cy.findByTestId('category-description');
65
- });
66
-
67
- it('contains a product grid with products', () => {
68
- cy.findByTestId('product-grid').within(() =>
69
- cy.findAllByTestId('product')
70
- );
71
- });
72
- });
73
- });
@@ -1,103 +0,0 @@
1
- const BIKES_URL = '/bikes';
2
- const SEARCH_URL = '/se/search/?term=city';
3
- const FURNITURE_URL = '/furniture';
4
- const PRODUCT_NAME_TO_CHECK = 'Toldbod Pendant';
5
- describe('Filters', () => {
6
- it('Has a working default in stock filter on categories', () => {
7
- cy.visit(`${BIKES_URL}?channelCountry=US`);
8
- cy.get('input[type=checkbox]').should('be.checked');
9
- cy.contains('City Racer_ 2').should('not.exist');
10
- cy.get('label').contains('In stock').click();
11
- cy.url().should('include', 'boolean[150:buyable]=false');
12
- cy.contains('City Racer_ 2').should('exist');
13
- });
14
-
15
- it('Has a working default in stock filter on search', () => {
16
- cy.visit(`${SEARCH_URL}&channelCountry=US`);
17
- cy.get('input[type=checkbox]').should('be.checked');
18
- cy.contains('City Racer_ 2').should('not.exist');
19
- cy.get('label').contains('In stock').click();
20
- cy.url().should('include', 'boolean[buyable]=false');
21
- cy.contains('City Racer_ 2').should('exist');
22
- });
23
-
24
- it('Non-default filters should be un-chcked', () => {
25
- cy.visit(`${FURNITURE_URL}?channelCountry=US`);
26
- cy.get('input[type=checkbox]').should('not.be.checked');
27
- });
28
-
29
- it('Applies filters when returning to category from product', () => {
30
- cy.visit(FURNITURE_URL);
31
- cy.get('.product-card-detail')
32
- .contains(PRODUCT_NAME_TO_CHECK)
33
- .should('exist');
34
- cy.get('button[data-flight-dropdown-button] > span')
35
- .contains('Brand')
36
- .click();
37
- cy.get('li[data-flight-dropdown-item] > span').contains('Cartels').click();
38
- cy.get('.product-card-detail')
39
- .contains(PRODUCT_NAME_TO_CHECK)
40
- .should('not.exist');
41
- cy.get('.product-card-detail').click();
42
- cy.go('back');
43
- cy.get('.product-card-detail')
44
- .contains(PRODUCT_NAME_TO_CHECK)
45
- .should('not.exist');
46
- });
47
-
48
- it('Persists filters when applying sort', () => {
49
- cy.visit(FURNITURE_URL);
50
- cy.get('button[data-flight-dropdown-button] > span')
51
- .contains('Brand')
52
- .click();
53
- cy.get('li[data-flight-dropdown-item] > span').contains('Cartels').click();
54
- cy.get('button[data-flight-dropdown-button] > span')
55
- .contains('Sort By')
56
- .click();
57
- cy.get('li[data-flight-dropdown-item] > span')
58
- .contains('Date added')
59
- .click();
60
-
61
- // logically working
62
- cy.get('.product-card-detail')
63
- .contains(PRODUCT_NAME_TO_CHECK)
64
- .should('not.exist');
65
-
66
- // also shown in ui
67
- cy.get('aside > button').contains('Clear all filters').should('exist');
68
- });
69
-
70
- it('Persists filters when paginating', () => {
71
- cy.visit('/accessories?standardPagination=true');
72
- cy.get('button[data-flight-dropdown-button] > span')
73
- .contains('Categories')
74
- .click();
75
- cy.get('li[data-flight-dropdown-item] > span').as('listOfCategories');
76
- cy.get('@listOfCategories').contains('Watches').click();
77
- cy.get('@listOfCategories').contains('Glasses').click();
78
- cy.get('@listOfCategories').contains('Bags').click();
79
-
80
- cy.get('.product-card-detail').contains('Belt Light').should('not.exist');
81
-
82
- cy.get('a').contains('Next').click();
83
-
84
- cy.get('.product-card-detail').contains('Belt Light').should('not.exist');
85
- });
86
-
87
- it('Persists filters when infinite paginating', () => {
88
- cy.visit('/accessories');
89
- cy.get('button[data-flight-dropdown-button] > span')
90
- .contains('Categories')
91
- .click();
92
- cy.get('li[data-flight-dropdown-item] > span').as('listOfCategories');
93
- cy.get('@listOfCategories').contains('Watches').click();
94
- cy.get('@listOfCategories').contains('Glasses').click();
95
- cy.get('@listOfCategories').contains('Bags').click();
96
-
97
- cy.get('.product-card-detail').contains('Belt Light').should('not.exist');
98
-
99
- cy.get('a').contains('Show more').click();
100
-
101
- cy.get('.product-card-detail').contains('Belt Light').should('not.exist');
102
- });
103
- });
@@ -1,28 +0,0 @@
1
- import { ARTICLENUMBER_URL, US_ARTICLENUMBER_URL } from '../constants';
2
-
3
- describe('Visiting /articlenumber/:articlenumber', () => {
4
- it('does a redirect on the server to the correct product', () => {
5
- cy.request(ARTICLENUMBER_URL)
6
- .its('body')
7
- .should('include', '>Toldbod Pendant</h1>');
8
- });
9
- it("returns the startpage if the product isn't found", () => {
10
- cy.request('/articlenumber/quepasa_quepasa')
11
- .its('body')
12
- .should('include', 'Selected Categories</h2>');
13
- });
14
- it('redirect to login if login required', () => {
15
- cy.request(
16
- US_ARTICLENUMBER_URL +
17
- '?culture=en-US&currency=USD&channelCountry=US&channel=M7-GLOBAL'
18
- ).then(res => {
19
- expect(res.redirects).to.have.length(1);
20
- expect(res.redirects[0]).to.include('/login');
21
- });
22
- });
23
- it('handles preselected variants', () => {
24
- cy.visit(ARTICLENUMBER_URL + '-170-white');
25
- cy.get('button[aria-pressed="true"]').should('contain', '170');
26
- cy.get('[data-flight-dropdown-button=""]').should('contain', 'White');
27
- });
28
- });
@@ -1,85 +0,0 @@
1
- const PRODUCT_URL = '/living-room-furniture-pack';
2
-
3
- describe('Package products', () => {
4
- it('will preselect the cheapest variants', () => {
5
- cy.visit(PRODUCT_URL);
6
- cy.get('[aria-pressed="true"]')
7
- .should('contain', 'Black')
8
- .should('contain', '140');
9
-
10
- cy.get('[data-testid=package-product-add-to-cart]')
11
- .contains('Add to cart') // check that the button reads 'add to cart' (after transitioning from 'updating price')
12
- .click();
13
- cy.get('[data-testid="cart-button"]').click();
14
- cy.get('[data-testid="item-name"').should('have.length', 5);
15
- });
16
-
17
- it('should update the price when variants are selected', () => {
18
- cy.visit(PRODUCT_URL);
19
-
20
- cy.get('[data-testid="package-price-total"] > div').should($div => {
21
- const totalPrice = parseFloat($div.text().replace(/\D+/g, ''));
22
- expect(totalPrice).to.be.eq(104498);
23
- });
24
-
25
- cy.get('[data-testid=ColorWhite]').click();
26
- cy.get('[data-testid=Height120]').click();
27
-
28
- cy.get('[data-testid=package-product-add-to-cart]').contains('Add to cart'); // check that the button reads 'add to cart' (after transitioning from 'updating price')
29
-
30
- cy.get('[data-testid="package-price-total"] > div').should($div => {
31
- const totalPrice = parseFloat($div.text().replace(/\D+/g, ''));
32
- expect(totalPrice).to.be.eq(106298);
33
- });
34
- });
35
-
36
- it('should update the item price when variants are selected', () => {
37
- cy.visit(PRODUCT_URL);
38
-
39
- cy.get('.package-product-price')
40
- .first()
41
- .children()
42
- .last()
43
- .as('item-price');
44
-
45
- cy.get('@item-price')
46
- .last()
47
- .should($div => {
48
- const totalPrice = parseFloat($div.text().replace(/\D+/g, ''));
49
- expect(totalPrice).to.be.eq(8000);
50
- });
51
-
52
- cy.get('[data-testid=ColorWhite]').click();
53
- cy.get('[data-testid=Height120]').click();
54
-
55
- cy.get('@item-price')
56
- .last()
57
- .should($div => {
58
- const totalPrice = parseFloat($div.text().replace(/\D+/g, ''));
59
- expect(totalPrice).to.be.eq(10000);
60
- });
61
- });
62
-
63
- it('can not be added to the cart without selected variants', () => {
64
- cy.visit(PRODUCT_URL);
65
- cy.get('[data-testid=ColorWhite]').click();
66
- cy.get('[data-testid=package-product-add-to-cart]').click();
67
- cy.get('[data-testid="cart-button"]').click();
68
- // Wait for cart to update
69
- cy.get('[data-testid=package-product-add-to-cart]').contains(
70
- 'Select the variants'
71
- );
72
- cy.get('[data-testid="item-name"').should('not.exist');
73
- });
74
-
75
- it('can be added to the cart after selecting the appropriate options', () => {
76
- cy.visit(PRODUCT_URL);
77
- cy.get('[data-testid=ColorWhite]').click();
78
- cy.get('[data-testid=Height120]').click();
79
- cy.get('[data-testid=package-product-add-to-cart]')
80
- .contains('Add to cart') // check that the button reads 'add to cart' (after transitioning from 'updating price')
81
- .click();
82
- cy.get('[data-testid="cart-button"]').click();
83
- cy.get('[data-testid="item-name"').should('have.length', 5);
84
- });
85
- });
@@ -1,26 +0,0 @@
1
- import { CATEGORY_URL, PRODUCT_URL } from '../constants';
2
-
3
- describe('Preload Link header', () => {
4
- it('Sets appropriate preload Link header on the home page', () => {
5
- cy.request({
6
- url: '/'
7
- }).then(res => {
8
- expect(res.headers).to.have.property('link');
9
- expect(res.headers.link).to.match(/^<([^\s>]+.[js|css])>/);
10
- });
11
- });
12
-
13
- it('Sets appropriate preload Link header on Category page', () => {
14
- cy.request(`/${CATEGORY_URL}?channelCountry=US`).then(res => {
15
- expect(res.headers).to.have.property('link');
16
- expect(res.headers.link).to.include('static/js/');
17
- });
18
- });
19
- it('Sets appropriate preload Link header on Product page for both jss and css', () => {
20
- cy.request(`/${PRODUCT_URL}?channelCountry=US`).then(res => {
21
- expect(res.headers).to.have.property('link');
22
- expect(res.headers.link).to.include('static/js/');
23
- expect(res.headers.link).to.include('static/css/');
24
- });
25
- });
26
- });
@@ -1,17 +0,0 @@
1
- import { CATEGORY_URL } from '../constants';
2
-
3
- describe('product browsing', () => {
4
- describe('news category', () => {
5
- beforeEach(() => cy.visit(`${CATEGORY_URL}?channelCountry=US`));
6
-
7
- it('contains a category description', () => {
8
- cy.findByTestId('category-description');
9
- });
10
-
11
- it('contains a product grid with products', () => {
12
- cy.findByTestId('product-grid').within(() =>
13
- cy.findAllByTestId('product')
14
- );
15
- });
16
- });
17
- });
@@ -1,28 +0,0 @@
1
- const CATEGORY_TERM = 'brand';
2
- const PRODUCT_TERM = 'bike';
3
-
4
- describe('Search autocomplete', () => {
5
- it('Returns results', () => {
6
- cy.visit('/');
7
-
8
- cy.get('#root > div > header').as('header');
9
- cy.get('@header')
10
- .find('button')
11
- .contains('Search')
12
- .click();
13
- cy.get('[data-flight-search-autocomplete-field]')
14
- .as('searchField')
15
- .click()
16
- .type(CATEGORY_TERM);
17
-
18
- cy.get('@header')
19
- .find('[data-flight-search-autocomplete-result="category"]')
20
- .should('be.visible');
21
-
22
- cy.get('@searchField').type(`{selectall}${PRODUCT_TERM}`);
23
-
24
- cy.get('@header')
25
- .find('[data-flight-search-autocomplete-result="product"]')
26
- .should('be.visible');
27
- });
28
- });
@@ -1,39 +0,0 @@
1
- const PRODUCT_TERM = 'bike';
2
- const EMPTY_TERM = 'sikeeeeee';
3
- const PAGED_TERM = 'wa bag';
4
-
5
- describe('Search page', () => {
6
- it('Returns results', () => {
7
- cy.visit(`se/search/?term=${PRODUCT_TERM}`);
8
-
9
- cy.findByTestId('product-grid').as('productGrid').should('exist');
10
- });
11
-
12
- it('Returns a no results page if there are no matches', () => {
13
- cy.visit(`se/search/?term=${EMPTY_TERM}`);
14
-
15
- cy.findByTestId('product-grid').as('productGrid').should('not.exist');
16
-
17
- cy.findAllByText('No results for').should('exist');
18
- });
19
-
20
- it('Can handle pagination on search page', () => {
21
- cy.visit(`se/search/?term=${PAGED_TERM}&standardPagination=true`);
22
- cy.findByTestId('product-grid').as('productGrid').should('exist');
23
- cy.get('li[data-testid="product"]').should('have.length', 24);
24
- cy.get('a').contains('Next').click();
25
- cy.url().should('contain', 'page=2');
26
- cy.findByTestId('product-grid').as('productGrid').should('exist');
27
- cy.get('li[data-testid="product"]').should('have.length.lessThan', 24);
28
- });
29
-
30
- it('Can handle infinite pagination', () => {
31
- cy.visit(`se/search/?term=${PAGED_TERM}`);
32
- cy.get('a').contains('Show more').click();
33
- cy.wait(2000);
34
- cy.scrollTo('bottom');
35
- cy.url().should('contain', 'page=2');
36
- cy.scrollTo('top');
37
- cy.url().should('not.contain', 'page=2');
38
- });
39
- });
@@ -1,9 +0,0 @@
1
- import { CATEGORY_URL } from '../../constants';
2
-
3
- describe('Product Page SSR', () => {
4
- it('Gets the full page from the server', () => {
5
- cy.request(`${CATEGORY_URL}`)
6
- .its('body')
7
- .should('include', '>Watches</h1>');
8
- });
9
- });
@@ -1,9 +0,0 @@
1
- import { PRODUCT_URL } from '../../constants';
2
-
3
- describe('Product Page SSR', () => {
4
- it('Gets the full page from the server', () => {
5
- cy.request(`${PRODUCT_URL}`)
6
- .its('body')
7
- .should('include', '">Watch Classic</h1>');
8
- });
9
- });
@@ -1,5 +0,0 @@
1
- describe('Product Page SSR', () => {
2
- it('Gets the full page from the server', () => {
3
- cy.request('/se').its('body').should('include', 'Selected Categories</h2>');
4
- });
5
- });
@@ -1,5 +0,0 @@
1
- describe('start page', () => {
2
- it('successfully loads', () => {
3
- cy.visit('/?channelCountry=US');
4
- });
5
- });
@@ -1,5 +0,0 @@
1
- describe('Stores page', () => {
2
- it('Successfully loads without errors', () => {
3
- cy.visit('/se/stores');
4
- });
5
- });