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

E2E Tests für Multitenancy #923

Closed
3 tasks done
janikEndtner opened this issue May 19, 2024 · 14 comments · Fixed by #1122
Closed
3 tasks done

E2E Tests für Multitenancy #923

janikEndtner opened this issue May 19, 2024 · 14 comments · Fixed by #1122
Assignees

Comments

@janikEndtner
Copy link
Collaborator

janikEndtner commented May 19, 2024

Die E2E-Tests sollen mit den Testfällen für Multitenancy erweitert werden. Zusätzlich sollen die E2E-Tests noch aufgeräumt bzw schneller gemacht werden.

  • Braucht es noch weitere Integrationtests um sicherzustellen, dass nie Daten von einem anderen Mandanten ausgelesen oder updated werden können?

Anforderungen

  • E2E-Tests für Multitenancy, hier spezifiziert, sind implementiert
  • E2E-Tests wurden aufgeräumt ( z.B. unnötige cy.wait entfernt
  • E2E-Tests sind schneller

Akzeptanzkriterien

  • Multitenancy-Tests sind implementiert -> See this comment
  • Tests wurden aufgeräumt
  • (Optional) E2E-Testsausführung braucht weniger als 10min
@janikEndtner janikEndtner added this to the Mandantenfähigkeit milestone May 19, 2024
@janikEndtner janikEndtner changed the title Multitenancy E2E Tests automatisieren E2E Tests für Multitenancy May 21, 2024
@MasterEvarior
Copy link
Collaborator

Eine Idee um die E2E-Tests (immerhin in der Pipeline) schneller zu machen, wäre es die Ausführung zu parallelisieren.
Mithilfe der Matrix-Strategie könnte jedes .cy.ts-File seperat, gleichzeitig ausgeführt werden. Ein Beispiel wie das aussehen könnte kann man hier finden.

Wichtig wäre auch noch, dass die Lösung automatisch alle verfügbaren .cy.ts Files ausgewählt und diese nicht manuell nachgeführt werden müssen. Z.B. kann man die Files zu einem JSON-Array verarbeiten mit jq ls -1 "./cypress/e2e/" | jq -R . | jq -s . und dann als Argument an den Matrix-Job weitergeben.

@nevio18324 nevio18324 self-assigned this Oct 31, 2024
@RandomTannenbaum RandomTannenbaum self-assigned this Nov 4, 2024
@RandomTannenbaum
Copy link
Collaborator

Stand 04.11.2024
Heute habe ich zuerst mal bei allen inputs delay: 0 hinzugefügt. Danach bin ich dem nachgegangen was @MasterEvarior in seinem Kommentar oben geschrieben hat. Das sollte eigentlich auch funktionieren, jedoch habe ich es noch nicht geschafft das richtige Format auszugeben damit die Matrix die Liste von files auch nimmt.

@MasterEvarior
Copy link
Collaborator

@RandomTannenbaum
Hier ist Code den ich mal zum Laufen gebracht hatte, vielleicht hilft er dir weiter:

  gather-e2e-specs:
    runs-on: ubuntu-24.04
    outputs:
      specs: ${{ steps.gather.outputs.specs }}
    defaults:
      run:
        working-directory: frontend/cypress/e2e
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install jq
        run: sudo apt install jq

      - name: Gather specs
        id: gather
        run: |
          echo "Searching for specs at $(pwd)"
          specs=$(find * -maxdepth 1 -type f | jq -R . | jq -s -c .)
          echo "Collected specs for E2E tests: $specs"
          echo "specs=$specs" >> $GITHUB_OUTPUT

  e2e:
    runs-on: ubuntu-24.04
    needs: gather-e2e-specs
    strategy:
      fail-fast: false
      matrix:
        spec: ${{ fromJson(needs.gather-e2e-specs.outputs.specs) }}
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up JDK ${{vars.JAVA_VERSION}}
        uses: actions/setup-java@v4
        with:
          java-version: ${{vars.JAVA_VERSION}}
          distribution: 'adopt'

      - uses: abhi1693/[email protected]
        with:
          browser: chrome
          version: latest

      - name: run keycloak docker
        run: |
          docker run -d \
          --name my_keycloak \
          -e KC_BOOTSTRAP_ADMIN_USERNAME=admin26 \
          -e KC_BOOTSTRAP_ADMIN_PASSWORD=keycloak26 \
          -v ./docker/config/realm-export-pitc.json:/opt/keycloak/data/import/realm-pitc.json \
          -p 8544:8080 \
          quay.io/keycloak/keycloak:26.0.1 \
          start-dev --import-realm

      - name: start backend
        run: cd ./backend && mvn spring-boot:run -Dspring-boot.run.profiles=integration-test &

      - name: Cypress run e2e tests
        uses: cypress-io/github-action@v6
        with:
          working-directory: frontend
          spec: cypress/e2e/${{ matrix.spec }}
          start: npm start
          wait-on: 'http://pitc.okr.localhost:8080/config, http://pitc.okr.localhost:4200, http://localhost:8544'
          wait-on-timeout: 120
          browser: chrome
          headed: true

@RandomTannenbaum
Copy link
Collaborator

Stand 05.11.2024
Heute habe ich die Matrix zum laufen gebracht und auch noch eine fehlerhafte Methode in den tabbing tests gefunden, die die Tests verlängert hat. Ausserdem habe ich angefangen wait statements mit assertions zu ersetzen.

Momentan haben wir so eine Pipeline Zeit von ~ 3:40

@RandomTannenbaum
Copy link
Collaborator

Stand 06.11.2024
Ich habe nun die Matrix auf 3 concurrent runners beschränkt, damit wir nicht das limit (20) erreichen. Ausserdem habe ich heute vorallem daran gearbeitet die tabbing tests umzubauen. Hier haben wir uns darauf geeinigt, dass wir nur testen ob ein element getabbed werden kann und nicht alle aktionen (erstellen usw.) nochmal durchlaufen.

@clean-coder
Copy link
Collaborator

Spezielle E2E Test braucht es nicht, wenn #1077 umgesetzt ist. Dann hat jeder Tenant einen eigenen DB User der auf seinem eigenen DB Schema arbeitet und nur darauf Zugriff hat.

@kcinay055679
Copy link
Collaborator

Ich have unter anderem die getByTestId methode refactored, nun failen mehere e2e suits.
Die Objective e2e habe ich bereits behoben, an diesen kann man sich orientieren

@kcinay055679
Copy link
Collaborator

Egal welche Aktion im toDraft Dialog angecklit wird es wird immer durchgeführt. Tests dafür fehler

@RandomTannenbaum
Copy link
Collaborator

RandomTannenbaum commented Nov 13, 2024

ToDo

  • Maybe bring back checks if submit buttons are disabled
  • Check dialog content for keyresult

@RandomTannenbaum
Copy link
Collaborator

RandomTannenbaum commented Nov 13, 2024

Tests

  • Check-In
  • Crud
  • Duplicated scoring
  • Keyresult
  • Objective
  • Objective backlog
  • Scoring
  • Tab
  • Team
  • Teammanagement

@RandomTannenbaum
Copy link
Collaborator

RandomTannenbaum commented Nov 13, 2024

Stand 13.11.2024
Heute habe ich einige Testfiles mit den neuen Klassen und helpern umgeschrieben. Im Kommentar oben habe ich diese Tests markiert die ich refactored habe und auch die, von denen ich denke, dass @kcinay055679 sie schon fertig refactored hat. Bei den Teammanagement tests war ich mir nicht ganz sicher ob sie fertig sind.

So habe ich jetzt die Check-In tests, die Crud-Tests, die Keyresult-Tests umgeschrieben. Bei den Scoring Tests habe ich auch wo möglich die neuen Methoden verwendet. Ausserdem habe ich im commands.ts alle nun ungenutzten cypress commands gelöscht.

Was noch fehlt:

  • Ein Ticket erfassen für den To-Draft bug, bei dem der confirm-dialog als confirmed gilt egal was man auswählt.
  • Die Overview-Tests scheinen manchmal zu failen. Vielleicht kurz anschauen, meines wissens nach haben wir an diesen jedoch nichts geändert.
  • Rebasen
  • Tabbing tests schreiben
  • Bei mir scheint es momentan ein Problem mit dem Löschen von Objectives zu geben. Wenn ich ein Objective lösche kommt sowohl ein success toaster als auch ein error-toaster mit "Du bist nicht berechtigt dieses Objekt anzuzeigen" und das gelöschte Objective verschwindet erst nach einem refresh der page. Vielleicht behebt sich das nach dem rebase, sonst Ticket erfassen.

@RandomTannenbaum
Copy link
Collaborator

Stand 18.11.2024
Grundsätzlich sind die Tests fertig, jedoch habe ich momentan scheinbar noch einige flaky Tests. Oft läuft die Pipeline durch, doch manchmal failen die Objective-Tests. Auch die duplicated-scoring tests sind in seltenen Fällen gefailed. Es scheint immer etwas mit dem three-dot-menu zu tun haben. Bei den Objective-Tests heisst es, das Element sei nicht in der view, obwohl wir ein scrollIntoView haben und bei den duplicated-scoring tests ist die Fehlermeldung, dass die page geupdated wurde während ein button geklickt wird.

@RandomTannenbaum
Copy link
Collaborator

RandomTannenbaum commented Nov 19, 2024

Stand 19.11.2024
Es scheint als würden nun alle Tests durchlaufen. Das Problem war, dass wir oft unsafe calls in Cypress command chains hatten. Das Problem ist, dass man an Cypress commands (als commands gelten calls wie .clear() oder .scrollIntoView()) keine weiteren cypress calls chainen sollte, die das vorhergehende Objekt benötigen, da diese calls als unsafe gelten. Das hat bei uns dann wahrscheinlich auch zum flaky Verhalten geführt.

Um dies zu fixen muss man mit Cypress Aliasen arbeiten. Dafür gibt es die Funktion .as(), der man einen String als Alias mitgeben kann. Danach kann man das "gealiaste" Element mit cy.get('@<alias>') wieder auslesen.

Das Ticket ist somit nun ready for review.

@RandomTannenbaum
Copy link
Collaborator

Hinweis
Das Ticket wurde nun gemerged. In diesem Ticket wurde zusätzlich noch ein Bug gefixt, durch den die Benutzer keine Schreibrechte auf den Teams hatten denen sie zugehören. Nun hat man immer, ob admin oder nicht, Schreibrechte auf den Teams denen man zugehört.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

6 participants