Skip to content

e2e tests #101

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
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
Next Next commit
e2e tests
  • Loading branch information
previ committed Nov 13, 2022
commit d1cb4a7a8fa22f3e63cdc04e85af9ec88be0fefd
File renamed without changes.
3 changes: 2 additions & 1 deletion .env.development
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
VITE_CB_ENDPOINT=http://coderbot.local
VITE_CB_ENDPOINT=http://coderbot.local
VITE_COVERAGE=true
2 changes: 2 additions & 0 deletions .env.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
VITE_CB_ENDPOINT=http://localhost:5000
VITE_COVERAGE=true
50 changes: 40 additions & 10 deletions .github/workflows/build_frontend.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,50 @@ name: build CoderBot frontend
on: push

jobs:
build-frontend:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Docker login
run: docker login ghcr.io -u previ -p ${{ secrets.GHCR_BACKEND_STUB_RO }}
- name: Run stub
run: docker run -dp 5000:5000 --name backend-stub ghcr.io/coderbotorg/backend:stub-latest
# Install NPM dependencies, cache them correctly
# and run all Cypress tests
- name: Cypress run
uses: cypress-io/github-action@v4
with:
#build: npm run build-test
start: npm run test
wait-on: 'http://localhost:5000/api/v1/openapi.json'
wait-on-timeout: 60
browser: chrome
record: true
parallel: true
group: 'UI - Chrome'
env:
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
# Recommended: pass the GitHub token lets this action correctly
# determine the unique run id necessary to re-run the checks
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Clean up
run: docker stop backend-stub && docker rm backend-stub
- name: Archive coverage
uses: actions/upload-artifact@v3
with:
name: coverage
path: coverage

strategy:
matrix:
node-version: [16.x]
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/

build:
runs-on: ubuntu-latest
needs: test
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
- name: Use Node.js 16.x
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
node-version: 16
cache: 'npm'
- run: npm ci
- run: npm run build --if-present
Expand All @@ -29,9 +59,9 @@ jobs:
name: dist
path: dist

release-frontend:
release:
runs-on: ubuntu-latest
needs: build-frontend
needs: build
steps:
- uses: actions/checkout@v3 # Checking out the repo
- name: Docker meta
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,6 @@ pnpm-debug.log*

# Tests
tests/**/coverage

coverage
.nyc_output
13 changes: 13 additions & 0 deletions cypress.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
const { defineConfig } = require("cypress");

