Spaces:
Running
Running
| const fs = require("../server/fs_promises.js"); | |
| const os = require("os"); | |
| const path = require("path"); | |
| const PORT = 8487; | |
| const SERVER = "http://localhost:" + PORT; | |
| let wbo, data_path, tokenQuery; | |
| async function beforeEach(browser, done) { | |
| data_path = await fs.promises.mkdtemp( | |
| path.join(os.tmpdir(), "wbo-test-data-"), | |
| ); | |
| process.env["PORT"] = PORT; | |
| process.env["WBO_HISTORY_DIR"] = data_path; | |
| if (browser.globals.token) { | |
| process.env["AUTH_SECRET_KEY"] = "test"; | |
| tokenQuery = "token=" + browser.globals.token; | |
| } | |
| console.log("Launching WBO in " + data_path); | |
| wbo = require("../server/server.js"); | |
| done(); | |
| } | |
| async function afterEach(browser, done) { | |
| wbo.close(); | |
| done(); | |
| } | |
| function testPencil(browser) { | |
| return browser.assert | |
| .titleContains("WBO") | |
| .click(".tool[title ~= Crayon]") // pencil | |
| .assert.hasClass(".tool[title ~= Crayon]", "curTool") | |
| .executeAsync(async function (done) { | |
| function sleep(t) { | |
| return new Promise(function (accept) { | |
| setTimeout(accept, t); | |
| }); | |
| } | |
| // A straight path with just two points | |
| Tools.setColor("#123456"); | |
| Tools.curTool.listeners.press(100, 200, new Event("mousedown")); | |
| await sleep(80); | |
| Tools.curTool.listeners.release(300, 400, new Event("mouseup")); | |
| // A line with three points that form an "U" shape | |
| await sleep(80); | |
| Tools.setColor("#abcdef"); | |
| Tools.curTool.listeners.press(0, 0, new Event("mousedown")); | |
| await sleep(80); | |
| Tools.curTool.listeners.move(90, 120, new Event("mousemove")); | |
| await sleep(80); | |
| Tools.curTool.listeners.release(180, 0, new Event("mouseup")); | |
| done(); | |
| }) | |
| .assert.visible( | |
| "path[d='M 100 200 L 100 200 C 100 200 300 400 300 400'][stroke='#123456']", | |
| ) | |
| .assert.visible( | |
| "path[d='M 0 0 L 0 0 C 0 0 40 120 90 120 C 140 120 180 0 180 0'][stroke='#abcdef']", | |
| ) | |
| .refresh() | |
| .waitForElementVisible( | |
| "path[d='M 100 200 L 100 200 C 100 200 300 400 300 400'][stroke='#123456']", | |
| ) | |
| .assert.visible( | |
| "path[d='M 0 0 L 0 0 C 0 0 40 120 90 120 C 140 120 180 0 180 0'][stroke='#abcdef']", | |
| ) | |
| .url(SERVER + "/preview/anonymous?" + tokenQuery) | |
| .waitForElementVisible( | |
| "path[d='M 100 200 L 100 200 C 100 200 300 400 300 400'][stroke='#123456']", | |
| ) | |
| .assert.visible( | |
| "path[d='M 0 0 L 0 0 C 0 0 40 120 90 120 C 140 120 180 0 180 0'][stroke='#abcdef']", | |
| ) | |
| .back(); | |
| } | |
| function testCircle(browser) { | |
| return browser | |
| .click("#toolID-Ellipse") | |
| .executeAsync(function (done) { | |
| Tools.setColor("#112233"); | |
| Tools.curTool.listeners.press(200, 400, new Event("mousedown")); | |
| setTimeout(() => { | |
| const evt = new Event("mousemove"); | |
| evt.shiftKey = true; | |
| Tools.curTool.listeners.move(0, 0, evt); | |
| done(); | |
| }, 100); | |
| }) | |
| .assert.visible( | |
| "ellipse[cx='0'][cy='200'][rx='200'][ry='200'][stroke='#112233']", | |
| ) | |
| .refresh() | |
| .waitForElementVisible( | |
| "ellipse[cx='0'][cy='200'][rx='200'][ry='200'][stroke='#112233']", | |
| 15000, | |
| ) | |
| .click("#toolID-Ellipse") // Click the ellipse tool | |
| .click("#toolID-Ellipse") // Click again to toggle | |
| .assert.textContains("#toolID-Ellipse .tool-name", "Cercle"); // Circle in french | |
| } | |
| function testCursor(browser) { | |
| return browser | |
| .execute(function (done) { | |
| Tools.setColor("#456123"); // Move the cursor over the board | |
| var e = new Event("mousemove"); | |
| e.pageX = 150; | |
| e.pageY = 200; | |
| Tools.board.dispatchEvent(e); | |
| }) | |
| .assert.cssProperty( | |
| "#cursor-me", | |
| "transform", | |
| "matrix(1, 0, 0, 1, 150, 200)", | |
| ) | |
| .assert.attributeEquals("#cursor-me", "fill", "#456123"); | |
| } | |
| function testCollaborativeness(browser) { | |
| const boardUrl = SERVER + "/boards/collaborative-test?lang=en&" + tokenQuery; | |
| return browser | |
| .url(boardUrl) | |
| .waitForElementVisible(".tool[title ~= Pencil]") | |
| .click(".tool[title ~= Pencil]") | |
| .assert.hasClass(".tool[title ~= Pencil]", "curTool") | |
| .window.open() | |
| .window.getAllHandles(function (result) { | |
| const handles = result.value; | |
| const newWindowHandle = handles[handles.length - 1]; | |
| browser.window | |
| .switchTo(newWindowHandle) | |
| .url(boardUrl) | |
| .window.switchTo(handles[0]) | |
| .executeAsync(function (done) { | |
| Tools.setColor("#ff0000"); | |
| Tools.curTool.listeners.press(100, 100, new Event("mousedown")); | |
| Tools.curTool.listeners.move(200, 200, new Event("mousemove")); | |
| Tools.curTool.listeners.release(200, 200, new Event("mouseup")); | |
| done(); | |
| }) | |
| .window.switchTo(newWindowHandle) | |
| .waitForElementVisible("path[d^='M 100 100'][stroke='#ff0000']") | |
| .assert.visible("path[d^='M 100 100'][stroke='#ff0000']") | |
| .window.close() | |
| .window.switchTo(handles[0]); | |
| }); | |
| } | |
| function testBoard(browser) { | |
| var page = browser | |
| .url(SERVER + "/boards/anonymous?lang=fr&" + tokenQuery) | |
| .waitForElementVisible(".tool[title ~= Crayon]"); | |
| page = testPencil(page); | |
| page = testCircle(page); | |
| page = testCursor(page); | |
| page = testCollaborativeness(page); | |
| // test hideMenu | |
| browser | |
| .url(SERVER + "/boards/anonymous?lang=fr&hideMenu=true&" + tokenQuery) | |
| .waitForElementNotVisible("#menu"); | |
| browser | |
| .url(SERVER + "/boards/anonymous?lang=fr&hideMenu=false&" + tokenQuery) | |
| .waitForElementVisible("#menu"); | |
| if (browser.globals.token) { | |
| //has moderator jwt and no board name | |
| browser | |
| .url( | |
| SERVER + | |
| "/boards/testboard?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJyb2xlcyI6WyJtb2RlcmF0b3IiXX0.PqYHmV0loeKwyLLYZ1a1eIXBCCaa3t5lYUTu_P_-i14", | |
| ) | |
| .waitForElementVisible("#toolID-Clear"); | |
| //has moderator JWT and other board name | |
| browser | |
| .url( | |
| SERVER + | |
| "/boards/testboard123?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJyb2xlcyI6WyJtb2RlcmF0b3IiXX0.PqYHmV0loeKwyLLYZ1a1eIXBCCaa3t5lYUTu_P_-i14", | |
| ) | |
| .waitForElementVisible("#toolID-Clear"); | |
| //has moderator JWT and board name match board name in url | |
| browser | |
| .url( | |
| SERVER + | |
| "/boards/testboard?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJyb2xlcyI6WyJtb2RlcmF0b3I6dGVzdGJvYXJkIl19.UVf6awGEChVxcWBbt6dYoNH0Scq7cVD_xfQn-U8A1lw", | |
| ) | |
| .waitForElementVisible("#toolID-Clear"); | |
| //has moderator JWT and board name NOT match board name in url | |
| browser | |
| .url( | |
| SERVER + | |
| "/boards/testboard123?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJyb2xlcyI6WyJtb2RlcmF0b3I6dGVzdGJvYXJkIl19.UVf6awGEChVxcWBbt6dYoNH0Scq7cVD_xfQn-U8A1lw", | |
| ) | |
| .waitForElementNotPresent("#menu"); | |
| //has editor JWT and no boardname provided | |
| browser | |
| .url( | |
| SERVER + | |
| "/boards/testboard?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJyb2xlcyI6WyJlZGl0b3IiXX0.IJehwM8tPVQFzJ2fZMBHveii1DRChVtzo7PEnSmmFt8", | |
| ) | |
| .waitForElementNotPresent("#toolID-Clear"); | |
| browser | |
| .url( | |
| SERVER + | |
| "/boards/testboard?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJyb2xlcyI6WyJlZGl0b3IiXX0.IJehwM8tPVQFzJ2fZMBHveii1DRChVtzo7PEnSmmFt8", | |
| ) | |
| .waitForElementVisible("#menu"); | |
| //has editor JWT and boardname provided and match to the board in the url | |
| browser | |
| .url( | |
| SERVER + | |
| "/boards/testboard?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJyb2xlcyI6WyJlZGl0bzp0ZXN0Ym9hcmQiXX0.-P6gjYlPP5I2zgSoVTlADdesVPfSXV-JXZQK5uh3Xwo", | |
| ) | |
| .waitForElementVisible("#menu"); | |
| browser | |
| .url( | |
| SERVER + | |
| "/boards/testboard?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJyb2xlcyI6WyJlZGl0bzp0ZXN0Ym9hcmQiXX0.-P6gjYlPP5I2zgSoVTlADdesVPfSXV-JXZQK5uh3Xwo", | |
| ) | |
| .waitForElementNotPresent("#toolID-Clear"); | |
| //has editor JWT and boardname provided and and not match to the board in the url | |
| browser | |
| .url( | |
| SERVER + | |
| "/boards/testboard123?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJyb2xlcyI6WyJlZGl0bzp0ZXN0Ym9hcmQiXX0.-P6gjYlPP5I2zgSoVTlADdesVPfSXV-JXZQK5uh3Xwo", | |
| ) | |
| .waitForElementNotPresent("#menu"); | |
| //is moderator and boardname contains ":" | |
| browser | |
| .url( | |
| SERVER + | |
| "/boards/test:board?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJyb2xlcyI6WyJtb2RlcmF0b3I6dGVzdDpib2FyZCJdfQ.LKYcDccheD2oXAMAemxSekDeowGsMl29CFkgJgwbkGE", | |
| ) | |
| .waitForElementNotPresent("#menu"); | |
| browser | |
| .url( | |
| SERVER + | |
| "/boards/testboard?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJyb2xlcyI6WyJtb2RlcmF0b3I6dGVzdDpib2FyZCJdfQ.LKYcDccheD2oXAMAemxSekDeowGsMl29CFkgJgwbkGE", | |
| ) | |
| .waitForElementNotPresent("#menu"); | |
| } | |
| page.end(); | |
| } | |
| module.exports = { beforeEach, testBoard, afterEach }; | |