Skip to content

Conversation

@SamuelRoettgermann
Copy link
Contributor

@SamuelRoettgermann SamuelRoettgermann commented Jan 27, 2026

Summary

Allows instructors to access the exam room management/upload page by putting a button to the exam-distribution dialog. Also simplified the exam room management page.

Checklist

General

Server

Client

  • I strictly followed the client coding guidelines.
  • I strictly followed the AET UI-UX guidelines.
  • Following the theming guidelines, I specified colors only in the theming variable files and checked that the changes look consistent in both the light and the dark theme.
  • I added authorities to all new routes and checked the course groups for displaying navigation elements (links, buttons).
  • I added multiple screenshots/screencasts of my UI changes.
  • I translated all newly inserted strings into English and German.

Motivation and Context

Currently only administrators can upload new rooms. The reason for this feature being admin-only was the existence of a "delete all rooms" button, but after that functionality was removed shortly after introduction, the room management lost its reason for remaining admin only.

Description

Moves the exam room management to be accessible via the Distribute button at the Students view, so that both heavily related features can be accessed together.

This PR most a lot of code, while also lowering a few access privileges along the way.

Additionally, this PR simplifies the UI of the Exam Room Management page a bit, as reviews have shown me that it was still tremendously confusing.

Steps for Testing

Prerequisites:

  • 1 Administrator
  • 1 Instructor
  • 1 Exam
  1. Log in to Artemis
  2. Navigate to Course Administration
  3. Navigate to Exams
  4. Change to Instructor View
  5. Select the specific exam, if necessary, and select Students there to take you to the list of all registered students
  6. Click the Distribute button
  7. Check that there is text with a link directing to the Exam Room Management in the bottom left corner
  8. Check that it takes you to the Exam Room Management page upon clicking that link
  9. Check that you don't get any FORBIDDEN (403) HTTP-status. Here are some rooms.zip that you can upload there to see if it works.
  10. Go back to the Distribute Students dialog and select some rooms to distribute students to.
  11. Log in as an administrator and check that the option is gone from the admin management tab.

Testserver States

You can manage test servers using Helios. Check environment statuses in the environment list. To deploy to a test server, go to the CI/CD page, find your PR or branch, and trigger the deployment.

Review Progress

Code Review

  • Code Review 1
  • Code Review 2

Manual Tests

  • Test 1
  • Test 2

Test Coverage

Client

Class/File Line Coverage Lines Expects Ratio
admin-sidebar.component.ts not found (modified) 274 31 11.3
exam-rooms.component.ts 98.94% 164 47 28.7
exam-rooms.model.ts not found (renamed) 32 ? ?
exam-rooms.service.ts 100.00% 20 16 80.0
students-room-distribution-dialog.component.ts 94.73% 181 36 19.9

Server

Class/File Line Coverage Lines
ExamRoomOverviewDTO.java 100.00% 7
ExamRoomRepository.java 100.00% 116
ExamRoomService.java 82.41% 342
ExamRoomManagementResource.java 90.48% 68
AdminExamResource.java 100.00% 32

Last updated: 2026-01-27 13:46:15 UTC

Screenshots

Summary by CodeRabbit

  • New Features

    • Exam Room Management UI for instructors at /exams/rooms: upload ZIPs, view management overview, delete outdated rooms; new REST endpoints exposed.
  • User Interface

    • Renamed admin “overview” to “management”; simplified overview to show exam rooms, seats, and capacities; added “Can’t find your room? Upload it here” link; removed Exam Rooms from admin sidebar.
  • Behavior

    • ZIP upload validates size and skips hidden files; overview now returns newest room versions only.
  • Tests

    • Tests updated to new endpoints, DTOs, routes, and instructor access.

✏️ Tip: You can customize this high-level summary in your review settings.

SamuelRoettgermann and others added 30 commits December 9, 2025 04:34
@github-project-automation github-project-automation bot moved this to Work In Progress in Artemis Development Jan 27, 2026
@SamuelRoettgermann SamuelRoettgermann changed the title Exam mode: Exam mode: Exam Room Management for Instructors Jan 27, 2026
@github-actions github-actions bot added tests server Pull requests that update Java code. (Added Automatically!) client Pull requests that update TypeScript code. (Added Automatically!) core Pull requests that affect the corresponding module exam Pull requests that affect the corresponding module labels Jan 27, 2026
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 27, 2026

