Skip to content

Commit

Permalink
✨ feat: add new announcement check api (#488)
Browse files Browse the repository at this point in the history
* ✨ feat: add new announcement check api

* ✅ test: add announcement new test
  • Loading branch information
seonghun-dev authored Jun 25, 2024
1 parent c9f3736 commit c819e13
Show file tree
Hide file tree
Showing 6 changed files with 114 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,14 @@
import com.depromeet.common.dto.PaginationResponseDto;
import com.depromeet.common.dto.ResponseDto;
import com.depromeet.domains.announcement.dto.response.AnnouncementResponseDto;
import com.depromeet.domains.announcement.dto.response.NewAnnouncementResponseDto;
import com.depromeet.domains.announcement.service.AnnouncementService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/announcements")
Expand All @@ -37,4 +36,14 @@ public ResponseEntity<AnnouncementResponseDto> getAnnouncement(
return ResponseDto.ok(response);
}

@Operation(summary = "신규 공지사항 여부 조회")
@GetMapping("/new")
public ResponseEntity<NewAnnouncementResponseDto> hasNewAnnouncement(
@Schema(description = "마지막으로 조회한 공지사항 아이디", example = "1")
@RequestParam(defaultValue = "-1") Long lastAnnouncementId
) {
var response = announcementService.hasNewAnnouncement(lastAnnouncementId);
return ResponseDto.ok(response);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.depromeet.domains.announcement.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;

public record NewAnnouncementResponseDto (
@Schema(description = "새로운 공지사항이 있는지 여부", example = "true")
boolean hasNewAnnouncement
){
public NewAnnouncementResponseDto(boolean hasNewAnnouncement) {
this.hasNewAnnouncement = hasNewAnnouncement;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,7 @@
import org.springframework.data.jpa.repository.JpaRepository;

public interface AnnouncementRepository extends JpaRepository<Announcement, Long> {

boolean existsByIdGreaterThan(Long lastAnnouncementId);

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.depromeet.common.error.exception.internal.NotFoundException;
import com.depromeet.domains.announcement.dto.response.AnnouncementListResponseDto;
import com.depromeet.domains.announcement.dto.response.AnnouncementResponseDto;
import com.depromeet.domains.announcement.dto.response.NewAnnouncementResponseDto;
import com.depromeet.domains.announcement.repository.AnnouncementRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
Expand Down Expand Up @@ -41,4 +42,11 @@ public AnnouncementResponseDto getAnnouncement(Long announcementId) {
.orElseThrow(() -> new NotFoundException(CommonErrorCode.NOT_FOUND, announcementId));
}


@Transactional(readOnly = true)
public NewAnnouncementResponseDto hasNewAnnouncement(Long lastAnnouncementId) {
var isExist = announcementRepository.existsByIdGreaterThan(lastAnnouncementId);
return new NewAnnouncementResponseDto(isExist);
}

}
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
package unit.domains.announcement.controller;

import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import com.depromeet.announcement.Announcement;
import com.depromeet.common.dto.MetaInterface;
import com.depromeet.common.dto.PageMetaResponseDto;
Expand All @@ -15,8 +10,8 @@
import com.depromeet.domains.announcement.controller.AnnouncementController;
import com.depromeet.domains.announcement.dto.response.AnnouncementListResponseDto;
import com.depromeet.domains.announcement.dto.response.AnnouncementResponseDto;
import com.depromeet.domains.announcement.dto.response.NewAnnouncementResponseDto;
import com.depromeet.domains.announcement.service.AnnouncementService;
import java.util.List;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
Expand All @@ -28,6 +23,13 @@
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.web.servlet.MockMvc;

import java.util.List;

import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@ContextConfiguration(classes = AnnouncementController.class)
@WebMvcTest(controllers = {AnnouncementController.class}, excludeAutoConfiguration = {SecurityAutoConfiguration.class})
@Import({AnnouncementController.class, GlobalExceptionHandler.class})
Expand Down Expand Up @@ -133,4 +135,38 @@ void getAnnouncementTestFail1() throws Exception {
}
}


@DisplayName("[GET] 신규 공지사항 여부 조회")
@Nested
class HasNewAnnouncementTest {
@Nested
@DisplayName("성공")
class Success {
@DisplayName("신규 공지사항이 없는 경우")
@Test
void hasNewAnnouncementTestSuccess1() throws Exception {
var lastAnnouncementId = 1L;
var announcementResponseDto = new NewAnnouncementResponseDto(false);
when(announcementService.hasNewAnnouncement(lastAnnouncementId)).thenReturn(announcementResponseDto);

var response = mvc.perform(get("/announcements/new?lastAnnouncementId={lastAnnouncementId}", lastAnnouncementId));
response.andExpect(status().isOk())
.andExpect(jsonPath("$.hasNewAnnouncement").value(false));

}

@DisplayName("신규 공지사항이 있는 경우")
@Test
void hasNewAnnouncementTestSuccess2() throws Exception {
var lastAnnouncementId = 1L;
var announcementResponseDto = new NewAnnouncementResponseDto(true);
when(announcementService.hasNewAnnouncement(lastAnnouncementId)).thenReturn(announcementResponseDto);

var response = mvc.perform(get("/announcements/new?lastAnnouncementId={lastAnnouncementId}", lastAnnouncementId));
response.andExpect(status().isOk())
.andExpect(jsonPath("$.hasNewAnnouncement").value(true));
}
}

}
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,12 @@
package unit.domains.announcement.service;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
import static org.mockito.Mockito.when;

import com.depromeet.announcement.Announcement;
import com.depromeet.common.error.exception.internal.NotFoundException;
import com.depromeet.domains.announcement.dto.response.AnnouncementListResponseDto;
import com.depromeet.domains.announcement.dto.response.AnnouncementResponseDto;
import com.depromeet.domains.announcement.dto.response.NewAnnouncementResponseDto;
import com.depromeet.domains.announcement.repository.AnnouncementRepository;
import com.depromeet.domains.announcement.service.AnnouncementService;
import java.util.List;
import java.util.Optional;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
Expand All @@ -20,6 +15,13 @@
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import java.util.List;
import java.util.Optional;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
import static org.mockito.Mockito.when;

@ExtendWith(MockitoExtension.class)
@DisplayName("[Service] AnnouncementService 테스트")
class AnnouncementServiceTest {
Expand Down Expand Up @@ -104,4 +106,32 @@ void getAnnouncementTestFail1() {
}
}


@DisplayName("신규 공지사항 여부 조회")
@Nested
class HasNewAnnouncementTest {
@DisplayName("조회할 공지사항 있는 경우")
@Test
void hasNewAnnouncementTestSuccess1() {
var expectedResponse = new NewAnnouncementResponseDto(true);

when(announcementRepository.existsByIdGreaterThan(-1L)).thenReturn(true);

var result = announcementService.hasNewAnnouncement(-1L);

assertThat(result).isEqualTo(expectedResponse);
}

@DisplayName("조회할 공지사항 없는 경우")
@Test
void hasNewAnnouncementTestSuccess2() {
var expectedResponse = new NewAnnouncementResponseDto(false);

when(announcementRepository.existsByIdGreaterThan(-1L)).thenReturn(false);

var result = announcementService.hasNewAnnouncement(-1L);

assertThat(result).isEqualTo(expectedResponse);
}
}
}

0 comments on commit c819e13

Please sign in to comment.