Erez Rokah 6f221ab3c1 Feat: editorial workflow bitbucket gitlab (#3014)
* refactor: typescript the backends

* feat: support multiple files upload for GitLab and BitBucket

* fix: load entry media files from media folder or UI state

* chore: cleanup log message

* chore: code cleanup

* refactor: typescript the test backend

* refactor: cleanup getEntry unsued variables

* refactor: moved shared backend code to lib util

* chore: rename files to preserve history

* fix: bind readFile method to API classes

* test(e2e): switch to chrome in cypress tests

* refactor: extract common api methods

* refactor: remove most of immutable js usage from backends

* feat(backend-gitlab): initial editorial workflow support

* feat(backend-gitlab): implement missing workflow methods

* chore: fix lint error

* feat(backend-gitlab): support files deletion

* test(e2e): add gitlab cypress tests

* feat(backend-bitbucket): implement missing editorial workflow methods

* test(e2e): add BitBucket backend e2e tests

* build: update node version to 12 on netlify builds

* fix(backend-bitbucket): extract BitBucket avatar url

* test: fix git-gateway AuthenticationPage test

* test(e2e): fix some backend tests

* test(e2e): fix tests

* test(e2e): add git-gateway editorial workflow test

* chore: code cleanup

* test(e2e): revert back to electron

* test(e2e): add non editorial workflow tests

* fix(git-gateway-gitlab): don't call unpublishedEntry in simple workflow

gitlab git-gateway doesn't support editorial workflow APIs yet. This change makes sure not to call them in simple workflow

* refactor(backend-bitbucket): switch to diffstat API instead of raw diff

* chore: fix test

* test(e2e): add more git-gateway tests

* fix: post rebase typescript fixes

* test(e2e): fix tests

* fix: fix parsing of content key and add tests

* refactor: rename test file

* test(unit): add getStatues unit tests

* chore: update cypress

* docs: update beta docs
2020-01-14 17:15:14 -05:00
..

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 other backends 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

When recording tests, access to the relevant backend 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

GITLAB_REPO_OWNER=owner
GITLAB_REPO_NAME=repo
GITLAB_REPO_TOKEN=tokenWithWritePermissions

BITBUCKET_REPO_OWNER=owner
BITBUCKET_REPO_NAME=repo
BITBUCKET_OUATH_CONSUMER_KEY=ouathConsumerKey
BITBUCKET_OUATH_CONSUMER_SECRET=ouathConsumerSecret

NETLIFY_API_TOKEN=netlifyApiToken
NETLIFY_INSTALLATION_ID=netlifyGitHubInstallationId

The structure of the relevant repo should match the settings in config.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 the relevant repo 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:

  1. Mark the specific test as only by changing it("some test... to it.only("some test... for the relevant test.
  2. Run the test in recording mode.
  3. Exit Cypress and stop the proxy.
  4. Run the test normally (with mock data) to verify the recording works.

Debugging Playback Failures

Most common failures are:

  1. The recorded data is not transformed properly (e.g. sanitization broke something).
  2. 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.)