Walkthrough

Adds an instructor-scoped ExamRoomManagementResource with upload/overview/delete endpoints, renames/simplifies the exam room overview DTO to contain newestUniqueExamRooms only, updates repository queries to fetch newest room versions with eager layout strategies, and adapts frontend routes, components, tests, and translations to a management-oriented flow.

Changes

Cohort / File(s) Summary
Backend DTO
src/main/java/de/tum/cit/aet/artemis/exam/dto/room/ExamRoomOverviewDTO.java
Renamed record from ExamRoomAdminOverviewDTOExamRoomOverviewDTO; reduced fields to a single @NotNull Set<ExamRoomDTO> newestUniqueExamRooms.
Backend Repository
src/main/java/de/tum/cit/aet/artemis/exam/repository/ExamRoomRepository.java
Removed old eager-fetch method; renamed findAllIdsOfCurrentExamRooms()findAllIdsOfNewestExamRoomVersions(); added findAllNewestExamRoomVersionsWithEagerLayoutStrategies() (fetch join for layoutStrategies).
Backend Service
src/main/java/de/tum/cit/aet/artemis/exam/service/ExamRoomService.java
Skip hidden zip entries; renamed getExamRoomAdminOverview()getExamRoomOverview() returning ExamRoomOverviewDTO; switched to repo fetch of newest versions and updated freshness checks.
Backend REST Controller
src/main/java/de/tum/cit/aet/artemis/exam/web/ExamRoomManagementResource.java
New conditional, lazy controller (Instructor guard) exposing POST /api/exam/rooms/upload, GET /api/exam/rooms/overview, DELETE /api/exam/rooms/outdated-and-unused.
Admin Resource Cleanup
src/main/java/de/tum/cit/aet/artemis/exam/web/admin/AdminExamResource.java
Removed exam-room upload/overview/delete endpoints and related fields/imports; constructor simplified to drop ExamRoomService and MultipartProperties.
Frontend routes
src/main/webapp/app/app.routes.ts, src/main/webapp/app/core/admin/admin.routes.ts
Added exams/rooms route (INSTRUCTOR guard) and removed admin child exam-rooms route from admin section.
Frontend components & service
src/main/webapp/app/exam/manage/students/room-distribution/*
API and model refactor: ExamRoomAdminOverviewDTOExamRoomOverviewDTO, NumberOfStoredNumberOfAvailable; service baseUrl → api/exam/rooms, getAdminOverview()getRoomOverview(); component refactor to signals and translation keys renamed adminOverview → management.
Frontend admin sidebar & tests
src/main/webapp/app/core/admin/admin-sidebar/*
Removed Exam Rooms entry from admin sidebar and corresponding unit test; removed unused icon import.
Dialog & routing tests
src/main/webapp/app/exam/manage/students/room-distribution/students-room-distribution-dialog.*
Added RouterLink import and router-based navigation tests; dialog footer updated to include management link.
Translations
src/main/webapp/i18n/{en,de}/*
Renamed adminOverview → management, added management open/intro strings and cantFindRoom; removed several layout-statistics keys; removed admin sidebar examRooms entries.
Integration & tests
src/test/java/de/tum/cit/aet/artemis/exam/*, src/test/java/de/tum/cit/aet/artemis/exam/test_repository/ExamRoomTestRepository.java
Updated API paths /api/exam/admin/exam-rooms/*/api/exam/rooms/*; tests now use INSTRUCTOR where applicable; replaced AdminOverview DTO usages with Overview DTO and adjusted assertions; test repository query/method renamed/adjusted.

Sequence Diagram(s)

sequenceDiagram
    participant Client as Client (Instructor)
    participant Controller as ExamRoomManagementResource
    participant Service as ExamRoomService
    participant Repository as ExamRoomRepository
    participant DB as Database

    rect rgba(0,128,255,0.5)
    Note over Client,DB: Upload flow
    Client->>Controller: POST /api/exam/rooms/upload (zip)
    Controller->>Service: parseAndStoreExamRoomDataFromZipFile(zip)
    Service->>Repository: save/update ExamRoom entities (with layoutStrategies)
    Repository->>DB: persist exam rooms & layout strategies
    DB-->>Repository: OK
    Repository-->>Service: saved rooms
    Service-->>Controller: ExamRoomUploadInformationDTO
    Controller-->>Client: 200 OK + upload details
    end

    rect rgba(0,200,100,0.5)
    Note over Client,DB: Overview flow
    Client->>Controller: GET /api/exam/rooms/overview
    Controller->>Service: getExamRoomOverview()
    Service->>Repository: findAllNewestExamRoomVersionsWithEagerLayoutStrategies()
    Repository->>DB: SELECT newest versions with eager layoutStrategy join
    DB-->>Repository: newest ExamRoom set
    Repository-->>Service: ExamRoom entities
    Service->>Service: map to ExamRoomDTO set
    Service-->>Controller: ExamRoomOverviewDTO
    Controller-->>Client: 200 OK + overview
    end

    rect rgba(255,128,0,0.5)
    Note over Client,DB: Deletion flow
    Client->>Controller: DELETE /api/exam/rooms/outdated-and-unused
    Controller->>Service: deleteOutdatedAndUnusedExamRooms()
    Service->>Repository: find/delete outdated rooms
    Repository->>DB: DELETE outdated exam rooms
    DB-->>Repository: deletion summary
    Repository-->>Service: summary
    Service-->>Controller: ExamRoomDeletionSummaryDTO
    Controller-->>Client: 200 OK + summary
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • krusche
  • MoritzSpengler
  • florian-glombik
🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 24.59% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the main change: making Exam Room Management accessible to instructors rather than limiting it to admins. This aligns with the core refactoring shown across all modified files.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feature/exam-mode/exam-room-management-instructor-access

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/main/webapp/app/exam/manage/students/room-distribution/exam-rooms.component.spec.ts (1)

1-62: This spec is excluded from Vitest execution and uses incorrect test APIs

The spec file is not included in Vitest's test patterns (lines 27–41 in vitest.config.ts). The include array lists 13 module paths but omits src/main/webapp/app/exam/**/*.spec.ts, so this file will not be executed by Vitest at all. Additionally, the file uses jest.spyOn and jest.restoreAllMocks, which are Jest-specific APIs. The Vitest setup file (vitest-test-setup.ts) does not provide a Jest compatibility layer—it uses only Vitest's vi API. Even if the file were added to the include patterns, these Jest APIs would fail with ReferenceError.

