Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
import kr.ac.chungbuk.harmonize.utility.FileHandler;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.MessageSource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.data.domain.*;
import org.springframework.data.web.PageableDefault;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,10 @@ public MusicAnalysis(Long musicId) {
this.status = Status.INCOMPLETE;
}

public MusicAnalysis(Long musicId, Status status) {
this.musicId = musicId;
this.status = status;
}

public MusicAnalysis() {}
}
2 changes: 2 additions & 0 deletions src/main/java/kr/ac/chungbuk/harmonize/entity/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import kr.ac.chungbuk.harmonize.enums.Gender;
import kr.ac.chungbuk.harmonize.enums.Genre;
import kr.ac.chungbuk.harmonize.enums.Role;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import org.springframework.security.core.GrantedAuthority;
Expand Down Expand Up @@ -73,6 +74,7 @@ public class User implements UserDetails {
public User() {
}

@Builder
public User(String loginId, String password, String email, String nickname, Role role, Gender gender, Integer age) {
this.loginId = loginId;
this.password = password;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,38 +1,33 @@
package kr.ac.chungbuk.harmonize.service;

import jakarta.transaction.Transactional;
import kr.ac.chungbuk.harmonize.entity.Bookmark;
import kr.ac.chungbuk.harmonize.entity.Music;
import kr.ac.chungbuk.harmonize.entity.User;
import kr.ac.chungbuk.harmonize.repository.BookmarkRepository;
import kr.ac.chungbuk.harmonize.repository.MusicRepository;
import kr.ac.chungbuk.harmonize.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.NoSuchElementException;


@Service
@Slf4j
@Transactional(readOnly = true)
@RequiredArgsConstructor
@Service
// 북마크(좋아요), 추천 평가 등 음악과 관련된 사용자 행위를 담당하는 서비스
public class MusicActionService {

private final UserRepository userRepository;
private final MusicRepository musicRepository;
private final BookmarkRepository bookmarkRepository;

@Autowired
public MusicActionService(UserRepository userRepository, MusicRepository musicRepository,
BookmarkRepository bookmarkRepository) {
this.userRepository = userRepository;
this.musicRepository = musicRepository;
this.bookmarkRepository = bookmarkRepository;
}

// 북마크(좋아요 버튼)
@Transactional
public void createBookmark(Long userId, Long musicId) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package kr.ac.chungbuk.harmonize.service;

import jakarta.transaction.Transactional;
import kr.ac.chungbuk.harmonize.entity.Music;
import kr.ac.chungbuk.harmonize.entity.User;
import kr.ac.chungbuk.harmonize.enums.Status;
Expand All @@ -9,16 +8,17 @@
import kr.ac.chungbuk.harmonize.utility.FileHandler;
import lombok.RequiredArgsConstructor;
import org.apache.tomcat.util.http.fileupload.impl.SizeLimitExceededException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.requestreply.ReplyingKafkaTemplate;
import org.springframework.kafka.requestreply.RequestReplyMessageFuture;
import org.springframework.kafka.support.KafkaHeaders;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.messaging.support.MessageBuilder;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;
Expand Down Expand Up @@ -79,7 +79,7 @@ public void updateAlbumCover(MultipartFile albumCover) throws Exception {

// 음악 파일 업로드 (벌크 업로드)
@Transactional
public void updateAudioFile(MultipartFile audioFile) throws Exception {
public void updateAudioFile(MultipartFile audioFile) throws IOException {

String originalFilename = audioFile.getOriginalFilename();
assert originalFilename != null;
Expand Down Expand Up @@ -118,7 +118,7 @@ private void saveLyric(MultipartFile lyricFile, Music music) throws IOException,
}

InputStream stream = lyricFile.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
BufferedReader reader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8));
String lyric = reader.lines().collect(Collectors.joining("\n"));
music.setLyrics(lyric);
}
Expand Down
59 changes: 59 additions & 0 deletions src/test/java/kr/ac/chungbuk/harmonize/ControllerTestSupport.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package kr.ac.chungbuk.harmonize;

import com.fasterxml.jackson.databind.ObjectMapper;
import kr.ac.chungbuk.harmonize.config.SecurityConfig;
import kr.ac.chungbuk.harmonize.controller.MusicController;
import kr.ac.chungbuk.harmonize.repository.UserRepository;
import kr.ac.chungbuk.harmonize.security.JwtAuthenticationEntryPoint;
import kr.ac.chungbuk.harmonize.security.JwtAuthenticationFilter;
import kr.ac.chungbuk.harmonize.service.LogService;
import kr.ac.chungbuk.harmonize.service.MusicActionService;
import kr.ac.chungbuk.harmonize.service.MusicService;
import kr.ac.chungbuk.harmonize.utility.FileHandler;
import org.mockito.Mock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.DefaultSecurityFilterChain;
import org.springframework.test.web.servlet.MockMvc;

import static org.mockito.Mockito.mock;

@WebMvcTest(controllers = {
MusicController.class
})
@Import(SecurityConfig.class)
public abstract class ControllerTestSupport {

@Autowired
protected MockMvc mockMvc;

@Autowired
protected ObjectMapper objectMapper;

@MockBean
protected UserRepository userRepository;

@MockBean
protected MusicService musicService;

@MockBean
protected MusicActionService musicActionService;

@MockBean
protected LogService logService;

@MockBean
protected FileHandler fileHandler;

@Autowired
private JwtAuthenticationFilter jwtAuthenticationFilter;

@MockBean
private JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint;
}

This file was deleted.

21 changes: 21 additions & 0 deletions src/test/java/kr/ac/chungbuk/harmonize/IntegrationTestSupport.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package kr.ac.chungbuk.harmonize;

import kr.ac.chungbuk.harmonize.config.KafkaTopicConfig;
import kr.ac.chungbuk.harmonize.config.ScheduledTask;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.mock.mockito.MockBeans;
import org.springframework.kafka.requestreply.ReplyingKafkaTemplate;

@SpringBootTest
@MockBeans({
@MockBean(KafkaTopicConfig.class),
@MockBean(ReplyingKafkaTemplate.class),
@MockBean(ScheduledTask.class)
})
public class IntegrationTestSupport {

@MockBean
protected ReplyingKafkaTemplate<String, String, String> kafkaTemplate;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
package kr.ac.chungbuk.harmonize.controller;

import kr.ac.chungbuk.harmonize.entity.Music;
import kr.ac.chungbuk.harmonize.enums.Genre;
import kr.ac.chungbuk.harmonize.repository.MusicRepository;
import kr.ac.chungbuk.harmonize.service.MusicService;
import org.hamcrest.Matchers;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;

import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.util.Optional;

import static org.assertj.core.api.Assertions.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@SpringBootTest
@AutoConfigureMockMvc
@WithMockUser(authorities = "ADMIN")
class MusicControllerOldTest {

@Autowired
private MockMvc mvc;

@Autowired
private MusicService musicService;
@Autowired
private MusicRepository musicRepository;

@BeforeEach
void setUp() throws Exception {
// Given
MockMultipartFile albumCover = getProfileImage();

mvc.perform(
multipart("/api/music")
.file("albumCover", albumCover.getBytes())
.param("title", "<테스트 노래명>")
.param("genre", "INDIE")
.param("karaokeNum", "TJ 53651")
.param("releaseDate", "2019-03-13T00:00:00")
.param("playLink", "https://youtu.be/1gmleC0dOYY?si=ZFejSnIAzEEZx7Xd")
.param("themes", "부드러운 목소리, 테스트 테마!")
).andExpect(status().isCreated());

mvc.perform(
multipart("/api/music")
.file("albumCover", albumCover.getBytes())
.param("title", "<테스트 노래명2>")
.param("genre", "INDIE")
.param("karaokeNum", "TJ 53651")
.param("releaseDate", "2019-03-13T00:00:00")
.param("playLink", "https://youtu.be/1gmleC0dOYY?si=ZFejSnIAzEEZx7Xd")
).andExpect(status().isCreated());
}

@AfterEach
void cleanUp() throws Exception {
Optional<Music> uploaded1 = musicRepository.findByTitle("<테스트 노래명>");
if (uploaded1.isPresent())
musicService.delete(uploaded1.get().getMusicId());
Optional<Music> uploaded2 = musicRepository.findByTitle("<테스트 노래명2>");
if (uploaded2.isPresent())
musicService.delete(uploaded2.get().getMusicId());
}

@Test
void create() throws Exception {
// When & Then
Music uploaded = musicRepository.findByTitle("<테스트 노래명>").orElseThrow();
}

@Test
void update() throws Exception {
// Given
Long musicId = musicRepository.findByTitle("<테스트 노래명>").orElseThrow().getMusicId();

// When
mvc.perform(put(new URI("/api/music/"+musicId))
.param("title", "<테스트 노래명>")
.param("genre", "ROCK"))
.andExpect(status().isAccepted());

// Then
Music music = musicRepository.findByTitle("<테스트 노래명>").orElseThrow();
assertThat(music.getGenre() == Genre.ROCK);
}

@Test
void delete() throws Exception {
// When
Music uploaded = musicRepository.findByTitle("<테스트 노래명>").orElseThrow();

mvc.perform(MockMvcRequestBuilders.delete(new URI("/api/music/" + uploaded.getMusicId())))
.andExpect(status().isAccepted());

// Then
assertThat(musicRepository.findByTitle("<테스트 노래명>").isEmpty());
}

@Test
void list() throws Exception {
// When & Then
mvc.perform(get(new URI("/api/music?page=0&size=2")))
.andExpect(status().isOk())
.andExpect(jsonPath("$.content").isArray())
.andExpect(jsonPath("$.content", Matchers.hasSize(2)))
.andExpect(jsonPath("$.content[0].title").value(Matchers.is("<테스트 노래명2>")))
.andExpect(jsonPath("$.content[1].title").value(Matchers.is("<테스트 노래명>")));
}

@Test
void listThemes() throws Exception {
// When & Then
mvc.perform(get(new URI("/api/music/theme")))
.andExpect(status().isOk())
.andExpect(jsonPath("$.content").isArray())
.andExpect(jsonPath("$.content.length()", Matchers.greaterThanOrEqualTo(2)));
}

@Test
void listMusicOfTheme() throws Exception {
// When & Then
mvc.perform(get(new URI("/api/music/theme/music")).param("themeName", "테스트 테마!"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.content[0].themes").isArray())
.andExpect(jsonPath("$.content[0].themes").value(Matchers.hasItem("테스트 테마!")));
}


private MockMultipartFile getProfileImage() throws IOException {
final String filename = "albumcover.jpg";
final String filePath = "src/test/resources/" + filename;
FileInputStream fileInputStream = new FileInputStream(filePath);

MockMultipartFile profileImage = new MockMultipartFile(
"images",
filename,
"jpg",
fileInputStream
);
return profileImage;
}
}
Loading