From 1eeaaa2e3f5419243deca6da1b90570fba14f780 Mon Sep 17 00:00:00 2001 From: nilsreichardt Date: Wed, 18 Mar 2026 15:27:10 +0100 Subject: [PATCH] Fix the bug that occurs when setting the factor for a grade subject that doesn't yet exist. --- .../term_settings_page_controller.dart | 5 +- .../term_settings_page_controller_test.dart | 56 +++++++++++++++++++ 2 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 app/test/grades/pages/term_settings_page/term_settings_page_controller_test.dart diff --git a/app/lib/grades/pages/term_settings_page/term_settings_page_controller.dart b/app/lib/grades/pages/term_settings_page/term_settings_page_controller.dart index 0acfbf40a..58a9b5d4c 100644 --- a/app/lib/grades/pages/term_settings_page/term_settings_page_controller.dart +++ b/app/lib/grades/pages/term_settings_page/term_settings_page_controller.dart @@ -148,10 +148,11 @@ class TermSettingsPageController extends ChangeNotifier { } Future setSubjectWeight(SubjectId subjectId, Weight weight) async { - final subRef = termRef.subject(subjectId); + TermSubjectRef subRef = termRef.subject(subjectId); final isNewSubject = gradesService.getSubject(subjectId) == null; if (isNewSubject) { - subjectId = _createSubject(subRef); + final newSubjectId = _createSubject(subRef); + subRef = termRef.subject(newSubjectId); // Firestore had a soft limit of 1 write per second per document. However, // this limit isn't mentioned in the documentation anymore. We still keep diff --git a/app/test/grades/pages/term_settings_page/term_settings_page_controller_test.dart b/app/test/grades/pages/term_settings_page/term_settings_page_controller_test.dart new file mode 100644 index 000000000..f24cd70d0 --- /dev/null +++ b/app/test/grades/pages/term_settings_page/term_settings_page_controller_test.dart @@ -0,0 +1,56 @@ +// Copyright (c) 2026 Sharezone UG (haftungsbeschränkt) +// Licensed under the EUPL-1.2-or-later. +// +// You may obtain a copy of the Licence at: +// https://joinup.ec.europa.eu/software/page/eupl +// +// SPDX-License-Identifier: EUPL-1.2 + +import 'package:flutter_test/flutter_test.dart'; +import 'package:group_domain_models/group_domain_models.dart'; +import 'package:sharezone/grades/grades_service/grades_service.dart'; +import 'package:sharezone/grades/pages/term_settings_page/term_settings_page_controller.dart'; + +import '../../grades_test_common.dart'; + +void main() { + group('$TermSettingsPageController', () { + test( + 'setSubjectWeight creates a missing subject and updates the weight', + () async { + const termId = TermId('term-id'); + const courseId = 'course-id'; + final service = GradesService(); + final testController = GradesTestController(gradesService: service); + testController.createTerm(termWith(id: termId)); + + final controller = TermSettingsPageController( + gradesService: service, + termRef: service.term(termId), + coursesStream: Stream.value([ + Course.create().copyWith( + id: courseId, + name: 'English LK', + subject: 'English', + abbreviation: 'EN', + ), + ]), + ); + + await Future.delayed(Duration.zero); + await controller.setSubjectWeight( + const SubjectId(courseId), + const Weight.factor(2), + ); + + final termSubject = testController + .term(termId) + .subjects + .singleWhere((subject) => subject.name == 'English'); + expect(termSubject.weightingForTermGrade, const Weight.factor(2)); + + controller.dispose(); + }, + ); + }); +}