diff --git a/cypress/e2e/driver.ts b/cypress/e2e/driver.ts index 436b7844..b6e98af5 100644 --- a/cypress/e2e/driver.ts +++ b/cypress/e2e/driver.ts @@ -16,6 +16,7 @@ export default { cy.intercept('GET', 'http://localhost:8888/geojson-style.json', { fixture: 'geojson-style.json' }); cy.intercept('GET', 'http://localhost:8888/raster-style.json', { fixture: 'raster-style.json' }); cy.intercept('GET', 'http://localhost:8888/geojson-raster-style.json', { fixture: 'geojson-raster-style.json' }); + cy.intercept({method: 'GET', url: '*example.com/*', },[]); }, setStyle(styleProperties: 'geojson' | 'raster' | 'both' | 'layer' | '', zoom? : number) { diff --git a/package.json b/package.json index 2143dc71..d090253f 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "build": "cross-env NODE_OPTIONS=--openssl-legacy-provider webpack --config config/webpack.production.config.js --progress=profile --color", "profiling-build": "cross-env NODE_OPTIONS=--openssl-legacy-provider webpack --config config/webpack.profiling.config.js --progress=profile --color", "test": "cross-env NODE_OPTIONS=--openssl-legacy-provider cross-env NODE_ENV=test wdio config/wdio.conf.js", + "cy:run": "cypress run", "test-watch": "cross-env NODE_OPTIONS=--openssl-legacy-provider cross-env NODE_ENV=test wdio config/wdio.conf.js --watch", "start": "cross-env NODE_OPTIONS=--openssl-legacy-provider webpack-dev-server --progress=profile --color --config config/webpack.config.js", "start-prod": "cross-env NODE_OPTIONS=--openssl-legacy-provider webpack-dev-server --progress=profile --color --config config/webpack.production.config.js", diff --git a/test/functional/accessibility/index.js b/test/functional/accessibility/index.js deleted file mode 100644 index bb2e903d..00000000 --- a/test/functional/accessibility/index.js +++ /dev/null @@ -1,43 +0,0 @@ -var assert = require("assert"); -var driver = require("../driver"); - -describe("accessibility", function () { - describe("skip links", function() { - beforeEach(async function () { - await driver.setStyle("example-layer-style.json"); - }); - - it("skip link to layer list", async function() { - const selector = driver.getDataAttribute("root:skip:layer-list") - assert(await driver.isExisting(selector)); - await driver.typeKeys(['Tab']); - assert(await driver.isFocused(selector)); - await driver.click(selector); - - assert(await driver.isFocused("#skip-target-layer-list")); - }); - - it("skip link to layer editor", async function() { - const selector = driver.getDataAttribute("root:skip:layer-editor") - assert(await driver.isExisting(selector)); - await driver.typeKeys(['Tab']); - await driver.typeKeys(['Tab']); - assert(await driver.isFocused(selector)); - await driver.click(selector); - - assert(await driver.isFocused("#skip-target-layer-editor")); - }); - - it("skip link to map view", async function() { - const selector = driver.getDataAttribute("root:skip:map-view") - assert(await driver.isExisting(selector)); - await driver.typeKeys(['Tab']); - await driver.typeKeys(['Tab']); - await driver.typeKeys(['Tab']); - assert(await driver.isFocused(selector)); - await driver.click(selector); - - assert(await driver.isFocused(".maplibregl-canvas")); - }); - }); -}) diff --git a/test/functional/history/index.js b/test/functional/history/index.js deleted file mode 100644 index 79ed060e..00000000 --- a/test/functional/history/index.js +++ /dev/null @@ -1,103 +0,0 @@ -var assert = require("assert"); -var driver = require("../driver"); - -describe("history", function() { - let undoKeyCombo; - let undoKeyComboReset; - let redoKeyCombo; - let redoKeyComboReset; - - before(async function() { - const isMac = await driver.isMac(); - undoKeyCombo = ['Meta', 'z']; - undoKeyComboReset = ['Meta']; - redoKeyCombo = isMac ? ['Meta', 'Shift', 'z'] : ['Meta', 'y']; - redoKeyComboReset = isMac ? ['Meta', 'Shift'] : ['Meta']; - }); - - /** - * See - */ - it.skip("undo/redo", async function() { - var styleObj; - - await driver.setStyle(["geojson:example"]) - await driver.openLayersModal(); - - styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, []); - - await driver.fillLayersModal({ - id: "step 1", - type: "background" - }) - - styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - { - "id": "step 1", - "type": 'background' - } - ]); - - await driver.openLayersModal(); - await driver.fillLayersModal({ - id: "step 2", - type: "background" - }) - - styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - { - "id": "step 1", - "type": 'background' - }, - { - "id": "step 2", - "type": 'background' - } - ]); - - await driver.typeKeys(undoKeyCombo); - await driver.typeKeys(undoKeyComboReset); - styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - { - "id": "step 1", - "type": 'background' - } - ]); - - await driver.typeKeys(undoKeyCombo) - await driver.typeKeys(undoKeyComboReset); - styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - ]); - - await driver.typeKeys(redoKeyCombo) - await driver.typeKeys(redoKeyComboReset); - styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - { - "id": "step 1", - "type": 'background' - } - ]); - - await driver.typeKeys(redoKeyCombo) - await driver.typeKeys(redoKeyComboReset); - styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - { - "id": "step 1", - "type": 'background' - }, - { - "id": "step 2", - "type": 'background' - } - ]); - - }); - -}) diff --git a/test/functional/keyboard/index.js b/test/functional/keyboard/index.js deleted file mode 100644 index 8274ce43..00000000 --- a/test/functional/keyboard/index.js +++ /dev/null @@ -1,56 +0,0 @@ -var assert = require("assert"); -var driver = require("../driver"); - -describe("keyboard", function() { - describe("shortcuts", function() { - it("ESC should unfocus", async function() { - const targetSelector = driver.getDataAttribute("nav:inspect") + " select"; - driver.click(targetSelector); - assert(await driver.isFocused(targetSelector)); - - await driver.typeKeys(["Escape"]); - assert(await (await $("body")).isFocused()); - }); - - it("'?' should show shortcuts modal", async function() { - await driver.typeKeys(["?"]); - assert(await driver.isDisplayedInViewport(driver.getDataAttribute("modal:shortcuts"))); - }); - - it("'o' should show open modal", async function() { - await driver.typeKeys(["o"]); - assert(await driver.isDisplayedInViewport(driver.getDataAttribute("modal:open"))); - }); - - it("'e' should show export modal", async function() { - await driver.typeKeys(["e"]); - await driver.sleep(100); - assert(await driver.isDisplayedInViewport(driver.getDataAttribute("modal:export"))); - }); - - it("'d' should show sources modal", async function() { - await driver.typeKeys(["d"]); - assert(await driver.isDisplayedInViewport(driver.getDataAttribute("modal:sources"))); - }); - - it("'s' should show settings modal", async function() { - await driver.typeKeys(["s"]); - assert(await driver.isDisplayedInViewport(driver.getDataAttribute("modal:settings"))); - }); - - it.skip("'i' should change map to inspect mode", async function() { - // await driver.typeKeys(["i"]); - }); - - it("'m' should focus map", async function() { - await driver.typeKeys(["m"]); - assert(await driver.isFocused(".maplibregl-canvas")); - }); - - it("'!' should show debug modal", async function() { - await driver.typeKeys(["!"]); - assert(await driver.isDisplayedInViewport(driver.getDataAttribute("modal:debug"))); - }); - }); - -}); diff --git a/test/functional/layers/index.js b/test/functional/layers/index.js deleted file mode 100644 index 5ab9b328..00000000 --- a/test/functional/layers/index.js +++ /dev/null @@ -1,458 +0,0 @@ -var assert = require("assert"); -var driver = require("../driver"); -var {v1: uuid} = require('uuid'); - -describe("layers", function() { - beforeEach(async function() { - driver.setStyle([ - "geojson:example", - "raster:raster" - ]); - await driver.openLayersModal(); - }); - - describe("ops", function() { - it("delete", async function() { - var styleObj; - var id = await driver.fillLayersModal({ - type: "background" - }) - - styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - { - "id": id, - "type": 'background' - }, - ]); - - await driver.click(driver.getDataAttribute("layer-list-item:"+id+":delete", "")) - - styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - ]); - }); - - it("duplicate", async function() { - var styleObj; - var id = await driver.fillLayersModal({ - type: "background" - }) - - styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - { - "id": id, - "type": 'background' - }, - ]); - - await driver.click(driver.getDataAttribute("layer-list-item:"+id+":copy", "")); - - styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - { - "id": id+"-copy", - "type": "background" - }, - { - "id": id, - "type": "background" - }, - ]); - }); - - it("hide", async function() { - var styleObj; - var id = await driver.fillLayersModal({ - type: "background" - }) - - styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - { - "id": id, - "type": 'background' - }, - ]); - - await driver.click(driver.getDataAttribute("layer-list-item:"+id+":toggle-visibility", "")); - - styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - { - "id": id, - "type": "background", - "layout": { - "visibility": "none" - } - }, - ]); - - await driver.click(driver.getDataAttribute("layer-list-item:"+id+":toggle-visibility", "")); - - styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - { - "id": id, - "type": "background", - "layout": { - "visibility": "visible" - } - }, - ]); - }) - }) - - - describe('background', function () { - - it("add", async function() { - var id = await driver.fillLayersModal({ - type: "background" - }) - - var styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - { - "id": id, - "type": 'background' - } - ]); - }); - - describe("modify", function() { - async function createBackground() { - // Setup - var id = uuid(); - - await driver.selectFromDropdown(driver.getDataAttribute("add-layer.layer-type", "select"), "background"); - await driver.setValue(driver.getDataAttribute("add-layer.layer-id", "input"), "background:"+id); - - await driver.click(driver.getDataAttribute("add-layer")); - - var styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - { - "id": 'background:'+id, - "type": 'background' - } - ]); - return id; - } - - // ====> THESE SHOULD BE FROM THE SPEC - describe("layer", function() { - it("expand/collapse"); - it("id", async function() { - var bgId = await createBackground(); - - await driver.click(driver.getDataAttribute("layer-list-item:background:"+bgId)); - - var id = uuid(); - await driver.setValue(driver.getDataAttribute("layer-editor.layer-id", "input"), "foobar:"+id) - await driver.click(driver.getDataAttribute("min-zoom")); - - var styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - { - "id": 'foobar:'+id, - "type": 'background' - } - ]); - }); - - it("min-zoom", async function() { - var bgId = await createBackground(); - - await driver.click(driver.getDataAttribute("layer-list-item:background:"+bgId)); - await driver.setValue(driver.getDataAttribute("min-zoom", 'input[type="text"]'), 1) - - await driver.click(driver.getDataAttribute("layer-editor.layer-id", "input")); - - var styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - { - "id": 'background:'+bgId, - "type": 'background', - "minzoom": 1 - } - ]); - - // AND RESET! - // await driver.setValue(driver.getDataAttribute("min-zoom", "input"), "") - // await driver.click(driver.getDataAttribute("max-zoom", "input")); - - // var styleObj = await driver.getStyleStore(); - - // assert.deepEqual(styleObj.layers, [ - // { - // "id": 'background:'+bgId, - // "type": 'background' - // } - // ]); - }); - - it("max-zoom", async function() { - var bgId = await createBackground(); - - await driver.click(driver.getDataAttribute("layer-list-item:background:"+bgId)); - await driver.setValue(driver.getDataAttribute("max-zoom", 'input[type="text"]'), 1) - - await driver.click(driver.getDataAttribute("layer-editor.layer-id", "input")); - - var styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - { - "id": 'background:'+bgId, - "type": 'background', - "maxzoom": 1 - } - ]); - }); - - it("comments", async function() { - var bgId = await createBackground(); - var id = uuid(); - - await driver.click(driver.getDataAttribute("layer-list-item:background:"+bgId)); - await driver.setValue(driver.getDataAttribute("layer-comment", "textarea"), id); - - await driver.click(driver.getDataAttribute("layer-editor.layer-id", "input")); - - var styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - { - "id": 'background:'+bgId, - "type": 'background', - metadata: { - 'maputnik:comment': id - } - } - ]); - - // Unset it again. - // TODO: This fails - // await driver.setValue(driver.getDataAttribute("layer-comment", "textarea"), ""); - // await driver.click(driver.getDataAttribute("min-zoom", "input")); - // await driver.zeroTimeout(); - - // var styleObj = await driver.getStyleStore(); - // assert.deepEqual(styleObj.layers, [ - // { - // "id": 'background:'+bgId, - // "type": 'background' - // } - // ]); - }); - - it("color", null, async function() { - var bgId = await createBackground(); - - await driver.click(driver.getDataAttribute("layer-list-item:background:"+bgId)); - - await driver.click(driver.getDataAttribute("spec-field:background-color", "input")); - - var styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - { - "id": 'background:'+bgId, - "type": 'background' - } - ]); - - }) - }) - - describe("filter", function() { - it("expand/collapse"); - it("compound filter"); - }) - - describe("paint", function() { - it("expand/collapse"); - it("color"); - it("pattern"); - it("opacity"); - }) - // <===== - - describe("json-editor", function() { - it("expand/collapse"); - it("modify"); - - // TODO - it.skip("parse error", async function() { - var bgId = await createBackground(); - - - - await driver.click(driver.getDataAttribute("layer-list-item:background:"+bgId)); - - var errorSelector = ".CodeMirror-lint-marker-error"; - assert.equal(await driver.isExisting(errorSelector), false); - - await driver.click(".CodeMirror"); - await driver.keys("\uE013\uE013\uE013\uE013\uE013\uE013\uE013\uE013\uE013\uE013\uE013\uE013 {"); - await driver.waitForExist(errorSelector); - - await driver.click(driver.getDataAttribute("layer-editor.layer-id")); - }); - }); - }) - }); - - describe('fill', function () { - it("add", async function() { - - var id = await driver.fillLayersModal({ - type: "fill", - layer: "example" - }); - - var styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - { - "id": id, - "type": 'fill', - "source": "example" - } - ]); - }) - - // TODO: Change source - it("change source") - }); - - describe('line', function () { - it("add", async function() { - var id = await driver.fillLayersModal({ - type: "line", - layer: "example" - }); - - var styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - { - "id": id, - "type": "line", - "source": "example", - } - ]); - }); - - it("groups", null, function() { - // TODO - // Click each of the layer groups. - }) - }); - - describe('symbol', function () { - it("add", async function() { - var id = await driver.fillLayersModal({ - type: "symbol", - layer: "example" - }); - - var styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - { - "id": id, - "type": "symbol", - "source": "example", - } - ]); - }); - }); - - describe('raster', function () { - it("add", async function() { - var id = await driver.fillLayersModal({ - type: "raster", - layer: "raster" - }); - - var styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - { - "id": id, - "type": "raster", - "source": "raster", - } - ]); - }); - }); - - describe('circle', function () { - it("add", async function() { - var id = await driver.fillLayersModal({ - type: "circle", - layer: "example" - }); - - var styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - { - "id": id, - "type": "circle", - "source": "example", - } - ]); - }); - - }); - - describe('fill extrusion', function () { - it("add", async function() { - var id = await driver.fillLayersModal({ - type: "fill-extrusion", - layer: "example" - }); - - var styleObj = await driver.getStyleStore(); - assert.deepEqual(styleObj.layers, [ - { - "id": id, - "type": 'fill-extrusion', - "source": "example" - } - ]); - }); - }); - - - describe("groups", function() { - it("simple", async function() { - await driver.setStyle(["geojson:example"]); - - await driver.openLayersModal(); - await driver.fillLayersModal({ - id: "foo", - type: "background" - }) - - await driver.openLayersModal(); - await driver.fillLayersModal({ - id: "foo_bar", - type: "background" - }) - - await driver.openLayersModal(); - await driver.fillLayersModal({ - id: "foo_bar_baz", - type: "background" - }) - - assert.equal(await driver.isDisplayedInViewport(driver.getDataAttribute("layer-list-item:foo")), true); - assert.equal(await driver.isDisplayedInViewport(driver.getDataAttribute("layer-list-item:foo_bar")), false); - assert.equal(await driver.isDisplayedInViewport(driver.getDataAttribute("layer-list-item:foo_bar_baz")), false); - - await driver.click(driver.getDataAttribute("layer-list-group:foo-0")); - - assert.equal(await driver.isDisplayedInViewport(driver.getDataAttribute("layer-list-item:foo")), true); - assert.equal(await driver.isDisplayedInViewport(driver.getDataAttribute("layer-list-item:foo_bar")), true); - assert.equal(await driver.isDisplayedInViewport(driver.getDataAttribute("layer-list-item:foo_bar_baz")), true); - - }) - }) -}); diff --git a/test/functional/modals/index.js b/test/functional/modals/index.js deleted file mode 100644 index f589731d..00000000 --- a/test/functional/modals/index.js +++ /dev/null @@ -1,160 +0,0 @@ -var assert = require('assert'); -var driver = require("../driver"); - -describe("modals", function() { - describe("open", function() { - beforeEach(async function() { - - await driver.setStyle(); - await driver.click(driver.getDataAttribute("nav:open")); - await driver.zeroTimeout(); - }); - - it("close", async function() { - await driver.closeModal("modal:open"); - }); - - // "chooseFile" command currently not available for wdio v5 https://github.com/webdriverio/webdriverio/pull/3632 - it.skip("upload", async function() { - await driver.chooseExampleFile(); - - var styleObj = await driver.getStyleStore(); - assert.deepEqual(await driver.getExampleFileData(), styleObj); - }); - - it("load from url", async function() { - var styleFileUrl = driver.getGeoServerUrl("example-style.json"); - - await driver.setValue(driver.getDataAttribute("modal:open.url.input"), styleFileUrl); - - await driver.click(driver.getDataAttribute("modal:open.url.button")) - - // Allow the network request to happen - // NOTE: Its localhost so this should be fast. - await driver.sleep(300); - - var styleObj = await driver.getStyleStore(); - assert.deepEqual(await driver.getExampleFileData(), styleObj); - }); - }) - - describe("shortcuts", function() { - it("open/close", async function() { - await driver.setStyle(); - - await driver.typeKeys(["?"]); - - const modalEl = await $(driver.getDataAttribute("modal:shortcuts")) - assert(await modalEl.isDisplayed()); - - await driver.closeModal("modal:shortcuts"); - }); - - }); - - describe("export", function() { - - beforeEach(async function() { - await driver.setStyle(); - await driver.click(driver.getDataAttribute("nav:export")); - await driver.zeroTimeout(); - }); - - it("close", async function() { - await driver.closeModal("modal:export"); - }); - - // TODO: Work out how to download a file and check the contents - it("download") - - }) - - describe("sources", function() { - it("active sources") - it("public source") - it("add new source") - }) - - describe("inspect", function() { - it("toggle", async function() { - await driver.setStyle(["geojson:example"]); - - await driver.selectFromDropdown(driver.getDataAttribute("nav:inspect", "select"), "inspect"); - }) - }) - - describe("style settings", function() { - beforeEach(async function() { - await driver.setStyle(); - await driver.click(driver.getDataAttribute("nav:settings")); - await driver.zeroTimeout(); - }); - - it("name", async function() { - await driver.setValue(driver.getDataAttribute("modal:settings.name"), "foobar"); - await driver.click(driver.getDataAttribute("modal:settings.owner")); - await driver.zeroTimeout(); - - var styleObj = await driver.getStyleStore(); - assert.equal(styleObj.name, "foobar"); - }) - it("owner", async function() { - await driver.setValue(driver.getDataAttribute("modal:settings.owner"), "foobar") - await driver.click(driver.getDataAttribute("modal:settings.name")); - await driver.zeroTimeout(); - - var styleObj = await driver.getStyleStore(); - assert.equal(styleObj.owner, "foobar"); - }) - it("sprite url", async function() { - await driver.setValue(driver.getDataAttribute("modal:settings.sprite"), "http://example.com") - await driver.click(driver.getDataAttribute("modal:settings.name")); - await driver.zeroTimeout(); - - var styleObj = await driver.getStyleStore(); - assert.equal(styleObj.sprite, "http://example.com"); - }) - it("glyphs url", async function() { - var glyphsUrl = "http://example.com/{fontstack}/{range}.pbf" - await driver.setValue(driver.getDataAttribute("modal:settings.glyphs"), glyphsUrl); - await driver.click(driver.getDataAttribute("modal:settings.name")); - await driver.zeroTimeout(); - - var styleObj = await driver.getStyleStore(); - assert.equal(styleObj.glyphs, glyphsUrl); - }) - - it("maptiler access token", async function() { - var apiKey = "testing123"; - await driver.setValue(driver.getDataAttribute("modal:settings.maputnik:openmaptiles_access_token"), apiKey); - await driver.click(driver.getDataAttribute("modal:settings.name")); - await driver.zeroTimeout(); - - var styleObj = await driver.getStyleStore(); - assert.equal(styleObj.metadata["maputnik:openmaptiles_access_token"], apiKey); - }) - - it("thunderforest access token", async function() { - var apiKey = "testing123"; - await driver.setValue(driver.getDataAttribute("modal:settings.maputnik:thunderforest_access_token"), apiKey); - await driver.click(driver.getDataAttribute("modal:settings.name")); - await driver.zeroTimeout(); - - var styleObj = await driver.getStyleStore(); - assert.equal(styleObj.metadata["maputnik:thunderforest_access_token"], apiKey); - }) - - it("style renderer", async function() { - await driver.selectFromDropdown(driver.getDataAttribute("modal:settings.maputnik:renderer"), "ol"); - await driver.click(driver.getDataAttribute("modal:settings.name")); - await driver.zeroTimeout(); - - var styleObj = await driver.getStyleStore(); - assert.equal(styleObj.metadata["maputnik:renderer"], "ol"); - }) - }) - - describe("sources", function() { - it("toggle") - }) -})