Skip to content

Commit ddbd839

Browse files
committed
Merge remote-tracking branch 'origin/master' into geometry-update
2 parents d25414c + 69c7860 commit ddbd839

File tree

13 files changed

+154
-217
lines changed

13 files changed

+154
-217
lines changed

.github/workflows/ci-regression.yml

+4-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,10 @@ jobs:
4545
# If we run out cypress test runs then we temporarily expand the timeout to 4hrs until cypress cloud is available
4646
# again
4747
# timeout-minutes: 240
48-
container: cypress/browsers:node-20.11.0-chrome-121.0.6167.184-1-ff-123.0-edge-121.0.2277.128-1
48+
container:
49+
image: cypress/browsers:node-20.11.0-chrome-121.0.6167.184-1-ff-123.0-edge-121.0.2277.128-1
50+
# This is needed so the commit info can be recorded by cypress
51+
options: --user 1001
4952
strategy:
5053
# when one test fails, DO NOT cancel the other
5154
# containers, because this will kill Cypress processes

.github/workflows/ci.yml

+4-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,10 @@ jobs:
7272
token: ${{ secrets.CODECOV_TOKEN }}
7373
cypress:
7474
runs-on: ubuntu-latest
75-
container: cypress/browsers:node-20.11.0-chrome-121.0.6167.184-1-ff-123.0-edge-121.0.2277.128-1
75+
container:
76+
image: cypress/browsers:node-20.11.0-chrome-121.0.6167.184-1-ff-123.0-edge-121.0.2277.128-1
77+
# This is needed so the commit info can be recorded by cypress
78+
options: --user 1001
7679
strategy:
7780
# when one test fails, DO NOT cancel the other
7881
# containers, because this will kill Cypress processes

.github/workflows/manual-regression.yml

+4-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,10 @@ on:
6262
jobs:
6363
all-tests:
6464
runs-on: ubuntu-latest
65-
container: cypress/browsers:node-20.11.0-chrome-121.0.6167.184-1-ff-123.0-edge-121.0.2277.128-1
65+
container:
66+
image: cypress/browsers:node-20.11.0-chrome-121.0.6167.184-1-ff-123.0-edge-121.0.2277.128-1
67+
# This is needed so the commit info can be recorded by cypress
68+
options: --user 1001
6669
if: ${{ github.event.inputs.test == 'all' }}
6770
strategy:
6871
# when one test fails, DO NOT cancel the other

.github/workflows/regression-daily.yml

+4-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ on:
66
jobs:
77
all-tests:
88
runs-on: ubuntu-latest
9-
container: cypress/browsers:node-20.11.0-chrome-121.0.6167.184-1-ff-123.0-edge-121.0.2277.128-1
9+
container:
10+
image: cypress/browsers:node-20.11.0-chrome-121.0.6167.184-1-ff-123.0-edge-121.0.2277.128-1
11+
# This is needed so the commit info can be recorded by cypress
12+
options: --user 1001
1013
strategy:
1114
# when one test fails, DO NOT cancel the other
1215
# containers, because this will kill Cypress processes

cypress/e2e/functional/document_tests/tiles_copy_test_spec.js

+57-7
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import DataCardToolTile from '../../../support/elements/tile/DataCardToolTile';
99
import DataflowToolTile from '../../../support/elements/tile/DataflowToolTile';
1010
import SimulatorTile from '../../../support/elements/tile/SimulatorTile';
1111
import DiagramToolTile from '../../../support/elements/tile/DiagramToolTile';
12+
import XYPlotToolTile from "../../../support/elements/tile/XYPlotToolTile";
1213

1314
const student5 = `${Cypress.config("qaUnitStudent5")}`;
1415
const student6 = `${Cypress.config("qaUnitStudent6")}`;
@@ -22,22 +23,28 @@ let clueCanvas = new ClueCanvas,
2223
dc = new DataCardToolTile,
2324
dataflowToolTile = new DataflowToolTile,
2425
simulatorTile = new SimulatorTile,
25-
diagramTile = new DiagramToolTile;
26+
diagramTile = new DiagramToolTile,
27+
graphTile = new XYPlotToolTile;
2628
let canvas = new Canvas;
2729