Replace jest.spyOn with vi.spyOn and jest.restoreAllMocks() with vi.restoreAllMocks(), then add the exam module pattern to Vitest's include array: 'src/main/webapp/app/exam/**/*.spec.ts'.

🤖 Fix all issues with AI agents
In `@src/main/java/de/tum/cit/aet/artemis/exam/dto/room/ExamRoomOverviewDTO.java`:
- Around line 9-11: The JsonInclude policy on ExamRoomOverviewDTO causes
newestUniqueExamRooms to be omitted when empty, conflicting with the TypeScript
contract and tests; update the annotation on the ExamRoomOverviewDTO record (or
remove it) so the field is always serialized (e.g., change
`@JsonInclude`(JsonInclude.Include.NON_EMPTY) to
`@JsonInclude`(JsonInclude.Include.NON_NULL) or remove the annotation entirely)
ensuring newestUniqueExamRooms is emitted as an empty array instead of being
omitted.

In
`@src/main/java/de/tum/cit/aet/artemis/exam/repository/ExamRoomRepository.java`:
- Around line 178-202: The new repository method
findAllNewestExamRoomVersionsWithEagerLayoutStrategies has inconsistent grouping
compared to findAllIdsOfNewestExamRoomVersions (it GROUPs BY roomNumber, name
instead of selecting newest per roomNumber) and its Javadoc/@implNote/@return
are inaccurate; update the query to group by roomNumber only (or switch to the
same ROW_NUMBER() OVER (PARTITION BY roomNumber) approach used by
findAllIdsOfNewestExamRoomVersions to guarantee the same "newest" semantics),
change the `@implNote` to correctly describe the chosen technique (either the
GROUP BY+MAX(createdDate) strategy or the PARTITION BY/ROW_NUMBER approach), and
fix the `@return` to state that full ExamRoom entities with eagerly loaded
layoutStrategies are returned (or adjust return type if you intended to return
only basic info). Ensure references to ExamRoom and layoutStrategies remain in
the query and method signature
findAllNewestExamRoomVersionsWithEagerLayoutStrategies.

