itemengine-cypress-automation 1.0.150-migrationScripts-5e451b6.0 → 1.0.150

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. package/cypress/e2e/ILC/AudioResponseNew/compactRecorderStyle.smoke.js +4 -4
  2. package/cypress/e2e/ILC/AudioResponseNew/editTabBasicSection.js +3 -3
  3. package/cypress/e2e/ILC/AudioResponseNew/standardRecorderStyle.smoke.js +1 -1
  4. package/cypress/e2e/ILC/AudioResponseNew/studentViewSettings.js +2 -1
  5. package/cypress/e2e/ILC/ContentBlocks/additionalSection.js +2 -2
  6. package/cypress/e2e/ILC/ContentBlocks/editTabBasics.js +6 -6
  7. package/cypress/e2e/ILC/DragAndDropIntoCategoriesNew/clickAndDrop.js +1 -1
  8. package/cypress/e2e/ILC/DragAndDropIntoCategoriesNew/editTabBasicSection.js +1 -1
  9. package/cypress/e2e/ILC/DrawingResponse/drawingResponseAdditionalSettings.js +3 -3
  10. package/cypress/e2e/ILC/DrawingResponse/drawingResponseBackground.js +2 -2
  11. package/cypress/e2e/ILC/DrawingResponse/drawingResponseCustomizeAdditionalOptions.js +1 -1
  12. package/cypress/e2e/ILC/DrawingResponse/drawingResponseEditTabBasicSection.js +1 -1
  13. package/cypress/e2e/ILC/Graphing/gradingViewAndCorrectAnswerView.smoke.js +1 -1
  14. package/cypress/e2e/ILC/GridFill/additionalSettings.js +52 -0
  15. package/cypress/e2e/ILC/GridFill/headerSection.js +74 -0
  16. package/cypress/e2e/ILC/GridFill/minimumScoringPenaltyPointsAndRoundingDropdown.js +199 -0
  17. package/cypress/e2e/ILC/GridFill/scoring/allOrNothingAlternativePointsGreaterThanCorrectPoints.js +0 -15
  18. package/cypress/e2e/ILC/GridFill/scoring/allOrNothingCorrectPointsEqualToAlternativePoints.js +3 -18
  19. package/cypress/e2e/ILC/GridFill/scoring/allOrNothingCorrectPointsGreaterThanAlternativePoints.js +4 -25
  20. package/cypress/e2e/ILC/GridFill/scoring/allOrNothingPenaltyScoring.js +4 -7
  21. package/cypress/e2e/ILC/GridFill/scoring/allOrNothingScoringCellShadeCount.js +1 -14
  22. package/cypress/e2e/ILC/GridFill/scoring/manuallyAndNonScored.js +1 -1
  23. package/cypress/e2e/ILC/GridFill/scoring/partialEqualWeightsBasic.js +4 -4
  24. package/cypress/e2e/ILC/GridFill/scoring/partialEqualWeightsWithAlternativePointsGreaterThanCorrectPoints.js +256 -0
  25. package/cypress/e2e/ILC/GridFill/scoring/partialEqualWeightsWithCorrectPointsEqualToAlternativePoints.js +213 -0
  26. package/cypress/e2e/ILC/GridFill/scoring/partialEqualWeightsWithCorrectPointsGreaterThanAlternativePoints.js +258 -0
  27. package/cypress/e2e/ILC/GridFill/studentViewSettingsSection.js +206 -0
  28. package/cypress/e2e/ILC/Matching/Scoring/allOrNothingWithAlternativePointsGreaterThanCorrectPoints.js +198 -0
  29. package/cypress/e2e/ILC/Matching/Scoring/allOrNothingWithCorrectPointsEqualToAlternativePoints.js +4 -6
  30. package/cypress/e2e/ILC/Matching/Scoring/allOrNothingWithCorrectPointsGreaterThanAlternativePoints.js +10 -22
  31. package/cypress/e2e/ILC/Matching/Scoring/partialDifferentWeightsScoringBasic.js +421 -0
  32. package/cypress/e2e/ILC/Matching/Scoring/partialDifferentWeightsWithAlternativePointsGreaterThanCorrectPoints.js +247 -0
  33. package/cypress/e2e/ILC/Matching/Scoring/partialDifferentWeightsWithCorrectPointsEqualToAlternativePoints.js +219 -0
  34. package/cypress/e2e/ILC/Matching/Scoring/partialDifferentWeightsWithCorrectPointsGreaterThanAlternativePoints.js +247 -0
  35. package/cypress/e2e/ILC/Matching/Scoring/partialEqualWeightsBasic.js +168 -0
  36. package/cypress/e2e/ILC/Matching/Scoring/partialEqualWeightsWithAlternativePointsGreaterThanCorrectPoints.js +227 -0
  37. package/cypress/e2e/ILC/Matching/Scoring/partialEqualWeightsWithCorrectPointsEqualToAlternativePoints.js +199 -0
  38. package/cypress/e2e/ILC/Matching/Scoring/partialEqualWeightsWithCorrectPointsGreaterThanAlternativePoints.js +227 -0
  39. package/cypress/e2e/ILC/MultipleSelectionGridNew/Scoring/allOrNothingAlternativePointsGreaterThanCorrectPoints.js +345 -0
  40. package/cypress/e2e/ILC/MultipleSelectionGridNew/Scoring/allOrNothingCorrectPointsEqualToAlternativePoints.js +340 -0
  41. package/cypress/e2e/ILC/MultipleSelectionGridNew/Scoring/allOrNothingCorrectPointsGreaterThanAlternativePoints.js +421 -0
  42. package/cypress/e2e/ILC/MultipleSelectionGridNew/editTabScoringSection.js +292 -0
  43. package/cypress/e2e/ILC/MultipleSelectionGridNew/minimumScoringPenaltyPointsAndRoundingDropdown.js +194 -0
  44. package/cypress/e2e/ILC/MultipleSelectionGridNew/previewContentsForAllViews.smoke.js +10 -2
  45. package/cypress/e2e/ILC/MultipleSelectionGridNew/specifyCorrectAnswerSection.js +86 -0
  46. package/cypress/e2e/ILC/MultipleSelectionGridNew/studentViewSettings.js +189 -0
  47. package/cypress/e2e/ILC/SingleSelectionGridNew/Scoring/allOrNothingPenaltyScoring.js +55 -0
  48. package/cypress/e2e/ILC/SingleSelectionGridNew/Scoring/partialDifferentWeightsBasic.js +116 -0
  49. package/cypress/e2e/ILC/SingleSelectionGridNew/Scoring/partialDifferentWeightsMinimumAndPenaltyScoring.js +309 -0
  50. package/cypress/e2e/ILC/SingleSelectionGridNew/Scoring/partialEqualWeightsBasic.js +163 -0
  51. package/cypress/e2e/ILC/SingleSelectionGridNew/editTabScoringSection.js +292 -0
  52. package/cypress/e2e/ILC/SingleSelectionGridNew/minimumScoringPenaltyPointsAndRoundingDropdown.js +194 -0
  53. package/cypress/e2e/ILC/SingleSelectionGridNew/previewContentsForAllViews.smoke.js +10 -2
  54. package/cypress/e2e/ILC/SingleSelectionGridNew/specifyCorrectAnswerSection.js +86 -0
  55. package/cypress/e2e/ILC/SingleSelectionGridNew/studentViewSettings.js +189 -0
  56. package/cypress/e2e/ILC/TextEntryMathWithImage/allOrNothingScoringForAllViews.smoke.js +1 -1
  57. package/cypress/e2e/ILC/ToolSettings/toolSettingsPreviewContents.smoke.js +1 -1
  58. package/cypress/fixtures/drawingToolbarOptionsAdditionalOptionsAndSpecialAndMathCharacters.js +1 -1
  59. package/cypress/fixtures/uploads/sampleVirus.zip +0 -0
  60. package/cypress/pages/audioResponsePage.js +2 -2
  61. package/cypress/pages/components/autoScoredSpecifyCorrectAnswerSection.js +3 -3
  62. package/cypress/pages/components/commonComponents.js +2 -1
  63. package/cypress/pages/components/customizeSpecialCharacterComponent.js +5 -5
  64. package/cypress/pages/components/desmosToolComponent.js +1 -1
  65. package/cypress/pages/components/gridQuestionCommonComponent.js +388 -35
  66. package/cypress/pages/components/maximumRecorderLengthComponent.js +4 -4
  67. package/cypress/pages/components/playbackControlsBaseComponent.js +8 -2
  68. package/cypress/pages/components/scoringSectionBaseEditTab.js +1 -1
  69. package/cypress/pages/contentBlocksPage.js +1 -1
  70. package/cypress/pages/drawingResponsePage.js +9 -10
  71. package/cypress/pages/geoGebraActivityPage.js +2 -1
  72. package/cypress/pages/geoGebraToolsPage.js +1 -1
  73. package/cypress/pages/gridFillPage.js +108 -13
  74. package/cypress/pages/matchingPage.js +154 -2
  75. package/cypress/pages/multipleSelectionGridPage.js +10 -2
  76. package/cypress/pages/rulerPage.js +2 -5
  77. package/cypress/pages/singleSelectionGridPage.js +18 -2
  78. package/package.json +2 -2
