Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Modernize cypress tests
Signed-off-by: Louis Chemineau <[email protected]>
  • Loading branch information
artonge committed May 18, 2023
commit 89f2ea009734b38237d510fdccf54aa7a9588379
148 changes: 95 additions & 53 deletions .github/workflows/cypress.yml
Original file line number Diff line number Diff line change
@@ -1,75 +1,117 @@
name: Cypress

on: pull_request

permissions:
contents: read

concurrency:
group: cypress-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
on:
pull_request:
push:
branches:
- master
- stable*

env:
APP_NAME: activity
CYPRESS_baseUrl: http://localhost:8081/index.php
BRANCH: ${{ github.base_ref }}
PHP_VERSION: 7.4

jobs:
init:
runs-on: ubuntu-latest

steps:
- name: Checkout app
uses: actions/checkout@v3

- name: Install server dependencies
run: composer install

- name: Read package.json node and npm engines version
uses: skjnldsv/[email protected]
id: versions
with:
fallbackNode: "^14"
fallbackNpm: "^7"

- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@v3
with:
cache: "npm"
node-version: ${{ steps.versions.outputs.nodeVersion }}

- name: Set up npm ${{ steps.versions.outputs.npmVersion }}
run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}"

- name: Install node dependencies & build app
run: |
npm ci
TESTING=true npm run build --if-present
- name: Save context
uses: actions/cache@v3
with:
key: cypress-context-${{ github.run_id }}
path: /home/runner/work/activity

cypress:
name: cypress
runs-on: ubuntu-latest
needs: init

strategy:
fail-fast: false
matrix:
# run multiple copies of the current job in parallel
containers: ["component", 1, 2]

name: runner ${{ matrix.containers }}

steps:
- name: Checkout server
uses: actions/checkout@v2
- name: Restore context
uses: actions/cache@v3
with:
repository: nextcloud/server
submodules: true
ref: ${{ env.BRANCH }}
key: cypress-context-${{ github.run_id }}
path: /home/runner/work/activity

- name: Run ${{ matrix.containers == 'component' && 'component' || 'E2E' }} cypress tests

- name: Checkout ${{ env.APP_NAME }}
uses: actions/checkout@v2
uses: cypress-io/github-action@v5
with:
path: apps/${{ env.APP_NAME }}
record: true
parallel: true
# cypress env
ci-build-id: ${{ github.sha }}-${{ github.run_number }}
tag: ${{ github.event_name }}
env:
# Needs to be prefixed with CYPRESS_
CYPRESS_BRANCH: ${{ env.BRANCH }}
# https://github.com/cypress-io/github-action/issues/124
COMMIT_INFO_MESSAGE: ${{ github.event.pull_request.title }}
# Needed for some specific code workarounds
TESTING: true
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}

- name: Set up php ${{ env.PHP_VERSION }}
uses: shivammathur/setup-php@v2
- name: Upload snapshots
uses: actions/upload-artifact@v3
if: always()
with:
php-version: ${{ env.PHP_VERSION }}
extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_sqlite, zip, gd, apcu
coverage: none
ini-values:
apc.enable_cli=on
name: snapshots_${{ matrix.containers }}
path: cypress/snapshots

- name: Set up Nextcloud
env:
DB_PORT: 4444
PHP_CLI_SERVER_WORKERS: 10
run: |
mkdir data
php occ maintenance:install --verbose --database=sqlite --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
php occ config:system:set memcache.local --value="\\OC\\Memcache\\APCu"
php -f index.php
php -S 0.0.0.0:8081 &
export OC_PASS=1234561
php occ user:add --password-from-env user1
php occ user:add --password-from-env user2
php occ config:system:set force_language --value en
php occ app:enable activity
php occ app:list
curl -v http://localhost:8081/index.php/login
cat data/nextcloud.log

- name: Cypress run
uses: cypress-io/github-action@v2
- name: Extract NC logs
if: always()
run: docker-compose --project-directory cypress logs > nextcloud.log

