Skip to content
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

Softwarequalität - Abgabe #49

Open
wants to merge 149 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
149 commits
Select commit Hold shift + click to select a range
3e21599
Added cypress
Nov 16, 2024
e61d75a
Added peters branch to workflow
Nov 16, 2024
1f1ded1
fixed workflow.yml
Nov 16, 2024
b6c0001
set working-directory in workflow.yml
Nov 16, 2024
75d2128
ports zu 27018
Ranea-D Nov 16, 2024
c7ac498
fixed
Ranea-D Nov 16, 2024
20d5308
Addes cypress folder
Nov 16, 2024
7b014bc
moved cypress.config.js
Nov 16, 2024
f322069
Changed workflow start app
Nov 16, 2024
0bafe11
Changed workflow start app
Nov 16, 2024
4e3185d
Changed workflow start app
Nov 16, 2024
b2593fc
moved cypress.config.js
Nov 16, 2024
2f56c66
changed baseUrl for cypress
Nov 16, 2024
a1a1f3b
edit test
driox30 Nov 16, 2024
d36d5c4
moved todo.e2e.cy
Nov 16, 2024
4605ce0
moved todo.e2e.cy
Nov 16, 2024
fa8658f
moved todo.e2e.cy test um 3 Buttosn zu suchen
Nov 16, 2024
4c40b24
e2e.cy.js beforeEach angepasst
Nov 16, 2024
be22451
navigation tests
Ranea-D Nov 16, 2024
7982ce7
api test
Ranea-D Nov 16, 2024
e018cb8
responsive design test
Ranea-D Nov 16, 2024
b48df83
Run jest tests on workflow
Nov 16, 2024
763a973
Uploading cypress screenshots
Nov 16, 2024
6e791a1
Jester gedöhns
driox30 Nov 16, 2024
a3657b8
jester gedöhns
driox30 Nov 16, 2024
8c75453
ALWAYS!!
Nov 16, 2024
45a3d96
ALWAYS!!Screenshots für Cypress
Nov 16, 2024
49277a0
ALWAYS!!2
Nov 16, 2024
eb126a6
Removed SONAR_ROOT_CERT
Nov 16, 2024
9904899
Workflow.yml
Nov 16, 2024
24c07df
Workflow.yml
Nov 16, 2024
b63dbc7
Chenged soanrqube version to v1
Nov 16, 2024
0b728f9
Chenged soanrqube version to v4
Nov 16, 2024
2f537b9
Sonar feste url
Nov 16, 2024
42e540c
Sonar verbose false
Nov 16, 2024
b0acd73
Build stages run parallel
TTomczek Nov 16, 2024
01df4f0
Fixed pipeline syntax
TTomczek Nov 16, 2024
05de5d7
removed build job, added mongodb services to jobs, sonar_host_url fro…
TTomczek Nov 16, 2024
ed7fa55
Kaputte Tests gelöscht
Nov 16, 2024
94bd062
workflow.yml sichere Screenshots wenn Cypress failure
Nov 16, 2024
d088ec2
Added helper function to create todo
Nov 16, 2024
850f6a0
fixed case sensitive test error
Nov 16, 2024
525e0da
fixed case sensitive test error
Nov 16, 2024
4684c85
fixed create todo test selectors
Nov 16, 2024
7480860
fixed create todo test expectation
Nov 16, 2024
6793e37
fixed create todo test expectation
Nov 16, 2024
677d4b3
Wait for todos to load
Nov 16, 2024
978052b
workflow.yml save cypress videos, artifact retention 7 days
Nov 16, 2024
3d7d046
Set language for browser to german
Nov 16, 2024
de74fcb
Set language in browser to de
Nov 17, 2024
17ad819
Set language for cypress browser in cypress.config.js
Nov 17, 2024
fa34f81
removed language setting
Nov 17, 2024
c37a0e5
GitHub Actions names for cypress artifacts changed
Nov 17, 2024
746adce
Added Links to README.md
Nov 17, 2024
a531677
removed .only from todo.test.js
Nov 17, 2024
8a9b0f9
removed .only from e2e.cy.js
Nov 17, 2024
637c7ba
api test
Ranea-D Nov 20, 2024
5079244
test2
Ranea-D Nov 20, 2024
67d1307
cypres https
Ranea-D Nov 20, 2024
09382fa
add "dev": "vite --host"
Ranea-D Nov 20, 2024
b93f2a8
change_config
Ranea-D Nov 20, 2024
e70810b
change
Ranea-D Nov 20, 2024
4122c61
workflow
Ranea-D Nov 20, 2024
4f82976
cypress.config changes
Ranea-D Nov 20, 2024
7cbd7a0
change back
Ranea-D Nov 20, 2024
065c19e
clear
Ranea-D Nov 20, 2024
9549936
deleted package-lock.json
Nov 20, 2024
b480005
api.cy.js deactivated
Nov 20, 2024
90eb5b7
Added cypress support file to disable test failing on application error
Nov 20, 2024
eeebfb6
renamed supportFile to match default names
Nov 20, 2024
b6ef7f7
reordered jest tests to match order in index.js
Nov 21, 2024
0760bc2
fixed test job
Nov 21, 2024
c045d12
fixed test job 2
Nov 21, 2024
8328674
Looking for crashes in nodemon.log in cypress job
Nov 21, 2024
95b3439
commented getKeycloakTOken in todo.test.js beforeAll
Nov 21, 2024
05ad0bb
added more bugs to BERICHT.md
Nov 21, 2024
5d1788c
Implemented more E2E Tests
Nov 22, 2024
15e9124
e2e.cy.js Test assert fixed
Nov 22, 2024
eac5e25
e2e.cy.js replaced expect with should
Nov 22, 2024
027f708
Jest ignores utils.js
Nov 23, 2024
8a3b816
todo.test.js added tests for missing code paths to increase coverage …
Nov 23, 2024
bdfa746
Added screenshot of jest test results before fixes
Nov 23, 2024
eb44e0b
Added screenshots of code coverage
Nov 23, 2024
c6e0acb
workflow.yml aktualisieren, SonarQube checkout depth 0
TTomczek Nov 24, 2024
38cdc06
FixIssues
Ranea-D Nov 24, 2024
a61256a
Merge branch 'peters' of https://github.com/Ranea-D/todo into peters
Ranea-D Nov 24, 2024
3e07653
re
Ranea-D Nov 24, 2024
e7dab79
Re2
Ranea-D Nov 24, 2024
674d13a
Changed url for SonarQube
Dec 2, 2024
b3162c0
fixed lets that should be const
Dec 2, 2024
ed4c39e
e2e Todos hinzufügen und bearbeiten
Ranea-D Dec 4, 2024
413dae3
e2e Todo erstellen
Ranea-D Dec 4, 2024
9cfc7e1
e2e Todo erstellen 2
Ranea-D Dec 4, 2024
e3546ab
e2e Todo anlegen
Ranea-D Dec 4, 2024
d6fd203
e2e new
Ranea-D Dec 4, 2024
8313037
e2e neues todo, todo bearbeiten, todo löschen
Ranea-D Dec 4, 2024
8fdcd7c
e2e
Ranea-D Dec 4, 2024
71410ab
e2e
Ranea-D Dec 4, 2024
c4acb84
e2e_2
Ranea-D Dec 4, 2024
deb371d
e2e_2
Ranea-D Dec 4, 2024
94327f4
e2e_3
Ranea-D Dec 4, 2024
1630e0b
e2e_4
Ranea-D Dec 4, 2024
3316344
e2e_5
Ranea-D Dec 4, 2024
cfe8311
e2e_6
Ranea-D Dec 4, 2024
de30084
e2e_7
Ranea-D Dec 4, 2024
364d79f
e2e_8
Ranea-D Dec 4, 2024
2211008
e2e_9
Ranea-D Dec 4, 2024
c6bdd35
e2e_10
Ranea-D Dec 4, 2024
069e183
e2e_11
Ranea-D Dec 4, 2024
6c295ae
e2e_12
Ranea-D Dec 4, 2024
c8decff
e2e_13
Ranea-D Dec 4, 2024
90c0619
e2e
Ranea-D Dec 4, 2024
289d610
e2e
Ranea-D Dec 4, 2024
90b8ca6
ungültiges DAtum e2e
Ranea-D Dec 4, 2024
4a25434
da
Ranea-D Dec 4, 2024
6960a77
da2
Ranea-D Dec 4, 2024
df58ce7
ungültiges Datum
Ranea-D Dec 4, 2024
edafdbe
Datum2
Ranea-D Dec 4, 2024
0599a0d
Datum3
Ranea-D Dec 4, 2024
15e9bec
Datum4
Ranea-D Dec 4, 2024
4f8054d
Datum5
Ranea-D Dec 4, 2024
36fb403
erwarteter Fehler
Ranea-D Dec 4, 2024
2281b45
Datumsfehler2
Ranea-D Dec 4, 2024
58846c0
heutiges Datum
Ranea-D Dec 4, 2024
cb89054
heutiges Datum + 3 Tage
Ranea-D Dec 4, 2024
4f0c16a
heutiges Datum prüfen
Ranea-D Dec 4, 2024
5b40c4a
Eingabe ohne Name
Ranea-D Dec 4, 2024
7a4843e
Eingabe ohne Name
Ranea-D Dec 4, 2024
f424dd4
Eingabe ohne Name 2
Ranea-D Dec 4, 2024
6f52397
ohne Name 3
Ranea-D Dec 4, 2024
5124f28
Ohne Name 4
Ranea-D Dec 4, 2024
31dba1a
Sachen
Dec 9, 2024
fa25343
Fixed bug related to id
Dec 10, 2024
fad896f
should delete todo assertion now using should syntax
Dec 10, 2024
0571ec2
shoudl create todo assertion modified
Dec 10, 2024
7a5cebc
updated express-validator to 7.1.0
Dec 10, 2024
78c6e35
Fixed cypress tests
Dec 11, 2024
66e2e61
removed skip from test
Dec 11, 2024
e7cff53
increased wait after visit in cypress tests
Dec 11, 2024
de93297
Added Badge to README.md
Dec 11, 2024
447fe40
removed clear from todo name input in cypress tests
Dec 11, 2024
1192463
Added cy.log to fillInForm
Dec 11, 2024
b7f6a67
removed cy.log to fillInForm
Dec 11, 2024
1263715
??
Dec 11, 2024
4209548
fixed minor code smells
Dec 11, 2024
40f74d1
increases code coverage by removing unnecessary code
Dec 11, 2024
b6f9756
added app.disable
Dec 11, 2024
cd6ef66
Fixed format in BERICHT.md
Dec 11, 2024
36f184b
Neue README_Aufgabe2.md
Dec 14, 2024
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
2 changes: 1 addition & 1 deletion .devcontainer/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,4 @@ services:
# (Adding the "ports" property to this file will not forward from a Codespace.)

