* wip - upgrade to slate 0.43 * wip * wip * wip * wip * wip * wip * wip * finish list handling logic * add plugins directory * tests wip * setup testing * wip * add selection commands * finish list testing * stuff * add codemirror * abstract codemirror from slate * wip * wip * wip * wip * wip * wip * wip * wip * wip * codemirror mostly working, some bugs * upgrade to slate 46 * upgrade to slate 47 * wip * wip * progress * wip * mostly working links with surrounding marks * wip * tests passing * add test * fix formatting * update snapshots * close self closing tag in markdown html output * wip - commonmark * hold on commonmark work * all tests passing * fix e2e specs * ignore tests in esm builds * break/backspace plugins wip * finish enter/backspace spec * fix soft break handling * wip - editor component deletion * add insertion points * make insertion points invisible * fix empty mark nodes output to markdown * fix pasting * improve insertion points * add static bottom insertion point * improve click handling at insertion points * restore current table functionality * add paste support for Slate fragments * support cut/copy markdown, paste between rich/raw editor * fix copy paste * wip - paste/select bug fixing * fixed known slate issues * split plugins * fix editor toggles * force text cursor in code widget * wip - reorg plugins * finish markdown control reorg * configure plugin types * quote block adjacent handling with tests * wip * finish quote logic and tests * fix copy paste plugin migration regressions * fix force insert before node * fix trailing insertion point * remove empty headers * codemirror working properly in markdown widget * return focus to codemirror on lang select enter * fix state issues for widgets with local state * wip - vim working, just need to work out distribution * add settings pane * wip - default modes * fix deps * add programming language data * implement linguist langs in code widget * everything built in * remove old registration code, fix focus styling * fix/update linting setup * fix js lint errors * remove stylelint from format script * fix remaining linting errors * fix reducer test failures * chore: update commitlint for worktree support * chore: fix remaining tests * chore: drop unused monaco plugin * chore: remove extraneous global styles rendering * chore: fix failing tests * fix: tests * fix: quote/list nesting (tests still broken) * fix: update quote tests * chore: bring back code widget test config * fix: autofocus * fix: code blocks without the code widget * fix: code editor component state issues * fix: error * fix: add code block test, few fixes * chore: remove notes * fix: [wip] update stateful shortcodes on undo/redo * fix: support code styled links, handle unknown langs * fix: few fixes * fix: autofocus on insert, focus on all clicks * fix: linting * fix: autofocus * fix: update code block fixture * fix: remove unused cypress snapshot plugin * fix: drop node 8 test, add node 12 * fix: use lodash.flatten instead of Array.flat * fix: remove console logs
Cypress Tests Guide
Introduction
Cypress is a JavaScript End to End Testing Framework that runs in the browser.
Cypress tests run with a local version of the CMS.
During the setup of a spec file, the relevant index.html
and config.yml
are copied from dev-test/backends/<backend>
to dev-test
.
Tests for the test
backend use mock data generated in dev-test/backends/test/index.html
.
Tests for the github
backend use previously recorded data and stub fetch
calls. See more about recording tests data here.
Run Tests Locally
yarn test:e2e # builds the demo site and runs Cypress in headless mode with mock data
Debug Tests
yarn develop # starts a local dev server with the demo site
yarn test:e2e:exec # runs Cypress in non-headless mode with mock data
Recording Tests Data
Currently only relevant for
github
backend tests.
When recording tests, access to the GitHub API is required, thus one must set up a .env
file in the root project directory in the following format:
GITHUB_REPO_OWNER=owner
GITHUB_REPO_NAME=repo
GITHUB_REPO_TOKEN=tokenWithWritePermissions
GITHUB_OPEN_AUTHORING_OWNER=forkOwner
GITHUB_OPEN_AUTHORING_TOKEN=tokenWithWritePermissions
The structure of the repo designated by
GITHUB_REPO_OWNER/GITHUB_REPO_NAME
should match the settings inconfig.yml
To start a recording run the following commands:
yarn develop # starts a local dev server with the demo site
yarn mock:server:start # starts the recording proxy
yarn test:e2e:record-fixtures:dev # runs Cypress in non-headless and pass data through the recording proxy
yarn mock:server:stop # stops the recording proxy
During the recorded process a clone of
GITHUB_REPO_NAME
will be created under.temp
and reset between tests.
Recordings are sanitized from any possible sensitive data and transformed into an easier to process format.
To avoid recording all the tests over and over again, a recommended process is to:
- Mark the specific test as
only
by changingit("some test...
toit.only("some test...
for the relevant test. - Run the test in recording mode.
- Exit Cypress and stop the proxy.
- Run the test normally (with mock data) to verify the recording works.
Debugging Playback Failures
Most common failures are:
- The recorded data is not transformed properly (e.g. sanitization broke something).
- The stubbed requests and responses are not matched properly (e.g. timestamp changes in request body between recording and playback).
Dumping all recorded data as is to a file here and adding a debugger;
statement here is useful to gain insights.
Also comparing console log messages between recording and playback is very useful (ordering of requests, etc.)