2830
const imageName = "Image Tile";
2931
const simName = "Test Simulation";
3032
const diagramName = "Test Diagram";
33+
const categoricalGraphName = "Categorical Graph Test";
34+
const categoricalGraphCopyName = "Categorical Graph Test 1";
35+
3136
const studentWorkspace = 'QA 1.1 Solving a Mystery with Proportional Reasoning';
3237
const studentWorkspaceCopyTiles = 'Test Workspace Copy Tiles';
3338
const studentClassWorkCopyTiles = 'Test Class Work Copy Tiles';
3439

35-
const tiles1 = [{ "name": "table" },
36-
{ "name": "geometry" },
37-
{ "name": "drawing" },
38-
{ "name": "expression" },
39-
{ "name": "numberline" },
40-
{ "name": "image" }];
40+
const tiles1 = [
41+
{ "name": "table" },
42+
{ "name": "geometry" },
43+
{ "name": "drawing" },
44+
{ "name": "expression" },
45+
{ "name": "numberline" },
46+
{ "name": "image" }
47+
];
4148
const tiles2 = [
4249
{ "name": "data-card" },
4350
{ "name": "dataflow" },
@@ -300,3 +307,46 @@ context('Test copy tiles from one document to other document', function () {
300307

301308
});
302309
});
310+
311+
context("Test copy tile within a document", function () {
312+
it("Copies a graph tile within a document", function () {
313+
beforeTest(student5);
314+
315+
// Add table tile and populate it with categorical data.
316+
cy.log("Add table tile with categorical data");
317+
clueCanvas.addTile("table");
318+
cy.get(".primary-workspace").within((workspace) => {
319+
tableToolTile.typeInTableCellXY(0, 0, "small");
320+
tableToolTile.getTableCellXY(0, 0).should("contain", "small");
321+
tableToolTile.typeInTableCellXY(1, 0, "medium");
322+
tableToolTile.getTableCellXY(1, 0).should("contain", "medium");
323+
tableToolTile.typeInTableCellXY(0, 1, "red");
324+
tableToolTile.getTableCellXY(0, 1).should("contain", "red");
325+
tableToolTile.typeInTableCellXY(1, 1, "green");
326+
tableToolTile.getTableCellXY(1, 1).should("contain", "green");
327+
});
328+
329+
// Graph the table data in a new graph tile
330+
cy.get("[data-original-title='Graph It!']").click();
331+
cy.get("[data-test=link-tile-select]").select("New Graph");
332+
cy.get(".modal-button").contains("Graph It").click();
333+
graphTile.getTile().should("have.length", 1);
334+
graphTile.getXYPlotTitle().first().should("contain", "Graph 1");
335+
graphTile.getXYPlotTitle().first().click();
336+
cy.get(".primary-workspace .graph-wrapper .editable-tile-title").first().type(categoricalGraphName + "{enter}");
337+
graphTile.getXYPlotTitle().first().should("contain", categoricalGraphName);
338+
graphTile.getGraphDot().should("have.length", 2).each(($g) => {
339+
cy.wrap($g).should("have.attr", "transform").should("not.be.empty");
340+
});
341+
342+
// Click on new graph tile to select it, then copy it
343+
graphTile.getTile().first().click();
344+
cy.get("[data-testid=tool-duplicate]").click();
345+
graphTile.getTile().should("have.length", 2);
346+
graphTile.getXYPlotTitle().eq(1).should("contain", categoricalGraphCopyName);
347+
graphTile.getTile().eq(1).find("g.graph-dot").should("have.length", 2).each(($g) => {
348+
cy.wrap($g).should("have.attr", "transform").should("not.be.empty");
349+
});
350+
351+
});
352+
});

cypress/e2e/functional/teacher_tests/teacher_sort_work_view_spec.js