module.exports = defineConfig({
projectId: 'm2n47r',
e2e: {
experimentalStudio: true,
setupNodeEvents(on, config) {
require('@cypress/code-coverage/task')(on, config)
// implement node event listeners here
return config
},
},
});
31 changes: 31 additions & 0 deletions cypress/e2e/100_home.cy.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
describe('load homepage', () => {
it('passes', () => {
cy.visit('http://localhost:8080')
cy.get('.v-carousel').should('exist')
cy.get('.logo').should('have.text', 'CoderBot')
cy.get('a[href*="program"]').should('exist')
cy.get('a[href*="control"]').should('exist')
cy.get('a[href*="settings"]').should('exist')
})

it('checks sidebar contents', () => {
cy.visit('http://localhost:8080')
cy.get('.v-carousel').should('exist')
cy.get('button.v-app-bar-nav-icon').should('exist').click()
cy.get('a[href="#/"]').should('exist')
cy.get('a[href*="/docs"]').should('exist')
cy.get('a[href*="/activity/manage"]').should('exist')
cy.get('a[href*="/program"]').should('exist')
cy.get('a[href*="/control"]').should('exist')
cy.get('a[href*="/gallery"]').should('exist')
cy.get('a[href*="/settings"]').should('exist')
})

it('checks home page links', () => {
cy.visit('http://localhost:8080')
cy.get('a.v-btn[href*="/program"]').should('exist')
cy.get('a.v-btn[href*="/docs"]').should('exist')
cy.get('a.v-btn[href*="/control"]').should('exist')
cy.get('a.v-btn[href*="/settings"]').should('exist')
})
})
10 changes: 10 additions & 0 deletions cypress/e2e/200_docs.cy.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
describe('load homepage', () => {
it('checks sidebar contents', () => {
cy.visit('http://localhost:8080')
cy.get('.v-carousel').should('exist')
cy.get('button.v-app-bar-nav-icon').should('exist').click()
cy.get('a.v-list-item[href*="/docs"]').should('exist')
cy.get('a.v-list-item[href*="/docs"]').invoke('removeAttr', 'target').click()
cy.url().should('include', '/docs')
})
})
203 changes: 203 additions & 0 deletions cypress/e2e/300_activities.cy.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@
describe('activities page', () => {
it('loads the default activity', () => {
cy.visit('http://localhost:8080')
cy.get('.v-carousel').should('exist')
cy.get('button.v-app-bar-nav-icon').should('exist').click()
cy.get('a.v-list-item[href*="activity/manage"]').click()
cy.get('#activity_list').should('exist')
cy.get('div#default').should('exist')
cy.get('div#default i.mdi-star').should('exist')
cy.get('div#default .v-list-item-title').should('have.text', 'default')
cy.get('div#default a[href*="activity/edit/default"]').should('exist')
cy.get('#app').click()
cy.get('div#default a[href*="activity/edit/default"]').click()
})

it('creates a new activity', () => {
cy.visit('http://localhost:8080')
cy.get('.v-carousel').should('exist')
cy.get('button.v-app-bar-nav-icon').should('exist')
cy.get('button.v-app-bar-nav-icon').click()
cy.get('a.v-list-item[href*="activity/manage"]').click()
cy.get('#app').click()
cy.get('a.v-btn[href*="activity/new"]').should('exist')
cy.get('a.v-btn[href*="activity/new"]').click()
cy.get('input#name').should('exist')
cy.get('input#desc').should('exist')
cy.get('input#name').type("test-activity-name")
cy.get('input#desc').type("Test activity description")
cy.get('button#toolbox').should('exist')
cy.get('button#toolbox').click()
cy.get('button#add_category').should('exist')
cy.get('button#add_category_all').should('exist')
cy.get('button#add_category_all').click()
cy.get('button#activity_save').should('exist')
cy.get('button#activity_save').click()
})

it('deletes an existing activity', () => {
cy.visit('http://localhost:8080')
cy.get('.v-carousel').should('exist')
cy.get('button.v-app-bar-nav-icon').should('exist')
cy.get('button.v-app-bar-nav-icon').click()
cy.get('a[href*="activity/manage"]').click()
cy.get('#app').click()
cy.get('div#test-activity-name').find('i.mdi-delete').should("exist")
cy.get('div#test-activity-name').find('i.mdi-delete').click()
cy.get('button#confirmDeleteDlg_ok').should("exist")
cy.get('button#confirmDeleteDlg_ok').click({ force: true, multiple: true })
})

it('creates activity, open default view', () => {
cy.visit('http://localhost:8080')
cy.get('.v-carousel').should('exist')
cy.get('button.v-app-bar-nav-icon').should('exist')
cy.get('button.v-app-bar-nav-icon').click()
cy.get('a.v-list-item[href*="activity/manage"]').click()
cy.get('#app').click()
cy.get('a.v-btn[href*="activity/new"]').should('exist')
cy.get('a.v-btn[href*="activity/new"]').click()
cy.get('input#name').type("test-default-activity-name")
cy.get('input#desc').type("Test default activity description")
cy.get('input#is_default').check()
cy.get('button#toolbox').click()
cy.get('button#add_category_all').click()
cy.get('button#activity_save').click()
cy.visit('http://localhost:8080')
cy.get('.v-carousel').should('exist')
cy.get('button.v-app-bar-nav-icon').should('exist')
cy.get('button.v-app-bar-nav-icon').click()
cy.get('a.v-list-item[href*="activity/manage"]').click()
cy.get('#app').click()
cy.get('#activity_list').find('.mdi-star').should('have.length', 1)
cy.get('button.v-app-bar-nav-icon').should('exist')
cy.get('button.v-app-bar-nav-icon').click()
cy.get('a.v-list-item[href*="program"]').click()
cy.get('#app').click()
cy.contains('test-default-activity-name').should('exist')
cy.get('button.v-app-bar-nav-icon').should('exist')
cy.get('button.v-app-bar-nav-icon').click()
cy.get('a.v-list-item[href*="activity/manage"]').click()
cy.get('#app').click()
cy.get('div#test-default-activity-name').find('i.mdi-delete').click()
cy.get('button#confirmDeleteDlg_ok').click({ force: true, multiple: true })
})

it('creates activity, define specific buttons, verify', () => {
cy.visit('http://localhost:8080')
cy.get('.v-carousel').should('exist')
cy.get('button.v-app-bar-nav-icon').should('exist')
cy.get('button.v-app-bar-nav-icon').click()
cy.get('a.v-list-item[href*="activity/manage"]').click()
cy.get('#app').click()
cy.get('a.v-btn[href*="activity/new"]').should('exist')
cy.get('a.v-btn[href*="activity/new"]').click()
cy.get('input#name').type("test-basic-activity-name")
cy.get('input#desc').type("Test basic activity description")
cy.get('input#is_default').check()
cy.get('button#toolbar').click()
cy.get('#button_index_7').find('button.remove').click()
cy.get('#button_index_6').find('button.remove').click()
cy.get('#button_index_5').find('button.remove').click()
cy.get('#button_index_3').find('button.remove').click()
cy.get('#button_index_2').find('button.remove').click()
cy.get('#button_index_1').find('button.remove').click()
cy.get('button#toolbox').click()
cy.get('.blockly-toolbox-editor').find('#blockly-9').click()
cy.get('.blocklyDraggable').click({ force: true, multiple: true })
cy.get('button#activity_save').click()
cy.visit('http://localhost:8080')
cy.get('.v-carousel').should('exist')
cy.get('button.v-app-bar-nav-icon').should('exist')
cy.get('button.v-app-bar-nav-icon').click()
cy.get('a.v-list-item[href*="activity/manage"]').click()
cy.get('#app').click()
cy.get('#activity_list').find('.mdi-star').should('have.length', 1)
cy.get('#activity_list').contains('test-basic-activity-name').should('exist')
cy.get('#activity_list').contains('test-basic-activity-name').click()
cy.url().should('include', 'activity/open/test-basic-activity-name')
cy.get('.v-toolbar__content').find('button#clearProgramDlg').should('exist')
cy.get('.v-toolbar__content').find('button#runProgram').should('exist')
cy.get('.v-toolbar__content').find('button#saveProgram').should('not.exist')
cy.get('button.v-app-bar-nav-icon').should('exist')
cy.get('button.v-app-bar-nav-icon').click()
cy.get('a.v-list-item[href*="activity/manage"]').click()
cy.get('#app').click()
cy.get('div#test-basic-activity-name').find('i.mdi-delete').click()
cy.get('button#confirmDeleteDlg_ok').click({ force: true, multiple: true })
})

it('creates activity, define specific fonts, verify', () => {
cy.visit('http://localhost:8080')
cy.get('.v-carousel').should('exist')
cy.get('button.v-app-bar-nav-icon').should('exist')
cy.get('button.v-app-bar-nav-icon').click()
cy.get('a.v-list-item[href*="activity/manage"]').click()
cy.get('#app').click()
cy.get('a.v-btn[href*="activity/new"]').should('exist')
cy.get('a.v-btn[href*="activity/new"]').click()
cy.get('input#name').type("test-font-activity-name")
cy.get('input#desc').type("Test font activity description")
cy.get('#card_font_ui').find('input[value*="opensans"]').click()
cy.get('#card_font_editor').find('input[value*="robotomono"]').click()
cy.get('button#toolbox').click()
cy.get('.blockly-toolbox-editor').find('#blockly-3').click()
cy.get('.blocklyDraggable').click({ force: true, multiple: true })
cy.get('button#activity_save').click()
cy.visit('http://localhost:8080')
cy.get('.v-carousel').should('exist')
cy.get('button.v-app-bar-nav-icon').should('exist')
cy.get('button.v-app-bar-nav-icon').click()
cy.get('a.v-list-item[href*="activity/manage"]').click()
cy.get('#app').click()
cy.get('#activity_list').find('.mdi-star').should('have.length', 1)
cy.get('#activity_list').contains('test-font-activity-name').should('exist')
cy.get('#activity_list').contains('test-font-activity-name').click()
cy.url().should('include', 'activity/open/test-font-activity-name')
cy.get('button.v-app-bar-nav-icon').should('exist')
cy.get('button.v-app-bar-nav-icon').click()
cy.get('a.v-list-item[href*="activity/manage"]').click()
cy.get('#app').click()
cy.get('div#test-font-activity-name').find('i.mdi-delete').click()
cy.get('button#confirmDeleteDlg_ok').click({ force: true, multiple: true })
})

it('creates activity, define specific toolbox, verify', () => {
cy.visit('http://localhost:8080')
cy.get('.v-carousel').should('exist')
cy.get('button.v-app-bar-nav-icon').should('exist')
cy.get('button.v-app-bar-nav-icon').click()
cy.get('a.v-list-item[href*="activity/manage"]').click()
cy.get('#app').click()
cy.get('a.v-btn[href*="activity/new"]').should('exist')
cy.get('a.v-btn[href*="activity/new"]').click()
cy.get('input#name').type("test-spec-activity-name")
cy.get('input#desc').type("Test spec activity description")
cy.get('input#is_default').check()
cy.get('button#toolbox').click()
cy.get('button#add_category').click()
cy.get('input#category_name').type("Test category")
cy.get('button#save_category').click()
cy.get('.v-list-item-title').contains('Test category').click({ force: true })
cy.get('.blockly-toolbox-editor').find('#blockly-1').click({ force: true })
cy.get('.blocklyDraggable').click({ force: true, multiple: true })
cy.get('button#activity_save').click()
cy.visit('http://localhost:8080')
cy.get('.v-carousel').should('exist')
cy.get('button.v-app-bar-nav-icon').should('exist')
cy.get('button.v-app-bar-nav-icon').click()
cy.get('a.v-list-item[href*="activity/manage"]').click()
cy.get('#app').click()
cy.get('#activity_list').find('.mdi-star').should('have.length', 1)
cy.get('#activity_list').contains('test-spec-activity-name').should('exist')
cy.get('#activity_list').contains('test-spec-activity-name').click()
cy.url().should('include', 'activity/open/test-spec-activity-name')
cy.get('.blocklyToolboxDiv').contains('Test category').should('exist')
cy.get('button.v-app-bar-nav-icon').should('exist')
cy.get('button.v-app-bar-nav-icon').click()
cy.get('a.v-list-item[href*="activity/manage"]').click()
cy.get('#app').click()
cy.get('div#test-spec-activity-name').find('i.mdi-delete').click()
cy.get('button#confirmDeleteDlg_ok').click({ force: true, multiple: true })
})
})
Loading
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy