@comicrelief/component-library 7.24.0 → 7.24.2

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 (278) hide show
  1. package/.github/workflows/main.yml +22 -24
  2. package/dist/components/Atoms/Button/Button.js +21 -15
  3. package/dist/components/Atoms/Button/Button.test.js +3 -3
  4. package/dist/components/Atoms/ButtonWithStates/ButtonWithStates.js +19 -22
  5. package/dist/components/Atoms/Checkbox/Checkbox.js +42 -26
  6. package/dist/components/Atoms/Checkbox/Checkbox.test.js +3 -3
  7. package/dist/components/Atoms/Confetti/Confetti.js +20 -23
  8. package/dist/components/Atoms/Confetti/_TriggerConfetti.js +4 -11
  9. package/dist/components/Atoms/ErrorText/ErrorText.js +15 -11
  10. package/dist/components/Atoms/ErrorText/ErrorText.test.js +3 -3
  11. package/dist/components/Atoms/Icons/Arrow.js +16 -15
  12. package/dist/components/Atoms/Icons/AtSign.js +9 -9
  13. package/dist/components/Atoms/Icons/Chevron.js +16 -15
  14. package/dist/components/Atoms/Icons/Curve.js +16 -18
  15. package/dist/components/Atoms/Icons/Download.js +8 -8
  16. package/dist/components/Atoms/Icons/External.js +8 -8
  17. package/dist/components/Atoms/Icons/Favourite.js +8 -8
  18. package/dist/components/Atoms/Icons/Internal.js +8 -8
  19. package/dist/components/Atoms/Icons/index.js +8 -8
  20. package/dist/components/Atoms/Input/Input.js +38 -33
  21. package/dist/components/Atoms/Input/input.test.js +3 -3
  22. package/dist/components/Atoms/Label/Label.js +28 -23
  23. package/dist/components/Atoms/Link/Link.js +24 -29
  24. package/dist/components/Atoms/Link/Link.style.js +51 -40
  25. package/dist/components/Atoms/Link/Link.test.js +9 -9
  26. package/dist/components/Atoms/Logo/Logo.js +16 -18
  27. package/dist/components/Atoms/Logo/Logo.test.js +3 -3
  28. package/dist/components/Atoms/Pagination/Item/Item.js +7 -7
  29. package/dist/components/Atoms/Pagination/Item/Item.style.js +35 -28
  30. package/dist/components/Atoms/Pagination/List/List.js +21 -19
  31. package/dist/components/Atoms/Pagination/Pagination.js +41 -49
  32. package/dist/components/Atoms/Pagination/Pagination.test.js +54 -108
  33. package/dist/components/Atoms/Pagination/Utils/PaginationCalculator.js +15 -15
  34. package/dist/components/Atoms/Picture/Picture.js +34 -44
  35. package/dist/components/Atoms/Picture/Picture.test.js +5 -5
  36. package/dist/components/Atoms/RadioButton/RadioButton.js +35 -23
  37. package/dist/components/Atoms/RadioButton/RadioButton.test.js +3 -3
  38. package/dist/components/Atoms/RichText/RichText.js +9 -11
  39. package/dist/components/Atoms/RichText/RichText.test.js +4 -4
  40. package/dist/components/Atoms/Select/Select.js +56 -49
  41. package/dist/components/Atoms/Select/Select.test.js +3 -3
  42. package/dist/components/Atoms/SocialIcons/Icon/Icon.js +13 -13
  43. package/dist/components/Atoms/SocialIcons/SocialIcons.js +25 -23
  44. package/dist/components/Atoms/SocialIcons/SocialIcons.test.js +7 -7
  45. package/dist/components/Atoms/SocialIcons/Utils/Icons.js +3 -3
  46. package/dist/components/Atoms/SocialIcons/Utils/Links.js +19 -20
  47. package/dist/components/Atoms/SocialIcons/assets/X-white-Subtract.svg +3 -0
  48. package/dist/components/Atoms/Text/Text.js +62 -41
  49. package/dist/components/Atoms/Text/Text.test.js +11 -11
  50. package/dist/components/Atoms/TextArea/TextArea.js +18 -17
  51. package/dist/components/Atoms/TextArea/TextArea.test.js +3 -3
  52. package/dist/components/Atoms/TextInputWithDropdown/TextInputWithDropdown.js +69 -86
  53. package/dist/components/Atoms/TextInputWithDropdown/TextInputWithDropdown.style.js +23 -15
  54. package/dist/components/Atoms/TextInputWithDropdown/TextInputWithDropdown.test.js +15 -19
  55. package/dist/components/Molecules/Accordion/Accordion.js +35 -32
  56. package/dist/components/Molecules/Accordion/Accordion.test.js +3 -3
  57. package/dist/components/Molecules/ArticleTeaser/ArticleTeaser.js +81 -52
  58. package/dist/components/Molecules/ArticleTeaser/ArticleTeaser.test.js +5 -5
  59. package/dist/components/Molecules/Banner/Banner.js +21 -13
  60. package/dist/components/Molecules/Banner/Banner.test.js +3 -3
  61. package/dist/components/Molecules/Box/Box.js +33 -27
  62. package/dist/components/Molecules/Box/Box.test.js +5 -5
  63. package/dist/components/Molecules/Card/Card.js +22 -22
  64. package/dist/components/Molecules/Card/Card.test.js +5 -5
  65. package/dist/components/Molecules/CardDs/CardDs.js +80 -55
  66. package/dist/components/Molecules/CardDs/CardDs.test.js +3 -3
  67. package/dist/components/Molecules/Chip/Chip.js +8 -6
  68. package/dist/components/Molecules/Chip/Chip.style.js +48 -28
  69. package/dist/components/Molecules/Chip/Chip.test.js +4 -6
  70. package/dist/components/Molecules/Countdown/Countdown.js +28 -36
  71. package/dist/components/Molecules/Countdown/Countdown.style.js +3 -3
  72. package/dist/components/Molecules/Descriptor/Descriptor.js +32 -26
  73. package/dist/components/Molecules/Descriptor/Descriptor.test.js +5 -5
  74. package/dist/components/Molecules/DoubleCopy/DoubleCopy.js +6 -4
  75. package/dist/components/Molecules/DoubleCopy/DoubleCopy.style.js +7 -5
  76. package/dist/components/Molecules/DoubleCopy/DoubleCopy.test.js +4 -4
  77. package/dist/components/Molecules/HeroBanner/HeroBanner.js +13 -17
  78. package/dist/components/Molecules/InfoBanner/InfoBanner.js +22 -18
  79. package/dist/components/Molecules/InfoBanner/InfoBanner.test.js +10 -10
  80. package/dist/components/Molecules/Logos/Logos.js +26 -14
  81. package/dist/components/Molecules/Logos/Logos.md +5 -0
  82. package/dist/components/Molecules/Lookup/Lookup.js +49 -84
  83. package/dist/components/Molecules/PartnerLink/PartnerLink.js +10 -11
  84. package/dist/components/Molecules/PartnerLink/PartnerLink.style.js +15 -9
  85. package/dist/components/Molecules/PartnerLink/PartnerLink.test.js +3 -3
  86. package/dist/components/Molecules/Promo/Promo.js +30 -36
  87. package/dist/components/Molecules/Promo/Promo.style.js +44 -31
  88. package/dist/components/Molecules/Promo/Promo.test.js +6 -6
  89. package/dist/components/Molecules/Promo/_ProgressRing.js +13 -19
  90. package/dist/components/Molecules/Promo/_PromoVideo.js +25 -34
  91. package/dist/components/Molecules/Promo/_PromoVideoButton.js +7 -7
  92. package/dist/components/Molecules/Promo/_PromoVideoButton.style.js +68 -41
  93. package/dist/components/Molecules/SchoolLookup/SchoolLookup.js +29 -52
  94. package/dist/components/Molecules/SchoolLookup/SchoolLookup.test.js +4 -4
  95. package/dist/components/Molecules/SearchInput/SearchInput.js +8 -8
  96. package/dist/components/Molecules/SearchInput/SearchInput.style.js +22 -14
  97. package/dist/components/Molecules/SearchInput/SearchInput.test.js +4 -4
  98. package/dist/components/Molecules/SearchResult/SearchResult.js +43 -29
  99. package/dist/components/Molecules/SearchResult/SearchResult.test.js +9 -9
  100. package/dist/components/Molecules/ShareButton/ShareButton.js +22 -26
  101. package/dist/components/Molecules/ShareButton/ShareButton.style.js +5 -5
  102. package/dist/components/Molecules/ShareButton/ShareButton.test.js +3 -3
  103. package/dist/components/Molecules/ShareButton/assets/ShareIcons.js +2 -2
  104. package/dist/components/Molecules/SimpleSchoolLookup/SimpleSchoolLookup.js +28 -55
  105. package/dist/components/Molecules/SingleMessage/SingleMessage.js +99 -123
  106. package/dist/components/Molecules/SingleMessage/SingleMessage.style.js +132 -81
  107. package/dist/components/Molecules/SingleMessage/SingleMessage.test.js +13 -13
  108. package/dist/components/Molecules/SingleMessageDS/SingleMessageDs.js +31 -40
  109. package/dist/components/Molecules/SingleMessageDS/SingleMessageDs.style.js +85 -49
  110. package/dist/components/Molecules/SingleMessageDS/SingleMessageDs.test.js +3 -3
  111. package/dist/components/Molecules/Typeahead/Typeahead.js +47 -84
  112. package/dist/components/Molecules/Typeahead/Typeahead.test.js +12 -35
  113. package/dist/components/Molecules/VideoBanner/VideoBanner.js +20 -25
  114. package/dist/components/Molecules/VideoBanner/VideoBanner.test.js +4 -4
  115. package/dist/components/Organisms/CookieBanner/CookieBanner.js +7 -5
  116. package/dist/components/Organisms/CookieBanner/CookieBanner.style.js +21 -13
  117. package/dist/components/Organisms/CookieBanner/CookieBanner.test.js +5 -5
  118. package/dist/components/Organisms/Donate/Donate.js +34 -37
  119. package/dist/components/Organisms/Donate/Donate.style.js +85 -53
  120. package/dist/components/Organisms/Donate/Donate.test.js +10 -10
  121. package/dist/components/Organisms/Donate/Form/Form.js +53 -78
  122. package/dist/components/Organisms/Donate/Form/PopUpComponent.js +25 -30
  123. package/dist/components/Organisms/Donate/GivingSelector/GivingSelector.js +11 -13
  124. package/dist/components/Organisms/Donate/GivingSelector/GivingSelector.style.js +38 -22
  125. package/dist/components/Organisms/Donate/MoneyBuy/MoneyBuy.js +47 -30
  126. package/dist/components/Organisms/EmailSignUp/EmailSignUp.style.js +63 -37
  127. package/dist/components/Organisms/EmailSignUp/EmailSignUp.test.js +12 -12
  128. package/dist/components/Organisms/EmailSignUp/EmailSignUpForm.js +23 -43
  129. package/dist/components/Organisms/EmailSignUp/_EmailSignUp.js +25 -21
  130. package/dist/components/Organisms/EmailSignUp/_EmailSignUpConfig.js +10 -9
  131. package/dist/components/Organisms/EmailSignUp/_TextInput.js +20 -18
  132. package/dist/components/Organisms/Footer/Footer.js +10 -10
  133. package/dist/components/Organisms/Footer/Footer.style.js +27 -21
  134. package/dist/components/Organisms/Footer/Footer.test.js +3 -3
  135. package/dist/components/Organisms/Footer/Nav/Nav.js +59 -70
  136. package/dist/components/Organisms/Footer/Nav/Nav.style.js +77 -43
  137. package/dist/components/Organisms/Header/Burger/BurgerMenu.js +6 -4
  138. package/dist/components/Organisms/Header/Burger/BurgerMenu.style.js +37 -21
  139. package/dist/components/Organisms/Header/Header.js +8 -8
  140. package/dist/components/Organisms/Header/Header.style.js +27 -19
  141. package/dist/components/Organisms/Header/Nav/Nav.js +39 -50
  142. package/dist/components/Organisms/Header/Nav/Nav.style.js +103 -57
  143. package/dist/components/Organisms/Header/header.test.js +1 -1
  144. package/dist/components/Organisms/ImpactSlider/ImpactMoneybuys.style.js +32 -29
  145. package/dist/components/Organisms/ImpactSlider/ImpactSlider.js +19 -22
  146. package/dist/components/Organisms/ImpactSlider/ImpactSlider.style.js +38 -24
  147. package/dist/components/Organisms/ImpactSlider/Slider.style.js +8 -14
  148. package/dist/components/Organisms/ImpactSlider/_ImpactMoneybuys.js +11 -11
  149. package/dist/components/Organisms/ImpactSlider/_Slider.js +9 -7
  150. package/dist/components/Organisms/ImpactSlider/_utils.js +11 -11
  151. package/dist/components/Organisms/MarketingPreferencesDS/MarketingPreferencesDS.style.js +61 -38
  152. package/dist/components/Organisms/MarketingPreferencesDS/MarketingPreferencesDSForm.js +24 -16
  153. package/dist/components/Organisms/MarketingPreferencesDS/_AssociatedFields.js +1 -1
  154. package/dist/components/Organisms/MarketingPreferencesDS/_CheckAnswer.js +20 -16
  155. package/dist/components/Organisms/MarketingPreferencesDS/_DefaultCopy.js +3 -3
  156. package/dist/components/Organisms/MarketingPreferencesDS/_MarketingPreferencesDS.js +46 -36
  157. package/dist/components/Organisms/MarketingPreferencesDS/_MarketingPrefsConfig.js +21 -34
  158. package/dist/components/Organisms/MarketingPreferencesDS/_TextInput.js +20 -18
  159. package/dist/components/Organisms/Membership/Form/Form.js +48 -81
  160. package/dist/components/Organisms/Membership/Membership.js +17 -15
  161. package/dist/components/Organisms/Membership/Membership.style.js +81 -51
  162. package/dist/components/Organisms/Membership/Membership.test.js +4 -4
  163. package/dist/components/Organisms/Membership/MoneyBox/MoneyBox.js +37 -26
  164. package/dist/hoc/shallowWithTheme.js +1 -1
  165. package/dist/index.js +67 -67
  166. package/dist/styleguide/CRLogo.js +2 -2
  167. package/dist/styleguide/StyleGuideRenderer.js +9 -7
  168. package/dist/styleguide/ThemeWrapper.js +5 -3
  169. package/dist/styleguide/data/data.js +3 -3
  170. package/dist/theme/crTheme/buttonColors.js +6 -5
  171. package/dist/theme/crTheme/colors.js +4 -3
  172. package/dist/theme/crTheme/fontSizes.js +4 -3
  173. package/dist/theme/crTheme/linkStyles.js +6 -5
  174. package/dist/theme/crTheme/theme.js +1 -1
  175. package/dist/theme/shared/breakpoint.js +4 -3
  176. package/dist/theme/shared/fontFamilies.js +5 -4
  177. package/dist/theme/shared/hideVisually.js +1 -1
  178. package/dist/theme/shared/size.js +4 -3
  179. package/dist/theme/shared/spacing.js +2 -2
  180. package/dist/theme/shared/zIndex.js +3 -3
  181. package/dist/theme/srTheme/buttonColors.js +6 -5
  182. package/dist/theme/srTheme/colors.js +4 -3
  183. package/dist/theme/srTheme/fontSizes.js +4 -3
  184. package/dist/theme/srTheme/linkStyles.js +6 -5
  185. package/dist/theme/srTheme/theme.js +1 -1
  186. package/dist/utils/Membership.js +30 -27
  187. package/dist/utils/ShareButton/sharePopUpHelper.js +8 -8
  188. package/dist/utils/ShareButton/shareTracking.js +1 -1
  189. package/dist/utils/ShareButton/shareUrlHelper.js +3 -3
  190. package/dist/utils/allowListed.js +3 -5
  191. package/dist/utils/allowListed.test.js +3 -3
  192. package/dist/utils/internalLinkHelper.js +8 -10
  193. package/dist/utils/navHelper.js +2 -2
  194. package/package.json +12 -9
  195. package/playwright/components/atoms/checkbox.spec.js +64 -0
  196. package/playwright/components/atoms/input.spec.js +158 -0
  197. package/playwright/components/atoms/label.spec.js +29 -0
  198. package/playwright/components/atoms/link.spec.js +48 -0
  199. package/playwright/components/atoms/radioButton.spec.js +30 -0
  200. package/playwright/components/atoms/select.spec.js +36 -0
  201. package/playwright/components/atoms/textArea.spec.js +39 -0
  202. package/playwright/components/atoms/textInputWithDropdown.spec.js +23 -0
  203. package/playwright/components/molecules/accordian.spec.js +20 -0
  204. package/playwright/components/molecules/schoolLookup.spec.js +26 -0
  205. package/playwright/components/molecules/searchInput.spec.js +24 -0
  206. package/playwright/components/molecules/shareButton.spec.js +32 -0
  207. package/playwright/components/molecules/simpleSchoolLookUp.spec.js +35 -0
  208. package/playwright/components/molecules/typeahead.spec.js +27 -0
  209. package/playwright/components/organisms/donate.spec.js +293 -0
  210. package/playwright/components/organisms/emailSignUpForm.spec.js +109 -0
  211. package/playwright/components/organisms/footer.spec.js +67 -0
  212. package/playwright/components/organisms/header.spec.js +82 -0
  213. package/playwright/components/organisms/impactSlider.spec.js +292 -0
  214. package/playwright/components/organisms/marketingPreferences.spec.js +220 -0
  215. package/playwright/components/organisms/membership.spec.js +47 -0
  216. package/playwright.config.js +49 -0
  217. package/src/components/Atoms/SocialIcons/Utils/Icons.js +1 -1
  218. package/src/components/Atoms/SocialIcons/assets/X-white-Subtract.svg +3 -0
  219. package/src/components/Molecules/Logos/Logos.js +18 -6
  220. package/src/components/Molecules/Logos/Logos.md +5 -0
  221. package/src/components/Organisms/ImpactSlider/_ImpactMoneybuys.js +3 -4
  222. package/src/components/Organisms/Membership/Membership.test.js +1 -1
  223. package/cypress/e2e/components/atoms/button.cy.js +0 -102
  224. package/cypress/e2e/components/atoms/buttonWithStates.cy.js +0 -47
  225. package/cypress/e2e/components/atoms/checkbox.cy.js +0 -70
  226. package/cypress/e2e/components/atoms/confetti.cy.js +0 -46
  227. package/cypress/e2e/components/atoms/errorText.cy.js +0 -45
  228. package/cypress/e2e/components/atoms/input.cy.js +0 -157
  229. package/cypress/e2e/components/atoms/label.cy.js +0 -93
  230. package/cypress/e2e/components/atoms/link.cy.js +0 -190
  231. package/cypress/e2e/components/atoms/logo.cy.js +0 -132
  232. package/cypress/e2e/components/atoms/pagination.cy.js +0 -191
  233. package/cypress/e2e/components/atoms/picture.cy.js +0 -130
  234. package/cypress/e2e/components/atoms/radioButton.cy.js +0 -76
  235. package/cypress/e2e/components/atoms/richText.cy.js +0 -70
  236. package/cypress/e2e/components/atoms/select.cy.js +0 -84
  237. package/cypress/e2e/components/atoms/socialIcons.cy.js +0 -162
  238. package/cypress/e2e/components/atoms/text.cy.js +0 -169
  239. package/cypress/e2e/components/atoms/textArea.cy.js +0 -89
  240. package/cypress/e2e/components/atoms/textInputWithDrop.cy.js +0 -76
  241. package/cypress/e2e/components/molecules/accordion.cy.js +0 -67
  242. package/cypress/e2e/components/molecules/articleTeaser.cy.js +0 -105
  243. package/cypress/e2e/components/molecules/banner.cy.js +0 -67
  244. package/cypress/e2e/components/molecules/box.cy.js +0 -104
  245. package/cypress/e2e/components/molecules/card.cy.js +0 -105
  246. package/cypress/e2e/components/molecules/cardDs.cy.js +0 -198
  247. package/cypress/e2e/components/molecules/chip.cy.js +0 -68
  248. package/cypress/e2e/components/molecules/countdown.cy.js +0 -71
  249. package/cypress/e2e/components/molecules/descriptor.cy.js +0 -142
  250. package/cypress/e2e/components/molecules/doubleCopy.cy.js +0 -79
  251. package/cypress/e2e/components/molecules/heroBanner.cy.js +0 -69
  252. package/cypress/e2e/components/molecules/infoBanner.cy.js +0 -69
  253. package/cypress/e2e/components/molecules/partnerLink.cy.js +0 -68
  254. package/cypress/e2e/components/molecules/promo.cy.js +0 -74
  255. package/cypress/e2e/components/molecules/schoolLookup.cy.js +0 -83
  256. package/cypress/e2e/components/molecules/searchInput.cy.js +0 -72
  257. package/cypress/e2e/components/molecules/searchResult.cy.js +0 -191
  258. package/cypress/e2e/components/molecules/shareButton.cy.js +0 -76
  259. package/cypress/e2e/components/molecules/simpleSchoolLookup.cy.js +0 -83
  260. package/cypress/e2e/components/molecules/singleMessage.cy.js +0 -502
  261. package/cypress/e2e/components/molecules/singleMessageDs.cy.js +0 -234
  262. package/cypress/e2e/components/molecules/typeahead.cy.js +0 -97
  263. package/cypress/e2e/components/molecules/videoBanner.cy.js +0 -132
  264. package/cypress/e2e/components/organisms/cookieBanner.cy.js +0 -80
  265. package/cypress/e2e/components/organisms/donate.cy.js +0 -284
  266. package/cypress/e2e/components/organisms/emailSignUp.cy.js +0 -54
  267. package/cypress/e2e/components/organisms/footer.cy.js +0 -168
  268. package/cypress/e2e/components/organisms/header.cy.js +0 -138
  269. package/cypress/e2e/components/organisms/impactSlider.cy.js +0 -72
  270. package/cypress/e2e/components/organisms/marketingPreferencesDSForm.cy.js +0 -589
  271. package/cypress/e2e/components/organisms/membership.cy.js +0 -122
  272. package/cypress/fixtures/example.json +0 -5
  273. package/cypress/plugins/index.js +0 -21
  274. package/cypress/support/commands.js +0 -25
  275. package/cypress/support/e2e.js +0 -36
  276. package/cypress.config.js +0 -15
  277. package/dist/components/Atoms/SocialIcons/assets/x-logo.svg +0 -3
  278. package/src/components/Atoms/SocialIcons/assets/x-logo.svg +0 -3