@@ -1,6 +1,9 @@
1
1
  import constants from "../../fixtures/constants";
2
2
  import utilities from "../../support/helpers/utilities";
3
3
  import { autoScoredScoringPreviewTab } from "./autoScoredScoringPreviewTab";
4
+ import { autoScoredScoringSectionMultiResponseType } from "./autoScoredScoringSectionMultiResponseType";
5
+ import { autoScoredSpecifyCorrectAnswerSection } from "./autoScoredSpecifyCorrectAnswerSection";
6
+ import { commonComponents } from "./commonComponents";
4
7
  const css = Cypress.env('css');
5
8
 
6
9
  const selectors = {
@@ -13,13 +16,20 @@ const selectors = {
13
16
  optionCellPropertyInputField: () => cy.get('[title="Option text or image..."]'),
14
17
  tableRowSpecifyCorrectAnswerSection: () => cy.get('.correct-answer-accordion [class*="wrapper-row"]'),
15
18
  tableRowPreviewTab: () => cy.get('[class*="question-preview-wrapper"] [class*="wrapper-row"]'),
19
+ questionsColumnPreviewTab: () => cy.get('[class*="question-preview-wrapper"] [class*="TableCellWrapper"][class*="col-0"]'),
16
20
  optionsButton: () => cy.get('[class*="PreviewSelectionButton"]'),
17
21
  gridPreviewTab: () => cy.get('.single-selection-grid-wrapper:visible'),
22
+ gridSpecifyCorrectAnswerSection: () => cy.get('.set-correct-ans-selection-grid'),
18
23
  tableCell: () => cy.get('[class*="CellContainer"]'),
19
- correctAnswerGrid: () => cy.get('.selection-grid-wrapper').last(),
24
+ correctAnswerGrid: () => cy.get('.correct-ans-selection-grid'),
20
25
  tableRow: () => cy.get('[class*="wrapper-row"]'),
21
26
  correctAnswersLabel: () => cy.get('[class*="question-preview-wrapper"] [class*="CorrectAnswerHeader"]'),
22
27
  penaltyPointsForEachIncorrectRowInputField: () => cy.get('input[aria-label="Penalty points for each incorrect row"]'),
28
+ pointsPerRowLabel: () => cy.get('.selection-grid-partial-points-per-response-label'),
29
+ enableRowHeadingLabel: () => cy.get('[data-ngie-testid="enable-row-heading-checkbox"] [class*="label"]'),
30
+ enableRowHeadingCheckbox: () => cy.get('[data-ngie-testid="enable-row-heading-checkbox"] .ngie-checkbox'),
31
+ leftPaginationButtonSpecifyCorrectAnswerSection: () => cy.get('.set-correct-ans-selection-grid [aria-label="Left Pagination Button"]'),
32
+ rightPaginationButtonSpecifyCorrectAnswerSection: () => cy.get('.set-correct-ans-selection-grid [aria-label="Right Pagination Button"]'),
23
33
  }
24
34
 
25
35
  const steps = {
@@ -82,6 +92,14 @@ const steps = {
82
92
  });
83
93
  },
84
94
 
95
+ verifyTextInCellPropertyInputField: ({ row, column }, text) => {
96
+ utilities.getNthElement(gridQuestionCommonComponent.editCellPropertyRow(), row).within(() => {
97
+ utilities.getNthElement(gridQuestionCommonComponent.tableCell(), column).within(() => {
98
+ utilities.verifyTextContent(gridQuestionCommonComponent.cellPropertyInputField(), text);
99
+ });
100
+ });
101
+ },
102
+
85
103
  /**
86
104
  * Enters text into the input field of an option cell.
87
105
  * @param {Object} position - The position of the option cell.
@@ -99,6 +117,14 @@ const steps = {
99
117
  });
100
118
  },
101
119
 
120
+ verifyTextInOptionCellInputField: ({ row, column }, text) => {
121
+ utilities.getNthElement(gridQuestionCommonComponent.editCellPropertyRow(), row).within(() => {
122
+ utilities.getNthElement(gridQuestionCommonComponent.tableCell(), column).within(() => {
123
+ utilities.verifyTextContent(gridQuestionCommonComponent.optionCellPropertyInputField(), text);
124
+ });
125
+ });
126
+ },
127
+
102
128
  setRowsAndColumnsForBasicQuestion: () => {
103
129
  gridQuestionCommonComponent.steps.modifyTableCellProperty({ row: 1, column: 0 }, 'Heading');
104
130
  gridQuestionCommonComponent.steps.modifyTableCellProperty({ row: 2, column: 0 }, 'Subheading');
@@ -106,38 +132,106 @@ const steps = {
106
132
  gridQuestionCommonComponent.steps.enterTextInCellPropertyInputField({ row: 2, column: 0 }, 'Bats are blind and navigate by using echolocation');
107
133
  },
108
134
 
109
- //Note: Need to work on this after https://redmine.zeuslearning.com/issues/565255 gets resolved
110
135
  /**
111
- * @param {number} cellIndex - Index of the table cell.
112
- * @param {("Heading" | "Subheading" | "Text" | "None")} cellProperty - Type of property to verify.
113
- * @description Verifies the appearance and content of a specific property in a table cell on the preview tab.
136
+ * Verifies the property of a cell in the preview tab of a grid question component.
137
+ * @param {Object} cellPosition - The position of the cell to verify, containing row and column indices.
138
+ * @param {number} cellPosition.row - The row index of the cell.
139
+ * @param {number} cellPosition.column - The column index of the cell.
140
+ * @param {'None'|Heading'|'Subheading'|'Text'|'Radio button'|'Checkbox'|'Radio button with text'|'Checkbox with text'|'No radio button'|'No checkbox'} cellProperty - The property to verify for the cell.
141
+ * @throws {Error} If an invalid cellProperty is provided.
114
142
  */