volumes:
mongodb-data:
mongodb-data:
126 changes: 126 additions & 0 deletions .github/workflows/workflow.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
name: Build

on:
push:
branches: [ "main", "develop", "peters" ]
pull_request:
branches: [ "main", "develop" ]

jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Node.js
uses: actions/setup-node@v4
with:
node-version: '21'

- name: Install dependencies
working-directory: ./backend
run: npm install

- name: Run Jest tests
working-directory: ./backend
run: npm run test -- --coverage

- uses: actions/upload-artifact@v4
if: always()
with:
name: jest-code-coverage
path: backend/coverage
overwrite: true
retention-days: 7
services:
mongodb:
image: mongo:latest
ports:
- 27017:27017

cypress:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Node.js
uses: actions/setup-node@v4
with:
node-version: '21'

- name: Install dependencies
working-directory: ./backend
run: npm install

- name: Run app
working-directory: ./backend
run: |
npm run start > nodemon.log &
while ! nc -z localhost 3000; do
sleep 1
done

- name: Test
working-directory: ./backend
run: npx cypress run --headless

- uses: actions/upload-artifact@v4
if: failure()
with:
name: nodemon logs
path: backend/nodemon.log
overwrite: true
retention-days: 7

- uses: actions/upload-artifact@v4
if: failure()
with:
name: Cypress screenshots
path: backend/cypress/screenshots
overwrite: true
retention-days: 7

