diff --git a/src/main/webapp/app/exercises/shared/rating/rating.component.ts b/src/main/webapp/app/exercises/shared/rating/rating.component.ts index 41173d0c219f..918caf3876d3 100644 --- a/src/main/webapp/app/exercises/shared/rating/rating.component.ts +++ b/src/main/webapp/app/exercises/shared/rating/rating.component.ts @@ -15,6 +15,7 @@ export class RatingComponent implements OnInit, OnChanges { public rating: number; public disableRating = false; @Input() result?: Result; + private previousResultId?: number; constructor( private ratingService: RatingService, @@ -26,7 +27,8 @@ export class RatingComponent implements OnInit, OnChanges { } ngOnChanges(changes: SimpleChanges): void { - if (changes['result'] && !changes['result'].isFirstChange()) { + if (changes['result'] && changes['result'].currentValue?.id !== this.previousResultId) { + this.previousResultId = changes['result'].currentValue?.id; this.loadRating(); } } diff --git a/src/test/javascript/spec/component/rating/rating.component.spec.ts b/src/test/javascript/spec/component/rating/rating.component.spec.ts index 87f4018ec8a9..cab6a9d11e14 100644 --- a/src/test/javascript/spec/component/rating/rating.component.spec.ts +++ b/src/test/javascript/spec/component/rating/rating.component.spec.ts @@ -98,6 +98,20 @@ describe('RatingComponent', () => { expect(ratingComponent.rating).toBe(2); }); + it('should not call loadRating if result ID remains the same', () => { + // without this condition the loadRating might be spammed making unnecessary api calls + const loadRatingSpy = jest.spyOn(ratingComponent, 'loadRating'); + ratingComponent.result = { id: 90 } as Result; + ratingComponent.result.submission = { id: 1 } as Submission; + ratingComponent.result.participation = { id: 1 } as Participation; + jest.spyOn(ratingService, 'getRating').mockReturnValue(of(2)); + ratingComponentFixture.detectChanges(); + ratingComponent.result = { id: 90 } as Result; + ratingComponentFixture.detectChanges(); + expect(loadRatingSpy).toHaveBeenCalledOnce(); + expect(ratingComponent.rating).toBe(2); + }); + describe('OnRate', () => { beforeEach(() => { ratingComponent.rating = 0;