Skip to content

Commit 03b4e8b

Browse files
authored
add coverage (#98)
* e2e tests * add coverage
1 parent 0952ca5 commit 03b4e8b

21 files changed

+10415
-4945
lines changed

.env.development

+2-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
VITE_CB_ENDPOINT=http://coderbot.local
1+
VITE_CB_ENDPOINT=http://coderbot.local
2+
VITE_COVERAGE=true

.env.test

+2-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
VITE_CB_ENDPOINT=http://localhost:5000
1+
VITE_CB_ENDPOINT=http://localhost:5000
2+
VITE_COVERAGE=true

.github/workflows/build_frontend.yml

+31-26
Original file line numberDiff line numberDiff line change
@@ -9,32 +9,37 @@ jobs:
99
test:
1010
runs-on: ubuntu-latest
1111
steps:
12-
- name: Checkout
13-
uses: actions/checkout@v3
14-
- name: Docker login
15-
run: docker login ghcr.io -u previ -p ${{ secrets.GHCR_BACKEND_STUB_RO }}
16-
- name: Run stub
17-
run: docker run -dp 5000:5000 --name backend-stub ghcr.io/coderbotorg/backend:stub-latest
18-
# Install NPM dependencies, cache them correctly
19-
# and run all Cypress tests
20-
- name: Cypress run
21-
uses: cypress-io/github-action@v4
22-
with:
23-
build: npm run build-test
24-
start: npm run preview
25-
wait-on: 'http://localhost:5000/api/v1/openapi.json'
26-
wait-on-timeout: 60
27-
browser: chrome
28-
record: true
29-
parallel: true
30-
group: 'UI - Chrome'
31-
env:
32-
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
33-
# Recommended: pass the GitHub token lets this action correctly
34-
# determine the unique run id necessary to re-run the checks
35-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
36-
- name: Clean up
37-
run: docker stop backend-stub && docker rm backend-stub
12+
- name: Checkout
13+
uses: actions/checkout@v3
14+
- name: Docker login
15+
run: docker login ghcr.io -u previ -p ${{ secrets.GHCR_BACKEND_STUB_RO }}
16+
- name: Run stub
17+
run: docker run -dp 5000:5000 --name backend-stub ghcr.io/coderbotorg/backend:stub-latest
18+
# Install NPM dependencies, cache them correctly
19+
# and run all Cypress tests
20+
- name: Cypress run
21+
uses: cypress-io/github-action@v4
22+
with:
23+
#build: npm run build-test
24+
start: npm run test
25+
wait-on: 'http://localhost:5000/api/v1/openapi.json'
26+
wait-on-timeout: 60
27+
browser: chrome
28+
record: true
29+
parallel: true
30+
group: 'UI - Chrome'
31+
env:
32+
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
33+
# Recommended: pass the GitHub token lets this action correctly
34+
# determine the unique run id necessary to re-run the checks
35+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
36+
- name: Clean up
37+
run: docker stop backend-stub && docker rm backend-stub
38+
- name: Archive coverage
39+
uses: actions/upload-artifact@v3
40+
with:
41+
name: coverage
42+
path: coverage
3843

3944
build:
4045
runs-on: ubuntu-latest

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,6 @@ pnpm-debug.log*
2424

2525
# Tests
2626
tests/**/coverage
27+
28+
coverage
29+
.nyc_output

cypress.config.js

+2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ module.exports = defineConfig({
55
e2e: {
66
experimentalStudio: true,
77
setupNodeEvents(on, config) {
8+
require('@cypress/code-coverage/task')(on, config)
89
// implement node event listeners here
10+
return config
911
},
1012
},
1113
});

cypress/e2e/100_home.cy.js

+16
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,20 @@ describe('load homepage', () => {
2020
cy.get('a[href*="/gallery"]').should('exist')
2121
cy.get('a[href*="/settings"]').should('exist')
2222
})
23+
/*
24+
it('checks home page links', () => {
25+
cy.visit('http://localhost:8080')
26+
cy.get('a.v-btn[href*="/program"]').click()
27+
cy.url().should('include', '/program')
28+
cy.visit('http://localhost:8080')
29+
cy.get('a.v-btn[href*="/docs"]').invoke('removeAttr', 'target').click()
30+
cy.url().should('include', '/docs')
31+
cy.visit('http://localhost:8080')
32+
cy.get('a.v-btn[href*="/control"]').click()
33+
cy.url().should('include', '/control')
34+
cy.visit('http://localhost:8080')
35+
cy.get('a.v-btn[href*="/settings"]').click()
36+
cy.url().should('include', '/settings')
37+
})
38+
*/
2339
})

cypress/e2e/300_activities.cy.js