115
- verifyTableCellPropertyPreviewTab: (cellIndex, cellProperty) => {
116
- switch (cellProperty) {
117
- case 'Heading':
118
- utilities.getNthElement(gridQuestionCommonComponent.cellContainerPreviewTab(), cellIndex)
119
- .should('have.class', 'heading');
120
- break;
121
- case 'Subheading':
122
- utilities.getNthElement(gridQuestionCommonComponent.cellContainerPreviewTab(), cellIndex)
123
- .should('have.class', 'subheading');
124
- break;
125
- case 'Text':
126
- utilities.getNthElement(gridQuestionCommonComponent.cellContainerPreviewTab(), cellIndex)
127
- .should('have.class', 'text');
128
- break;
129
- case 'Dropzone':
130
- utilities.getNthElement(gridQuestionCommonComponent.cellContainerPreviewTab(), cellIndex)
131
- .should('have.class', 'dropzone-cell');
132
- break;
133
- case 'None':
134
- utilities.getNthElement(gridQuestionCommonComponent.cellContainerPreviewTab(), cellIndex)
135
- .should('have.class', 'text')
136
- .and('have.text', '');
137
- break;
138
- default:
139
- throw new Error('Invalid list option');
140
- };
143
+ verifyTableCellPropertyPreviewTab: ({ row, column }, cellProperty) => {
144
+ gridQuestionCommonComponent.gridPreviewTab().within(() => {
145
+ utilities.getNthElement(gridQuestionCommonComponent.tableRow(), row)
146
+ .within(() => {
147
+ switch (cellProperty) {
148
+ case 'None':
149
+ utilities.getNthElement(gridQuestionCommonComponent.tableCell(), column)
150
+ .should('have.class', 'cell-content-none');
151
+ break;
152
+ case 'Heading':
153
+ utilities.getNthElement(gridQuestionCommonComponent.tableCell(), column)
154
+ .should('have.class', 'cell-content-heading');
155
+ break;
156
+ case 'Subheading':
157
+ utilities.getNthElement(gridQuestionCommonComponent.tableCell(), column)
158
+ .should('have.class', 'cell-content-subeading');
159
+ break;
160
+ case 'Text':
161
+ utilities.getNthElement(gridQuestionCommonComponent.tableCell(), column)
162
+ .should('have.class', 'cell-content-text');
163
+ break;
164
+ case 'Radio button':
165
+ case 'Checkbox':
166
+ utilities.getNthElement(gridQuestionCommonComponent.tableCell(), column)
167
+ .should('have.class', 'cell-content-radio');
168
+ break;
169
+ case 'Radio button with text':
170
+ case 'Checkbox with text':
171
+ utilities.getNthElement(gridQuestionCommonComponent.tableCell(), column)
172
+ .should('have.class', 'cell-content-radio-text');
173
+ break;
174
+ case 'No radio button':
175
+ case 'No checkbox':
176
+ utilities.getNthElement(gridQuestionCommonComponent.tableCell(), column)
177
+ .should('have.class', 'cell-content-text');
178
+ break;
179
+ default:
180
+ throw new Error('Invalid list option');
181
+ };
182
+ });
183
+ });
184
+ },
185
+
186
+ /**
187
+ * Verifies the property of a cell in the specify correct answer section of a grid question component.
188
+ * @param {Object} cellPosition - The position of the cell to verify, containing row and column indices.
189
+ * @param {number} cellPosition.row - The row index of the cell.
190
+ * @param {number} cellPosition.column - The column index of the cell.
191
+ * @param {'None'|Heading'|'Subheading'|'Text'|'Radio button'|'Checkbox'|'Radio button with text'|'Checkbox with text'|'No radio button'|'No checkbox'} cellProperty - The property to verify for the cell.
192
+ * @throws {Error} If an invalid cellProperty is provided.
193
+ */
194
+ verifyTableCellPropertySpecifyCorrectAnswerSection: ({ row, column }, cellProperty) => {
195
+ gridQuestionCommonComponent.gridSpecifyCorrectAnswerSection().within(() => {
196
+ utilities.getNthElement(gridQuestionCommonComponent.tableRow(), row)
197
+ .within(() => {
198
+ switch (cellProperty) {
199
+ case 'None':
200
+ utilities.getNthElement(gridQuestionCommonComponent.tableCell(), column)
201
+ .should('have.class', 'cell-content-none');
202
+ break;
203
+ case 'Heading':
204
+ utilities.getNthElement(gridQuestionCommonComponent.tableCell(), column)
205
+ .should('have.class', 'cell-content-heading');
206
+ break;
207
+ case 'Subheading':
208
+ utilities.getNthElement(gridQuestionCommonComponent.tableCell(), column)
209
+ .should('have.class', 'cell-content-subeading');
210
+ break;
211
+ case 'Text':
212
+ utilities.getNthElement(gridQuestionCommonComponent.tableCell(), column)
213
+ .should('have.class', 'cell-content-text');
214
+ break;
215
+ case 'Radio button':
216
+ case 'Checkbox':
217
+ utilities.getNthElement(gridQuestionCommonComponent.tableCell(), column)
218
+ .should('have.class', 'cell-content-radio');
219
+ break;
220
+ case 'Radio button with text':
221
+ case 'Checkbox with text':
222
+ utilities.getNthElement(gridQuestionCommonComponent.tableCell(), column)
223
+ .should('have.class', 'cell-content-radio-text');
224
+ break;
225
+ case 'No radio button':
226
+ case 'No checkbox':
227
+ utilities.getNthElement(gridQuestionCommonComponent.tableCell(), column)
228
+ .should('have.class', 'cell-content-text');
229
+ break;
230
+ default:
231
+ throw new Error('Invalid list option');
232
+ };
233
+ });
234
+ });
141
235
  },
142
236
 
143
237
  /**
@@ -238,6 +332,21 @@ const steps = {
238
332
  });
239
333
  },
240
334
 
335
+ /**
336
+ * Unchecks an option in the Specify Correct Answer section of a grid question component.
337
+ * @param {Object} cellPosition - The position of the option to uncheck, containing row and column indices.
338
+ * @param {number} cellPosition.row - The row index of the option.
339
+ * @param {number} cellPosition.column - The column index of the option.
340
+ */
341
+ uncheckOptionInSpecifyCorrectAnswerSection: ({ row, column }) => {
342
+ utilities.getNthElement(gridQuestionCommonComponent.tableRowSpecifyCorrectAnswerSection(), row)
343
+ .within(() => {
344
+ utilities.getNthElement(gridQuestionCommonComponent.optionsButton(), column)
345
+ .click()
346
+ .should('not.have.class', 'selected');
347
+ });
348
+ },
349
+
241
350
  /**
242
351
  * Sets answers for all question stems in the Specify Correct Answer section.
243
352
  * @param {Object[]} rowsAndColumns - An array of objects containing row and column indices.
@@ -289,8 +398,7 @@ const steps = {
289
398
  gridQuestionCommonComponent.gridPreviewTab().within(() => {
290
399
  utilities.getNthElement(gridQuestionCommonComponent.tableRow(), row)
291
400
  .within(() => {
292
- utilities.getNthElement(gridQuestionCommonComponent.optionsButton(), column)
293
- .should('have.attr', 'tabindex', '-1');
401
+ utilities.verifyElementDisabledClass(utilities.getNthElement(gridQuestionCommonComponent.optionsButton(), column));
294
402
  });
295
403
  });
296
404
  },
@@ -396,8 +504,8 @@ const steps = {
396
504
  },
397
505
 
398
506
  /**
399
- * @description Allots penalty points for each incorrect text container
400
- * @param {number} points - The penalty points to be allotted for each text container.
507
+ * @description Allots penalty points for each incorrect row
508
+ * @param {number} points - The penalty points to be allotted for each row.
401
509
  */
402
510
  allotPenaltyPointsForEachIncorrectRow: (points) => {
403
511
  gridQuestionCommonComponent.penaltyPointsForEachIncorrectRowInputField()
@@ -406,9 +514,254 @@ const steps = {
406
514
  .should('have.value', points)
407
515
  .blur();
408
516
  },
517
+
518
+ /**
519
+ * Verifies the points per row value in the grid question component.
520
+ * @param {number} pointsValue - The expected points value per row.
521
+ */
522
+ verifyPointsPerRowValue: (pointsValue) => {
523
+ utilities.verifyInnerText(gridQuestionCommonComponent.pointsPerRowLabel(), `Points per row: ${pointsValue}`)
524
+ },
525
+
526
+ /**
527
+ * @description verify the displayed penalty points for each incorrect row
528
+ * @param {number} penaltyPoints displayed penalty points
529
+ */
530
+ verifyPenaltyPointsForEachIncorrectRow: (penaltyPoints) => {
531
+ utilities.verifyInnerText(autoScoredScoringSectionMultiResponseType.penaltyPointsDetailsSectionAllottedPointsLabel(), `Penalty points for each incorrect row: ${penaltyPoints}`);
532
+ },
533
+
534
+ /**
535
+ * @description Verifies the penalty points value for each incorrect row
536
+ * @param {number} points - The expected penalty points value for each incorrect row.
537
+ */
538
+ verifyPenaltyPointsForEachIncorrectRowValue: (points) => {
539
+ gridQuestionCommonComponent.penaltyPointsForEachIncorrectRowInputField()
540
+ .should('have.value', points);
541
+ },
542
+
543
+ /**
544
+ * @description Verify the number of columns in the specify columns and rows section grid
545
+ * @param {number} numberOfColumns Number of columns in the specify columns and rows section grid
546
+ */
547
+ verifyColumnsCountInSpecifyColumnsAndRowsGrid: (numberOfColumns) => {
548
+ gridQuestionCommonComponent.editCellPropertyTableWrapper()
549
+ .within(() => {
550
+ utilities.verifyElementCount(gridQuestionCommonComponent.tableCell(), numberOfColumns);
551
+ });
552
+ },
553
+
554
+ /**
555
+ * @description Verify the number of columns in the specify columns and rows section grid
556
+ * @param {number} numberOfRows Number of rows in the specify columns and rows section grid
557
+ */
558
+ verifyRowsCountInSpecifyColumnsAndRowsGrid: (numberOfRows) => {
559
+ gridQuestionCommonComponent.editCellPropertyTableWrapper()
560
+ .within(() => {
561
+ utilities.verifyElementCount(gridQuestionCommonComponent.tableRow(), numberOfRows);
562
+ });
563
+ },
564
+
565
+ verifyEnableRowHeadingCheckboxCheckedState: () => {
566
+ gridQuestionCommonComponent.enableRowHeadingCheckbox()
567
+ .should('be.checked');
568
+ },
569
+
570
+ checkEnableRowHeadingCheckbox: () => {
571
+ gridQuestionCommonComponent.enableRowHeadingCheckbox()
572
+ .click()
573
+ .should('be.checked');
574
+ },
575
+
576
+ uncheckEnableRowHeadingCheckbox: () => {
577
+ gridQuestionCommonComponent.enableRowHeadingCheckbox()
578
+ .click()
579
+ .should('not.be.checked');
580
+ },
581
+
582
+ /**
583
+ * Verifies the text content of a cell in the Specify Correct Answer section of a grid question component.
584
+ * @param {Object} cellPosition - The position of the cell to verify, containing row and column indices.
585
+ * @param {number} cellPosition.row - The row index of the cell.
586
+ * @param {number} cellPosition.column - The column index of the cell.
587
+ * @param {string} text - The expected text content of the cell.
588
+ */
589
+ verifyTextInGridCellSpecifyCorrectAnswerSection: ({ row, column }, text) => {
590
+ utilities.getNthElement(gridQuestionCommonComponent.tableRowSpecifyCorrectAnswerSection(), row).within(() => {
591
+ utilities.verifyTextContent(utilities.getNthElement(gridQuestionCommonComponent.tableCell(), column), text);
592
+ });
593
+ },
594
+
595
+ /**
596
+ * Verifies the text content of a cell in the Preview tab of a grid question component.
597
+ * @param {Object} cellPosition - The position of the cell to verify, containing row and column indices.
598
+ * @param {number} cellPosition.row - The row index of the cell.
599
+ * @param {number} cellPosition.column - The column index of the cell.
600
+ * @param {string} text - The expected text content of the cell.
601
+ */
602
+ verifyTextInGridCellPreviewTab: ({ row, column }, text) => {
603
+ utilities.getNthElement(gridQuestionCommonComponent.tableRowPreviewTab(), row).within(() => {
604
+ utilities.verifyTextContent(utilities.getNthElement(gridQuestionCommonComponent.tableCell(), column), text);
605
+ });
606
+ },
607
+
608
+ clickOnRightPaginationButtonSpecifyCorrectAnswerSection: () => {
609
+ gridQuestionCommonComponent.rightPaginationButtonSpecifyCorrectAnswerSection()
610
+ .click();
611
+ },
612
+
613
+ clickOnLeftPaginationButtonSpecifyCorrectAnswerSection: () => {
614
+ gridQuestionCommonComponent.leftPaginationButtonSpecifyCorrectAnswerSection()
615
+ .click();
616
+ },
617
+
618
+ /**
619
+ * Verifies that questions are randomized in the preview tab of a grid question component.
620
+ * @param {Array<string>} questionsArray - An array containing the original questions in their initial order.
621
+ * @returns {void}
622
+ */
623
+ verifyRandomizeQuestionsOrder: (questionsArray) => {
624
+ let currentQuestions = [...questionsArray]
625
+ for (let index = 0; index < currentQuestions.length; index++) {
626
+ utilities.getNthElement(gridQuestionCommonComponent.tableRowPreviewTab(), index + 1)
627
+ .within(() => {
628
+ utilities.getNthElement(gridQuestionCommonComponent.tableCell(), 0)
629
+ .then(($element) => {
630
+ expect($element.text()).to.be.oneOf(currentQuestions);
631
+ currentQuestions = currentQuestions.filter((value) => value !== $element.text())
632
+ });
633
+ });
634
+ };
635
+ gridQuestionCommonComponent.steps.verifyQuestionsAreReRandomized(questionsArray)
636
+ },
637
+
638
+ /**
639
+ * @param {string[]} previousOrderOfQuestionsArray array of previous order of the question stems
640
+ * @description this function verifies that the order of the question stems is different from the previous order
641
+ */
642
+ verifyQuestionsAreReRandomized: (previousOrderOfQuestionsArray) => {
643
+ gridQuestionCommonComponent.questionsColumnPreviewTab()
644
+ .should('not.have.text', '')
645
+ .and('not.have.text', previousOrderOfQuestionsArray.join(''));
646
+ },
647
+
648
+ getQuestionsArray: () => {
649
+ const questionsArray = []
650
+ gridQuestionCommonComponent.questionsColumnPreviewTab()
651
+ .each(($el) => {
652
+ cy.wrap($el)
653
+ .invoke('text')
654
+ .then((text) => {
655
+ questionsArray.push(text);
656
+ });
657
+ });
658
+ return questionsArray;
659
+ },
660
+ }
661
+
662
+ const tests = {
663
+ verifyContentsOfSpecifyCorrectAnswerSection: () => {
664
+ it(`When the user selects any scoring type except for manual scored, then the question grid should be displayed in the specify correct answer section`, () => {
665
+ gridQuestionCommonComponent.steps.verifyTableCellPropertySpecifyCorrectAnswerSection({ row: 0, column: 0 }, 'None');
666
+ gridQuestionCommonComponent.steps.verifyTableCellPropertySpecifyCorrectAnswerSection({ row: 0, column: 1 }, 'Heading');
667
+ gridQuestionCommonComponent.steps.verifyTextInCellPropertyInputField({ row: 0, column: 1 }, 'True');
668
+ gridQuestionCommonComponent.steps.verifyTableCellPropertySpecifyCorrectAnswerSection({ row: 0, column: 2 }, 'Heading');
669
+ gridQuestionCommonComponent.steps.verifyTextInCellPropertyInputField({ row: 0, column: 2 }, 'False');
670
+ gridQuestionCommonComponent.steps.verifyTableCellPropertySpecifyCorrectAnswerSection({ row: 1, column: 0 }, 'Heading');
671
+ gridQuestionCommonComponent.steps.verifyTextInCellPropertyInputField({ row: 1, column: 0 }, 'Elephants are the only mammals that can\'t jump');
672
+ gridQuestionCommonComponent.steps.verifyTableCellPropertySpecifyCorrectAnswerSection({ row: 1, column: 1 }, 'Radio button');
673
+ gridQuestionCommonComponent.steps.verifyTableCellPropertySpecifyCorrectAnswerSection({ row: 2, column: 0 }, 'Subheading');
674
+ gridQuestionCommonComponent.steps.verifyTextInCellPropertyInputField({ row: 2, column: 0 }, 'Bats are blind and navigate by using echolocation');
675
+ gridQuestionCommonComponent.steps.verifyTextInCellPropertyInputField({ row: 3, column: 0 }, 'Whale are mammals');
676
+ gridQuestionCommonComponent.steps.verifyTextInCellPropertyInputField({ row: 4, column: 0 }, 'Tigers can jump upto 3 metres');
677
+
678
+ });
679
+ },
680
+
681
+ /**
682
+ * Verifies the contents and functionality of the 'Specify correct answer' accordion for multiple selection questions.
683
+ * @param {{'Correct' | 'Alternative'}} accordionName - The name of the accordion to be used in the validation.
684
+ * @example - verifySpecifyCorrectAnswerAccordionContentsAndFunctionality('Correct');
685
+ */
686
+ verifySpecifyCorrectAnswerAccordionContentsAndFunctionality: (accordionName) => {
687
+ it(`The user should be able to check an option in the ${accordionName} accordion`, () => {
688
+ gridQuestionCommonComponent.steps.setAnswerInSpecifyCorrectAnswerSection({ row: 1, column: 0 });
689
+ });
690
+
691
+ it(`When the user has unchecked all the options in the ${accordionName} accordion, \'Error: Please set a correct answer.\' error message should be thrown along with an error icon on the \'${accordionName}\' accordion`, () => {
692
+ gridQuestionCommonComponent.steps.uncheckOptionInSpecifyCorrectAnswerSection({ row: 1, column: 0 });
693
+ utilities.verifyElementVisibilityState(commonComponents.errorMessage(), 'visible')
694
+ utilities.verifyInnerText(commonComponents.errorMessage(), 'Error: Please set a correct answer.');
695
+ if (accordionName == 'Correct') {
696
+ autoScoredSpecifyCorrectAnswerSection.correctAnswerAccordion()
697
+ .within(() => {
698
+ utilities.verifyElementVisibilityState(autoScoredSpecifyCorrectAnswerSection.specifyCorrectAnswerErrorIcon(), 'visible');
699
+ });
700
+ } else {
701
+ autoScoredSpecifyCorrectAnswerSection.alternativeAnswerAccordion()
702
+ .within(() => {
703
+ utilities.verifyElementVisibilityState(autoScoredSpecifyCorrectAnswerSection.specifyCorrectAnswerErrorIcon(), 'visible');
704
+ });
705
+ };
706
+ });
707
+
708
+ autoScoredSpecifyCorrectAnswerSection.tests.verifyAutoScoredCorrectAnswerErrorMessageCSSAndA11y();
709
+
710
+ it('When the user checks an option in the question grid, the error message should disappear', () => {
711
+ gridQuestionCommonComponent.steps.setAnswersForAllQuestionStemsInSpecifyCorrectAnswerSection([{ row: 1, column: 0 }, { row: 2, column: 1 }, { row: 3, column: 0 }, { row: 4, column: 1 }]);
712
+ commonComponents.steps.verifyErrorMessageIsNotDisplayed();
713
+ });
714
+
715
+ autoScoredSpecifyCorrectAnswerSection.tests.verifyAutoScoredPointsErrorMessageWhenPointsFieldIsEmpty(accordionName);
716
+
717
+ it('CSS of \'Correct\' accordion contents', { tags: 'css' }, () => {
718
+ gridQuestionCommonComponent.gridSpecifyCorrectAnswerSection()
719
+ .within(() => {
720
+ utilities.verifyCSS(utilities.getNthElement(gridQuestionCommonComponent.tableCell().parent(), 1), {
721
+ 'background-color': css.color.matrixHeadingCellBg,
722
+ 'border-color': `${css.color.matrixCellBorder}`
723
+ });
724
+ utilities.verifyCSS(utilities.getNthElement(gridQuestionCommonComponent.tableCell().parent(), 6), {
725
+ 'background-color': css.color.matrixSubheadingCellBg,
726
+ 'border-color': `${css.color.matrixCellBorder}`
727
+ });
728
+ utilities.verifyCSS(utilities.getNthElement(gridQuestionCommonComponent.tableCell().parent(), 9), {
729
+ 'background-color': css.color.defaultBackground,
730
+ 'border-color': `${css.color.matrixCellBorder}`
731
+ });
732
+ utilities.verifyCSS(utilities.getNthElement(gridQuestionCommonComponent.optionsButton, 0), {
733
+ 'background-color': css.color.matrixHeadingCellBg,
734
+ 'color': `${css.color.matrixCellBorder}`
735
+ });
736
+ utilities.verifyCSS(utilities.getNthElement(gridQuestionCommonComponent.optionsButton, 0).find('svg'), {
737
+ 'color': css.color.activeButtons
738
+ });
739
+ utilities.verifyCSS(utilities.getNthElement(gridQuestionCommonComponent.tableCell(), 1).find('.question-text-wrapper'), {
740
+ 'color': css.color.text,
741
+ 'font-size': css.fontSize.heading,
742
+ 'font-weight': css.fontWeight.bold
743
+ });
744
+ utilities.verifyCSS(utilities.getNthElement(gridQuestionCommonComponent.tableCell(), 6).find('.question-text-wrapper'), {
745
+ 'color': css.color.text,
746
+ 'font-size': css.fontSize.default,
747
+ 'font-weight': css.fontWeight.bold
748
+ });
749
+ utilities.verifyCSS(utilities.getNthElement(gridQuestionCommonComponent.tableCell(), 9).find('.question-text-wrapper'), {
750
+ 'color': css.color.text,
751
+ 'font-size': css.fontSize.default,
752
+ 'font-weight': css.fontWeight.regular
753
+ });
754
+ });
755
+ });
756
+
757
+ it('Accessibility of \'Correct\' accordion contents', { tags: 'a11y' }, () => {
758
+ cy.checkAccessibility(gridQuestionCommonComponent.tableCell().parents('.correct-answer-accordion'));
759
+ });
760
+ },
409
761
  }
410
762
 
411
763
  export const gridQuestionCommonComponent = {
412
764
  ...selectors,
413
765
  steps,
766
+ tests
414
767
  }
@@ -113,7 +113,7 @@ const tests = {
113
113
 
114
114
  it('When the user updates the \'Maximum recorder length\' value, then the validation message \'Error: Maximum recorder length is required.\' should disappear.', () => {
115
115
  maximumRecorderLengthComponent.steps.setMaximumRecorderLength('1000');
116
- utilities.verifyElementVisibilityState(commonComponents.errorMessage(), 'hidden');
116
+ utilities.verifyElementVisibilityState(commonComponents.errorMessage(), 'notExist');
117
117
  });
118
118
 
119
119
  it('When the user has set \'Maximum recorder length\' to \'0\' (zero), a validation message \'Error: Value must be greater than 0 secs.\' should be displayed', () => {
@@ -127,7 +127,7 @@ const tests = {
127
127
 
128
128
  it('When the user updates the \'Maximum recorder length\' value, then the validation message \'Error: Value must be greater than 0 secs.\' should disappear', () => {
129
129
  maximumRecorderLengthComponent.steps.setMaximumRecorderLength('1000');
130
- utilities.verifyElementVisibilityState(commonComponents.errorMessage(), 'hidden');
130
+ utilities.verifyElementVisibilityState(commonComponents.errorMessage(), 'notExist');
131
131
  });
132
132
  },
133
133
 
@@ -151,7 +151,7 @@ const tests = {
151
151
 
152
152
  it('When the user updates the \'Maximum recorder length\' value, then the validation message \'Error: Maximum recorder length is required.\' should disappear.', () => {
153
153
  maximumRecorderLengthComponent.steps.setMaximumRecorderLength('50');
154
- utilities.verifyElementVisibilityState(commonComponents.errorMessage(), 'hidden');
154
+ utilities.verifyElementVisibilityState(commonComponents.errorMessage(), 'notExist');
155
155
  });
156
156
 
157
157
  it('When the user has set \'Maximum recorder length\' to \'0\' (zero), a validation message \'Error: Value must be greater than 0 mins.\' should be displayed', () => {
@@ -165,7 +165,7 @@ const tests = {
165
165
 
166
166
  it('When the user updates the \'Maximum recorder length\' value, then the validation message \'Error: Value must be greater than 0 mins.\' should disappear', () => {
167
167
  maximumRecorderLengthComponent.steps.setMaximumRecorderLength('50');
168
- utilities.verifyElementVisibilityState(commonComponents.errorMessage(), 'hidden');
168
+ utilities.verifyElementVisibilityState(commonComponents.errorMessage(), 'notExist');
169
169
  });
170
170
  },
171
171
  }
@@ -43,6 +43,11 @@ const steps = {
43
43
  .trigger('mouseover')
44
44
  },
45
45
 
46
+ hoverOnPlaybackSpeedButton: () => {
47
+ playbackControlsBaseComponent.playbackSpeedButton()
48
+ .trigger('mouseover');
49
+ },
50
+
46
51
  /**
47
52
  * @param {number} volume of the audio/video player - from 0 to 100
48
53
  * @description this function is used to verify volume of the audio/video player
@@ -269,12 +274,13 @@ const tests = {
269
274
 
270
275
  verifyPlaybackSpeedContents: () => {
271
276
  it('When the user hovers overs the playback button, a list of 4 playback speed options - 1x, 1.25x, 1.5x, 2x should be displayed and by default 1x should be in selected state', () => {
272
- utilities.hoverOverElement(playbackControlsBaseComponent.playbackSpeedButton());
277
+ playbackControlsBaseComponent.playbackSpeedButton()
278
+ .trigger('mouseover');
273
279
  utilities.verifyElementVisibilityState(playbackControlsBaseComponent.playbackSpeedOptionsList(), 'visible');
274
280
  utilities.verifyElementCount(playbackControlsBaseComponent.playbackSpeedOption(), 4);
275
281
  playbackControlsBaseComponent.steps.verifyPlaybackSpeedListOptions();
276
282
  playbackControlsBaseComponent.steps.verifyPlaybackSpeedOptionSelectedState('1x');
277
- utilities.hoverAwayFromElement();
283
+ playbackControlsBaseComponent.steps.selectPlaybackSpeed('1x');
278
284
  });
279
285
 
280
286
  it('CSS of playback speed options', { tags: 'css' }, () => {
@@ -28,7 +28,7 @@ const selectors = {
28
28
  return cy.get('[aria-labelledby*="minimum-scoring-dropdown-label"] [role="option"]')
29
29
  }
30
30
  },
31
- minimumPointsLabel: () => cy.get('.min-score-points-label'),
31
+ minimumPointsLabel: () => cy.get('[class*="min-score-points-label"]'),
32
32
  minimumPointsInputField: () => cy.get('.min-score-points-input-field input'),
33
33
  }
34
34
 
@@ -461,7 +461,7 @@ const steps = {
461
461
  contentBlocksPage.lexileInputField()
462
462
  .clear()
463
463
  .type(text)
464
- .should('have.text', text);
464
+ .should('have.value', text);
465
465
  },
466
466
 
467
467
  /**
@@ -42,7 +42,7 @@ const selectors = {
42
42
  },
43
43
 
44
44
  //Default colors
45
- defaultStrokeColorsWrapper: () => cy.get('ColorSelectionComponentstyles__DefaultColorOptions').eq(0),
45
+ defaultStrokeColorsWrapper: () => cy.get('[class*="ColorSelectionComponentstyles__DefaultColorOptions"]').eq(0),
46
46
  defaultStrokeFontColorLabel: () => cy.get('[class*="ColorSelectionComponentstyles__LabelWrapper"]').eq(0),
47
47
  colorPickerBlock: () => cy.get('.color-picker-block'),
48
48
  colorPickerBlockCloseIcon: () => cy.get('[class*="ColorSelectionComponentstyles__CloseIcon"]'),
@@ -181,7 +181,7 @@ const selectors = {
181
181
  additionalSettingsStrokeImage: () => cy.get('[class*="DrawingResponsestyles__StrokeLineThicknessWrapper"] svg[aria-label*="Stroke"]'),
182
182
  setLineTypeButton: (ariaLabel = null) => {
183
183
  if (ariaLabel) {
184
- return cy.get(`[class*="DrawingResponsestyles__SetLineTypeWrapper"] button[aria-label*="Set Line Types group ${ariaLabel}"]`)
184
+ return cy.get(`[class*="DrawingResponsestyles__SetLineTypeWrapper"] button[aria-label*="Set line types group ${ariaLabel}"]`)
185
185
  } else {
186
186
  return cy.get('[class*="DrawingResponsestyles__SetLineTypeWrapper"] button')
187
187
  }
@@ -230,9 +230,9 @@ const steps = {
230
230
  selectEditTabToolbarOptions: (arrayOfToolbarOptions) => {
231
231
  arrayOfToolbarOptions.forEach((arialabel) => {
232
232
  drawingResponsePage.toolbarOptionsAndControlsFormattingOptionsTiles(arialabel)
233
- .click()
234
- .find('[role="menuitemcheckbox"]')
235
- .should('have.attr', 'aria-checked', 'true');
233
+ .click();
234
+ drawingResponsePage.toolbarOptionsAndControlsFormattingOptionsTiles(arialabel)
235
+ .should('have.attr', 'data-aria-pressed', 'true');
236
236
  });
237
237
  },
238
238
 
@@ -343,7 +343,7 @@ const steps = {
343
343
 
344
344
  clickOnAddColorBlockInDefaultFontStrokeColorBlockSection: () => {
345
345
  drawingResponsePage.colorPickerBlock()
346
- .find('[data-name="Add color"]')
346
+ .find('.icon-plus')
347
347
  .click();
348
348
  },
349
349
 
@@ -1169,7 +1169,6 @@ const steps = {
1169
1169
  clickOnStudentViewUpperCanvas: () => {
1170
1170
  drawingResponsePage.studentViewUpperCanvas()
1171
1171
  .click({ force: true });
1172
- createQuestionBasePage
1173
1172
  },
1174
1173
 
1175
1174
  verifyCustomizeToolbarOptionsAndControlsAccordionCollapsedState: () => {
@@ -1183,9 +1182,9 @@ const steps = {
1183
1182
  */
1184
1183
  deselectToolbarOptionsAndControlsFormattingOptionsTiles: (toolbarOption) => {
1185
1184
  drawingResponsePage.toolbarOptionsAndControlsFormattingOptionsTiles(toolbarOption)
1186
- .click()
1187
- .find('[role="menuitemcheckbox"]')
1188
- .should('have.attr', 'aria-checked', 'false');
1185
+ .click();
1186
+ drawingResponsePage.toolbarOptionsAndControlsFormattingOptionsTiles(toolbarOption)
1187
+ .should('have.attr', 'data-aria-pressed', 'false');
1189
1188
  },
1190
1189
 
1191
1190
  /**
@@ -42,7 +42,8 @@ const steps = {
42
42
  addInputToInsertResourceLinkInputField: (inputURL) => {
43
43
  geoGebraActivityPage.insertResourceLinkInputField()
44
44
  .clear()
45
- .type(`${inputURL}`);
45
+ .type(`${inputURL}`)
46
+ .blur();
46
47
  },
47
48
 
48
49
  clearInputToInsertResourceLinkInputField: () => {