+3
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ describe('SortWorkView Tests', () => {
6666

6767

6868
it("should open Sort Work tab and test sorting by group", () => {
69+
// Clear data before the test so it can be retried and will start with a clean slate
70+
cy.clearQAData('all');
71+
6972
const students = ["student:1", "student:2", "student:3", "student:4"];
7073
const studentProblemDocs = [
7174
`Student 1: ${title}`,

cypress/e2e/functional/tile_tests/datacard_merge_spec.js

+18-96
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
11
import ClueCanvas from '../../../support/elements/common/cCanvas';
2-
import Canvas from '../../../support/elements/common/Canvas';
32
import DataCardToolTile from '../../../support/elements/tile/DataCardToolTile';
43

54
let clueCanvas = new ClueCanvas;
65
let dc = new DataCardToolTile;
7-
let canvas = new Canvas;
8-
let studentWorkspace = 'SAS 1.1 Solving a Mystery with Proportional Reasoning';
9-
const dataTransfer = new DataTransfer;
106

117
function beforeTest() {
128
const queryParams = `${Cypress.config("qaUnitStudent5")}`;
@@ -15,14 +11,6 @@ function beforeTest() {
1511
cy.waitForLoad();
1612
}
1713

18-
function openMyWork() {
19-
cy.wait(2000);
20-
clueCanvas.getInvestigationCanvasTitle().text().then((investigationTitle) => {
21-
cy.openTopTab('my-work');
22-
cy.openDocumentThumbnail('my-work', 'workspaces', investigationTitle);
23-
});
24-
}
25-
2614
context('Merge Data Card Tool Tile', function () {
2715
it("Merge Data Card Tool Tile", () => {
2816
beforeTest();
@@ -64,12 +52,9 @@ context('Merge Data Card Tool Tile', function () {
6452
dc.getTile(1).should("exist");
6553
dc.getTileTitle(1).should("have.text", "Card Deck Data 2");
6654

67-
dc.getTile(0).find(".data-card-tool")
68-
.trigger('dragstart', { dataTransfer }).then(() => {
69-
dc.getTile(1).find(".data-card-tool .data-card-header-row")
70-
.trigger('drop', { dataTransfer, force: true })
71-
.trigger('dragend', { dataTransfer, force: true });
72-
});
55+
dc.getMergeDataButton(1).click();
56+
dc.getMergeDataModalSelect().select("Card Deck Data 1");
57+
dc.getMergeDataModalAddDataButton().click();
7358

7459
dc.getAttrs(0).should("have.length", 1);
7560
dc.getCardNofTotalListing(0).should("have.text", "Card 1 of 1");
@@ -98,12 +83,9 @@ context('Merge Data Card Tool Tile', function () {
9883
dc.getTile(1).should("exist");
9984
dc.getTileTitle(1).should("have.text", "Card Deck Data 2");
10085

101-
dc.getTile(0).find(".data-card-tool")
102-
.trigger('dragstart', { dataTransfer }).then(() => {
103-
dc.getTile(1).find(".data-card-tool .data-card-header-row")
104-
.trigger('drop', { dataTransfer, force: true })
105-
.trigger('dragend', { dataTransfer, force: true });
106-
});
86+
dc.getMergeDataButton(1).click();
87+
dc.getMergeDataModalSelect().select("Card Deck Data 1");
88+
dc.getMergeDataModalAddDataButton().click();
10789

10890
dc.getAttrs(0).should("have.length", 1);
10991
dc.getCardNofTotalListing(0).should("have.text", "Card 1 of 1");
@@ -140,12 +122,9 @@ context('Merge Data Card Tool Tile', function () {
140122
dc.getAttrName(1).contains("Attr1 Name");
141123
dc.getAttrValue(1).click().type("Attr1 Value{enter}");
142124

143-
dc.getTile(0).find(".data-card-tool")
144-
.trigger('dragstart', { dataTransfer }).then(() => {
145-
dc.getTile(1).find(".data-card-tool .data-card-header-row")
146-
.trigger('drop', { dataTransfer, force: true })
147-
.trigger('dragend', { dataTransfer, force: true });
148-
});
125+
dc.getMergeDataButton(1).click();
126+
dc.getMergeDataModalSelect().select("Card Deck Data 1");
127+
dc.getMergeDataModalAddDataButton().click();
149128

150129
dc.getAttrs(0).should("have.length", 1);
151130
dc.getCardNofTotalListing(0).should("have.text", "Card 1 of 1");
@@ -186,12 +165,9 @@ context('Merge Data Card Tool Tile', function () {
186165
dc.getAttrName(1).contains("Attr2 Name");
187166
dc.getAttrValue(1).click().type("Attr2 Value{enter}");
188167

189-
dc.getTile(0).find(".data-card-tool")
190-
.trigger('dragstart', { dataTransfer }).then(() => {
191-
dc.getTile(1).find(".data-card-tool .data-card-header-row")
192-
.trigger('drop', { dataTransfer, force: true })
193-
.trigger('dragend', { dataTransfer, force: true });
194-
});
168+
dc.getMergeDataButton(1).click();
169+
dc.getMergeDataModalSelect().select("Card Deck Data 1");
170+
dc.getMergeDataModalAddDataButton().click();
195171

196172
dc.getAttrs(0).should("have.length", 1);
197173
dc.getCardNofTotalListing(0).should("have.text", "Card 1 of 1");
@@ -232,12 +208,9 @@ context('Merge Data Card Tool Tile', function () {
232208
dc.getAttrName(1).contains("Attr1 Name");
233209
dc.getAttrValue(1).click().type("Attr2 Value{enter}");
234210

235-
dc.getTile(0).find(".data-card-tool")
236-
.trigger('dragstart', { dataTransfer }).then(() => {
237-
dc.getTile(1).find(".data-card-tool .data-card-header-row")
238-
.trigger('drop', { dataTransfer, force: true })
239-
.trigger('dragend', { dataTransfer, force: true });
240-
});
211+
dc.getMergeDataButton(1).click();
212+
dc.getMergeDataModalSelect().select("Card Deck Data 1");
213+
dc.getMergeDataModalAddDataButton().click();
241214

242215
dc.getAttrs(1).should("have.length", 1);
243216
dc.getCardNofTotalListing(1).should("have.text", "Card 1 of 2");
@@ -275,12 +248,9 @@ context('Merge Data Card Tool Tile', function () {
275248
dc.getSortSelect(1).select("Attr2 Name");
276249
dc.getSortView(1).should('exist');
277250

278-
dc.getTile(0).find(".data-card-tool")
279-
.trigger('dragstart', { dataTransfer }).then(() => {
280-
dc.getTile(1).find(".data-card-tool .data-card-header-row")
281-
.trigger('drop', { dataTransfer, force: true })
282-
.trigger('dragend', { dataTransfer, force: true });
283-
});
251+
dc.getMergeDataButton(1).click();
252+
dc.getMergeDataModalSelect().select("Card Deck Data 1");
253+
dc.getMergeDataModalAddDataButton().click();
284254

285255
dc.getSortSelect(1).select("None");
286256
dc.getSingleCardView(1).should('exist');
@@ -301,52 +271,4 @@ context('Merge Data Card Tool Tile', function () {
301271
dc.getPreviousCardButton(1).click();
302272
dc.getCardNofTotalListing(1).should("have.text", "Card 1 of 2");
303273
});
304-
305-
it("merge Data card tool tile across documents", () => {
306-
beforeTest();
307-
openMyWork();
308-
clueCanvas.addTile("datacard");
309-
dc.getTile(0).should("exist");
310-
dc.getTileTitle(0).should("have.text", "Card Deck Data 1");
311-
312-
dc.getAttrName(0).dblclick().type("Attr1 Name{enter}");
313-
dc.getAttrName(0).contains("Attr1 Name");
314-
dc.getAttrValue(0).click().type("Attr1 Value{enter}");
315-
316-
cy.log("opens document in main doc on the left");
317-
canvas.createNewExtraDocumentFromFileMenu(studentWorkspace, "my-work");
318-
319-
cy.log("creates a Data Card tool tile in new personal workspace");
320-
clueCanvas.addTile("datacard");
321-
dc.getTile(0).should("exist");
322-
dc.getTileTitle(0).should("have.text", "Card Deck Data 1");
323-
324-
dc.getAttrName(0).dblclick().type("Attr2 Name{enter}");
325-
dc.getAttrName(0).contains("Attr2 Name");
326-
dc.getAttrValue(0).click().type("Attr2 Value{enter}");
327-
328-
cy.log("merge Data card tool tile from left to right");
329-
dc.getTile(0, "[data-test=\"subtab-workspaces\"] .editable-document-content").find(".data-card-tool")
330-
.trigger('dragstart', { dataTransfer }).then(() => {
331-
dc.getTile(0).find(".data-card-tool .data-card-header-row")
332-
.trigger('drop', { dataTransfer, force: true })
333-
.trigger('dragend', { dataTransfer, force: true });
334-
});
335-
336-
dc.getAttrs(0).should("have.length", 2);
337-
dc.getCardNofTotalListing(0).should("have.text", "Card 1 of 2");
338-
dc.getAttrName(0).eq(0).should("have.text", "Attr2 Name");
339-
dc.getAttrValue(0).eq(0).invoke("val").should("contain", "Attr2 Value");
340-
dc.getAttrName(0).eq(1).should("have.text", "Attr1 Name");
341-
dc.getAttrValue(0).eq(1).invoke("val").should("be.empty");
342-
dc.getNextCardButton(0).click();
343-
dc.getCardNofTotalListing(0).should("have.text", "Card 2 of 2");
344-
dc.getAttrs(0).should("have.length", 2);
345-
dc.getAttrName(0).eq(0).should("have.text", "Attr2 Name");
346-
dc.getAttrValue(0).eq(0).invoke("val").should("be.empty");
347-
dc.getAttrName(0).eq(1).should("have.text", "Attr1 Name");
348-
dc.getAttrValue(0).eq(1).invoke("val").should("contain", "Attr1 Value");
349-
dc.getPreviousCardButton(0).click();
350-
dc.getCardNofTotalListing(0).should("have.text", "Card 1 of 2");
351-
});
352274
});

cypress/support/elements/common/cHeader.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,14 @@ class ClueHeader{
1010
getGroupMembers(){
1111
return cy.get('[data-test=group-members]');
1212
}
13-
13+
1414
leaveGroup(){
1515
this.getGroupName().click();
1616
dialog.getDialogTitle().should('contain', 'Leave Group');
1717
dialog.getDialogOKButton().click();
18+
19+
// Wait a little bit to make sure this group change makes it to the database
20+
cy.wait(500);
1821
}
1922

2023
cancelLeaveGroup(){

dependencies-notes.md

-3
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,6 @@ Notes on dependencies, particularly reasons for not updating to their latest ver
1212
|@types/react-dom |17.0.17 |18.0.6 |React 18 |
1313
|@types/react-tabs |2.3.4 |5.0.5 |Versions 3 and 4 were never published(?); Version 5 requires React 18 |
1414
|@types/slate-react |0.22.9 |0.50.1 |Requires slate-editor library update to latest slate |
15-
|cypress |9.7.0 |10.6.0 |Cypress 10 requires non-trivial migration. |
16-
|cypress-commands |2.0.1 |3.0.0 |Cypress 10 |
17-
|cypress-terminal-report |3.5.2 |4.1.2 |Cypress 10 |
1815

1916
## Runtime Dependencies
2017

package-lock.json

+7-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@
169169
"cross-env": "^7.0.3",
170170
"css-loader": "^6.7.1",
171171
"cypress": "^13.5.0",
172-
"cypress-commands": "2.0.1",
172+
"cypress-commands": "3.0.0",
173173
"cypress-file-upload": "^5.0.8",
174174
"cypress-terminal-report": "^4.1.2",
175175
"enquirer": "^2.3.6",

0 commit comments

Comments
 (0)