In
`@src/main/webapp/app/exam/manage/students/room-distribution/exam-rooms.service.spec.ts`:
- Around line 29-33: Update the test description in the getRoomOverview suite to
reflect the new naming (replace "admin overview" with the current naming such as
"room overview" or "exam room overview"); locate the test inside the
describe('getRoomOverview', ...) block where the it(...) call currently reads
'should send GET request to retrieve admin overview' and change the string to
the updated description so the test name matches the renamed functionality.

In `@src/test/java/de/tum/cit/aet/artemis/exam/ExamRoomIntegrationTest.java`:
- Around line 321-325: The test method
testUploadSingleRoomRepeatedDuplicatesRejected is still calling the removed
admin route; update the request.postMultipartFileOnly call to use the new upload
endpoint used by the current controller (replace the
"/api/exam/admin/exam-rooms/upload" path with the new upload path) so that
ExamRoomZipFiles.zipFileSingleExamRoomRepeated is posted to the correct
controller endpoint.
🧹 Nitpick comments (3)
src/main/webapp/app/app.routes.ts (1)

229-237: Consider adding usesModuleBackground for consistency.

Most other routes in this file include the usesModuleBackground data property. For visual consistency with other management pages, consider adding it:

♻️ Suggested change
     {
         path: 'exams/rooms',
         loadComponent: () => import('app/exam/manage/students/room-distribution/exam-rooms.component').then((m) => m.ExamRoomsComponent),
         data: {
             authorities: IS_AT_LEAST_INSTRUCTOR,
             pageTitle: 'artemisApp.examRooms.management.title',
+            usesModuleBackground: true,
         },
         canActivate: [UserRouteAccessService],
     },
src/main/webapp/app/exam/manage/students/room-distribution/exam-rooms.component.ts (1)

65-73: Avoid as assertions for response body and derived totals.

This keeps nulls out of the signal state and preserves type safety.