- uses: actions/upload-artifact@v4
if: failure()
with:
name: Cypress videos
path: backend/cypress/videos
overwrite: true
retention-days: 7

- name: check for crash
run: |
if grep -q "crash" backend/nodemon.log; then
echo "Crash detected. See nodemon.log"
exit 1
else
echo "No crash detected"
fi
services:
mongodb:
image: mongo:latest
ports:
- 27017:27017

sonarqube:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Analyze with SonarQube
uses: sonarsource/sonarqube-scan-action@v4
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} # Generate a token on SonarQube, add it to the secrets of this repo with the name SONAR_TOKEN (Settings > Secrets > Actions > add new repository secret)
SONAR_HOST_URL: ${{ vars.SONAR_HOST_URL }}
with:
args:
-Dsonar.verbose=false
services:
mongodb:
image: mongo:latest
ports:
- 27017:27017

8 changes: 7 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -129,4 +129,10 @@ dist
.yarn/install-state.gz
.pnp.*

sonar-scanner-5.0.1.3006-linux/**/*
sonar-scanner-5.0.1.3006-linux/**/*

.idea
backend/cypress/screenshots
backend/cypress/videos
nodemon.log
coverage/
57 changes: 57 additions & 0 deletions BERICHT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# Projektbericht für die Todo Anwendung
Diese Datei enthält den Projektbericht für die Todo Anwendung. Der Bericht wird im Rahmen des Moduls `Softwarequalität` an der [Fachhoschule Südwestfalen](www.fh-swf.de) erstellt.