@@ -0,0 +1,292 @@
1
+ const { test, expect } = require('@playwright/test');
2
+
3
+ test.describe('impact slider component - 1', () => {
4
+ test('impact slider - sliding to £70', async ({ page }) => {
5
+
6
+ await page.goto('/#impactslider');
7
+
8
+ // Ensure that the slider and its handle are visible
9
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"]')).toBeVisible();
10
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] #ImpactSlider > div:nth-child(4)')).toBeVisible();
11
+
12
+ // slider selector
13
+ const sliderSelector = '[data-testid="ImpactSlider-example-1"] #ImpactSlider';
14
+ const slider = await page.$(sliderSelector);
15
+
16
+ const moneyBuyElement = page.locator('[data-testid="ImpactSlider-example-1"] [data-testid="impact-slider--moneybuy-1"]');
17
+ const moneyBuyText = await moneyBuyElement.innerText();
18
+ console.log('Target initially: ', moneyBuyText);
19
+
20
+ if (slider) {
21
+ // Get the bounding box of the slider
22
+ let sliderBound = await slider.boundingBox();
23
+
24
+ // Get the target position for the mouse move to a donation of £70
25
+ const targetPosition = sliderBound.width * (70 / 100);
26
+
27
+ // Perform mouse actions to simulate dragging the slider handle
28
+ await page.mouse.move(sliderBound.x, sliderBound.y + sliderBound.height / 2);
29
+ await page.mouse.down();
30
+
31
+ while (sliderBound.width * (parseFloat(await moneyBuyElement.innerText()) / 100) !== targetPosition) {
32
+ await page.mouse.move(sliderBound.x + targetPosition, sliderBound.y + sliderBound.height / 2);
33
+ sliderBound = await slider.boundingBox();
34
+ }
35
+
36
+ await page.mouse.up();
37
+ }
38
+
39
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] > [data-preview="ImpactSlider"] > div > div > div > p')).toContainText('A donation of £70 could help pay for:');
40
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] [data-testid="impact-slider--moneybuy-1"] [data-testid="moneybuy-amount"]')).toContainText('70');
41
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] [data-testid="impact-slider--moneybuy-2"] [data-testid="moneybuy-amount"]')).toContainText('7');
42
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] [data-testid="impact-slider--moneybuy-3"] [data-testid="moneybuy-amount"]')).toContainText('4');
43
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] [data-testid="impact-slider--moneybuy-4"] [data-testid="moneybuy-amount"]')).toContainText('3');
44
+
45
+ // donate now button should have the amount as £70
46
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] button[type="submit"]')).toContainText('Donate £70 now');
47
+
48
+ await page.waitForTimeout(5000);
49
+ await page.close();
50
+ });
51
+
52
+ test('impact slider - sliding to the maximum amount £100', async ({ page }) => {
53
+
54
+ await page.goto('/#impactslider');
55
+
56
+ // Ensure that the slider and its handle are visible
57
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"]')).toBeVisible();
58
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] #ImpactSlider > div:nth-child(4)')).toBeVisible();
59
+
60
+ // slider selector
61
+ const sliderSelector = '[data-testid="ImpactSlider-example-1"] #ImpactSlider';
62
+ const slider = await page.$(sliderSelector);
63
+
64
+ const moneyBuyElement = page.locator('[data-testid="ImpactSlider-example-1"] [data-testid="impact-slider--moneybuy-1"]');
65
+ const moneyBuyText = await moneyBuyElement.innerText();
66
+ console.log('Target initially: ', moneyBuyText);
67
+
68
+ if (slider) {
69
+ // Get the bounding box of the slider
70
+ let sliderBound = await slider.boundingBox();
71
+
72
+ // Get the target position for the mouse move to a donation of £100
73
+ const targetPosition = sliderBound.width * (100 / 100);
74
+
75
+ // Perform mouse actions to simulate dragging the slider handle
76
+ await page.mouse.move(sliderBound.x, sliderBound.y + sliderBound.height / 2);
77
+ await page.mouse.down();
78
+
79
+ while (sliderBound.width * (parseFloat(await moneyBuyElement.innerText()) / 100) !== targetPosition) {
80
+ await page.mouse.move(sliderBound.x + targetPosition, sliderBound.y + sliderBound.height / 2);
81
+ sliderBound = await slider.boundingBox();
82
+ }
83
+
84
+ await page.mouse.up();
85
+ }
86
+
87
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] > [data-preview="ImpactSlider"] > div > div > div > p')).toContainText('A donation of £100 could help pay for:');
88
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] [data-testid="impact-slider--moneybuy-1"] [data-testid="moneybuy-amount"]')).toContainText('100');
89
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] [data-testid="impact-slider--moneybuy-2"] [data-testid="moneybuy-amount"]')).toContainText('10');
90
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] [data-testid="impact-slider--moneybuy-3"] [data-testid="moneybuy-amount"]')).toContainText('6');
91
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] [data-testid="impact-slider--moneybuy-4"] [data-testid="moneybuy-amount"]')).toContainText('5');
92
+
93
+ // donate now button should have the amount as £100
94
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] button[type="submit"]')).toContainText('Donate £100 now');
95
+
96
+ await page.waitForTimeout(5000);
97
+ await page.close();
98
+ });
99
+
100
+ test('impact slider - sliding to the minimum amount £25', async ({ page }) => {
101
+
102
+ await page.goto('/#impactslider');
103
+
104
+ // Ensure that the slider and its handle are visible
105
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"]')).toBeVisible();
106
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] #ImpactSlider > div:nth-child(4)')).toBeVisible();
107
+
108
+ // slider selector
109
+ const sliderSelector = '[data-testid="ImpactSlider-example-1"] #ImpactSlider';
110
+ const slider = await page.$(sliderSelector);
111
+
112
+ const moneyBuyElement = page.locator('[data-testid="ImpactSlider-example-1"] [data-testid="impact-slider--moneybuy-1"]');
113
+ const moneyBuyText = await moneyBuyElement.innerText();
114
+ console.log('Target initially: ', moneyBuyText);
115
+
116
+ if (slider) {
117
+ // Get the bounding box of the slider
118
+ let sliderBound = await slider.boundingBox();
119
+
120
+ // Get the target position for the mouse move to a donation of £25
121
+ const targetPosition = sliderBound.width * (25 / 100);
122
+
123
+ // Perform mouse actions to simulate dragging the slider handle
124
+ await page.mouse.move(sliderBound.x, sliderBound.y + sliderBound.height / 2);
125
+ await page.mouse.down();
126
+
127
+ while (sliderBound.width * (parseFloat(await moneyBuyElement.innerText()) / 100) !== targetPosition) {
128
+ await page.mouse.move(sliderBound.x + targetPosition, sliderBound.y + sliderBound.height / 2);
129
+ sliderBound = await slider.boundingBox();
130
+ }
131
+
132
+ await page.mouse.up();
133
+ }
134
+
135
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] > [data-preview="ImpactSlider"] > div > div > div > p')).toContainText('A donation of £25 could help pay for:');
136
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] [data-testid="impact-slider--moneybuy-1"] [data-testid="moneybuy-amount"]')).toContainText('25');
137
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] [data-testid="impact-slider--moneybuy-2"] [data-testid="moneybuy-amount"]')).toContainText('2');
138
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] [data-testid="impact-slider--moneybuy-3"] [data-testid="moneybuy-amount"]')).toContainText('1');
139
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] [data-testid="impact-slider--moneybuy-4"] [data-testid="moneybuy-amount"]')).toContainText('1');
140
+
141
+ // donate now button should have the amount as £25
142
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] button[type="submit"]')).toContainText('Donate £25 now');
143
+
144
+ await page.waitForTimeout(5000);
145
+ await page.close();
146
+ });
147
+
148
+ test('impact slider - moving the slider to £80 and then back to £50', async ({ page }) => {
149
+ await page.goto('/#impactslider');
150
+
151
+ // Ensure that the slider and its handle are visible
152
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"]')).toBeVisible();
153
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] #ImpactSlider > div:nth-child(4)')).toBeVisible();
154
+
155
+ const sliderSelector = '[data-testid="ImpactSlider-example-1"] #ImpactSlider';
156
+ const slider = await page.$(sliderSelector);
157
+
158
+ const moneyBuyElement = page.locator('[data-testid="ImpactSlider-example-1"] [data-testid="impact-slider--moneybuy-1"]');
159
+ const moneyBuyText = await moneyBuyElement.innerText();
160
+ console.log('Target initially: ', moneyBuyText);
161
+
162
+ let targetAmountBeforeMoving;
163
+ let sliderBound;
164
+
165
+ // drag the slider to the right to increase the amount to £80
166
+ if (slider) {
167
+ // Get the bounding box of the slider
168
+ sliderBound = await slider.boundingBox();
169
+
170
+ // Get the target position for the mouse move to a donation of £80
171
+ const targetPosition80 = sliderBound.width * (80 / 100);
172
+
173
+ // Perform mouse actions to simulate dragging the slider handle to 80
174
+ await page.mouse.move(sliderBound.x, sliderBound.y + sliderBound.height / 2);
175
+ await page.mouse.down();
176
+
177
+ while (sliderBound.width * (parseFloat(await moneyBuyElement.innerText()) / 100) !== targetPosition80) {
178
+ await page.mouse.move(sliderBound.x + targetPosition80, sliderBound.y + sliderBound.height / 2);
179
+ sliderBound = await slider.boundingBox();
180
+ }
181
+
182
+ await page.mouse.up();
183
+
184
+ // Update targetAmountBeforeMoving after the first slider move
185
+ targetAmountBeforeMoving = parseFloat(await moneyBuyElement.innerText());
186
+ console.log('Slider increased to amount: ', targetAmountBeforeMoving);
187
+ }
188
+
189
+ // Validate that the slider is at £80
190
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] > [data-preview="ImpactSlider"] > div > div > div > p')).toContainText('A donation of £80 could help pay for:');
191
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] [data-testid="impact-slider--moneybuy-1"] [data-testid="moneybuy-amount"]')).toContainText('80');
192
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] [data-testid="impact-slider--moneybuy-2"] [data-testid="moneybuy-amount"]')).toContainText('8');
193
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] [data-testid="impact-slider--moneybuy-3"] [data-testid="moneybuy-amount"]')).toContainText('5');
194
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] [data-testid="impact-slider--moneybuy-4"] [data-testid="moneybuy-amount"]')).toContainText('4');
195
+
196
+ // donate now button should have the amount as £80
197
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] button[type="submit"]')).toContainText('Donate £80 now');
198
+
199
+ // add a short wait for the slider to move back from £80 to £50
200
+ await page.waitForTimeout(5000);
201
+
202
+ // drag the slider to the left to decrease the amount to £50
203
+ if (slider) {
204
+ // Get the bounding box of the slider
205
+ sliderBound = await slider.boundingBox();
206
+
207
+ // Get the target position for the mouse move to a donation of £80
208
+ const targetPosition45 = sliderBound.width * (50 / 100);
209
+
210
+ // Perform mouse actions to simulate dragging the slider handle to 80
211
+ await page.mouse.move(sliderBound.x, sliderBound.y + sliderBound.height / 2);
212
+ await page.mouse.down();
213
+
214
+ while (sliderBound.width * (parseFloat(await moneyBuyElement.innerText()) / 100) !== targetPosition45) {
215
+ await page.mouse.move(sliderBound.x + targetPosition45, sliderBound.y + sliderBound.height / 2);
216
+ sliderBound = await slider.boundingBox();
217
+ }
218
+
219
+ await page.mouse.down();
220
+
221
+ await page.waitForTimeout(2000);
222
+
223
+ // Update targetAmountBeforeMoving after the first slider move
224
+ targetAmountBeforeMoving = parseFloat(await moneyBuyElement.innerText());
225
+ console.log('Slider decreased to amount: ', targetAmountBeforeMoving);
226
+ }
227
+
228
+ await page.waitForTimeout(2000);
229
+
230
+ // Validate that the slider is at £50
231
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] > [data-preview="ImpactSlider"] > div > div > div > p')).toContainText('A donation of £50 could help pay for:');
232
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] [data-testid="impact-slider--moneybuy-1"] [data-testid="moneybuy-amount"]')).toContainText('50');
233
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] [data-testid="impact-slider--moneybuy-2"] [data-testid="moneybuy-amount"]')).toContainText('5');
234
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] [data-testid="impact-slider--moneybuy-3"] [data-testid="moneybuy-amount"]')).toContainText('3');
235
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] [data-testid="impact-slider--moneybuy-4"] [data-testid="moneybuy-amount"]')).toContainText('2');
236
+
237
+ // donate now button should have the amount as £50
238
+ await expect(page.locator('[data-testid="ImpactSlider-example-1"] button[type="submit"]')).toContainText('Donate £50 now');
239
+
240
+ await page.close();
241
+ });
242
+ });
243
+
244
+ test.describe('impact slider component - 2', () => {
245
+ test('impact slider - sliding to £45', async ({ page }) => {
246
+
247
+ await page.goto('/#impactslider');
248
+
249
+ // Ensure that the slider and its handle are visible
250
+ await expect(page.locator('[data-testid="ImpactSlider-example-3"]')).toBeVisible();
251
+ await expect(page.locator('[data-testid="ImpactSlider-example-3"] #ImpactSlider > div:nth-child(4)')).toBeVisible();
252
+
253
+ // slider selector
254
+ const sliderSelector = '[data-testid="ImpactSlider-example-3"] #ImpactSlider';
255
+ const slider = await page.$(sliderSelector);
256
+
257
+ const moneyBuyElement = page.locator('[data-testid="ImpactSlider-example-3"] [data-testid="impact-slider--moneybuy-1"]');
258
+ const moneyBuyText = await moneyBuyElement.innerText();
259
+ console.log('Target initially: ', moneyBuyText);
260
+
261
+ if (slider) {
262
+ // Get the bounding box of the slider
263
+ let sliderBound = await slider.boundingBox();
264
+
265
+ // Get the target position for the mouse move to a donation of £45
266
+ const targetPosition = sliderBound.width * (45 / 100);
267
+
268
+ // Perform mouse actions to simulate dragging the slider handle
269
+ await page.mouse.move(sliderBound.x, sliderBound.y + sliderBound.height / 2);
270
+ await page.mouse.down();
271
+
272
+ while (sliderBound.width * (parseFloat(await moneyBuyElement.innerText()) / 100) !== targetPosition) {
273
+ await page.mouse.move(sliderBound.x + targetPosition, sliderBound.y + sliderBound.height / 2);
274
+ sliderBound = await slider.boundingBox();
275
+ }
276
+
277
+ await page.mouse.up();
278
+ }
279
+
280
+ await expect(page.locator('[data-testid="ImpactSlider-example-3"] > [data-preview="ImpactSlider"] > div > div > div > p')).toContainText('A donation of £45 could help pay for:');
281
+ await expect(page.locator('[data-testid="ImpactSlider-example-3"] [data-testid="impact-slider--moneybuy-1"] [data-testid="moneybuy-amount"]')).toContainText('45');
282
+ await expect(page.locator('[data-testid="ImpactSlider-example-3"] [data-testid="impact-slider--moneybuy-2"] [data-testid="moneybuy-amount"]')).toContainText('4');
283
+ await expect(page.locator('[data-testid="ImpactSlider-example-3"] [data-testid="impact-slider--moneybuy-3"] [data-testid="moneybuy-amount"]')).toContainText('3');
284
+ await expect(page.locator('[data-testid="ImpactSlider-example-3"] [data-testid="impact-slider--moneybuy-4"] [data-testid="moneybuy-amount"]')).toContainText('2');
285
+
286
+ // donate now button should have the amount as £45
287
+ await expect(page.locator('[data-testid="ImpactSlider-example-3"] button[type="submit"]')).toContainText('Donate £45 now');
288
+
289
+ await page.waitForTimeout(5000);
290
+ await page.close();
291
+ });
292
+ });
@@ -0,0 +1,220 @@
1
+ const { test, expect } = require('@playwright/test');
2
+
3
+ test.describe('marketing preferences component', () => {
4
+ test('marketing preferences', async ({ page }) => {
5
+
6
+ await page.goto('/#marketingpreferencesdsform');
7
+
8
+ await expect(page.locator('[data-testid="MarketingPreferencesDSForm-example-1"]')).toBeVisible();
9
+
10
+ // Email field should be visible when the checkbox is clicked
11
+ await expect(page.locator('div#marketing-preferences--default label[for="mp_permissionEmail-yes"]')).toBeVisible();
12
+ await page.locator('div#marketing-preferences--default label[for="mp_permissionEmail-yes"]').click();
13
+ await expect(page.locator('div#marketing-preferences--default input#mp_email')).toBeVisible();
14
+ expect(await page.locator('div#marketing-preferences--default label[for="mp_permissionEmail-yes"]').isChecked()).toBeTruthy();
15
+
16
+ // Post field should be visible when the checkbox is clicked
17
+ await expect(page.locator('div#marketing-preferences--default label[for="mp_permissionPost-yes"]')).toBeVisible();
18
+ await page.locator('div#marketing-preferences--default label[for="mp_permissionPost-yes"]').click();
19
+ await expect(page.locator('div#marketing-preferences--default input#mp_address1')).toBeVisible();
20
+ await expect(page.locator('div#marketing-preferences--default input#mp_address2')).toBeVisible();
21
+ await expect(page.locator('div#marketing-preferences--default input#mp_address3')).toBeVisible();
22
+ await expect(page.locator('div#marketing-preferences--default input#mp_town')).toBeVisible();
23
+ await expect(page.locator('div#marketing-preferences--default input#mp_postcode')).toBeVisible();
24
+ await expect(page.locator('div#marketing-preferences--default input#mp_country')).toBeVisible();
25
+
26
+ // Text field should be visible when the checkbox is clicked
27
+ await expect(page.locator('div#marketing-preferences--default label[for="mp_permissionSMS-yes"]')).toBeVisible();
28
+ await page.locator('div#marketing-preferences--default label[for="mp_permissionSMS-yes"]').click();
29
+ await expect(page.locator('div#marketing-preferences--default input#mp_mobile')).toBeVisible();
30
+ expect(await page.locator('div#marketing-preferences--default label[for="mp_permissionSMS-yes"]').isChecked()).toBeTruthy();
31
+
32
+ // Text field should be visible when the checkbox is clicked
33
+ await expect(page.locator('div#marketing-preferences--default label[for="mp_permissionPhone-yes"]')).toBeVisible();
34
+ await page.locator('div#marketing-preferences--default label[for="mp_permissionPhone-yes"]').click();
35
+ await expect(page.locator('div#marketing-preferences--default input#mp_phone')).toBeVisible();
36
+ expect(await page.locator('div#marketing-preferences--default label[for="mp_permissionPhone-yes"]').isChecked()).toBeTruthy();
37
+
38
+ // submit button should be visible
39
+ await expect(page.locator('div#marketing-preferences--default ~ input[type="submit"]')).toBeVisible();
40
+
41
+ // submitting button without entering input values should show error messages
42
+ await page.locator('div#marketing-preferences--default ~ input[type="submit"]').click();
43
+
44
+ // email field empty error message
45
+ await expect(page.locator('div#marketing-preferences--default div.field-email > div > label[for="mp_email"] > span > span')).toContainText('Please enter your email address');
46
+
47
+ // postal address fields empty error messages
48
+ // address line 1 error message
49
+ await expect(page.locator('div#marketing-preferences--default div.field-post > div > label[for="mp_address1"] > span > span')).toContainText('Please enter the first line of your address');
50
+ // town error message
51
+ await expect(page.locator('div#marketing-preferences--default div.field-post > div > label[for="mp_town"] > span > span')).toContainText('Please enter your town');
52
+ // postcode error message
53
+ await expect(page.locator('div#marketing-preferences--default div.field-post > div > label[for="mp_postcode"] > span > span')).toContainText('Please enter your postcode');
54
+ // country error message
55
+ await expect(page.locator('div#marketing-preferences--default div.field-post > div > label[for="mp_country"] > span > span')).toContainText('Please enter your country');
56
+ // text empty error message
57
+ await expect(page.locator('div#marketing-preferences--default div.field-sms > div > label[for="mp_mobile"] > span > span')).toContainText('Please enter your mobile number');
58
+ // phone error message
59
+ await expect(page.locator('div#marketing-preferences--default div.field-phone > div > label > span > span')).toContainText('Please enter your phone number');
60
+
61
+ // text field empty error message
62
+ await expect(page.locator('div#marketing-preferences--default div.field-sms > div > label[for="mp_mobile"] > span > span')).toContainText('Please enter your mobile number');
63
+
64
+ // phone field empty error message
65
+ await expect(page.locator('div#marketing-preferences--default div.field-phone > div > label > span > span')).toContainText('Please enter your phone number');
66
+
67
+ // validate email field
68
+ await page.locator('div#marketing-preferences--default input#mp_email').type('email-signup@email.sls.comicrelief.com');
69
+ await page.locator('div#marketing-preferences--default input#mp_email').fill(''); // clear the email field
70
+ await page.locator('div#marketing-preferences--default input#mp_address1').click();
71
+ await expect(page.locator('div#marketing-preferences--default div.field-email > div > label[for="mp_email"] > span > span')).toContainText('Please enter your email address');
72
+
73
+ // email that has : should show error message
74
+ await page.locator('div#marketing-preferences--default input#mp_email').fill(''); // clear the email field
75
+ await page.locator('div#marketing-preferences--default input#mp_email').type('test:@£$%£test@comicrelief.com');
76
+ await page.locator('div#marketing-preferences--default input#mp_address1').click();
77
+ await expect(page.locator('div#marketing-preferences--default div.field-email > div > label[for="mp_email"] > span > span')).toContainText('Please enter a valid email address');
78
+
79
+ // email that has mix of special chars that's valid and not valid should show error message
80
+ await page.locator('div#marketing-preferences--default input#mp_email').fill(''); // clear the email field
81
+ await page.locator('div#marketing-preferences--default input#mp_email').type('Test0-9!#$%&\'*+/=?^_{|}~-@comicrelief_9-8.com.uk');
82
+ await page.locator('div#marketing-preferences--default input#mp_address1').click();
83
+ await expect(page.locator('div#marketing-preferences--default div.field-email > div > label[for="mp_email"] > span > span')).toBeHidden('');
84
+
85
+ // postal address fields validation
86
+ // validate address line 1 field
87
+ await page.locator('div#marketing-preferences--default input#mp_address1').type('Comic Relief');
88
+ await page.locator('div#marketing-preferences--default input#mp_address1').fill(''); // clear the email field
89
+ await page.locator('div#marketing-preferences--default input#mp_address2').click();
90
+ await expect(page.locator('div#marketing-preferences--default div.field-post > div > label[for="mp_address1"] > span > span')).toContainText('Please enter the first line of your address');
91
+
92
+ // address line 1 with special characters should show error message
93
+ await page.locator('div#marketing-preferences--default input#mp_address1').type('Comic @% Relief');
94
+ await page.locator('div#marketing-preferences--default input#mp_address2').click();
95
+ await expect(page.locator('div#marketing-preferences--default div.field-post > div > label[for="mp_address1"] > span > span')).toContainText('This field only accepts alphanumeric characters and , . ( ) / & \' - and must start with an alphanumeric character');
96
+
97
+ // address line 1 with valid input should not show error message
98
+ await page.locator('div#marketing-preferences--default input#mp_address1').fill('Comic Relief'); // clear the email field
99
+ await expect(page.locator('div#marketing-preferences--default div.field-post > div > label[for="mp_address1"] > span > span')).toBeHidden('');
100
+
101
+ // address line 2 optional field should not show error message when value is not entered
102
+ await page.locator('div#marketing-preferences--default input#mp_address2').type('Comic Relief');
103
+ await page.locator('div#marketing-preferences--default input#mp_address2').fill(''); // clear the email field
104
+ await expect(page.locator('div#marketing-preferences--default div.field-post > div > label[for="mp_address2"] > span > span')).toBeHidden('');
105
+
106
+ // address line 3 optional field should not show error message when value is not entered
107
+ await page.locator('div#marketing-preferences--default input#mp_address3').type('White Chapel');
108
+ await page.locator('div#marketing-preferences--default input#mp_address3').fill(''); // clear the email field
109
+ await expect(page.locator('div#marketing-preferences--default div.field-post > div > label[for="mp_address2"] > span > span')).toBeHidden('');
110
+
111
+ // town field should show error message when value is not entered
112
+ await page.locator('div#marketing-preferences--default input#mp_town').type('London');
113
+ await page.locator('div#marketing-preferences--default input#mp_town').fill(''); // clear the email field
114
+ await page.locator('div#marketing-preferences--default input#mp_address2').click();
115
+ await expect(page.locator('div#marketing-preferences--default div.field-post > div > label[for="mp_town"] > span > span')).toContainText('Please enter your town');
116
+
117
+ // town field with special characters should show error message
118
+ await page.locator('div#marketing-preferences--default input#mp_town').type('Lon@%don ');
119
+ await page.locator('div#marketing-preferences--default input#mp_address2').click();
120
+ await expect(page.locator('div#marketing-preferences--default div.field-post > div > label[for="mp_town"] > span > span')).toContainText('This field only accepts alphanumeric characters and , . ( ) / & \' - and must start with an alphanumeric character');
121
+
122
+ // town field with valid input should not show error message
123
+ await page.locator('div#marketing-preferences--default input#mp_town').fill('LONDON'); // clear the email field
124
+ await expect(page.locator('div#marketing-preferences--default div.field-post > div > label[for="mp_town"] > span > span')).toBeHidden('');
125
+
126
+ // postcode field should show error message when value is not entered
127
+ await page.locator('div#marketing-preferences--default input#mp_postcode').type('E1 8QS');
128
+ await page.locator('div#marketing-preferences--default input#mp_postcode').fill(''); // clear the email field
129
+ await page.locator('div#marketing-preferences--default input#mp_address2').click();
130
+ await expect(page.locator('div#marketing-preferences--default div.field-post > div > label[for="mp_postcode"] > span > span')).toContainText('Please enter your postcode');
131
+
132
+ // postcode field with a space should show error message
133
+ await page.locator('div#marketing-preferences--default input#mp_postcode').type('E 1 8QS');
134
+ await page.locator('div#marketing-preferences--default input#mp_address2').click();
135
+ await expect(page.locator('div#marketing-preferences--default div.field-post > div > label[for="mp_postcode"] > span > span')).toContainText('Please enter a valid postcode');
136
+
137
+ // postcode field with a space in second part should show error message
138
+ await page.locator('div#marketing-preferences--default input#mp_postcode').type('E1 8 QS');
139
+ await page.locator('div#marketing-preferences--default input#mp_address2').click();
140
+ await expect(page.locator('div#marketing-preferences--default div.field-post > div > label[for="mp_postcode"] > span > span')).toContainText('Please enter a valid postcode');
141
+
142
+ // postcode field with valid input should not show error message
143
+ await page.locator('div#marketing-preferences--default input#mp_postcode').fill('E1 8QS'); // clear the email field
144
+ await expect(page.locator('div#marketing-preferences--default div.field-post > div > label[for="mp_postcode"] > span > span')).toBeHidden('');
145
+
146
+ // country field should show error message when value is not entered
147
+ await page.locator('div#marketing-preferences--default input#mp_country').type('United Kingdom');
148
+ await page.locator('div#marketing-preferences--default input#mp_country').fill(''); // clear the email field
149
+ await page.locator('div#marketing-preferences--default input#mp_address2').click();
150
+ await expect(page.locator('div#marketing-preferences--default div.field-post > div > label[for="mp_country"] > span > span')).toContainText('Please enter your country');
151
+
152
+ // country field with special characters should show error message
153
+ await page.locator('div#marketing-preferences--default input#mp_country').type('United £$^3 Kingdom');
154
+ await page.locator('div#marketing-preferences--default input#mp_address2').click();
155
+ await expect(page.locator('div#marketing-preferences--default div.field-post > div > label[for="mp_country"] > span > span')).toContainText('This field only accepts alphanumeric characters and , . ( ) / & \' - and must start with an alphanumeric character');
156
+
157
+ // country field with valid input should not show error message
158
+ await page.locator('div#marketing-preferences--default input#mp_country').fill(''); // clear the email field
159
+ await page.locator('div#marketing-preferences--default input#mp_country').fill('United Kingdom'); // clear the email field
160
+ await expect(page.locator('div#marketing-preferences--default div.field-post > div > label[for="mp_country"] > span > span')).toBeHidden('');
161
+
162
+ // sms field should show error message when value is not entered
163
+ await page.locator('div#marketing-preferences--default input#mp_mobile').type('07123456789');
164
+ await page.locator('div#marketing-preferences--default input#mp_mobile').fill(''); // clear the email field
165
+ await page.locator('div#marketing-preferences--default input#mp_address2').click();
166
+ await expect(page.locator('div#marketing-preferences--default div.field-sms > div > label[for="mp_mobile"] > span > span')).toContainText('Please enter your mobile number');
167
+
168
+ // sms field with 10 digits should show error message
169
+ await page.locator('div#marketing-preferences--default input#mp_mobile').type('0712345678');
170
+ await page.locator('div#marketing-preferences--default input#mp_address2').click();
171
+ await expect(page.locator('div#marketing-preferences--default div.field-sms > div > label[for="mp_mobile"] > span > span')).toContainText('Please enter a valid UK mobile number');
172
+
173
+ // sms field with 12 digits should show error message
174
+ await page.locator('div#marketing-preferences--default input#mp_mobile').fill(''); // clear the email field
175
+ await page.locator('div#marketing-preferences--default input#mp_mobile').type('071234567890');
176
+ await page.locator('div#marketing-preferences--default input#mp_address2').click();
177
+ await expect(page.locator('div#marketing-preferences--default div.field-sms > div > label[for="mp_mobile"] > span > span')).toContainText('Please enter a valid UK mobile number');
178
+
179
+ // sms field starting with a space should show error message
180
+ await page.locator('div#marketing-preferences--default input#mp_mobile').fill(''); // clear the email field
181
+ await page.locator('div#marketing-preferences--default input#mp_mobile').type(' 07123456789');
182
+ await page.locator('div#marketing-preferences--default input#mp_address2').click();
183
+ await expect(page.locator('div#marketing-preferences--default div.field-sms > div > label[for="mp_mobile"] > span > span')).toContainText('Please enter a valid UK mobile number');
184
+
185
+ // sms field with valid input should not show error message
186
+ await page.locator('div#marketing-preferences--default input#mp_mobile').fill(''); // clear the email field
187
+ await page.locator('div#marketing-preferences--default input#mp_mobile').fill('07123456789');
188
+ await expect(page.locator('div#marketing-preferences--default div.field-sms > div > label[for="mp_mobile"] > span > span')).toBeHidden('');
189
+
190
+ // phone field should show error message when value is not entered
191
+ await page.locator('div#marketing-preferences--default input#mp_phone').type('02081234567');
192
+ await page.locator('div#marketing-preferences--default input#mp_phone').fill(''); // clear the email field
193
+ await page.locator('div#marketing-preferences--default input#mp_address2').click();
194
+ await expect(page.locator('div#marketing-preferences--default div.field-phone > div > label > span > span')).toContainText('Please enter your phone number');
195
+
196
+ // phone field with 10 digits should show error message
197
+ await page.locator('div#marketing-preferences--default input#mp_phone').type('0208123456');
198
+ await page.locator('div#marketing-preferences--default input#mp_address2').click();
199
+ await expect(page.locator('div#marketing-preferences--default div.field-phone > div > label > span > span')).toContainText('Please enter a valid UK phone number');
200
+
201
+ // phone field with 12 digits should show error message
202
+ await page.locator('div#marketing-preferences--default input#mp_phone').fill(''); // clear the email field
203
+ await page.locator('div#marketing-preferences--default input#mp_phone').type('020812345678');
204
+ await page.locator('div#marketing-preferences--default input#mp_address2').click();
205
+ await expect(page.locator('div#marketing-preferences--default div.field-phone > div > label > span > span')).toContainText('Please enter a valid UK phone number');
206
+
207
+ // phone field starting with a space should show error message
208
+ await page.locator('div#marketing-preferences--default input#mp_phone').fill(''); // clear the email field
209
+ await page.locator('div#marketing-preferences--default input#mp_phone').type(' 02081234567');
210
+ await page.locator('div#marketing-preferences--default input#mp_address2').click();
211
+ await expect(page.locator('div#marketing-preferences--default div.field-phone > div > label > span > span')).toContainText('Please enter a valid UK phone number');
212
+
213
+ // phone field with valid input should not show error message
214
+ await page.locator('div#marketing-preferences--default input#mp_phone').fill(''); // clear the email field
215
+ await page.locator('div#marketing-preferences--default input#mp_phone').fill('02081234567');
216
+ await expect(page.locator('div#marketing-preferences--default div.field-phone > div > label > span > span')).toBeHidden('');
217
+
218
+ await page.close();
219
+ });
220
+ });
@@ -0,0 +1,47 @@
1
+ const { test, expect } = require('@playwright/test');
2
+
3
+ test.describe('membership component', () => {
4
+ test('membership', async ({ page }) => {
5
+
6
+ await page.goto('/#membership');
7
+
8
+ await expect(page.locator('[data-testid="Membership-example-1"]')).toBeVisible();
9
+
10
+ // moneybuy 1
11
+ await expect(page.locator('[data-testid="Membership-example-1"] [aria-label="£5"]')).toBeVisible();
12
+ await page.locator('[data-testid="Membership-example-1"] [aria-label="£5"]').click();
13
+ await expect(page.locator('[data-testid="Membership-example-1"] form > fieldset > p')).toContainText('a regular supply of toiletries for someone living in a refugee camp in Serbia.');
14
+
15
+ // moneybuy 2
16
+ await expect(page.locator('[data-testid="Membership-example-1"] [aria-label="£10"]')).toBeVisible();
17
+ await page.locator('[data-testid="Membership-example-1"] [aria-label="£10"]').click();
18
+ await expect(page.locator('[data-testid="Membership-example-1"] form > fieldset > p')).toContainText('a potentially lifesaving call for a man at risk of suicide in the UK.');
19
+
20
+ // moneybuy 3
21
+ await expect(page.locator('[data-testid="Membership-example-1"] [aria-label="£20"]')).toBeVisible();
22
+ await page.locator('[data-testid="Membership-example-1"] [aria-label="£20"]').click();
23
+ await expect(page.locator('[data-testid="Membership-example-1"] form > fieldset > p')).toContainText('the distribution of enough surplus food for a school breakfast club to feed 80 children.');
24
+
25
+ // amount field validation
26
+ await page.locator('[data-testid="Membership-example-1"] input#mship-1--MoneyBuy-userInput').fill('');
27
+
28
+ // enter amount 0 should show error message
29
+ await page.locator('[data-testid="Membership-example-1"] input#mship-1--MoneyBuy-userInput').type('0');
30
+ await expect(page.locator('[data-testid="Membership-example-1"] form > fieldset > p')).toContainText('Please enter a number between 1 and 25000, and up to 2 decimal places');
31
+
32
+ // enter amount 25001 should show error message
33
+ await page.locator('[data-testid="Membership-example-1"] input#mship-1--MoneyBuy-userInput').fill('');
34
+ await page.locator('[data-testid="Membership-example-1"] input#mship-1--MoneyBuy-userInput').type('25001');
35
+ await expect(page.locator('[data-testid="Membership-example-1"] form > fieldset > p')).toContainText('Please enter a number between 1 and 25000, and up to 2 decimal places');
36
+
37
+ // enter own amount in decimals should not show error message
38
+ await page.locator('[data-testid="Membership-example-1"] input#mship-1--MoneyBuy-userInput').fill('');
39
+ await page.locator('[data-testid="Membership-example-1"] input#mship-1--MoneyBuy-userInput').type('12.99');
40
+ await expect(page.locator('[data-testid="Membership-example-1"] form > fieldset > p')).toContainText('Your donation will help us fund amazing projects in the UK and around the world.');
41
+
42
+ // clicking the submit button should take to donate.comicrelief.com/form/giftaid
43
+ await page.locator('[data-testid="Membership-example-1"] form > fieldset > input[type="submit"]').click();
44
+
45
+ await page.close();
46
+ });
47
+ });
@@ -0,0 +1,49 @@
1
+ // @ts-check
2
+ const { defineConfig, devices } = require('@playwright/test');
3
+
4
+ /**
5
+ * Read environment variables from file.
6
+ * https://github.com/motdotla/dotenv
7
+ */
8
+ require('dotenv').config();
9
+
10
+ /**
11
+ * @see https://playwright.dev/docs/test-configuration
12
+ */
13
+ module.exports = defineConfig({
14
+ testDir: './playwright',
15
+ /* Fail the build on CI if you accidentally left test
16
+ .only in the source code. */
17
+ forbidOnly: !!process.env.CI,
18
+ retries: 2,
19
+ workers: 2,
20
+ timeout: 60 * 1000,
21
+ expect: {
22
+ timeout: 60 * 1000,
23
+ },
24
+ reporter: [
25
+ ['list'],
26
+ ['html', { open: 'never' }]
27
+ ],
28
+ use: {
29
+ actionTimeout: 0,
30
+ /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
31
+ trace: 'on-first-retry',
32
+ },
33
+
34
+ /* Configure projects for major browsers */
35
+ projects: [
36
+ {
37
+ name: 'chromium',
38
+ use: { ...devices['Desktop Chrome'] },
39
+ },
40
+ ],
41
+
42
+ /* Run your local dev server before starting the tests */
43
+ webServer: {
44
+ command: 'yarn styleguide',
45
+ port: '6060',
46
+ timeout: 120000,
47
+ reuseExistingServer: true,
48
+ },
49
+ });
@@ -1,5 +1,5 @@
1
1
  import facebook from '../assets/facebook.svg';
2
- import twitter from '../assets/x-logo.svg';
2
+ import twitter from '../assets/X-white-Subtract.svg';
3
3
  import youtube from '../assets/youtube.svg';
4
4
  import instagram from '../assets/instagram.svg';
5
5
 
@@ -0,0 +1,3 @@
1
+ <svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M24 48C37.2548 48 48 37.2548 48 24C48 10.7452 37.2548 0 24 0C10.7452 0 0 10.7452 0 24C0 37.2548 10.7452 48 24 48ZM37.0874 9.18501L26.6638 21.3016H26.6632L38 37.8003H29.6623L22.0281 26.6901L12.4702 37.8003H10L20.9315 25.0942L10 9.18501H18.3377L25.5665 19.7057L34.6174 9.18501H37.0874ZM22.1729 23.6501L23.2805 25.2343V25.2349L30.8244 36.0253H34.6185L25.3739 22.8019L24.2663 21.2177L17.1544 11.0446H13.3603L22.1729 23.6501Z" fill="white"/>
3
+ </svg>