- name: Upload NC logs
uses: actions/upload-artifact@v3
if: always()
with:
record: false # disabled for now as we have no way to savely use the token in our org
parallel: false
wait-on: '${{ env.CYPRESS_baseUrl }}'
working-directory: 'apps/${{ env.APP_NAME }}'
env:
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
name: nc_logs_${{ matrix.containers }}
path: nextcloud.log

summary:
runs-on: ubuntu-latest
needs: [init, cypress]

if: always()

name: cypress-summary

steps:
- name: Summary status
run: if ${{ needs.init.result != 'success' || ( needs.cypress.result != 'success' && needs.cypress.result != 'skipped' ) }}; then exit 1; fi
89 changes: 89 additions & 0 deletions cypress.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@

import {
configureNextcloud,
startNextcloud,
stopNextcloud,
waitOnNextcloud,
} from './cypress/dockerNode'
import { defineConfig } from 'cypress'

import browserify from '@cypress/browserify-preprocessor'
import getCompareSnapshotsPlugin from 'cypress-visual-regression/dist/plugin'

export default defineConfig({
projectId: 'hx9gqy',

// 16/9 screen ratio
viewportWidth: 1280,
viewportHeight: 720,

// Tries again 2 more times on failure
retries: {
runMode: 2,
// do not retry in `cypress open`
openMode: 0,
},

// Needed to trigger `after:run` events with cypress open
experimentalInteractiveRunEvents: true,

// faster video processing
videoCompression: false,

// Visual regression testing
env: {
failSilently: false,
type: 'actual',
},
screenshotsFolder: 'cypress/snapshots/actual',
trashAssetsBeforeRuns: true,

e2e: {
testIsolation: false,

// We've imported your old cypress plugins here.
// You may want to clean this up later by importing these.
async setupNodeEvents(on, config) {
// Fix browserslist extend https://github.com/cypress-io/cypress/issues/2983#issuecomment-570616682
on('file:preprocessor', browserify({ typescript: require.resolve('typescript') }))
getCompareSnapshotsPlugin(on, config)

// Disable spell checking to prevent rendering differences
on('before:browser:launch', (browser, launchOptions) => {
if (browser.family === 'chromium' && browser.name !== 'electron') {
launchOptions.preferences.default['browser.enable_spellchecking'] = false
return launchOptions
}

if (browser.family === 'firefox') {
launchOptions.preferences['layout.spellcheckDefault'] = 0
return launchOptions
}

if (browser.name === 'electron') {
launchOptions.preferences.spellcheck = false
return launchOptions
}
})

// Remove container after run
on('after:run', () => {
stopNextcloud()
})

// Before the browser launches
// starting Nextcloud testing container
return startNextcloud(process.env.BRANCH)
.then((ip) => {
// Setting container's IP as base Url
config.baseUrl = `http://${ip}/index.php`
return ip
})
.then(waitOnNextcloud)
.then(() => configureNextcloud(process.env.BRANCH))
.then(() => {
return config
})
},
},
})
6 changes: 0 additions & 6 deletions cypress.json

This file was deleted.

11 changes: 11 additions & 0 deletions cypress/.eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
module.exports = {
env: {
'cypress/globals': true,
},
plugins: [
'cypress',
],
extends: [
'plugin:cypress/recommended',
],
};
5 changes: 0 additions & 5 deletions cypress/.eslintrc.json

This file was deleted.

6 changes: 0 additions & 6 deletions cypress/Dockerfile

This file was deleted.

20 changes: 12 additions & 8 deletions cypress/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
version: '3'
version: '3.7'

services:
nextcloud:
build:
context: .
restart: always
image: ghcr.io/nextcloud/continuous-integration-shallow-server

ports:
- 8081:80
- 8082:80

environment:
CYPRESS_baseUrl:
APP_SOURCE:
CYPRESS_baseUrl: "http://127.0.0.1:8082/index.php"
BRANCH: "${BRANCH:-master}"

volumes:
- ${APP_SOURCE}:/var/www/html/apps/activity
# Using fallback to make sure this script doesn't mess
# with the mounting if APP_NAME is not provided.
- ../:/var/www/html/apps/${APP_NAME:-activity}
- ./initserver.sh:/initserver.sh
Loading