Browse Source
Co-authored-by: Ankush <ankush@iwebnotes.com> Co-authored-by: Nabin Hait <nabinhait@gmail.com>develop
Rucha Mahabal
3 years ago
10 changed files with 229 additions and 2 deletions
@ -0,0 +1,108 @@ |
|||||
|
name: UI |
||||
|
|
||||
|
on: |
||||
|
pull_request: |
||||
|
workflow_dispatch: |
||||
|
|
||||
|
jobs: |
||||
|
test: |
||||
|
runs-on: ubuntu-18.04 |
||||
|
|
||||
|
strategy: |
||||
|
fail-fast: false |
||||
|
|
||||
|
name: UI Tests (Cypress) |
||||
|
|
||||
|
services: |
||||
|
mysql: |
||||
|
image: mariadb:10.3 |
||||
|
env: |
||||
|
MYSQL_ALLOW_EMPTY_PASSWORD: YES |
||||
|
ports: |
||||
|
- 3306:3306 |
||||
|
options: --health-cmd="mysqladmin ping" --health-interval=5s --health-timeout=2s --health-retries=3 |
||||
|
|
||||
|
steps: |
||||
|
- name: Clone |
||||
|
uses: actions/checkout@v2 |
||||
|
|
||||
|
- name: Setup Python |
||||
|
uses: actions/setup-python@v2 |
||||
|
with: |
||||
|
python-version: 3.7 |
||||
|
|
||||
|
- uses: actions/setup-node@v2 |
||||
|
with: |
||||
|
node-version: 14 |
||||
|
check-latest: true |
||||
|
|
||||
|
- name: Add to Hosts |
||||
|
run: | |
||||
|
echo "127.0.0.1 test_site" | sudo tee -a /etc/hosts |
||||
|
|
||||
|
- name: Cache pip |
||||
|
uses: actions/cache@v2 |
||||
|
with: |
||||
|
path: ~/.cache/pip |
||||
|
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} |
||||
|
restore-keys: | |
||||
|
${{ runner.os }}-pip- |
||||
|
${{ runner.os }}- |
||||
|
|
||||
|
- name: Cache node modules |
||||
|
uses: actions/cache@v2 |
||||
|
env: |
||||
|
cache-name: cache-node-modules |
||||
|
with: |
||||
|
path: ~/.npm |
||||
|
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} |
||||
|
restore-keys: | |
||||
|
${{ runner.os }}-build-${{ env.cache-name }}- |
||||
|
${{ runner.os }}-build- |
||||
|
${{ runner.os }}- |
||||
|
|
||||
|
- name: Get yarn cache directory path |
||||
|
id: yarn-cache-dir-path |
||||
|
run: echo "::set-output name=dir::$(yarn cache dir)" |
||||
|
|
||||
|
- uses: actions/cache@v2 |
||||
|
id: yarn-cache |
||||
|
with: |
||||
|
path: ${{ steps.yarn-cache-dir-path.outputs.dir }} |
||||
|
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} |
||||
|
restore-keys: | |
||||
|
${{ runner.os }}-yarn- |
||||
|
|
||||
|
- name: Cache cypress binary |
||||
|
uses: actions/cache@v2 |
||||
|
with: |
||||
|
path: ~/.cache |
||||
|
key: ${{ runner.os }}-cypress- |
||||
|
restore-keys: | |
||||
|
${{ runner.os }}-cypress- |
||||
|
${{ runner.os }}- |
||||
|
|
||||
|
- name: Install |
||||
|
run: bash ${GITHUB_WORKSPACE}/.github/helper/install.sh |
||||
|
env: |
||||
|
DB: mariadb |
||||
|
TYPE: ui |
||||
|
|
||||
|
- name: Site Setup |
||||
|
run: cd ~/frappe-bench/ && bench --site test_site execute erpnext.setup.utils.before_tests |
||||
|
|
||||
|
- name: cypress pre-requisites |
||||
|
run: cd ~/frappe-bench/apps/frappe && yarn add cypress-file-upload@^5 --no-lockfile |
||||
|
|
||||
|
|
||||
|
- name: Build Assets |
||||
|
run: cd ~/frappe-bench/ && bench build |
||||
|
|
||||
|
- name: UI Tests |
||||
|
run: cd ~/frappe-bench/ && bench --site test_site run-ui-tests erpnext --headless |
||||
|
env: |
||||
|
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} |
||||
|
|
||||
|
- name: Show bench console if tests failed |
||||
|
if: ${{ failure() }} |
||||
|
run: cat ~/frappe-bench/bench_run_logs.txt |
@ -0,0 +1,11 @@ |
|||||
|
{ |
||||
|
"baseUrl": "http://test_site:8000/", |
||||
|
"projectId": "da59y9", |
||||
|
"adminPassword": "admin", |
||||
|
"defaultCommandTimeout": 20000, |
||||
|
"pageLoadTimeout": 15000, |
||||
|
"retries": { |
||||
|
"runMode": 2, |
||||
|
"openMode": 2 |
||||
|
} |
||||
|
} |
@ -0,0 +1,5 @@ |
|||||
|
{ |
||||
|
"name": "Using fixtures to represent data", |
||||
|
"email": "hello@cypress.io", |
||||
|
"body": "Fixtures are a great way to mock data for responses to routes" |
||||
|
} |
@ -0,0 +1,13 @@ |
|||||
|
|
||||
|
context('Customer', () => { |
||||
|
before(() => { |
||||
|
cy.login(); |
||||
|
}); |
||||
|
it('Check Customer Group', () => { |
||||
|
cy.visit(`app/customer/`); |
||||
|
cy.get('.primary-action').click(); |
||||
|
cy.wait(500); |
||||
|
cy.get('.custom-actions > .btn').click(); |
||||
|
cy.get_field('customer_group', 'Link').should('have.value', 'All Customer Groups'); |
||||
|
}); |
||||
|
}); |
@ -0,0 +1,17 @@ |
|||||
|
// ***********************************************************
|
||||
|
// This example plugins/index.js can be used to load plugins
|
||||
|
//
|
||||
|
// You can change the location of this file or turn off loading
|
||||
|
// the plugins file with the 'pluginsFile' configuration option.
|
||||
|
//
|
||||
|
// You can read more here:
|
||||
|
// https://on.cypress.io/plugins-guide
|
||||
|
// ***********************************************************
|
||||
|
|
||||
|
// This function is called when a project is opened or re-opened (e.g. due to
|
||||
|
// the project's config changing)
|
||||
|
|
||||
|
module.exports = () => { |
||||
|
// `on` is used to hook into various events Cypress emits
|
||||
|
// `config` is the resolved Cypress config
|
||||
|
}; |
@ -0,0 +1,31 @@ |
|||||
|
// ***********************************************
|
||||
|
// This example commands.js shows you how to
|
||||
|
// create various custom commands and overwrite
|
||||
|
// existing commands.
|
||||
|
//
|
||||
|
// For more comprehensive examples of custom
|
||||
|
// commands please read more here:
|
||||
|
// https://on.cypress.io/custom-commands
|
||||
|
// ***********************************************
|
||||
|
//
|
||||
|
//
|
||||
|
// -- This is a parent command --
|
||||
|
// Cypress.Commands.add("login", (email, password) => { ... });
|
||||
|
//
|
||||
|
//
|
||||
|
// -- This is a child command --
|
||||
|
// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... });
|
||||
|
//
|
||||
|
//
|
||||
|
// -- This is a dual command --
|
||||
|
// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... });
|
||||
|
//
|
||||
|
//
|
||||
|
// -- This is will overwrite an existing command --
|
||||
|
// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... });
|
||||
|
|
||||
|
const slug = (name) => name.toLowerCase().replace(" ", "-"); |
||||
|
|
||||
|
Cypress.Commands.add("go_to_doc", (doctype, name) => { |
||||
|
cy.visit(`/app/${slug(doctype)}/${encodeURIComponent(name)}`); |
||||
|
}); |
@ -0,0 +1,26 @@ |
|||||
|
// ***********************************************************
|
||||
|
// This example support/index.js is processed and
|
||||
|
// loaded automatically before your test files.
|
||||
|
//
|
||||
|
// This is a great place to put global configuration and
|
||||
|
// behavior that modifies Cypress.
|
||||
|
//
|
||||
|
// You can change the location of this file or turn off
|
||||
|
// automatically serving support files with the
|
||||
|
// 'supportFile' configuration option.
|
||||
|
//
|
||||
|
// You can read more here:
|
||||
|
// https://on.cypress.io/configuration
|
||||
|
// ***********************************************************
|
||||
|
|
||||
|
// Import commands.js using ES2015 syntax:
|
||||
|
import './commands'; |
||||
|
import '../../../frappe/cypress/support/commands' // eslint-disable-line
|
||||
|
|
||||
|
|
||||
|
// Alternatively you can use CommonJS syntax:
|
||||
|
// require('./commands')
|
||||
|
|
||||
|
Cypress.Cookies.defaults({ |
||||
|
preserve: 'sid' |
||||
|
}); |
@ -0,0 +1,12 @@ |
|||||
|
{ |
||||
|
"compilerOptions": { |
||||
|
"allowJs": true, |
||||
|
"baseUrl": "../node_modules", |
||||
|
"types": [ |
||||
|
"cypress" |
||||
|
] |
||||
|
}, |
||||
|
"include": [ |
||||
|
"**/*.*" |
||||
|
] |
||||
|
} |
Loading…
Reference in new issue