From e80e7fd72a2c50b0bf21ca43048e06928e78f95a Mon Sep 17 00:00:00 2001 From: Tim Cremer Date: Mon, 23 Sep 2024 17:29:26 +0200 Subject: [PATCH] Integrated changes, fixed last test --- .../communication/service/FaqService.java | 52 ------------------- .../communication/web/FaqResource.java | 27 +++++----- .../course/manage/course-update.component.ts | 2 +- src/main/webapp/app/faq/faq.service.ts | 4 +- .../course-faq-accordion-component.html | 2 +- .../de/tum/cit/aet/artemis/FaqFactory.java | 3 -- .../cit/aet/artemis/FaqIntegrationTest.java | 3 +- .../faq/faq-update.component.spec.ts | 3 -- .../spec/component/faq/faq.component.spec.ts | 25 ++++----- 9 files changed, 29 insertions(+), 92 deletions(-) delete mode 100644 src/main/java/de/tum/cit/aet/artemis/communication/service/FaqService.java diff --git a/src/main/java/de/tum/cit/aet/artemis/communication/service/FaqService.java b/src/main/java/de/tum/cit/aet/artemis/communication/service/FaqService.java deleted file mode 100644 index 127fe3af84f6..000000000000 --- a/src/main/java/de/tum/cit/aet/artemis/communication/service/FaqService.java +++ /dev/null @@ -1,52 +0,0 @@ -package de.tum.cit.aet.artemis.communication.service; - -import static de.tum.cit.aet.artemis.core.config.Constants.PROFILE_CORE; - -import java.util.Optional; -import java.util.Set; - -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Service; - -import de.tum.cit.aet.artemis.communication.domain.Faq; -import de.tum.cit.aet.artemis.communication.repository.FaqRepository; - -/** - * REST service for managing Faqs. - */ -@Profile(PROFILE_CORE) -@Service -public class FaqService { - - private final FaqRepository faqRepository; - - public FaqService(FaqRepository faqRepository) { - this.faqRepository = faqRepository; - } - - /** - * Deletes the given faq - * - * @param faqId the ID of the FAQ to be deleted - */ - public void deleteById(long faqId) { - faqRepository.deleteById(faqId); - - } - - public Faq save(Faq faq) { - return faqRepository.save(faq); - } - - public Set findAllCategoriesByCourseId(long courseId) { - return faqRepository.findAllCategoriesByCourseId(courseId); - } - - public Optional findById(Long faqId) { - return faqRepository.findById(faqId); - } - - public Set findAllByCourseId(Long courseId) { - return faqRepository.findAllByCourseId(courseId); - } -} diff --git a/src/main/java/de/tum/cit/aet/artemis/communication/web/FaqResource.java b/src/main/java/de/tum/cit/aet/artemis/communication/web/FaqResource.java index 8da9e7d0f1c9..e0d884d2e304 100644 --- a/src/main/java/de/tum/cit/aet/artemis/communication/web/FaqResource.java +++ b/src/main/java/de/tum/cit/aet/artemis/communication/web/FaqResource.java @@ -21,10 +21,9 @@ import org.springframework.web.bind.annotation.RestController; import de.tum.cit.aet.artemis.communication.domain.Faq; -import de.tum.cit.aet.artemis.communication.service.FaqService; +import de.tum.cit.aet.artemis.communication.repository.FaqRepository; import de.tum.cit.aet.artemis.core.domain.Course; import de.tum.cit.aet.artemis.core.exception.BadRequestAlertException; -import de.tum.cit.aet.artemis.core.exception.EntityNotFoundException; import de.tum.cit.aet.artemis.core.repository.CourseRepository; import de.tum.cit.aet.artemis.core.security.Role; import de.tum.cit.aet.artemis.core.security.annotations.EnforceAtLeastInstructor; @@ -47,17 +46,17 @@ public class FaqResource { @Value("${jhipster.clientApp.name}") private String applicationName; - private final FaqService faqService; - private final CourseRepository courseRepository; + private final FaqRepository faqRepository; + private final AuthorizationCheckService authCheckService; - public FaqResource(FaqService faqService, CourseRepository courseRepository, AuthorizationCheckService authCheckService) { + public FaqResource(CourseRepository courseRepository, AuthorizationCheckService authCheckService, FaqRepository faqRepository) { - this.faqService = faqService; this.courseRepository = courseRepository; this.authCheckService = authCheckService; + this.faqRepository = faqRepository; } /** @@ -76,7 +75,7 @@ public ResponseEntity createFaq(@RequestBody Faq faq) throws URISyntaxExcep } authCheckService.checkHasAtLeastRoleInCourseElseThrow(Role.INSTRUCTOR, faq.getCourse(), null); - Faq savedFaq = faqService.save(faq); + Faq savedFaq = faqRepository.save(faq); return ResponseEntity.created(new URI("/api/faqs/" + savedFaq.getId())).body(savedFaq); } @@ -96,8 +95,8 @@ public ResponseEntity updateFaq(@RequestBody Faq faq, @PathVariable Long fa throw new BadRequestAlertException("Id of FAQ and path must match", ENTITY_NAME, "idNull"); } authCheckService.checkHasAtLeastRoleInCourseElseThrow(Role.INSTRUCTOR, faq.getCourse(), null); - Faq existingFaq = faqService.findById(faqId).orElseThrow(() -> new EntityNotFoundException("FAQ not found", faqId)); - Faq result = faqService.save(faq); + Faq existingFaq = faqRepository.findByIdElseThrow(faqId); + Faq result = faqRepository.save(faq); return ResponseEntity.ok().body(result); } @@ -111,7 +110,7 @@ public ResponseEntity updateFaq(@RequestBody Faq faq, @PathVariable Long fa @EnforceAtLeastStudent public ResponseEntity getFaq(@PathVariable Long faqId) { log.debug("REST request to get faq {}", faqId); - Faq faq = faqService.findById(faqId).orElseThrow(() -> new EntityNotFoundException("FAQ not found", faqId)); + Faq faq = faqRepository.findByIdElseThrow(faqId); authCheckService.checkHasAtLeastRoleInCourseElseThrow(Role.STUDENT, faq.getCourse(), null); return ResponseEntity.ok(faq); } @@ -127,9 +126,9 @@ public ResponseEntity getFaq(@PathVariable Long faqId) { public ResponseEntity deleteFaq(@PathVariable Long faqId) { log.debug("REST request to delete faq {}", faqId); - Faq faq = faqService.findById(faqId).orElseThrow(() -> new EntityNotFoundException("FAQ not found", faqId)); + Faq faq = faqRepository.findByIdElseThrow(faqId); authCheckService.checkHasAtLeastRoleInCourseElseThrow(Role.INSTRUCTOR, faq.getCourse(), null); - faqService.deleteById(faqId); + faqRepository.deleteById(faqId); return ResponseEntity.ok().headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, faqId.toString())).build(); } @@ -146,7 +145,7 @@ public ResponseEntity> getFaqForCourse(@PathVariable Long courseId) { Course course = getCourseForRequest(courseId); authCheckService.checkHasAtLeastRoleInCourseElseThrow(Role.STUDENT, course, null); - Set faqs = faqService.findAllByCourseId(courseId); + Set faqs = faqRepository.findAllByCourseId(courseId); return ResponseEntity.ok().body(faqs); } @@ -163,7 +162,7 @@ public ResponseEntity> getFaqCategoriesForCourse(@PathVariable Long Course course = getCourseForRequest(courseId); authCheckService.checkHasAtLeastRoleInCourseElseThrow(Role.STUDENT, course, null); - Set faqs = faqService.findAllCategoriesByCourseId(courseId); + Set faqs = faqRepository.findAllCategoriesByCourseId(courseId); return ResponseEntity.ok().body(faqs); } diff --git a/src/main/webapp/app/course/manage/course-update.component.ts b/src/main/webapp/app/course/manage/course-update.component.ts index 16f8ed1ab0e3..f0dcaa47c9e8 100644 --- a/src/main/webapp/app/course/manage/course-update.component.ts +++ b/src/main/webapp/app/course/manage/course-update.component.ts @@ -71,7 +71,7 @@ export class CourseUpdateComponent implements OnInit { faExclamationTriangle = faExclamationTriangle; faPen = faPen; - faqEnabled: boolean = true; //default value + faqEnabled: true; //default value communicationEnabled = true; messagingEnabled = true; ltiEnabled = false; diff --git a/src/main/webapp/app/faq/faq.service.ts b/src/main/webapp/app/faq/faq.service.ts index 2088129a1bdc..059a10b95f99 100644 --- a/src/main/webapp/app/faq/faq.service.ts +++ b/src/main/webapp/app/faq/faq.service.ts @@ -16,7 +16,7 @@ export class FAQService { create(faq: FAQ): Observable { const copy = FAQService.convertFaqFromClient(faq); - faq.faqState = FAQState.ACCEPTED; + copy.faqState = FAQState.ACCEPTED; return this.http.post(`api/faqs`, copy, { observe: 'response' }).pipe( map((res: EntityResponseType) => { return res; @@ -59,7 +59,7 @@ export class FAQService { * @param res the response */ static convertFaqCategoriesFromServer(res: ERT): ERT { - if (res.body && res.body.categories) { + if (res.body?.categories) { FAQService.parseFaqCategories(res.body); } return res; diff --git a/src/main/webapp/app/overview/course-faq/course-faq-accordion-component.html b/src/main/webapp/app/overview/course-faq/course-faq-accordion-component.html index 3e41b0eeefab..6f985dcfba2f 100644 --- a/src/main/webapp/app/overview/course-faq/course-faq-accordion-component.html +++ b/src/main/webapp/app/overview/course-faq/course-faq-accordion-component.html @@ -1,6 +1,6 @@
-

+

{{faq().questionTitle}}

@for (category of faq().categories; track category){ diff --git a/src/test/java/de/tum/cit/aet/artemis/FaqFactory.java b/src/test/java/de/tum/cit/aet/artemis/FaqFactory.java index 92b23c833cdb..ed782cb289ce 100644 --- a/src/test/java/de/tum/cit/aet/artemis/FaqFactory.java +++ b/src/test/java/de/tum/cit/aet/artemis/FaqFactory.java @@ -25,7 +25,4 @@ public static Set generateFaqCategories() { categories.add("this is also a category"); return categories; } - - private FaqFactory() { - } } diff --git a/src/test/java/de/tum/cit/aet/artemis/FaqIntegrationTest.java b/src/test/java/de/tum/cit/aet/artemis/FaqIntegrationTest.java index c56f34ad916d..45a9bfb47f05 100644 --- a/src/test/java/de/tum/cit/aet/artemis/FaqIntegrationTest.java +++ b/src/test/java/de/tum/cit/aet/artemis/FaqIntegrationTest.java @@ -16,6 +16,7 @@ import de.tum.cit.aet.artemis.communication.domain.FaqState; import de.tum.cit.aet.artemis.communication.repository.FaqRepository; import de.tum.cit.aet.artemis.core.domain.Course; +import de.tum.cit.aet.artemis.core.exception.EntityNotFoundException; class FaqIntegrationTest extends AbstractSpringIntegrationIndependentTest { @@ -105,7 +106,7 @@ void updateFaq_correctRequestBody_shouldUpdateFaq() throws Exception { @Test @WithMockUser(username = TEST_PREFIX + "instructor1", roles = "INSTRUCTOR") void testGetFaqCategoriesByCourseId() throws Exception { - Faq faq = faqRepository.findById(this.faq.getId()).orElseThrow(); + Faq faq = faqRepository.findById(this.faq.getId()).orElseThrow(EntityNotFoundException::new); Set categories = faq.getCategories(); Set returnedCategories = request.get("/api/courses/" + faq.getCourse().getId() + "/faq-categories", HttpStatus.OK, Set.class); assertThat(categories).isEqualTo(returnedCategories); diff --git a/src/test/javascript/spec/component/faq/faq-update.component.spec.ts b/src/test/javascript/spec/component/faq/faq-update.component.spec.ts index 4693a72c65dd..bc00d1df79bc 100644 --- a/src/test/javascript/spec/component/faq/faq-update.component.spec.ts +++ b/src/test/javascript/spec/component/faq/faq-update.component.spec.ts @@ -38,9 +38,6 @@ describe('FaqUpdateComponent', () => { parent: { data: of({ course: { id: 1 } }), }, - queryParams: of({ - params: {}, - }), snapshot: { paramMap: convertToParamMap({ courseId: '1', diff --git a/src/test/javascript/spec/component/faq/faq.component.spec.ts b/src/test/javascript/spec/component/faq/faq.component.spec.ts index f2ca7cef71a3..28214f64eb44 100644 --- a/src/test/javascript/spec/component/faq/faq.component.spec.ts +++ b/src/test/javascript/spec/component/faq/faq.component.spec.ts @@ -58,9 +58,6 @@ describe('FaqComponent', () => { parent: { data: of({ course: { id: 1 } }), }, - queryParams: of({ - params: {}, - }), snapshot: { paramMap: convertToParamMap({ courseId: '1', @@ -93,16 +90,17 @@ describe('FaqComponent', () => { }, }), ], - }).compileComponents(); + }) + .compileComponents() + .then(() => { + global.ResizeObserver = jest.fn().mockImplementation((callback: ResizeObserverCallback) => { + return new MockResizeObserver(callback); + }); + faqComponentFixture = TestBed.createComponent(FAQComponent); + faqComponent = faqComponentFixture.componentInstance; - global.ResizeObserver = jest.fn().mockImplementation((callback: ResizeObserverCallback) => { - return new MockResizeObserver(callback); - }); - faqComponentFixture = TestBed.createComponent(FAQComponent); - faqComponent = faqComponentFixture.componentInstance; - - faqService = TestBed.inject(FAQService); - faqComponentFixture.detectChanges(); + faqService = TestBed.inject(FAQService); + }); }); afterEach(() => { @@ -113,7 +111,6 @@ describe('FaqComponent', () => { const findAllSpy = jest.spyOn(faqService, 'findAllByCourseId'); faqComponentFixture.detectChanges(); - //is actually called when debugging, i dont get why it is 0. Need help expect(findAllSpy).toHaveBeenCalledOnce(); expect(findAllSpy).toHaveBeenCalledWith(1); expect(faqComponent.faqs).toHaveLength(3); @@ -121,10 +118,8 @@ describe('FaqComponent', () => { it('should delete faq', () => { const deleteSpy = jest.spyOn(faqService, 'delete'); - faqComponentFixture.detectChanges(); faqComponent.deleteFaq(faq1.id!); - expect(deleteSpy).toHaveBeenCalledOnce(); expect(deleteSpy).toHaveBeenCalledWith(faq1.id!); expect(faqComponent.faqs).toHaveLength(2);