♻️ Suggested adjustment
-    readonly numberOfAvailable: Signal<NumberOfAvailable | undefined> = computed(() => {
+    readonly numberOfAvailable = computed<NumberOfAvailable | undefined>(() => {
         if (!this.hasOverview()) {
             return undefined;
         }

         return {
             examRooms: this.numberOfUniqueExamRooms(),
             examSeats: this.numberOfUniqueExamSeats(),
-        } as NumberOfAvailable;
+        };
     });
@@
-        this.examRoomsService.getRoomOverview().subscribe({
-            next: (examRoomOverviewResponse: HttpResponse<ExamRoomOverviewDTO>) => {
-                this.overview.set(examRoomOverviewResponse.body as ExamRoomOverviewDTO);
+        this.examRoomsService.getRoomOverview().subscribe({
+            next: (examRoomOverviewResponse: HttpResponse<ExamRoomOverviewDTO>) => {
+                this.overview.set(examRoomOverviewResponse.body ?? undefined);
                 this.sortRows();
             },

Also applies to: 90-93

src/main/java/de/tum/cit/aet/artemis/exam/web/ExamRoomManagementResource.java (1)

92-96: Rename “admin” wording to match new instructor-facing scope

The log message and local variable still use “admin” terminology; consider aligning with the new overview naming (and keep log level consistent with other methods).

♻️ Suggested rename
-    public ResponseEntity<ExamRoomOverviewDTO> getExamRoomOverview() {
-        log.info("REST request to get exam room admin overview");
-
-        var examRoomAdminOverviewDTO = examRoomService.getExamRoomOverview();
-        return ResponseEntity.ok(examRoomAdminOverviewDTO);
-    }
+    public ResponseEntity<ExamRoomOverviewDTO> getExamRoomOverview() {
+        log.debug("REST request to get exam room overview");
+
+        var examRoomOverviewDTO = examRoomService.getExamRoomOverview();
+        return ResponseEntity.ok(examRoomOverviewDTO);
+    }

@github-project-automation github-project-automation bot moved this from Work In Progress to Ready For Review in Artemis Development Jan 27, 2026
@github-actions
Copy link

@SamuelRoettgermann Test coverage could not be fully measured because some tests failed. Please check the workflow logs for details.

@github-actions
Copy link

End-to-End (E2E) Test Results Summary

TestsPassed ☑️Skipped ⚠️Failed ❌️Time ⏱
End-to-End (E2E) Test Report223 ran221 passed1 skipped1 failed1h 30m 57s 308ms
TestResultTime ⏱
End-to-End (E2E) Test Report
e2e/exam/test-exam/TestExamStudentExams.spec.ts
ts.Test Exam - student exams › Check exam participants and their submissions › Open the list of exam students❌ failure6m 59s 992ms

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In
`@src/main/webapp/app/exam/manage/students/room-distribution/exam-rooms.service.spec.ts`:
- Around line 9-10: The Vitest config is missing the exam spec pattern so tests
like exam-rooms.service.spec.ts won't run; open vitest.config.ts and add an
include pattern for the exam module (e.g.,
'src/main/webapp/app/exam/**/*.spec.ts') to the include array so files under the
exam folder (such as ExamRoomsService tests) are picked up by Vitest; ensure the
pattern matches existing spec filename conventions and restart the test runner.

In `@src/test/java/de/tum/cit/aet/artemis/exam/ExamRoomIntegrationTest.java`:
- Around line 269-287: The test currently treats only a null
newestUniqueExamRooms as the "no results" case; update validateExamRoomOverview
to treat an empty list the same: in the early guard, check if
roomOverview.newestUniqueExamRooms() == null ||
roomOverview.newestUniqueExamRooms().isEmpty(), then
assertThat(expectedNewRoomNames).isEmpty() and return. This ensures
validateExamRoomOverview (method name) handles both null and empty responses
from the API and avoids brittle contains assertions later when no expected names
are provided.
🧹 Nitpick comments (1)
src/main/java/de/tum/cit/aet/artemis/exam/repository/ExamRoomRepository.java (1)

183-198: Minor inconsistency with similar methods: Group-by approach vs ROW_NUMBER().

findAllNewestExamRoomVersionsWithEagerLayoutStrategies() uses GROUP BY roomNumber + MAX(createdDate), which can return multiple rows if two ExamRooms share the same roomNumber and createdDate. This differs from findAllIdsOfNewestExamRoomVersions() and findAllCurrentExamRoomsForDistribution(), both of which use ROW_NUMBER() OVER (PARTITION BY roomNumber ORDER BY createdDate DESC, id DESC) with an id-based tie-breaker.

In practice, timestamp precision prevents ties, but consider aligning all three methods for consistency.

♻️ Optional: Use ROW_NUMBER() for consistency
     `@Query`("""
-            WITH latestRooms AS (
-                SELECT
-                    roomNumber AS roomNumber,
-                    MAX(createdDate) AS maxCreatedDate
-                FROM ExamRoom
-                GROUP BY roomNumber
-            )
-            SELECT examRoom
-            FROM ExamRoom examRoom
-            JOIN latestRooms latestRoom
-                ON examRoom.roomNumber = latestRoom.roomNumber
-                AND examRoom.createdDate = latestRoom.maxCreatedDate
-            LEFT JOIN FETCH examRoom.layoutStrategies
+            SELECT examRoom
+            FROM ExamRoom examRoom
+            LEFT JOIN FETCH examRoom.layoutStrategies
+            WHERE examRoom.id IN (
+                SELECT id
+                FROM (
+                    SELECT er.id AS id, ROW_NUMBER() OVER (
+                        PARTITION BY er.roomNumber
+                        ORDER BY er.createdDate DESC, er.id DESC
+                    ) AS rowNumber
+                    FROM ExamRoom er
+                )
+                WHERE rowNumber = 1
+            )
             """)

@github-actions
Copy link

@SamuelRoettgermann Test coverage has been automatically updated in the PR description.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@src/test/java/de/tum/cit/aet/artemis/exam/ExamRoomIntegrationTest.java`:
- Around line 309-326: The tests have contradictory expectations for
duplicate-room zips: testGetExamRoomOverviewSingleRoomRepeated posts
ExamRoomZipFiles.zipFileSingleExamRoomRepeated expecting HttpStatus.OK but
ExamRoomService.parseAndStoreExamRoomDataFromZipFile rejects duplicates
(throwing BadRequest), which is what
testUploadSingleRoomRepeatedDuplicatesRejected expects; fix by making
testGetExamRoomOverviewSingleRoomRepeated either expect HttpStatus.BAD_REQUEST
on the first upload or change the uploaded fixture to
ExamRoomZipFiles.zipFileSingleExamRoom (a non-duplicate zip) so the loop can
succeed—update the assertion in testGetExamRoomOverviewSingleRoomRepeated or
swap the fixture accordingly and keep
testUploadSingleRoomRepeatedDuplicatesRejected as-is.
🧹 Nitpick comments (3)
src/test/java/de/tum/cit/aet/artemis/exam/ExamRoomIntegrationTest.java (3)

279-283: Update stale comment reference.

The comment mentions "admin overview" but this validation helper now serves the regular exam room overview endpoint. The comment should be updated to reflect the refactoring.

📝 Suggested fix
         List<ExamRoomDTO> newestUniqueExamRoomsFromDb = examRoomRepository.findAllNewestExamRoomVersionsWithEagerLayoutStrategies().stream().map(er -> new ExamRoomDTO(
                 er.getRoomNumber(), er.getName(), er.getBuilding(), er.getSeats().size(),
-                // Because of the INCLUDE.NON_EMPTY on the admin overview, we need to map to null on empty lists to match the returned DTO
+                // Because of the INCLUDE.NON_EMPTY on the overview DTO, we need to map to null on empty lists to match the returned DTO
                 er.getLayoutStrategies().isEmpty() ? null

312-313: Local variable should use camelCase, not ALL_CAPS.

Per Java naming conventions, ALL_CAPS is reserved for class-level constants (static final). Local final variables should use camelCase.

📝 Suggested fix
-        final int ITERATIONS = 3;
-        for (int i = 0; i < ITERATIONS; i++) {
+        final int iterations = 3;
+        for (int i = 0; i < iterations; i++) {

398-398: Same naming convention issue here.

The local variable ITERATIONS should be iterations to follow Java naming conventions.

📝 Suggested fix
-        final int ITERATIONS = 10;
+        final int iterations = 10;

@github-actions
Copy link

@SamuelRoettgermann Test coverage could not be fully measured because some tests failed. Please check the workflow logs for details.

@github-actions
Copy link

@SamuelRoettgermann Test coverage has been automatically updated in the PR description.

@github-actions
Copy link

@SamuelRoettgermann Your PR description needs attention before it can be reviewed:

Issues Found

  1. Screenshots are missing but this PR contains visual/UI changes

How to Fix

  • Add screenshots of the UI changes.

This check validates that your PR description follows the PR template. A complete description helps reviewers understand your changes and speeds up the review process.

Note: This description validation is an experimental feature. If you observe false positives, please send a DM with a link to the wrong comment to Patrick Bassner on Slack. Thank you!

@github-actions
Copy link

End-to-End (E2E) Test Results Summary

TestsPassed ☑️Skipped ⚠️Failed ❌️Time ⏱
End-to-End (E2E) Test Report223 ran220 passed1 skipped2 failed1h 42m 597ms
TestResultTime ⏱
End-to-End (E2E) Test Report
e2e/exam/test-exam/TestExamParticipation.spec.ts
ts.Test exam participation › Early Hand-in › Using exercise sidebar to navigate within exam❌ failure4m 32s 321ms
ts.Test exam participation › Early Hand-in › Using exercise overview to navigate within exam❌ failure4m 46s 777ms

@helios-aet helios-aet bot temporarily deployed to artemis-test5.artemis.cit.tum.de January 27, 2026 13:59 Inactive
@helios-aet helios-aet bot temporarily deployed to artemis-test3.artemis.cit.tum.de January 27, 2026 13:59 Inactive
@github-actions
Copy link

End-to-End (E2E) Test Results Summary

TestsPassed ☑️Skipped ⚠️Failed ❌️Time ⏱
End-to-End (E2E) Test Report223 ran220 passed2 skipped1 failed1h 44m 34s 448ms
TestResultTime ⏱
End-to-End (E2E) Test Report
e2e/exam/ExamAssessment.spec.ts
ts.Exam assessment › Text exercise assessment › Complaints about text exercises assessment❌ failure1m 15s 602ms

Copy link
Contributor

@florian-glombik florian-glombik left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

client Pull requests that update TypeScript code. (Added Automatically!) core Pull requests that affect the corresponding module exam Pull requests that affect the corresponding module ready for review server Pull requests that update Java code. (Added Automatically!) tests

Projects

Status: Ready For Review

Development

Successfully merging this pull request may close these issues.

3 participants