Skip to content

Commit

Permalink
feat/test setting
Browse files Browse the repository at this point in the history
  • Loading branch information
AlmondBreez3 committed Mar 25, 2024
1 parent 0139711 commit 7006da7
Show file tree
Hide file tree
Showing 15 changed files with 904 additions and 20 deletions.
2 changes: 1 addition & 1 deletion Api/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ repositories {
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-web'

testImplementation 'org.springframework.security:spring-security-test'

// swagger
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
import com.example.domains.recommendedPopcornUser.entity.RecommendedPopcornUser;
import com.example.domains.user.adaptor.UserAdaptor;
import com.example.domains.user.entity.User;
import com.example.oauth.tmdb.client.TmdbClient;
import com.example.oauth.tmdb.dto.TdmbResponseDto;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.JsonElement;
Expand All @@ -26,6 +29,7 @@
public class PostRecommendPopcornUseCase {
private final RecommendedPopcornAdaptor recommendedPopcornAdaptor;
private final UserAdaptor userAdaptor;
private final TmdbClient tmdbClient;
private final RecommendedPopcornUserAdaptor recommendedPopcornUserAdaptor;

@Value("${KDMB}")
Expand All @@ -38,14 +42,48 @@ public void execute(RecommendedPopcornRequest request) throws IOException {
JsonElement jsonObject = parser.parse(request.getMovieId());
String movieTypeWithoutQuotes = request.getMovieType().replaceAll("\"", "");

getApi(jsonObject,request,movieTypeWithoutQuotes);
//TODO
String responseString = tmdbClient.getMovieData(request.getMovieId(),movieTypeWithoutQuotes,"Y",tmdb);
changeToObject(responseString,request);
//RecommendedPopcorn.of(request.getMovieId(),request.getReason())
}

private void changeToObject(String responseString,RecommendedPopcornRequest request) throws JsonProcessingException {
//값 처리하는 로직
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(responseString);
//4. To JsonObject

JsonNode movieData = rootNode.path("Data").path(0).path("Result").path(0);


String title = movieData.path("title").asText();
title = title.trim();
String directorNm = movieData.path("directors").path("director").path(0).path("directorNm").asText();
String plotText = movieData.path("plots").path("plot").path(0).path("plotText").asText();
String firstPosterUrl = movieData.path("posters").asText().split("\\|")[0];
postRecommendation(request.getMovieId(),title,plotText,firstPosterUrl,directorNm,request);
}

private void validateMovieId(String movieId) {
recommendedPopcornAdaptor.checkExists(movieId);
}

public void postRecommendation(String movieId,String originalTitle, String overview, String posterPath,String directorNm, RecommendedPopcornRequest popcornRequest) {
Long userId = SecurityUtil.getCurrentUserId();
User user = userAdaptor.findById(userId);

final RecommendedPopcorn recommendedPopcorn = RecommendedPopcorn.of(movieId
,originalTitle,posterPath,overview,directorNm,popcornRequest.getReason());
RecommendedPopcorn recommendedPopcornResult = recommendedPopcornAdaptor.save(recommendedPopcorn);
proceedSaving(recommendedPopcornResult,user);
}
private void proceedSaving(RecommendedPopcorn recommendedPopcorn, User user) {
final RecommendedPopcornUser recommendedPopcornUser = RecommendedPopcornUser.of(true,user,recommendedPopcorn);
recommendedPopcornUserAdaptor.save(recommendedPopcornUser);
}


private void getApi(
JsonElement movieId, RecommendedPopcornRequest popcornRequest, String movieType) throws IOException {

Expand Down Expand Up @@ -83,17 +121,4 @@ private void getApi(
}
}

public void postRecommendation(String movieId,String originalTitle, String overview, String posterPath,String directorNm, RecommendedPopcornRequest popcornRequest) {
Long userId = SecurityUtil.getCurrentUserId();
User user = userAdaptor.findById(userId);

final RecommendedPopcorn recommendedPopcorn = RecommendedPopcorn.of(movieId
,originalTitle,posterPath,overview,directorNm,popcornRequest.getReason());
RecommendedPopcorn recommendedPopcornResult = recommendedPopcornAdaptor.save(recommendedPopcorn);
proceedSaving(recommendedPopcornResult,user);
}
private void proceedSaving(RecommendedPopcorn recommendedPopcorn, User user) {
final RecommendedPopcornUser recommendedPopcornUser = RecommendedPopcornUser.of(true,user,recommendedPopcorn);
recommendedPopcornUserAdaptor.save(recommendedPopcornUser);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,5 @@ public DuplicateCheckResponse execute(UpdateUserInfoRequest request) {
return DuplicateCheckResponse.from(false);
}
}

}
4 changes: 0 additions & 4 deletions Core/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,6 @@ jar.enabled = true

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.14.2'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'

testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.2'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@


import com.example.oauth.BaseFeignClientClass;
import com.example.oauth.tmdb.client.TmdbClient;
import feign.Logger;
import feign.Retryer;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
Expand Down
22 changes: 22 additions & 0 deletions Infra/src/main/java/com/example/oauth/tmdb/client/TmdbClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.example.oauth.tmdb.client;

import com.example.oauth.apple.config.AppleOAuthConfig;
import com.example.oauth.tmdb.config.TmdbClientConfig;
import com.example.oauth.tmdb.dto.TdmbResponseDto;
import feign.Headers;
import feign.Param;
import feign.Response;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;


@FeignClient(
name = "TmdbClient",
url = "http://api.koreafilm.or.kr/openapi-data2/wisenut/search_api/search_json2.jsp?collection=kmdb_new2",
configuration = TmdbClientConfig.class)
public interface TmdbClient {
@GetMapping
String getMovieData(@RequestParam("movieId") String movieId, @RequestParam("movieSeq") String movieSeq, @RequestParam("detail") String detail, @RequestParam("ServiceKey") String ServiceKey);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.example.oauth.tmdb.config;


import feign.codec.Decoder;
import feign.codec.Encoder;
import feign.codec.ErrorDecoder;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.support.HttpMessageConverterCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;

@Import({TmdbErrorDecoder.class})
public class TmdbClientConfig {

@Bean
@ConditionalOnMissingBean(value = ErrorDecoder.class)
public TmdbErrorDecoder commonFeignErrorDecoder() {
return new TmdbErrorDecoder();
}

@Bean
Encoder formEncoder() {
return new feign.form.FormEncoder();
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.example.oauth.tmdb.config;

import com.amazonaws.util.IOUtils;
import com.example.error.BaseRunTimeException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import feign.Response;
import feign.codec.ErrorDecoder;
import lombok.SneakyThrows;

import java.io.InputStream;

public class TmdbErrorDecoder implements ErrorDecoder {
@Override
@SneakyThrows
public Exception decode(String methodKey, Response response) {
InputStream inputStream = response.body().asInputStream();
byte[] byteArray = IOUtils.toByteArray(inputStream);
String responseBody = new String(byteArray);
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(responseBody);

String error = jsonNode.get("error") == null ? null : jsonNode.get("error").asText();
String errorDescription =
jsonNode.get("error_description") == null
? null
: jsonNode.get("error_description").asText();
throw new BaseRunTimeException(response.status(), error, errorDescription);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.example.oauth.tmdb.dto;

import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.List;


@NoArgsConstructor
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class TdmbResponseDto {
private String movieId;
private String movieSeq;
private String title;
private String directorNm;
private String plotText;
//private String posterUrls;
public String getMovieId() {
return movieId;
}
public String getMovieSeq() {
return movieSeq;
}
public String getTitle() {
return title;
}
public String getDirectorNm() {
return directorNm;
}
public String getPlotText() {
return plotText;
}

}
11 changes: 10 additions & 1 deletion Infra/src/main/resources/application-infra.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
spring:
config:
activate:
on-profile: local
on-profile: local,test

data:
redis:
Expand All @@ -24,6 +24,15 @@ cloud:
app:
firebase-configuration-file: popcornmate-d7ca1-firebase-adminsdk-svbpw-343677f710.json

test:
port:
localhost

feign:
httpclient:
enabled: true


---
spring:
config:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.example.config;

import org.springframework.test.context.ActiveProfilesResolver;

public class InfraIntegrateProfileResolver implements ActiveProfilesResolver {

@Override
public String[] resolve(Class<?> testClass) {
// some code to find out your active profiles
return new String[] { "local","infra","core"};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.example.config;

import com.example.CoreApplication;
import com.example.InfraApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackageClasses = {InfraApplication.class, CoreApplication.class})
public class InfraIntegrateTestConfig {
}
104 changes: 104 additions & 0 deletions Infra/src/test/java/com/example/oauth/tmdb/client/TmdbClientTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package com.example.oauth.tmdb.client;

import com.example.config.InfraIntegrateProfileResolver;
import com.example.config.InfraIntegrateTestConfig;
import com.example.oauth.tmdb.dto.TdmbResponseDto;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import feign.Response;
import net.minidev.json.JSONObject;
import okhttp3.ResponseBody;
import org.apache.tomcat.util.json.JSONParser;
import org.apache.tomcat.util.json.ParseException;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.client.AutoConfigureMockRestServiceServer;
import org.springframework.boot.test.autoconfigure.web.client.AutoConfigureWebClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.util.ResourceUtils;
import org.springframework.web.client.RestTemplate;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;

import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.times;
import static com.github.tomakehurst.wiremock.client.WireMock.*;
import static org.springframework.test.util.AssertionErrors.*;

@SpringBootTest(classes = InfraIntegrateTestConfig.class)
@AutoConfigureWireMock(port=0)
@ActiveProfiles(resolver = InfraIntegrateProfileResolver.class)
@TestPropertySource(properties = { "spring.thymeleaf.enabled=false","test.port=http://localhost:${wiremock.server.port}"})
public class TmdbClientTest {

@Autowired
private TmdbClient tmdbClient;
@Test
public void testGetMovieData() throws IOException, ParseException {
Path file = ResourceUtils.getFile("classpath:pamyo-response.json").toPath();
// WireMock 설정
stubFor(get(urlEqualTo("/openapi-data2/wisenut/search_api/search_xml2.jsp"))
.withQueryParam("collection", equalTo("kmdb_new2"))
.withQueryParam("movieId", equalTo("K"))
.withQueryParam("movieSeq", equalTo("35655"))
.withQueryParam("detail", equalTo("Y"))
.withQueryParam("ServiceKey", equalTo("33D62G26J6LHL95UV54Y"))
.willReturn(aResponse()
.withStatus(HttpStatus.OK.value())
.withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.withBody(Files.readAllBytes(file))));

// 테스트할 Feign Client 메소드 호출
try {

String mmovieData = tmdbClient.getMovieData("K", "35655", "Y","a");
System.out.println(mmovieData);

JsonParser jsonParser = new JsonParser();

//3. To Object

//값 처리하는 로직
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(mmovieData);
//4. To JsonObject

JsonNode movieData = rootNode.path("Data").path(0).path("Result").path(0);


String title = movieData.path("title").asText();
title = title.trim();
String directorNm = movieData.path("directors").path("director").path(0).path("directorNm").asText();
String plotText = movieData.path("plots").path("plot").path(0).path("plotText").asText();
String firstPosterUrl = movieData.path("posters").asText().split("\\|")[0];
//System.out.println(tes);

System.out.println(title +directorNm +plotText+ firstPosterUrl);
// 응답이 예상대로 받아졌는지 검증합니다.
//assertNotNull("check",tes);
}catch (Exception e) {
System.out.println(e.getMessage());
}
//assertEquals("right",test.size(),1);

}
}
Loading

0 comments on commit 7006da7

Please sign in to comment.