## Gruppenmitglieder
* Christian Peters
* Kevin Hillebrand
* Tim Tomczek

## Vorgehensweise
Zuerst wurde eine Build-Pipeline mit GitHub-Actions erstellt, in der die Anwendung gebaut und mit Cypress, für End-to-End (E2E) Tests, und Jest, für Unit-Tests, getestet wird. Anschließend wurden die Funktionen der Anwendung untersucht und mit E2E Tests abgedeckt. Für die Unit-Tests wurde geprüft ob für jede Funktion ein Test vorhanden ist. Die Überprüfung der Vollständigkeit der Tests erfolgte durch die Analyse der Code-Coverage durch Jest. Durch weitere Tests wurde die Abdeckung erhöht. Danach fand die Analyse der SonarQube Ergebnisse statt. Nach der Testphase wurden die gefundenen Bugs dokumentiert und Lösungen für diese erarbeitet. Abschließend gab es einen Vergleich der Ergebnisse nach den Korrekturen mit den Ergebnissen vor den Korrekturen.


## Lösungen
Für die Unit-Tests wird das Test-Framework Jest verwendet. Für die End-to-End Tests wird das Test-Framework Cypress verwendet. Dieses wurde in den devDependencies des Backend-Servers hinzugefügt, da dieser Server die gesamte Anwendung bereitstellt.

## Probleme
### Unit-Tests benötigen eine Datenbank (TODO)
Die Unit-Tests benötigen eine Datenbank, um die Funktionalität zu testen. Dadurch handelt es sich nicht mehr um Unit-Tests sondern um Integrationstests. Für Unit-Tests sollten die index.js und die DB-Klass einzeln getestet werden und es sollte kein externes System benötigt werden. Uns ist es nicht gelungen einen die Datenbank zu mocken, sodass die Tests ohne eine echte Datenbank laufen. Die Tests sind daher als Integrationstests zu betrachten.

### Anwendung stürzt ab, wenn ein Todo gelöscht wird
Wenn ein Todo gelöscht wird, stürzt die Anwendung ab. Dies sorgt dafür, dass die nachfolgenden E2E-Tests nicht mehr ausgeführt werden können. Dieses Problem wurde dadurch behoben, dass die Anwendung bei einem Absturz automatisch durch nodemon neugestartet wird. Dazu werden Events von nodemon verwendet. Dadurch können die einzelnen Tests noch ausgeführt werden. Um einen Absturz der Anwendung zu bemerken, wird die Ausgabe des npm run start Befehls in einer Log-Datei gesichert und in der CI/CD-Pipeline auch archiviert. In der Pipeline wird diese Datei zusätzlich noch nach Hinweisen auf einen Absturz durchsucht. Wird dort ein Absturz gefunden, wird der Job als fehlgeschlagen markiert.

### Keycloak ist nicht erreichbar
Der Keycloak-Server ist nicht erreichbar. Als Lösung wird die Authentifizierung nur simuliert, in dem nur das vorhandensein eine Authorization Headers geprüft wird. Der Header wurde den Requests in der todo.js hinzugefügt.

## Ergebnisse der QS
### Jest Analyse
Durch die Jest-Tests sind einige Fehler bei der Behandlung von Fehlern aufgefallen, die nun behoben werden müssen. Durch diese Fehler ist es ohne Änderungen an der Anwendung nicht möglich eine 100%-ige Code-Abdeckung zu erreichen.

Die aktuelle Code-Abdeckung ist im nachfolgenden Screenshot zu sehen:
![Code-Abdeckung](./images/jest-code-coverage-before-fixes.png)

### Cypress Analyse
Durch die End-to-End-Tests sind einige Fehler bei der Behandlung der Id der Todos und dem Umgang mit Fehlern der API Aufrufen aufgefallen.

### Gefundene Bugs
| Verhalten | Erwartetes Verhalten |
|-----------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------|
| Das Löschen eines Todo lässt die Anwendung abstürzen | Das Löschen eines Todos sollte das Todo aus der Liste und der Datenbank entfernen |
| Das Ändern des Namens eines Todos hängt den neuen Namen an den alten an | Der Name des Todos sollte überschrieben werden |
| Die Anwendung verügt über keine Authentifizierung | Bei dem Aufruf der Seite wird eine Anmeldemaske angezeigt. Aufrufe der Enpunkte ohne gültiges Token werden mit dem Status 401 beantwortet |
| Die Anwendung verfügt über keine Validierung ob ein gültiges Todo übergeben wurde | Ein Todo mit einem Namen der weniger als 3 Zeichen lang ist, wird abgelehnt |
| Todos bekommen eine Id bestehend aus dem aktuellen Datum, wenn keine Id vorhanden ist, somit landen ungültige Ids in der Datenbank | Die Ids sollten leer an den Server übergeben werden, damit dieser ein neues Todo erstellt und nicht verucht ein bestehendens zu bearbeiten |
| Der Client versucht die Id als Number zu parsen, die führt zu Fehlern, da die Ids hexadezimal sind | Die Ids sollen als String behandelt werden |

### SonarQube Analyse
Die SonarQube Analyse zeigt zwei mittlere Reliability Probleme einmal ein fehlendes lang-Attribut in der todo.html und die Verwendung eines let statt eines const in der index.js. Beide Probleme können ohne großen Aufwand behoben werden.
Außerdem gibt es 44 Maintainability Probleme. Davon einer mit einer hohen Stufe und 43 mit einer niedrigen Stufe. Das Problem mit der hohen Stufe kann auch wieder durch die Verwendung von const anstatt let behoben werden. Bei den Problemen mit niedriger Stufe sind viele falsche Probleme. Da hier die Wörter Todo als noch zu erledigende Aufgabe markiert werden. Außerdem wird dabei auf ungenutzte Imports aufmerksam gemacht. Dadurch ist aufgefallen das die definierte Validierung der Todos nicht genutzt wird.
Bei den doppelten Codezeilen scheint es sich um Vergleiche mit anderen Repos zu handeln, die das gleiche Projekt geforkt haben, daher wird dieser Punkt ignoriert.
Außerdem gibt es ein Security Hotspot in einer Testdatei, da dort ein Passwort im Klartext gespeichert ist.

## Vergleich der Ergebnisse
Nach dem alle Fehler behoben wurde, die zu Testfehlern führten, wurde die Code-Abdeckung durch Jest erneut analysiert. Die Abdeckung beträgt nun über 85% in der schlechtesten Kategorie (Branches). Die Ergebnisse sind im nachfolgenden Screenshot zu sehen:
![Code-Abdeckung](./images/jest-code-coverage-after-fixes.png)

Dies ist eine Steigerung von 10% im Vergleich zu den vorherigen Ergebnissen.
Die von SonarQube gefundenen Probleme wurden ebenfalls behoben. Es gibt nun keine Reliability Probleme mehr und die Maintainability Probleme wurden auf 0 reduziert. Ein Security Hotspot wurde ebenfalls behoben. Ein zweiter wurde als falsch positiv markiert, da es sich um ein Testpasswort handelt.
15 changes: 14 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,16 @@
# ToDo-Anwendung

Diese Anwendung dient als Beispiel für das [Modul Softwarequalität](https://elearning.fh-swf.de/course/view.php?id=19693).
Diese Anwendung dient als Beispiel für das [Modul Softwarequalität](https://elearning.fh-swf.de/course/view.php?id=19693).

[![Build](https://github.com/Ranea-D/todo/actions/workflows/workflow.yml/badge.svg?branch=peters)](https://github.com/Ranea-D/todo/actions/workflows/workflow.yml)

## Links
* [Aufgabe](https://github.com/fhswf/softwarequalitaet/tree/main/Exercises/CI_ToDo)
* [SonarQube](https://hopper.fh-swf.de/sonarqube/dashboard?id=peters_todo)
* [GitHub Actions](https://github.com/Ranea-D/todo/actions)
* [GitHub](https://github.com/Ranea-D/todo)


## Todos
* Validierung der Post und PUT Requests mit todoValidationRules
*
8 changes: 8 additions & 0 deletions README_Aufgabe2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Teammitglieder
* Kevin Hillebrand
* Christian Peters
* Tim Tomczek


# Vorgehen
Die Aufgabe wurde gemeinsam in einem Sprachchat bearbeitet. Dabei wurden die Aufgaben in technische Themen (GitHub Actions, SonarQube, Einrichtung Cypress), End-To-End-Tests und Unit-Tests unterteilt. Jedes Teammitglied hat sich um ein Thema gekümmert. Die Aufgaben wurden dann lokal gesammelt und gepusht.
13 changes: 13 additions & 0 deletions backend/cypress.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { defineConfig } from 'cypress'

const PORT = process.env.PORT || 3000;

export default defineConfig({
e2e: {
baseUrl: `http://localhost:${PORT}`,
screenshotOnRunFailure: true,
screenshotsFolder: 'cypress/screenshots',
videosFolder: 'cypress/videos',
video: true
},
})
Empty file added backend/cypress/.gitkeep
Empty file.
43 changes: 43 additions & 0 deletions backend/cypress/e2e-test-utils.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
export function fillInForm(chain, name, duedate, status) {
let statusNum;
switch (status) {
case 'offen':
statusNum = 0;
break;
case 'in Bearbeitung':
statusNum = 1;
break;
case 'erledigt':
statusNum = 2;
break;
default:
throw new Error('Status is invalid. Must be one of: offen, in Bearbeitung, erledigt');
}

return chain
.get('input#todo').type(name)
.get('input#due').type(duedate)
.get('select#status').select(statusNum)
.get('input[type=submit]').click();
}

export function findTodoByTitle(chain, title) {
return chain.get('div.todo').find('.title').contains(title).first().parent();
}

export function expectTodoToBe(chain, title, dueDate, status) {
const expectedDate = new Date(dueDate).toLocaleDateString();
return findTodoByTitle(chain, title)
.find('.title').should('contain', title).parent()
.find('.due').should('contain', expectedDate).parent()
.find('button.status').should('contain', status);
}

export function getCurrentTodoCount() {
return cy.get('div.todo').should('have.length.above', -1).its('length');
}

export function deleteTodoByTitle(chain, title) {
return findTodoByTitle(chain, title)
.find('button.delete').click();
}
67 changes: 67 additions & 0 deletions backend/cypress/e2e/e2e.cy.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import {deleteTodoByTitle, expectTodoToBe, fillInForm, findTodoByTitle} from "../e2e-test-utils.js";

describe('ToDo App End-to-End Tests', () => {
let chain;
beforeEach(async () => {
chain = cy;
chain = chain.visit('todo.html').wait(1000);
});

it('sollte ein neues ToDo erstellen', () => {
chain = fillInForm(chain, 'sollte ein neues ToDo erstellen', '2022-11-12', 'in Bearbeitung');
chain = expectTodoToBe(chain, 'sollte ein neues ToDo erstellen', '2022-11-12', 'in Bearbeitung');
chain = deleteTodoByTitle(chain, 'sollte ein neues ToDo erstellen');
});

it('sollte ein todo bearbeiten', () => {
chain = fillInForm(chain, 'Todo_2', '2024-11-12', 'in Bearbeitung');
chain = expectTodoToBe(chain, 'Todo_2', '2024-11-12', 'in Bearbeitung');

chain = findTodoByTitle(chain, 'Todo_2')
.find('button.edit').click();
chain = fillInForm(chain, 'Todo_2_bearbeitet', '2024-11-12', 'erledigt');
chain = expectTodoToBe(chain, 'Todo_2_bearbeitet', '2024-11-12', 'erledigt');
chain = deleteTodoByTitle(chain, 'Todo_2_bearbeitet');
});

it('sollte ein todo löschen', () => {
chain = fillInForm(chain, 'sollte ein todo löschen', '2025-11-12', 'erledigt');
chain = expectTodoToBe(chain, 'sollte ein todo löschen', '2025-11-12', 'erledigt');
chain = deleteTodoByTitle(chain, 'sollte ein todo löschen');
});

it('sollte ein todo ohne Namen nicht erstellen', () => {
chain = chain.get('input#todo').invoke('attr', 'value', '')
.get('input#due').type('2026-11-12')
.get('select#status').select(1)
.get('input[type=submit]').click()
.get('div.todo').should('have.length', 0);
});

it('sollte den status eines todos ändern', () => {
chain = fillInForm(chain, 'sollte den status eines todos ändern', '2026-11-12', 'offen');
chain = findTodoByTitle(chain, 'sollte den status eines todos ändern');
chain = chain.find('button.status').should('contain', 'offen').click();
chain = expectTodoToBe(chain, 'sollte den status eines todos ändern', '2026-11-12', 'in Bearbeitung');
chain = deleteTodoByTitle(chain, 'sollte den status eines todos ändern');
});

it('sollte todos laden', () => {
chain = fillInForm(chain, 'sollte todos laden', '2026-11-12', 'offen');
chain = expectTodoToBe(chain, 'sollte todos laden', '2026-11-12', 'offen');
chain.reload().wait(1000);
chain = expectTodoToBe(chain, 'sollte todos laden', '2026-11-12', 'offen');
chain = deleteTodoByTitle(chain, 'sollte todos laden');
});

it('sollte heutiges Datum + 3 Tage als Standarddatum setzen', () => {
// Datum in das richtige Format bringen (YYYY-MM-DD)
const today = new Date();
today.setDate(today.getDate() + 3); // 3 Tage hinzufügen

// Datum im richtigen Format (YYYY-MM-DD)
const formattedDate = today.toISOString().split('T')[0];

cy.get('input#due').should('have.value', formattedDate);
});
});
17 changes: 17 additions & 0 deletions backend/cypress/e2e/responsive.cy.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
describe('Responsive Design Tests', () => {
const viewports = [
{ name: 'mobile', width: 375, height: 667 },
{ name: 'tablet', width: 768, height: 1024 },
{ name: 'desktop', width: 1280, height: 720 },
];

viewports.forEach((viewport) => {
it(`should render correctly on ${viewport.name}`, () => {
cy.viewport(viewport.width, viewport.height);
cy.visit('/todo.html');
cy.get('#todo').should('be.visible');
cy.get('#due').should('be.visible');
cy.get('#status').should('be.visible');
});
});
});
5 changes: 5 additions & 0 deletions backend/cypress/support/e2e.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Cypress.on('uncaught:exception', (err, runnable) => {
// returning false here prevents Cypress from
// failing the test
return false
})
Loading