+157-9
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,10 @@ describe('activities page', () => {
3131
cy.get('button#add_category').should('exist')
3232
cy.get('button#add_category_all').should('exist')
3333
cy.get('button#add_category_all').click()
34-
cy.get('button#save').should('exist')
35-
cy.get('button#save').click()
36-
/*
37-
cy.get('input#input-317').should('exist')
38-
cy.get('input#input-317').type("Test Category")
39-
cy.get('button#category_ok').should('exist')
40-
cy.get('button#category_ok').click()
41-
*/
34+
cy.get('button#activity_save').should('exist')
35+
cy.get('button#activity_save').click()
4236
})
37+
4338
it('deletes an existing activity', () => {
4439
cy.visit('http://localhost:8080')
4540
cy.get('.v-carousel').should('exist')
@@ -50,6 +45,159 @@ describe('activities page', () => {
5045
cy.get('div#test-activity-name').find('i.mdi-delete').should("exist")
5146
cy.get('div#test-activity-name').find('i.mdi-delete').click()
5247
cy.get('button#confirmDeleteDlg_ok').should("exist")
53-
cy.get('button#confirmDeleteDlg_ok').click()
48+
cy.get('button#confirmDeleteDlg_ok').click({ force: true, multiple: true })
49+
})
50+
51+
it('creates activity, open default view', () => {
52+
cy.visit('http://localhost:8080')
53+
cy.get('.v-carousel').should('exist')
54+
cy.get('button.v-app-bar-nav-icon').should('exist')
55+
cy.get('button.v-app-bar-nav-icon').click()
56+
cy.get('a.v-list-item[href*="activity/manage"]').click()
57+
cy.get('#app').click()
58+
cy.get('a.v-btn[href*="activity/new"]').should('exist')
59+
cy.get('a.v-btn[href*="activity/new"]').click()
60+
cy.get('input#name').type("test-default-activity-name")
61+
cy.get('input#desc').type("Test default activity description")
62+
cy.get('input#is_default').check()
63+
cy.get('button#toolbox').click()
64+
cy.get('button#add_category_all').click()
65+
cy.get('button#activity_save').click()
66+
cy.visit('http://localhost:8080')
67+
cy.get('.v-carousel').should('exist')
68+
cy.get('button.v-app-bar-nav-icon').should('exist')
69+
cy.get('button.v-app-bar-nav-icon').click()
70+
cy.get('a.v-list-item[href*="activity/manage"]').click()
71+
cy.get('#app').click()
72+
cy.get('#activity_list').find('.mdi-star').should('have.length', 1)
73+
cy.get('button.v-app-bar-nav-icon').should('exist')
74+
cy.get('button.v-app-bar-nav-icon').click()
75+
cy.get('a.v-list-item[href*="program"]').click()
76+
cy.get('#app').click()
77+
cy.contains('test-default-activity-name').should('exist')
78+
cy.get('button.v-app-bar-nav-icon').should('exist')
79+
cy.get('button.v-app-bar-nav-icon').click()
80+
cy.get('a.v-list-item[href*="activity/manage"]').click()
81+
cy.get('#app').click()
82+
cy.get('div#test-default-activity-name').find('i.mdi-delete').click()
83+
cy.get('button#confirmDeleteDlg_ok').click({ force: true, multiple: true })
84+
})
85+
86+
it('creates activity, define specific buttons, verify', () => {
87+
cy.visit('http://localhost:8080')
88+
cy.get('.v-carousel').should('exist')
89+
cy.get('button.v-app-bar-nav-icon').should('exist')
90+
cy.get('button.v-app-bar-nav-icon').click()
91+
cy.get('a.v-list-item[href*="activity/manage"]').click()
92+
cy.get('#app').click()
93+
cy.get('a.v-btn[href*="activity/new"]').should('exist')
94+
cy.get('a.v-btn[href*="activity/new"]').click()
95+
cy.get('input#name').type("test-basic-activity-name")
96+
cy.get('input#desc').type("Test basic activity description")
97+
cy.get('input#is_default').check()
98+
cy.get('button#toolbar').click()
99+
cy.get('#button_index_7').find('button.remove').click()
100+
cy.get('#button_index_6').find('button.remove').click()
101+
cy.get('#button_index_5').find('button.remove').click()
102+
cy.get('#button_index_3').find('button.remove').click()
103+
cy.get('#button_index_2').find('button.remove').click()
104+
cy.get('#button_index_1').find('button.remove').click()
105+
cy.get('button#toolbox').click()
106+
cy.get('.blockly-toolbox-editor').find('#blockly-9').click()
107+
cy.get('.blocklyDraggable').click({ force: true, multiple: true })
108+
cy.get('button#activity_save').click()
109+
cy.visit('http://localhost:8080')
110+
cy.get('.v-carousel').should('exist')
111+
cy.get('button.v-app-bar-nav-icon').should('exist')
112+
cy.get('button.v-app-bar-nav-icon').click()
113+
cy.get('a.v-list-item[href*="activity/manage"]').click()
114+
cy.get('#app').click()
115+
cy.get('#activity_list').find('.mdi-star').should('have.length', 1)
116+
cy.get('#activity_list').contains('test-basic-activity-name').should('exist')
117+
cy.get('#activity_list').contains('test-basic-activity-name').click()
118+
cy.url().should('include', 'activity/open/test-basic-activity-name')
119+
cy.get('.v-toolbar__content').find('button#clearProgramDlg').should('exist')
120+
cy.get('.v-toolbar__content').find('button#runProgram').should('exist')
121+
cy.get('.v-toolbar__content').find('button#saveProgram').should('not.exist')
122+
cy.get('button.v-app-bar-nav-icon').should('exist')
123+
cy.get('button.v-app-bar-nav-icon').click()
124+
cy.get('a.v-list-item[href*="activity/manage"]').click()
125+
cy.get('#app').click()
126+
cy.get('div#test-basic-activity-name').find('i.mdi-delete').click()
127+
cy.get('button#confirmDeleteDlg_ok').click({ force: true, multiple: true })
128+
})
129+
130+
it('creates activity, define specific fonts, verify', () => {
131+
cy.visit('http://localhost:8080')
132+
cy.get('.v-carousel').should('exist')
133+
cy.get('button.v-app-bar-nav-icon').should('exist')
134+
cy.get('button.v-app-bar-nav-icon').click()
135+
cy.get('a.v-list-item[href*="activity/manage"]').click()
136+
cy.get('#app').click()
137+
cy.get('a.v-btn[href*="activity/new"]').should('exist')
138+
cy.get('a.v-btn[href*="activity/new"]').click()
139+
cy.get('input#name').type("test-font-activity-name")
140+
cy.get('input#desc').type("Test font activity description")
141+
cy.get('#card_font_ui').find('input[value*="opensans"]').click()
142+
cy.get('#card_font_editor').find('input[value*="robotomono"]').click()
143+
cy.get('button#toolbox').click()
144+
cy.get('.blockly-toolbox-editor').find('#blockly-3').click()
145+
cy.get('.blocklyDraggable').click({ force: true, multiple: true })
146+
cy.get('button#activity_save').click()
147+
cy.visit('http://localhost:8080')
148+
cy.get('.v-carousel').should('exist')
149+
cy.get('button.v-app-bar-nav-icon').should('exist')
150+
cy.get('button.v-app-bar-nav-icon').click()
151+
cy.get('a.v-list-item[href*="activity/manage"]').click()
152+
cy.get('#app').click()
153+
cy.get('#activity_list').find('.mdi-star').should('have.length', 1)
154+
cy.get('#activity_list').contains('test-font-activity-name').should('exist')
155+
cy.get('#activity_list').contains('test-font-activity-name').click()
156+
cy.url().should('include', 'activity/open/test-font-activity-name')
157+
cy.get('button.v-app-bar-nav-icon').should('exist')
158+
cy.get('button.v-app-bar-nav-icon').click()
159+
cy.get('a.v-list-item[href*="activity/manage"]').click()
160+
cy.get('#app').click()
161+
cy.get('div#test-font-activity-name').find('i.mdi-delete').click()
162+
cy.get('button#confirmDeleteDlg_ok').click({ force: true, multiple: true })
163+
})
164+
165+
it('creates activity, define specific toolbox, verify', () => {
166+
cy.visit('http://localhost:8080')
167+
cy.get('.v-carousel').should('exist')
168+
cy.get('button.v-app-bar-nav-icon').should('exist')
169+
cy.get('button.v-app-bar-nav-icon').click()
170+
cy.get('a.v-list-item[href*="activity/manage"]').click()
171+
cy.get('#app').click()
172+
cy.get('a.v-btn[href*="activity/new"]').should('exist')
173+
cy.get('a.v-btn[href*="activity/new"]').click()
174+
cy.get('input#name').type("test-spec-activity-name")
175+
cy.get('input#desc').type("Test spec activity description")
176+
cy.get('input#is_default').check()
177+
cy.get('button#toolbox').click()
178+
cy.get('button#add_category').click()
179+
cy.get('input#category_name').type("Test category")
180+
cy.get('button#save_category').click()
181+
cy.get('.v-list-item-title').contains('Test category').click({ force: true })
182+
cy.get('.blockly-toolbox-editor').find('#blockly-1').click({ force: true })
183+
cy.get('.blocklyDraggable').click({ force: true, multiple: true })
184+
cy.get('button#activity_save').click()
185+
cy.visit('http://localhost:8080')
186+
cy.get('.v-carousel').should('exist')
187+
cy.get('button.v-app-bar-nav-icon').should('exist')
188+
cy.get('button.v-app-bar-nav-icon').click()
189+
cy.get('a.v-list-item[href*="activity/manage"]').click()
190+
cy.get('#app').click()
191+
cy.get('#activity_list').find('.mdi-star').should('have.length', 1)
192+
cy.get('#activity_list').contains('test-spec-activity-name').should('exist')
193+
cy.get('#activity_list').contains('test-spec-activity-name').click()
194+
cy.url().should('include', 'activity/open/test-spec-activity-name')
195+
cy.get('.blocklyToolboxDiv').contains('Test category').should('exist')
196+
cy.get('button.v-app-bar-nav-icon').should('exist')
197+
cy.get('button.v-app-bar-nav-icon').click()
198+
cy.get('a.v-list-item[href*="activity/manage"]').click()
199+
cy.get('#app').click()
200+
cy.get('div#test-spec-activity-name').find('i.mdi-delete').click()
201+
cy.get('button#confirmDeleteDlg_ok').click({ force: true, multiple: true })
54202
})
55203
})

0 commit comments

Comments
 (0)