itemengine-cypress-automation 1.0.11 → 1.0.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. package/cypress/e2e/ILC/ShortTextResponse/shortTextResponseEditTabBasicSections.js +2 -2
  2. package/cypress/e2e/ILC/ShortTextResponse/shortTextResponseManuallyScoredNonScoredScoringSection.js +1 -0
  3. package/cypress/pages/audioPlayerPage.js +2 -2
  4. package/cypress/pages/audioResponsePage.js +3 -3
  5. package/cypress/pages/components/additionalSettingsPanel.js +1 -1
  6. package/cypress/pages/components/autoScoredPreviewBase.js +1 -1
  7. package/cypress/pages/components/autoScoredSetCorrectAnswerSection.js +7 -1
  8. package/cypress/pages/components/browseItemsPage.js +53 -0
  9. package/cypress/pages/components/createQuestionBasePage.js +32 -2
  10. package/cypress/pages/components/customizeHighlightPropertiesComponent.js +1 -1
  11. package/cypress/pages/components/dragAndDropResponseOptions.js +3 -2
  12. package/cypress/pages/components/draggableOptionsContainer.js +1 -0
  13. package/cypress/pages/components/figOverImageCommonComponent.js +198 -10
  14. package/cypress/pages/components/fillInTheGapsCommonComponents.js +4 -4
  15. package/cypress/pages/components/fillInTheGapsDropdownCommonComponent.js +54 -1
  16. package/cypress/pages/components/fillInTheGapsTextCommonComponent.js +3 -3
  17. package/cypress/pages/components/gridCommonComponents.js +3 -2
  18. package/cypress/pages/components/index.js +2 -1
  19. package/cypress/pages/components/listSortingAndOrderingBase.js +1 -1
  20. package/cypress/pages/components/questionInstructionsComponent.js +7 -3
  21. package/cypress/pages/components/uploadImageSectionComponent.js +2 -0
  22. package/cypress/pages/createItemPage.js +35 -2
  23. package/cypress/pages/dialogBoxBase.js +2 -2
  24. package/cypress/pages/dragAndDropIntoCategoriesAllOrNothingScoring.js +4 -4
  25. package/cypress/pages/dragAndDropIntoCategoriesCellsScoring.js +2 -0
  26. package/cypress/pages/dragAndDropIntoCategoriesPage.js +7 -10
  27. package/cypress/pages/essayResponseBasicPage.js +2 -2
  28. package/cypress/pages/essayResponseMathPage.js +3 -2
  29. package/cypress/pages/essayResponsePage.js +1 -1
  30. package/cypress/pages/fillInTheGapsOverImageDropdownPage.js +74 -7
  31. package/cypress/pages/fillInTheGapsTextPage.js +1 -1
  32. package/cypress/pages/highlightImagePage.js +12 -10
  33. package/cypress/pages/highlightPage.js +29 -5
  34. package/cypress/pages/listMatchingPage.js +205 -17
  35. package/cypress/pages/listMatchingScoring.js +0 -1
  36. package/cypress/pages/passagePage.js +3 -3
  37. package/cypress/pages/readingRulerPage.js +1 -1
  38. package/cypress/pages/shortTextResponsePage.js +1 -1
  39. package/cypress/pages/videoResponsePage.js +7 -7
  40. package/cypress/support/commands.js +4 -4
  41. package/cypress/support/e2e.js +0 -1
  42. package/cypress/support/helpers/accessibility.js +2 -2
  43. package/cypress.config.js +0 -2
  44. package/package.json +2 -3
  45. package/scripts/sorry-cypress.mjs +2 -1
@@ -28,8 +28,8 @@ describe('Create item page - Short text response: Question insructions, Set corr
28
28
  .find('svg')
29
29
  .should('have.css', 'fill', css.color.uncheckedCheckbox);
30
30
  shortTextResponsePage.ignoreSpacesBeforeAndAfterCheckbox()
31
- .parent()
32
- .find('svg')
31
+ .parent('.icon-checkbox-selected')
32
+ .find('.checkbox-icon-border-rect')
33
33
  .should('have.css', 'fill', css.color.activeButtons);
34
34
  uncheckedRadioButtons.forEach((uncheckedRadioButton) => {
35
35
  uncheckedRadioButton()
@@ -41,6 +41,7 @@ describe('Create Item page - Short text response: Scoring Section - Manually sco
41
41
  shortTextResponsePage.steps.switchToPreviewTab();
42
42
  });
43
43
 
44
+ //Failing due to https://redmine.zeuslearning.com/issues/548654
44
45
  shortTextResponsePage.tests.verifyShowCorrectAnswerLabelAndCheckboxExistAndPreviewScoreNotExistInPreviewTab();
45
46
 
46
47
  it('On selecting Show correct answer checkbox, no green checkmark or red crossmark icon should be displayed besides response field and no label should be displayed below the field', () => {
@@ -31,8 +31,8 @@ const selectors = {
31
31
  descriptionInputField: () => cy.get('[role="textbox"][title="Description"]'),
32
32
  transcriptLabel: () => cy.get('.additional-settings-label').eq(1),
33
33
  transcriptInputField: () => cy.get('[role="textbox"][title="Transcript"]'),
34
- customizeUIControlAccordion: () => cy.get('.ngie-accordion').eq(0),
35
- advancedPlayerSettingsAccordion: () => cy.get('.ngie-accordion').eq(1),
34
+ customizeUIControlAccordion: () => cy.get('.ngie-accordion-summary[role="button"]').eq(0),
35
+ advancedPlayerSettingsAccordion: () => cy.get('.ngie-accordion-summary[role="button"]').eq(1),
36
36
  customizeControlPlayButton: () => cy.get('[data-ngie-testid="play-toggle-button"]'),
37
37
  customizeControlButtonLabel: () => cy.get('.audio-response-selection-panel-details').eq(0).find('.customized_button_label'),
38
38
  customizeControlPauseButton: () => cy.get('[data-ngie-testid="pause-toggle-button"]'),
@@ -18,20 +18,20 @@ const selectors = {
18
18
  stopRecordingIfSilenceIsDetectedInputField: () => cy.get('.stop-recording-on-silence-time-input-field input'),
19
19
  recorderAndPlaybackControlsOptionButtonIcon: () => cy.get('.ngie-toggle-button-icon'),
20
20
  //Customize recorder and playback controls (for student player)
21
- customizeRecorderAndPlaybackControlsAccordionChevronIcon: () => cy.get('.customize-expand-icon'),
21
+ customizeRecorderAndPlaybackControlsAccordionChevronIcon: () => cy.get('.customize-accordion [class*="expandIconWrapper"]'),
22
22
  customizeRecorderAndPlaybackControlsAccordionLabel: () => cy.get('.customize_recorder_label'),
23
23
  customizeRecorderAndPlaybackControlsAccordion: () => cy.get('.customize-accordion [role="button"]'),
24
24
  customizeRecorderAndPlaybackControlsSection: () => cy.get('.customize-accordion'),
25
25
  recorderAndPlaybackControlsOptionButtonLabel: () => cy.get('.ngie-toggle-button-label'),
26
26
  //Controls for recording response
27
- controlsForRecordingResponseLabel: () => cy.get('.audio-response-selection-panel-details .ngie-toggle-button-title').eq(0),
27
+ controlsForRecordingResponseLabel: () => cy.get('.customize-accordion .ngie-toggle-button-title').eq(0),
28
28
  startRecordingOptionButton: () => cy.get('[data-ngie-testid="start-recording-toggle-button"]'),
29
29
  pauseRecordingOptionButton: () => cy.get('[data-ngie-testid="pause-recording-toggle-button"]'),
30
30
  stopRecordingOptionButton: () => cy.get('[data-ngie-testid="stop-recording-toggle-button"]'),
31
31
  recordingCueOptionButton: () => cy.get('[data-ngie-testid="recording-cue-toggle-button"]'),
32
32
  recordingOverlayOptionButton: () => cy.get('[value="recorderOverlay"]'),
33
33
  //Controls for response playback
34
- controlsForResponsePlaybackLabel: () => cy.get('.audio-response-selection-panel-details .ngie-toggle-button-title').eq(1),
34
+ controlsForResponsePlaybackLabel: () => cy.get('.customize-accordion .ngie-toggle-button-title').eq(1),
35
35
  playOptionButton: () => cy.get('[data-ngie-testid="play-toggle-button"]'),
36
36
  pauseOptionButton: () => cy.get('[data-ngie-testid="pause-toggle-button"]'),
37
37
  seekOptionButton: () => cy.get('[data-ngie-testid="seek-toggle-button"]'),
@@ -130,7 +130,7 @@ const tests = {
130
130
 
131
131
  it('Clicking on Font Size dropdown should open a list of 6 options - Default, Small, Normal, Large, Extra large, Huge', () => {
132
132
  additionalSettingsPanel.fontSizeDropdown()
133
- .click();
133
+ .realClick();
134
134
  additionalSettingsPanel.fontSizeListOptions(0)
135
135
  .should('be.visible');
136
136
  fontsizes.forEach((index, count) => {
@@ -6,7 +6,7 @@ const selectors = {
6
6
  incorrectIcon: () => cy.get('.icon-incorrect'),
7
7
  correctIncorectAnswerLabel: () => cy.get('.answer-label-text'),
8
8
  checkAnswerButton: () => cy.get('.check-answer-and-status-wrapper button'),
9
- correctIncorrectAnswerBorder: () => cy.get('.edit-question-preview-wrapper [class*="correct-answer-border"]')
9
+ correctIncorrectAnswerBorder: () => cy.get('[class*="question-preview-wrapper"] [class*="correct-answer-border"]')
10
10
  }
11
11
 
12
12
  const steps = {
@@ -7,7 +7,13 @@ const selectors = {
7
7
  setCorrectAnswerLabel: () => cy.get('.set-correct-answer-label'),
8
8
  setCorrectAnswerHelpText: () => cy.get('.edit-set-correct-answer-help-text'),
9
9
  alternateAnswerButton: () => cy.get('.edit-question-auto-scored-set-correct-answer-wrapper .ngie-button'),
10
- alternateAnswerTab: (tabIndex) => cy.get('[data-ngie-testid*="alternate-"][data-ngie-testid*="tab"]').eq(tabIndex - 1),
10
+ alternateAnswerTab: (tabIndex = null) => {
11
+ if (tabIndex) {
12
+ return cy.get('[data-ngie-testid*="alternate-"][data-ngie-testid*="tab"]').eq(tabIndex - 1)
13
+ } else {
14
+ return cy.get('[data-ngie-testid*="alternate-"][data-ngie-testid*="tab"]')
15
+ }
16
+ },
11
17
  deleteAlternateTabButton: () => cy.get('.ngie-tablist-tab-button .styled-close-button'),
12
18
  correctTab: () => cy.get('[data-ngie-testid="correct-tab"]'),
13
19
  setCorrectAnswerErrorIcon: () => cy.get('[aria-label="Error In"]'),
@@ -0,0 +1,53 @@
1
+ const selectors = {
2
+ browseItemPageWrapper: () => cy.get('.browse-item-page'),
3
+ itemLabel: () => cy.get('#reference-header'),
4
+ lastUpdatedLabel: () => cy.get('#updated-header'),
5
+ searchInputField: () => cy.get('.ngie-search input'),
6
+ sortArrow: () => cy.get('.table-header-sort-arrow'),
7
+ browseItemsLabel: () => cy.get('.browse-title-wrapper')
8
+ }
9
+
10
+ const steps = {
11
+ navigateToBrowseItemsPage: () => {
12
+ cy.visit('/item-engine/demo/browse-items');
13
+ },
14
+
15
+ verifyBrowseItemContainerIsVisible: () => {
16
+ browseItemsPage.browseItemPageWrapper()
17
+ .should('be.visible');
18
+ },
19
+
20
+ sortUsingItemColumn: () => {
21
+ browseItemsPage.itemLabel()
22
+ .click();
23
+ browseItemsPage.itemLabel()
24
+ .within(() => {
25
+ browseItemsPage.sortArrow()
26
+ .should('be.visible');
27
+ })
28
+ },
29
+
30
+ sortUsingLastUpdatedColumn: () => {
31
+ browseItemsPage.lastUpdatedLabel()
32
+ .click();
33
+ browseItemsPage.lastUpdatedLabel()
34
+ .within(() => {
35
+ browseItemsPage.sortArrow()
36
+ .should('be.visible');
37
+ })
38
+ },
39
+
40
+ /**
41
+ * @param {string} value of the text that needs to be searched
42
+ * @description enters value in input field and searched for the entered value
43
+ */
44
+ search: (value) => {
45
+ browseItemsPage.searchInputField()
46
+ .type(`${value}{enter}`);
47
+ }
48
+ }
49
+
50
+ export const browseItemsPage = {
51
+ ...selectors,
52
+ steps
53
+ }
@@ -53,6 +53,36 @@ const steps = {
53
53
  cy.log('Switching to edit tab and back to preview tab to reset the question preview')
54
54
  createQuestionBasePage.steps.switchToEditTab();
55
55
  createQuestionBasePage.steps.switchToPreviewTab();
56
+ },
57
+
58
+ verifySaveButtonIsEnabled: () => {
59
+ createQuestionBasePage.saveQuestionButton()
60
+ .should('be.enabled');
61
+ },
62
+
63
+ verifySaveButtonIsDisabled: () => {
64
+ createQuestionBasePage.saveQuestionButton()
65
+ .should('be.disabled');
66
+ },
67
+
68
+ verifyPreviewTabSelectedState: () => {
69
+ createQuestionBasePage.previewTab()
70
+ .should('have.attr', 'aria-selected', 'true');
71
+ },
72
+
73
+ clickOnSaveQuestionButton: () => {
74
+ createQuestionBasePage.saveQuestionButton()
75
+ .click();
76
+ },
77
+
78
+ verifyEditTabSelectedState: () => {
79
+ createQuestionBasePage.editTab()
80
+ .should('have.attr', 'aria-selected', 'true');
81
+ },
82
+
83
+ verifyPreviewTabNotSelectedState: () => {
84
+ createQuestionBasePage.previewTab()
85
+ .should('have.attr', 'aria-selected', 'false');
56
86
  }
57
87
  }
58
88
 
@@ -84,7 +114,7 @@ const tests = {
84
114
  });
85
115
 
86
116
  it('\'Save\' button should be displayed', () => {
87
- if (questionType === 'Passage' || questionType === 'Reading ruler' || questionType === 'Audio Player') {
117
+ if (questionType === 'Passage' || questionType === 'Reading ruler') {
88
118
  createQuestionBasePage.saveQuestionButton()
89
119
  .verifyInnerText('Save');
90
120
  }
@@ -111,7 +141,7 @@ const tests = {
111
141
  .should('be.visible')
112
142
  .type('Edited')
113
143
  .should('have.text', 'Edited');
114
- if (questionType !== 'feedback scale') {
144
+ if (questionType !== 'feedback scale' && questionType !== 'highlight image') {
115
145
  scoringSectionBase.steps.allotPoints(20);
116
146
  };
117
147
  createQuestionBasePage.cancelButton()
@@ -111,7 +111,7 @@ const steps = {
111
111
  * @description this function verfies the background color of hover border color block
112
112
  */
113
113
  verifyHoverBorderColorBlockColor: (color) => {
114
- customizeHighlightPropertiesComponent.hoverFillColorBlock()
114
+ customizeHighlightPropertiesComponent.hoverBorderColorBlock()
115
115
  .should('have.css', 'background-color', color);
116
116
  },
117
117
 
@@ -331,6 +331,7 @@ const tests = {
331
331
  .should('not.exist');
332
332
  });
333
333
 
334
+ //Failing due to https://redmine.zeuslearning.com/issues/548907
334
335
  it('CSS of disabled delete button tooltip', { tags: 'css' }, () => {
335
336
  optionsWrapperComponent.deleteOptionButton()
336
337
  .eq(0)
@@ -379,7 +380,7 @@ const tests = {
379
380
  dragAndDropResponseOptions.optionsInputField()
380
381
  .verifyCSS(css.color.text, css.fontSize.default, css.fontWeight.regular);
381
382
  optionsWrapperComponent.addOptionButton()
382
- .verifyCSS(css.color.secondaryBtnActive, css.fontSize.normal, css.fontWeight.medium);
383
+ .verifyCSS(css.color.secondaryBtnActive, css.fontSize.default, css.fontWeight.medium);
383
384
  });
384
385
 
385
386
  it('Accessibility of Options section', { tags: 'a11y' }, () => {
@@ -425,7 +426,7 @@ const tests = {
425
426
  })
426
427
 
427
428
  it('Accessibility of enabled \'Delete\' option button', { tags: 'a11y' }, () => {
428
- cy.checkAccessibility(optionsWrapperComponent.deleteOptionButton().parents('.cloze-with-drag-and-drop-delete'))
429
+ cy.checkAccessibility(optionsWrapperComponent.deleteOptionButton())
429
430
  });
430
431
 
431
432
  it('when the user hovers over the enabled \'Delete\' icon buttons, then \'Delete option\' message should be displayed on a tooltip and the tooltip should disappear if focus is removed from the \'Delete\' icon button', () => {
@@ -663,6 +663,7 @@ const tests = {
663
663
  draggableOptionsContainer.steps.verifyGroupedResponseContainerContentsInSetCorrectAnswerSection(0, optionsForResponses);
664
664
  });
665
665
 
666
+ //Failing due to https://redmine.zeuslearning.com/issues/547859
666
667
  it('CSS of \'Grouped\' container in the \'Set Correct Answer\' section', { tags: 'css' }, () => {
667
668
  draggableOptionsContainer.setCorrectAnswerSectionGroupedResponseContainer()
668
669
  .should('have.css', 'border', `1px solid ${css.color.defaultDropdownBorder}`);
@@ -2,8 +2,11 @@ import utilities from "../../support/helpers/utilities";
2
2
  import { commonComponents } from "./commonComponents";
3
3
  import { createQuestionBasePage } from "./createQuestionBasePage";
4
4
  import { scoringSectionBase } from "./scoringSectionBase";
5
+ import { uploadImageSectionComponent } from "./uploadImageSectionComponent";
5
6
  const css = Cypress.env('css');
6
7
 
8
+ const pointerDropdownList = ['Left', 'Right', 'Top', 'Bottom', 'Top left', 'Top right', 'None'];
9
+
7
10
  const selectors = {
8
11
  addResponseContainerButton: () => cy.get('[class*="ResponseOnImagestyles"] .ngie-icon-with-label-btn').eq(0),
9
12
  //Change selectors after https://redmine.zeuslearning.com/issues/518498 is fixed
@@ -32,6 +35,8 @@ const selectors = {
32
35
  imagePreviewTab: () => cy.get('.edit-question-preview-wrapper .image-container img'),
33
36
  imagePropertiesContainer: () => cy.get('[class*="AddTextResponseOnImagestyles__DimensionsContainer"]'),
34
37
  responseNumeration: () => cy.get('.response-input-adornment'),
38
+ uploadImageSectionWrapper: () => cy.get('[class*="ImagePopupWrapper"]'),
39
+ imageSectionContentsWrapper: () => cy.get('[class*="ImageDisplayWrapper"]'),
35
40
  // Additional setting accordion
36
41
  advanceSettingsforAllResponseAreasLabel: () => cy.get('.additional-settings-heading-label').eq(0),
37
42
  placeholderTextLabel: () => cy.get('.additional-settings-container .text-label'),
@@ -44,9 +49,9 @@ const selectors = {
44
49
  pointerDropdown: () => cy.get('[id*="Pointer"][id*="select"]'),
45
50
  pointerDropdownListOptions: (ariaLabel = null) => {
46
51
  if (ariaLabel) {
47
- return cy.get(`[aria-labelledby*="Pointer-dropdown-label"] li[role="option"][aria-label*="${ariaLabel}"]`)
52
+ return cy.get(`[aria-labelledby*="Pointer"] li[role="option"][aria-label*="${ariaLabel}"]`).eq(0)
48
53
  } else {
49
- return cy.get('[aria-labelledby*="Pointer-dropdown-label"] li[role="option"]')
54
+ return cy.get('[aria-labelledby*="Pointer"] li[role="option"]')
50
55
  }
51
56
  },
52
57
  fixPositionOnImageLabel: () => cy.get('[data-ngie-testid="fix-position-on-image-checkbox"] .MuiFormControlLabel-label'),
@@ -384,26 +389,26 @@ const steps = {
384
389
 
385
390
  /**
386
391
  * Set the width of a response field in the additional settings for all response areas.
387
- * @param {string} width - The width value to set for the response field.
392
+ * @param {number} width - The width value to set for the response field.
388
393
  */
389
394
  setResponseFieldWidthGlobal: (width) => {
390
395
  figOverImageCommonComponent.responseFieldWidthInputField()
391
396
  .eq(0)
392
397
  .clear()
393
- .type(width, { delay: 0 })
398
+ .type(`${width}`, { delay: 0 })
394
399
  .should('have.value', width)
395
400
  .blur();
396
401
  },
397
402
 
398
403
  /**
399
404
  * Set the height of a response field in the additional settings for all response areas.
400
- * @param {string} height - The height value to set for the response field.
405
+ * @param {number} height - The height value to set for the response field.
401
406
  */
402
407
  setResponseFieldHeightGlobal: (height) => {
403
408
  figOverImageCommonComponent.responseFieldHeightInputField()
404
409
  .eq(0)
405
410
  .clear()
406
- .type(height, { delay: 0 })
411
+ .type(`${height}`, { delay: 0 })
407
412
  .should('have.value', height)
408
413
  .blur();
409
414
  },
@@ -520,7 +525,7 @@ const steps = {
520
525
  /**
521
526
  * Set the width value in a response accordion.
522
527
  * @param {number} responseAccordionIndex - The index of the response accordion to set width value in.
523
- * @param {string} value - The width value to set.
528
+ * @param {number} value - The width value to set.
524
529
  */
525
530
  setWidthInResponseAccordion: (responseAccordionIndex, value) => {
526
531
  figOverImageCommonComponent.responseAccordionWrapper()
@@ -528,7 +533,7 @@ const steps = {
528
533
  .within(() => {
529
534
  figOverImageCommonComponent.responseFieldWidthInputField()
530
535
  .clear()
531
- .type(value)
536
+ .type(`${value}`)
532
537
  .should('have.value', value);
533
538
  });
534
539
  },
@@ -536,7 +541,7 @@ const steps = {
536
541
  /**
537
542
  * Set the height value in a response accordion.
538
543
  * @param {number} responseAccordionIndex - The index of the response accordion to set height value in.
539
- * @param {string} value - The height value to set.
544
+ * @param {number} value - The height value to set.
540
545
  */
541
546
  setHeightInResponseAccordion: (responseAccordionIndex, value) => {
542
547
  figOverImageCommonComponent.responseAccordionWrapper()
@@ -544,7 +549,7 @@ const steps = {
544
549
  .within(() => {
545
550
  figOverImageCommonComponent.responseFieldHeightInputField()
546
551
  .clear()
547
- .type(value)
552
+ .type(`${value}`)
548
553
  .should('have.value', value);
549
554
  });
550
555
  },
@@ -655,6 +660,70 @@ const steps = {
655
660
  });
656
661
  },
657
662
 
663
+ /**
664
+ * @param {number} dropdownOptionIndex of the pointer dropdown option
665
+ * @param {number} responseIndex index of the reponse container
666
+ * @description this function verifies the pointer position of response accordion
667
+ */
668
+ verifyResponseContainerPointerInImageSection: (responseIndex, dropdownOptionIndex) => {
669
+ figOverImageCommonComponent.responseContainerCloseButton()
670
+ .eq(responseIndex)
671
+ .should('have.attr', 'pointer', dropdownOptionIndex + 1)
672
+ },
673
+
674
+ /**
675
+ * @param {number} responseAccordionIndex index of the response accordion
676
+ * @param {string} dropdownOption aria-label of the dropdown option
677
+ * @description this function selects the dropdown option from response accordion
678
+ */
679
+ selectOptionFromPointerDropdownResponseAccordion: (responseAccordionIndex, dropdownOption) => {
680
+ figOverImageCommonComponent.responseAccordionWrapper()
681
+ .eq(responseAccordionIndex)
682
+ .within(() => {
683
+ figOverImageCommonComponent.pointerDropdown()
684
+ .click();
685
+ figOverImageCommonComponent.pointerDropdownListOptions(dropdownOption)
686
+ .click();
687
+ figOverImageCommonComponent.pointerDropdown()
688
+ .should('have.text', dropdownOption);
689
+ });
690
+ },
691
+
692
+ /**
693
+ * @param {string} dropdownOption aria-label of the dropdown option
694
+ * @description this function selects the dropdown option from response accordion
695
+ */
696
+ selectOptionFromPointerDropdownGlobal: (dropdownOption) => {
697
+ figOverImageCommonComponent.pointerDropdown()
698
+ .eq(0)
699
+ .click();
700
+ figOverImageCommonComponent.pointerDropdownListOptions(dropdownOption)
701
+ .click();
702
+ figOverImageCommonComponent.pointerDropdown()
703
+ .eq(0)
704
+ .should('have.text', dropdownOption);
705
+ },
706
+
707
+ expandPointerDropdownGlobal: () => {
708
+ figOverImageCommonComponent.pointerDropdown()
709
+ .eq(0)
710
+ .click();
711
+ utilities.verifyElementVisibilityState(figOverImageCommonComponent.pointerDropdownListOptions(), 'visible');
712
+ },
713
+
714
+ /**
715
+ * @param {number} responseAccordionIndex index of the response accordion
716
+ * @description this function expands the pointer dropdown in response accordion
717
+ */
718
+ expandPointerDropdownResponseAccordion: (responseAccordionIndex) => {
719
+ figOverImageCommonComponent.responseAccordionWrapper()
720
+ .eq(responseAccordionIndex)
721
+ .within(() => {
722
+ figOverImageCommonComponent.pointerDropdown()
723
+ .click();
724
+ utilities.verifyElementVisibilityState(figOverImageCommonComponent.pointerDropdownListOptions(), 'visible');
725
+ });
726
+ },
658
727
 
659
728
  verifyDisplayAnswerNumerationToStudentsCheckboxNotChecked: () => {
660
729
  figOverImageCommonComponent.displayAnswerNumerationToStudentsCheckbox()
@@ -665,6 +734,40 @@ const steps = {
665
734
  figOverImageCommonComponent.displayAnswerNumerationToStudentsCheckbox()
666
735
  .click()
667
736
  .should('be.checked');
737
+ },
738
+
739
+ verifyImageSectionErrorMessage: () => {
740
+ figOverImageCommonComponent.uploadImageSectionWrapper()
741
+ .within(() => {
742
+ commonComponents.errorMessage()
743
+ .should('have.text', 'Error: image is required.')
744
+ .and('be.visible');
745
+ });
746
+ },
747
+
748
+ verifyImageSectionErrorMessageNotExists: () => {
749
+ figOverImageCommonComponent.uploadImageSectionWrapper()
750
+ .within(() => {
751
+ commonComponents.errorMessage()
752
+ .should('not.exist');
753
+ });
754
+ },
755
+
756
+ verifyMinimumOneResponseContainerIsRequiredErrorMessage: () => {
757
+ figOverImageCommonComponent.imageSectionContentsWrapper()
758
+ .within(() => {
759
+ commonComponents.errorMessage()
760
+ .should('have.text', 'Error: Minimum one response container is required.')
761
+ .and('be.visible');
762
+ });
763
+ },
764
+
765
+ verifyMinimumOneResponseContainerIsRequiredErrorMessageNotExists: () => {
766
+ figOverImageCommonComponent.imageSectionContentsWrapper()
767
+ .within(() => {
768
+ commonComponents.errorMessage()
769
+ .should('not.exist');
770
+ });
668
771
  }
669
772
  }
670
773
 
@@ -914,6 +1017,91 @@ const tests = {
914
1017
  createQuestionBasePage.steps.switchToPreviewTab();
915
1018
  figOverImageCommonComponent.steps.verifyImageWidthInPreviewTab(250);
916
1019
  });
1020
+ },
1021
+
1022
+ verifyPointerDropdownContentsResponseAccordion: () => {
1023
+ it('Response accordion \'Pointer\' label and dropdown should be displayed and by default \'Left\' option should be selected', () => {
1024
+ figOverImageCommonComponent.responseAccordionWrapper()
1025
+ .eq(0)
1026
+ .within(() => {
1027
+ utilities.verifyInnerText(figOverImageCommonComponent.pointerLabel(), 'Pointer');
1028
+ utilities.verifyElementVisibilityState(figOverImageCommonComponent.pointerLabel(), 'visible');
1029
+ utilities.verifyInnerText(figOverImageCommonComponent.pointerDropdown(), 'Left');
1030
+ utilities.verifyElementVisibilityState(figOverImageCommonComponent.pointerDropdown(), 'visible');
1031
+ })
1032
+ });
1033
+
1034
+ it(`Clicking on Pointer dropdown should open a list of 6 options - ${pointerDropdownList}`, () => {
1035
+ figOverImageCommonComponent.steps.expandPointerDropdownResponseAccordion(0);
1036
+ pointerDropdownList.forEach((option) => {
1037
+ figOverImageCommonComponent.pointerDropdownListOptions(option)
1038
+ .verifyInnerText(option);
1039
+ utilities.verifyInnerText(figOverImageCommonComponent.pointerDropdownListOptions(option), `${option}`);
1040
+ });
1041
+ cy.get('body')
1042
+ .click();
1043
+ });
1044
+ },
1045
+
1046
+ verifyPointerDropdownContentsGlobal: () => {
1047
+ it('\'Pointer\' label and dropdown should be displayed and by default \'Left\' option should be selected', () => {
1048
+ utilities.verifyInnerText(figOverImageCommonComponent.pointerLabel(), 'Pointer');
1049
+ utilities.verifyElementVisibilityState(figOverImageCommonComponent.pointerLabel(), 'visible');
1050
+ utilities.verifyInnerText(figOverImageCommonComponent.pointerDropdown(), 'Left');
1051
+ utilities.verifyElementVisibilityState(figOverImageCommonComponent.pointerDropdown(), 'visible');
1052
+ });
1053
+
1054
+ it('CSS of \'Pointer\' dropdown', { tags: 'css' }, () => {
1055
+ utilities.verifyCSS(figOverImageCommonComponent.pointerLabel(), {
1056
+ 'color': css.color.labels,
1057
+ 'font-size': css.fontSize.normal,
1058
+ 'font-weight': css.fontWeight.semibold
1059
+ });
1060
+ utilities.verifyCSS(figOverImageCommonComponent.pointerDropdown(), {
1061
+ 'color': css.color.liText,
1062
+ 'font-size': css.fontSize.default,
1063
+ 'font-weight': css.fontWeight.regular
1064
+ });
1065
+ });
1066
+
1067
+ // Note: a11y is covered for the entire additional settings section
1068
+
1069
+ it(`Clicking on Pointer dropdown should open a a list of 6 options - ${pointerDropdownList}`, () => {
1070
+ figOverImageCommonComponent.steps.expandPointerDropdownGlobal();
1071
+ pointerDropdownList.forEach((option) => {
1072
+ figOverImageCommonComponent.pointerDropdownListOptions(option)
1073
+ .verifyInnerText(option);
1074
+ utilities.verifyInnerText(figOverImageCommonComponent.pointerDropdownListOptions(option), `${option}`);
1075
+ });
1076
+ cy.get('body')
1077
+ .click();
1078
+ });
1079
+
1080
+ it('CSS of Pointer dropdown in Active state', { tags: 'css' }, () => {
1081
+ cy.log('Pre step: Clicking on Pointer dropdown')
1082
+ figOverImageCommonComponent.steps.expandPointerDropdownGlobal();
1083
+ utilities.verifyCSS(figOverImageCommonComponent.pointerDropdownListOptions('Left'), {
1084
+ 'color': css.color.liText,
1085
+ 'font-size': css.fontSize.default,
1086
+ 'font-weight': css.fontWeight.regular,
1087
+ 'background-color': css.color.liTextSelectedBg
1088
+ });
1089
+ utilities.verifyCSS(figOverImageCommonComponent.pointerDropdownListOptions('Right'), {
1090
+ 'background-color': css.color.transparent
1091
+ });
1092
+ cy.log('Post step: Closing the Pointer dropdown')
1093
+ cy.get('body')
1094
+ .click();
1095
+ });
1096
+
1097
+ it('Accessibility of Pointer dropdown in active state', { tags: 'a11y' }, () => {
1098
+ cy.log('Pre step: Clicking on Pointer dropdown')
1099
+ figOverImageCommonComponent.steps.expandPointerDropdownGlobal();
1100
+ cy.checkAccessibility(figOverImageCommonComponent.pointerDropdownListOptions());
1101
+ cy.log('Post step: Closing the Pointer dropdown')
1102
+ cy.get('body')
1103
+ .click();
1104
+ });
917
1105
  }
918
1106
  }
919
1107
 
@@ -39,7 +39,7 @@ const selectors = {
39
39
  previewTabResponseWrapper: () => cy.get('.cloze-with-text-answer-status-response-preview-wrapper'),
40
40
  previewTabCorrectAnswerContainer: () => cy.get('[class*="ClozeWithTextResponsestyles__CorrectAnswerWrapper"]'),
41
41
  previewTabCorrectAnswerLabel: () => cy.get('[class*="ClozeWithTextResponsestyles__CorrectAnswerLabel"]'),
42
- previewTabCorrectAnswerResponseWrapper: () => cy.get('[class*="ClozeWithTextResponsestyles__CorrectResponseWrapper"] [aria-label*="Response"]'),
42
+ previewTabCorrectAnswerResponseWrapper: () => cy.get('[class*="ClozeWithTextResponsestyles__CorrectResponseWrapper"] [aria-label*="Add answer for response"]'),
43
43
  previewTabCorrectAnswerResponseNumerationWrapper: () => fillInTheGapsCommonComponents.previewTabCorrectAnswerContainer().find('.response-input-adornment') //Verify once numeration is implemented in all FIG questions
44
44
  }
45
45
 
@@ -415,7 +415,7 @@ const tests = {
415
415
  .should('have.value', '5.7');
416
416
  });
417
417
 
418
- it('When user has entered points in \'All or nothing\' scoring type and switches to \'Partial different weights\' scoring type, then the points input field displayed besides each response should be blank.', () => {
418
+ it('When user has entered points in \'All or nothing\' scoring type and switches to \'Partial different weights\' scoring type, then the points allocated should get equally divided between each correct response', () => {
419
419
  scoringSectionBase.pointsInputField()
420
420
  .clear()
421
421
  .type('9');
@@ -424,7 +424,7 @@ const tests = {
424
424
  scoringSectionBase.pointsInputField()
425
425
  .each(($element) => {
426
426
  cy.wrap($element)
427
- .should('have.value', '');
427
+ .should('have.value', '4.5');
428
428
  });
429
429
  });
430
430
  },
@@ -543,7 +543,7 @@ const tests = {
543
543
  });
544
544
 
545
545
  it('Accessibility of \'Response\' accordion', { tags: 'a11y' }, () => {
546
- cy.checkAccessibility(fillInTheGapsCommonComponents.responseAccordionWrapper().parents('.additional-settings-content'));
546
+ cy.checkAccessibility(fillInTheGapsCommonComponents.responseAccordionWrapper().parents('.ngie-accordion-detail'));
547
547
  });
548
548
  },
549
549