From f44a0c82727fa08a7d01bd59696609d50c6ae3e7 Mon Sep 17 00:00:00 2001 From: duswnwn Date: Mon, 8 May 2023 20:17:08 +0900 Subject: [PATCH] real_coding --- .DS_Store | Bin 0 -> 6148 bytes .github/workflows/deployment.yml | 76 ---------------- .github/workflows/run_test.yml | 34 ++++++++ build.gradle | 7 ++ src/.DS_Store | Bin 0 -> 6148 bytes src/main/.DS_Store | Bin 0 -> 6148 bytes .../error/ErrorResponse.java | 14 +++ .../error/RealCodingExceptionHandler.java | 14 +++ .../error/SlangBadRequestException.java | 17 ++++ .../service/PostService.java | 23 +++-- .../service/valid/PostValidService.java | 19 ++++ src/main/resources/.DS_Store | Bin 0 -> 6148 bytes src/main/resources/application-dev.yml | 25 ++++++ src/main/resources/application-test.yml | 22 +++++ src/main/resources/application.yml | 3 +- src/test/.DS_Store | Bin 0 -> 6148 bytes src/test/java/.DS_Store | Bin 0 -> 6148 bytes src/test/java/com/.DS_Store | Bin 0 -> 6148 bytes src/test/java/com/cnu/.DS_Store | Bin 0 -> 6148 bytes .../java/com/cnu/real_coding_server/.DS_Store | Bin 0 -> 6148 bytes .../cnu/real_coding_server/service/.DS_Store | Bin 0 -> 6148 bytes .../service/week1/.DS_Store | Bin 0 -> 6148 bytes .../service/week1/practice/.DS_Store | Bin 0 -> 6148 bytes .../practice/service/PostServiceTest.java | 82 ++++++++++++++++++ .../service/PostValidServiceTest.java | 45 ++++++++++ .../practice/service/fixture/PostFixture.java | 71 +++++++++++++++ src/test/resources/generate-dml.sql | 1 + 27 files changed, 370 insertions(+), 83 deletions(-) create mode 100644 .DS_Store delete mode 100644 .github/workflows/deployment.yml create mode 100644 .github/workflows/run_test.yml create mode 100644 src/.DS_Store create mode 100644 src/main/.DS_Store create mode 100644 src/main/java/com/cnu/real_coding_server/error/ErrorResponse.java create mode 100644 src/main/java/com/cnu/real_coding_server/error/RealCodingExceptionHandler.java create mode 100644 src/main/java/com/cnu/real_coding_server/error/SlangBadRequestException.java create mode 100644 src/main/java/com/cnu/real_coding_server/service/valid/PostValidService.java create mode 100644 src/main/resources/.DS_Store create mode 100644 src/main/resources/application-dev.yml create mode 100644 src/main/resources/application-test.yml create mode 100644 src/test/.DS_Store create mode 100644 src/test/java/.DS_Store create mode 100644 src/test/java/com/.DS_Store create mode 100644 src/test/java/com/cnu/.DS_Store create mode 100644 src/test/java/com/cnu/real_coding_server/.DS_Store create mode 100644 src/test/java/com/cnu/real_coding_server/service/.DS_Store create mode 100644 src/test/java/com/cnu/real_coding_server/service/week1/.DS_Store create mode 100644 src/test/java/com/cnu/real_coding_server/service/week1/practice/.DS_Store create mode 100644 src/test/java/com/cnu/real_coding_server/service/week1/practice/service/PostServiceTest.java create mode 100644 src/test/java/com/cnu/real_coding_server/service/week1/practice/service/PostValidServiceTest.java create mode 100644 src/test/java/com/cnu/real_coding_server/service/week1/practice/service/fixture/PostFixture.java create mode 100644 src/test/resources/generate-dml.sql diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..4594ea30059c3ed8b1b1676974891933b0b27b9f GIT binary patch literal 6148 zcmeHKPm9w)9Q{q(-85FApu%2+fY(xMD#GHW*6zWBmyPH_r6!xO8#bFMO=^%*$XUOG zU%{)N#P8xs-~1^iY4;`~GQTqO=FfXGofk5bAtE+ig%64PMAStR*tvmhPl$ezcA}+Q zdO#+}2%jhXEJ%2;!!-@Y0pq~G=YV*34=A7&#gtI>{S{lnQ>5Wf8S<~+{LQ2xozs$h z3ZaWC@4e7{ZRl*UB3gjS=_8aGUDOrqUPEzs{pjp-gKJf}R5V8Z(O~!LZ2X%5tH|rB z)_Fr^( zhZPjrLhrucf<+Q%`DpZ=wc4G7L(8(Qp7qYV;Dwj_`6`?G%QvF-lJg|kmi^#W92N8a zoo77F{Wy)5QV@p`C~sfKX~>HyU!`FtwVvv*?XErVAFbD}J03XWN8`=FSs%Njf%DjP zHygWq_x^(?r}N9?D&?QxD}v#?ka0`n7R0mFYyRLZ(}btuNo?6$mcc*afOfSj_5c&c z0poyipz46w9~>ls6OE-pxpg3uR{&rK%`#9H9{@t*Xq;#)6`}{hloY6>OkXjWlB3<(Yf&c&j literal 0 HcmV?d00001 diff --git a/.github/workflows/deployment.yml b/.github/workflows/deployment.yml deleted file mode 100644 index 2be1220..0000000 --- a/.github/workflows/deployment.yml +++ /dev/null @@ -1,76 +0,0 @@ -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. -# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle - -name: Deployment - -on: - workflow_dispatch: - push: - branches: [ "main" ] - -permissions: - contents: read - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - - name: Set up JDK 17 - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'temurin' - - name: Build with Gradle - uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1 - with: - arguments: build - - uses: actions/upload-artifact@v3 - with: - name: jar - path: build/libs - - send-jar: - needs: build - runs-on: ubuntu-latest - steps: - - name: Download jar - uses: actions/download-artifact@v3 - with: - name: jar - - name: Send jar to remote server - uses: appleboy/scp-action@master - with: - host: {나의 public ip} - username: {나의 userName} - source: "real_coding_server-0.0.1-SNAPSHOT.jar" - target: "/home/{나의 userName}" - key: ${{ secrets.PRIVATE_KEY }} - - run-app: - needs: send-jar - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - - name: Move deploy.sh - uses: appleboy/scp-action@master - with: - host: {나의 public ip} - username: {나의 userName} - source: "deploy.sh" - target: "/home/{나의 userName}" - key: ${{ secrets.PRIVATE_KEY }} - - name: Execute script - uses: appleboy/ssh-action@master - with: - username: {나의 userName} - host: {나의 public ip} - key: ${{ secrets.PRIVATE_KEY }} - script_stop: true - script: cd /home/{나의 userName} && chmod +x deploy.sh && ./deploy.sh diff --git a/.github/workflows/run_test.yml b/.github/workflows/run_test.yml new file mode 100644 index 0000000..e1bc687 --- /dev/null +++ b/.github/workflows/run_test.yml @@ -0,0 +1,34 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. +# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle + +name: Deployment + +on: + workflow_dispatch: + pull_request: + branches: [ "main" ] + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + cache: gradle + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Test with Gradle + run: ./gradlew test \ No newline at end of file diff --git a/build.gradle b/build.gradle index 4619d59..8743ab4 100644 --- a/build.gradle +++ b/build.gradle @@ -22,6 +22,8 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.junit.jupiter:junit-jupiter:5.8.1' + testImplementation 'org.projectlombok:lombok:1.18.22' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' //TODO: annotation build 활성화 언급하기 implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2' @@ -36,3 +38,8 @@ dependencies { tasks.named('test') { useJUnitPlatform() } +test { + testLogging { + events "PASSED", "SKIPPED", "FAILED" + } +} \ No newline at end of file diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7b67fa96eb61caaf642ba110702124c55595da44 GIT binary patch literal 6148 zcmeHKO>5gg5S>lb*oq1G&_a%aUQOc2ArN{|T=&pxRoX*Z94R)9sG<#)93PB9=k~|+ z+F#PY)4tiA1Z+2_KnP|BX5a37te6M8t05xQpN@`*+C;M(- z@jlm=X|7YOc|#|T0ms1eW`NJGN7s~4M#akcJ%jJyuMtzkeOx*#Z{(c+PH*z8th(Jl zYHQnjvD0YyjaK7pe5Ge`l~mKRpG?kq^-=3Qy_+ZLr))eMwqL&0MU`a5cw!Q=(HJ3L zK4-;9&-!{=j7pOmTZivA{b755J`clQC+Hpb7M);z8g@IuNf<5`e)HAq!#5v>-}CE2 z|FE_G#)B2;iMvqZgdPd29_Dvw#zoZ|L<^yAL##= zlibQN;278_29!652Yr+zZ|hod{MH803n&Z6)fP<(26>LngrDMls1f)Ao&Y1k+9E6v P_ak6vaD!vuNg4PD(>|P* literal 0 HcmV?d00001 diff --git a/src/main/.DS_Store b/src/main/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a91efb9d397088b984c289d598636500f07ce507 GIT binary patch literal 6148 zcmeHKOH0E*5T0$TZ74zy3OxqA7OklW;w9F4@M=U4Dm7_~Mq{=#eH=<5XZU?Bm;Hzl7Z#01)*-dk>%l00nfyjD^J#qki%Q%b1oNqM$j>BH0Qe z8DO0zWLtd&=-cJs5qubeKllBPv2W*7nOcYiJ?KCJ5(XHxD4t`y{muwRN!R=%??E>T zlYX`OAu`$A+Il{3<%{`S??H~dzTY1tb-#B_wF@buU>f_uW!M=tOPeP$?)zcf=_x|k z?%5Z6}Gl_kItJ< z(Q_&20b@3D8voH7_$0akz&SS$S5)@$+GumY^W z3MfGPgN;t;8ca2+tpf{{0wB^gQW?hT>W^qs1EOm%)rc)P|`LAV;ZWCd7(Sp~AXTB7s+^ymD4mc%tyfED;x3W!|8 zYt(T`=4@S99G$f``W-qMjY~CtQ!r3RF^;99xQwn0+ieOEU4yAcY(e9TfRcd=R^U$+ F_yQ|;XA}Sc literal 0 HcmV?d00001 diff --git a/src/main/java/com/cnu/real_coding_server/error/ErrorResponse.java b/src/main/java/com/cnu/real_coding_server/error/ErrorResponse.java new file mode 100644 index 0000000..2c5dc4f --- /dev/null +++ b/src/main/java/com/cnu/real_coding_server/error/ErrorResponse.java @@ -0,0 +1,14 @@ +package com.cnu.real_coding_server.error; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.http.HttpStatus; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ErrorResponse { + String code; // 클라이언트랑 약속한 작동 + String message; +} \ No newline at end of file diff --git a/src/main/java/com/cnu/real_coding_server/error/RealCodingExceptionHandler.java b/src/main/java/com/cnu/real_coding_server/error/RealCodingExceptionHandler.java new file mode 100644 index 0000000..fedd763 --- /dev/null +++ b/src/main/java/com/cnu/real_coding_server/error/RealCodingExceptionHandler.java @@ -0,0 +1,14 @@ +package com.cnu.real_coding_server.error; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class RealCodingExceptionHandler { + @ExceptionHandler(SlangBadRequestException.class) + public ResponseEntity handleSlangRequestException(SlangBadRequestException exception) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(exception.getErrorResponse()); + } +} \ No newline at end of file diff --git a/src/main/java/com/cnu/real_coding_server/error/SlangBadRequestException.java b/src/main/java/com/cnu/real_coding_server/error/SlangBadRequestException.java new file mode 100644 index 0000000..1a60b8a --- /dev/null +++ b/src/main/java/com/cnu/real_coding_server/error/SlangBadRequestException.java @@ -0,0 +1,17 @@ +package com.cnu.real_coding_server.error; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(code = HttpStatus.BAD_REQUEST) +public class SlangBadRequestException extends RuntimeException { + private static final long serialVersionUID = -4785136912743477236L; + + public SlangBadRequestException() { + super("비속어가 포함된 글은 등록할 수 없습니다"); + } + + public ErrorResponse getErrorResponse() { + return new ErrorResponse("slangInput", this.getMessage()); + } +} \ No newline at end of file diff --git a/src/main/java/com/cnu/real_coding_server/service/PostService.java b/src/main/java/com/cnu/real_coding_server/service/PostService.java index 490a745..7980144 100644 --- a/src/main/java/com/cnu/real_coding_server/service/PostService.java +++ b/src/main/java/com/cnu/real_coding_server/service/PostService.java @@ -1,33 +1,45 @@ package com.cnu.real_coding_server.service; import com.cnu.real_coding_server.entity.Post; +import com.cnu.real_coding_server.error.SlangBadRequestException; import com.cnu.real_coding_server.model.request.PostRequest; import com.cnu.real_coding_server.repository.PostRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - +import com.cnu.real_coding_server.service.valid.PostValidService; import java.util.List; import java.util.Optional; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +@Slf4j @Service @RequiredArgsConstructor public class PostService { private final PostRepository postRepository; + private static final List slangList = List.of("비속어1", "비속어2"); + private final PostValidService postValidService; public Post createPost(PostRequest postRequest) { + + if (postValidService.isSlangInclude(slangList, postRequest.getTitle(), postRequest.getContents())) { + throw new SlangBadRequestException(); + } + log.info("정상 저장 확인"); return postRepository.save(postRequest.toEntity()); } public List getPosts() { return postRepository.findAll(); } - public Optional getPost(Integer postId) { return postRepository.findById(postId); } public Optional updatePost(Integer postId, PostRequest postRequest) { + if (postValidService.isSlangInclude(slangList, postRequest.getTitle(), postRequest.getContents())) { + throw new SlangBadRequestException(); + } return postRepository.findById(postId) .map(post -> { post.setTitle(postRequest.getTitle()); @@ -36,9 +48,8 @@ public Optional updatePost(Integer postId, PostRequest postRequest) { return postRepository.save(post); }); } - public void deletePost(Integer postId) { postRepository.findById(postId) .ifPresent(postRepository::delete); } -} +} \ No newline at end of file diff --git a/src/main/java/com/cnu/real_coding_server/service/valid/PostValidService.java b/src/main/java/com/cnu/real_coding_server/service/valid/PostValidService.java new file mode 100644 index 0000000..8f75fe5 --- /dev/null +++ b/src/main/java/com/cnu/real_coding_server/service/valid/PostValidService.java @@ -0,0 +1,19 @@ +package com.cnu.real_coding_server.service.valid; + +import java.util.List; +import org.springframework.stereotype.Service; + +@Service +public class PostValidService { + public boolean isSlangInclude(List slangList, + String title, + String postContent) { + for (String slang : slangList) { + if(title.contains(slang) + || postContent.contains(slang)) { + return true; + } + } + return false; + } +} diff --git a/src/main/resources/.DS_Store b/src/main/resources/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..ffb1cab4b2d709fe1b83fe45b4822d9488e45ac7 GIT binary patch literal 6148 zcmeHK%}N774E~}$6g*hagBM|5z=ChEmU{5)3us#pg{>=C1#kOCKB9j4QE8oe6p^H4 zzH}zZW_WqEzW@vfFV^;)ToF~SC{s}d7mhjV~II#vBnZzCDC7;(%O$$^8;9_$9%oqK4$m0l1uL{yZ8x8_-HZ`R*DH1WWL!l}*fxV+`9UQC$APzWfLR&A# z8dCzBz}}H76!B1^hf1^<;^CYx;nxKAjvfw)=0oDiAI*!{)0w}RJEU>UF&Rh(HW|>~ zmon1x|B|0fwaGV^9Fl=#;J-2;gX#5j!ncdF_1k;uSzD+#R2B8>)u7PcxCHQz?jt9* d=<7vo`Za;Qqh`^03n%79zzE498TbVT-T?tlKf(Y2 literal 0 HcmV?d00001 diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml new file mode 100644 index 0000000..7e8c235 --- /dev/null +++ b/src/main/resources/application-dev.yml @@ -0,0 +1,25 @@ +spring: + # H2 Setting Info (H2 Console? ???? ?? ???? ??) + h2: + console: + enabled: true # H2 Console? ???? ?? (H2 Console? H2 Database? UI? ????? ??) + path: /h2-console # H2 Console? Path + # Database Setting Info (Database? H2? ???? ?? H2?? ?? ??) + datasource: + driver-class-name: org.h2.Driver # Database? H2? ?????. + url: jdbc:h2:file:~/demodb # H2 ?? ?? + username: sa # H2 ?? ? ??? username ?? (??? ??? ??) + password: # H2 ?? ? ??? password ?? (??? ??? ??) + + jpa: + hibernate: + ddl-auto: none # ??????? ??? ? ??????? ????? ?? ??? ?? + naming: + physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl + implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl + properties: + hibernate: + format_sql: true # ???? query? ??? + +logging.level: + org.hibernate.SQL: debug \ No newline at end of file diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml new file mode 100644 index 0000000..55127d4 --- /dev/null +++ b/src/main/resources/application-test.yml @@ -0,0 +1,22 @@ +spring: + # H2 Setting Info (H2 Console? ???? ?? ???? ??) + h2: + console: + enabled: true # H2 Console? ???? ?? (H2 Console? H2 Database? UI? ????? ??) + path: /h2-console # H2 Console? Path + # Database Setting Info (Database? H2? ???? ?? H2?? ?? ??) + datasource: + driver-class-name: org.h2.Driver # Database? H2? ?????. + url: jdbc:h2:mem:devblog # H2 ?? ?? + username: sa # H2 ?? ? ??? username ?? (??? ??? ??) + password: # H2 ?? ? ??? password ?? (??? ??? ??) + + jpa: + hibernate: + ddl-auto: create-drop # ??????? ??? ? ??????? ????? ?? ??? ?? + properties: + hibernate: + format_sql: true # ???? query? ??? + +logging.level: + org.hibernate.SQL: debug \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 9f1e564..13c3efe 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -13,10 +13,11 @@ spring: jpa: hibernate: - ddl-auto: create # ??????? ??? ? ??????? ????? ?? ??? ?? + ddl-auto: none # ??????? ??? ? ??????? ????? ?? ??? ?? properties: hibernate: format_sql: true # ???? query? ??? + open-in-view: false logging.level: org.hibernate.SQL: debug \ No newline at end of file diff --git a/src/test/.DS_Store b/src/test/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..20ba85a20a0d29c5b161f8d97a0a55d282e8d3e6 GIT binary patch literal 6148 zcmeHK!AiqG5Z!H~Nhm@O3OxqA7OklW;w8p<@M=U4DmAf1qcL0Bv^kVQ&iX@siNB*W zyPJYmPl8C9f!Vj2o!KyN!%l`V#{F?`hp{?i%mPKM*f4w}xQ@CY6>X^ka@^x25w}qy zB6!9PN&Y_rcyDkNj|WiBD%jBvCmJqw~0*ckAm%BF(}$?GI%@-0OqO)kU24MDB}m+8fE( zKrPs|Wq0e1>C|=GO{cxvo;986zT0X#d#*d1+1AG9_Q7fQF?mYGv!b5EcPV8}V+k)X znddVJhG`#W)`CPz6D1H{0u7{L3%0Y&sQ77FFn0fTG- z01Yrpfw}zk2XxQ?=xHnzf(3-DP(T&Rb&J7u=fG7stb5wOP^iKgmv4rB^qaZvP`GY9 zxFg*e_Y~4d3=jjK8Nl8Tq>lCf_~-s#I?+H35ChA}05>{8$A{c>ZC%I`Ypnx%1B!xv ng~E9VOk^nrUo6E9P$^({a02LQEEIwTgnk4h4Kxq~f6BlI)&5ka literal 0 HcmV?d00001 diff --git a/src/test/java/.DS_Store b/src/test/java/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..4e1452c04a31ea77fc1703dc2b00b13f9c78aad1 GIT binary patch literal 6148 zcmeHK!AiqG5Z!I7Nhm@N3OxqA7OklW;w8p<@M=U4Dm7_}2GguGtvQrJ&iX@siNB*W zyBncYFCGNT49vdG?97IF8+I~`G44;}J;rRtmp2kw4ygFczEdXEx z%u--3fBpd-Gyr-UONC$o;VKkRg>v0uaNRp_6%Om3_AeExaK`1EVITcwt~(U2TMzC? zcg8)1G!g^Ez#;?K`+?Y4|4)DJ|D_WR!~ij{nhfwpFX;J@o35=(Sz@hqK<_|N(63bZ l6#^4kioq94aSK!m*d3ezdKycGU;&{Y0Z9W5#K502@Cn|VQp5lN literal 0 HcmV?d00001 diff --git a/src/test/java/com/.DS_Store b/src/test/java/com/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..18638a84a1793a3f7e2ffd53812bf01d77a9b340 GIT binary patch literal 6148 zcmeHK!AiqG5Z!I7X(&Pt3Oz1(Em~6%#7nI8;MIs8RBF=}4aRI~Q+p_dob`wN5`RZ$ zcBewAUOWhv8JK;W*_jRVHtb}C5VAS$?Fr!tAr|ZE z@Ig<)tdosL&Cc)|pDwgcqWQcNUB>-M+uJ z%H}y7rio7P!7}%rdoeNt%m6d6x(v{bSFWsXikulUzzqD70lXg+C}KdETQpY(45kGD zEP>ew%+1d~ph5#+K$u$u3y8F#fHqW8iy^6ZkTx9F1M<%;+HfJwn_(Y%v!o71QtKg= zaThYM$Rjhr3@kE$y&s5&_5bwe{@*z9zzi@0tI2>YwZc{ta--V1lqJ?$1$qaHf_}Nh luMn7+QVhOWimRYTz^-rt7!c+b!2-fR0)_@2n1MfK;1i>mQrQ3i literal 0 HcmV?d00001 diff --git a/src/test/java/com/cnu/.DS_Store b/src/test/java/com/cnu/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7996fc2f0faf9e45bb7df623e756ffdf822c8a3c GIT binary patch literal 6148 zcmeHKO>fgc5S>laCRS7_Lao%}N?aodPK8u)aYH$9#Rv|7f*nV#h3l>Cd>o=kKEog4 zm+*Js&F%()0#Z-3LNn6L8_&+n+RxUmmx$DOkv$>m6Hyn+*a~3&AUw{xBP}1<11j5N zLQ^u7QBLJfwgm1Y1N`nDP(?FJsGwip-zBbU#4B2|eOZ`kT9_31{IQ%vAAPq1@0LB% zRej@od`)kPyq*t--&AX_y?@Z@1f5>zLwsdc@jRI?>Ty!Nb{4-C)u`S+B!zG|;2d(Pp66XW?+5pN8RP z6LgOsK7RIU@~OBk&1d^Gr0_jkIrO-NFK}+f*D|ik!jzZD-}c(}5EKT40b$^-8Sv{; zw|Cb!BJ&Fa!oa;_fY%2NWsE#F4(-wbV~+s9Ho{im^Y0gvICSNt{NY3SnUz1GC_6j)Ynx6gawt|95C(o{fX{xAKJWi8{(kBbT@06Q~u$H9Nq_W8)AJi2Mjx L8pH?#|CE6r1bt;@ literal 0 HcmV?d00001 diff --git a/src/test/java/com/cnu/real_coding_server/.DS_Store b/src/test/java/com/cnu/real_coding_server/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..3ffe3b3dcba27490addb46b8af43773e5c2977b3 GIT binary patch literal 6148 zcmeHK!AiqG5S?wSX%L|Y1&<3}i`G;G@e->Zyc*GiN^NY=V9ZL>HiuHkS%1hc@pp7) zcPnc3CSqjJ}Dq+b*^M%kl>6Dagq>L!^HDb7e=rB=N zVKSA?fxpNAJv#?7h@b~Uc=!BNh%5A3?4qu{XhCl(JIu5DFwxmh;e8Tk{YK+il**O4 zdB<^`1?M8TQF+ks^aok1(>tSI$4VvP#P5VBag?`fOM5Eqcj7ea>4LZ$VaoYwoOV^- zQiHUc>Ds_7xNg;L*H%U&&ui9YbF(?F%h9&isLL(S8;{-U^6L7|QTsNzOVxw^-yrZE z)v{=D0*~l?;$Rr`(nO`#xH74lWHT}Y%m6bm`wZBVt-3J#Tj3or1I)k=GeGBqL?!es z76$dvfkux2h!qTLL7zSvsYY7#EfxlG1x1)rL{lp4h#^cl#-+{kEfxk%IS4y^2zzH? zClsOYj@Oqu9fWU?Ei=Fjd}M%TKa?8v|AX)6f1SjJ8DIwfCj+9gAMCeqZ??Bi?UH(} tM7=~Mp}fN2TM0V46=N>7;uTaa7?S5Z>*NNhm@N3Oz1(E!w6ch?iLF!K)EHsMN*=4UJjpk2#b=&iX<=iLawG zyBn!gZz57=%Ir6tok_CahMf#!jCZDk7Go}B%mzg)IWT-9IFGs{CF3ara&?W?Ng{8< zM21VTACgU%=6j}(cW#(8)CNaH5+2j^X7BM-rU+bIPDFShg3eRXJ#DUO(p9F z3wQxzVMR~DC{1K~2i_v1h$JKihyh|?wHPp`oLyV3WzlMg0b<}67{K#EfFk+^bB*fg zfI+nYfE92n0UJLYF-I8m4dxnQ288QWK%L4>i@|j|_=Sn{4dxnkI^(AK;O5TUbSPZi z9j-4_IOD!X8i@g7;41^z`+>Mv|Brv}|5XqT!~ij{nhfwtH|Ta?ZKk#^trBak0KEZ4 p!MI%GX9^gq6hkbQ;yS1j@C!5meS^71@PN>VfTDp0V&G31_yGOXReAsb literal 0 HcmV?d00001 diff --git a/src/test/java/com/cnu/real_coding_server/service/week1/.DS_Store b/src/test/java/com/cnu/real_coding_server/service/week1/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..42dc8ee7b589b5a396817660a8090e591a19b5af GIT binary patch literal 6148 zcmeHK%}T>S5T0$TNf4n2g&r5Y7OklW;w9F4@M=U4DmAf1gE3p$)E-J9XMG``#MjZ8 z-K{9qqoOhcv)^QXlI*u(Hv<5oHR^5xQ~|(6B`kS3d?FMlos*LFlo5r#M-B;GLGLhC zS996y_>BzE+PTn&0YtcR@76C)Rg5wEF!oT_U$mh0Nq#&Y_HF)C+)tBX-e^3FQn|9Q z=s2FUWKJ{q>7!5Lj0E0xAGJBm+|-ndg;*;iQ}C0TEv3zBXRQ_fG5tgFT? zHOjg}T^pK!=eb^|TANIKzgd^ft>&~YCp&(lF1LMuI`!PuwT<1Q&TV>^sR#Y$An-fY zvTSh%k7&&Ca32n`RAtu~o7K(o8JPiQfEoD94A?!*UHZ$D;CE*Rn1OF$fc6K8N*Guy z4C<`|2i*c7R?w{lZTe-T8fh`GSQx|ziZG>!rc~G#Lzr^(OPd#1EDV}*5VrXc_Q}F_ zC_+CS?=N*ah`=C^%m6d+kpb%cP^xtPAAH^a>m(kS0cPNTG9W7Lu-(GB*|T+SmUPxi t)Js$n$}0@Mm7t-IV$7wZxQ40){gMpCz+zz#Jt+JmplRTN8Te5KUIFJ-S)u>{ literal 0 HcmV?d00001 diff --git a/src/test/java/com/cnu/real_coding_server/service/week1/practice/.DS_Store b/src/test/java/com/cnu/real_coding_server/service/week1/practice/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..aafaabb184a9230427f5dcb28d90f8d4c0c375c3 GIT binary patch literal 6148 zcmeHK!A`^M%kl>4M};B#$W6HA3h^a1_bD zA1!2a;4d;j&(4Ab0vN&s-aS9*;|jeN`>0zlO3+)#_S59vk5u-Pe;WLm+b-JOa%DQ*Y1XRFZoN6HI@4Bz{8nQ&vx^&>+k3~|+vqNq59)t|z;{&1 zn!!0dqVtJ^i8qWR8DHbdylS4!$P6$8%)s(9U{1DTY5BLpJ75Nwfgfgo&IbpT&^4H8 zR7VFIH3A?OFsuZ9`e>vY$DnI4(}*i5LYE@yQej36q02Gum^{~DrcsxJFvEv1cNS(s z5$f)EeMhB(a5b`J2AF}54AAU{Ql|cY`2GB^lGrc<%)tL-KomM&r;U3vy>(%i)N38o rD^wE7%QU`~prcwb=29!Jpen(*Lk^;AFw=+;6#fuUG_YX?ewBe&S$bIa literal 0 HcmV?d00001 diff --git a/src/test/java/com/cnu/real_coding_server/service/week1/practice/service/PostServiceTest.java b/src/test/java/com/cnu/real_coding_server/service/week1/practice/service/PostServiceTest.java new file mode 100644 index 0000000..9351aef --- /dev/null +++ b/src/test/java/com/cnu/real_coding_server/service/week1/practice/service/PostServiceTest.java @@ -0,0 +1,82 @@ +package com.cnu.real_coding_server.service.week1.practice.service; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import com.cnu.real_coding_server.entity.Post; +import com.cnu.real_coding_server.error.SlangBadRequestException; +import com.cnu.real_coding_server.model.request.PostRequest; +import com.cnu.real_coding_server.model.type.Tag; +import com.cnu.real_coding_server.service.PostService; +import com.cnu.real_coding_server.service.week1.practice.service.fixture.PostFixture; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.util.Optional; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.Transactional; + +@ActiveProfiles("test") +@SpringBootTest +public class PostServiceTest { + + @Autowired + PostService postService; + + @Autowired + ObjectMapper mapper; + + @BeforeEach + void init() { + + } + + @DisplayName("글 저장 테스트") +// @Transactional + @Test + void createPost() throws JsonProcessingException { + PostRequest postRequest = PostFixture.getNormalPostRequest(); + + Post post = postService.createPost(postRequest); + assertAll("verify object", + () -> assertThat(post.getTitle()).isEqualTo(postRequest.getTitle()), + () -> assertThat(post.getContents()).isEqualTo(postRequest.getContents()), + () -> assertThat(post.getTag()).isEqualTo(postRequest.getTag()) + ); + } + + @DisplayName("비속어 글 저장 테스트") + @Transactional + @Test + void createPostWithSlang() { + PostRequest postRequest = PostFixture.getSlangPostRequest(); + assertThrows(SlangBadRequestException.class, () -> postService.createPost(postRequest)); + } + + + @DisplayName("글 업데이트 테스트") + @Transactional + @Test + void updatePost() { + // given + PostRequest postRequest = PostFixture.getNormalPostRequest(); + Post post = postService.createPost(postRequest); + + PostRequest updatedPostRequest = PostFixture.getNormalPostRequestUpdated(); + // when + Optional optPost = postService.updatePost(post.getId(), updatedPostRequest); + + // then + Post updatedPost = optPost.get(); + assertAll("verify object", + () -> assertThat(updatedPost.getTitle()).isEqualTo(updatedPostRequest.getTitle()), + () -> assertThat(updatedPost.getContents()).isEqualTo(updatedPostRequest.getContents()), + () -> assertThat(updatedPost.getTag()).isEqualTo(updatedPostRequest.getTag()) + ); + } +} \ No newline at end of file diff --git a/src/test/java/com/cnu/real_coding_server/service/week1/practice/service/PostValidServiceTest.java b/src/test/java/com/cnu/real_coding_server/service/week1/practice/service/PostValidServiceTest.java new file mode 100644 index 0000000..56f9d56 --- /dev/null +++ b/src/test/java/com/cnu/real_coding_server/service/week1/practice/service/PostValidServiceTest.java @@ -0,0 +1,45 @@ +package com.cnu.real_coding_server.service.week1.practice.service; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.cnu.real_coding_server.service.valid.PostValidService; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +@ActiveProfiles("test") +@SpringBootTest +public class PostValidServiceTest { + + @Autowired + PostValidService postValidService; + + + @DisplayName("post 제목에 비속어가 있나 테스트") + @Test + void testValidPostIncludeSlang_title() { + // given 시나리오 + String testTitle = "제목"; + String testContent = "비속어"; + List slangList = List.of("비속어", "비속어2"); + + boolean validPost = postValidService.isSlangInclude(slangList, testTitle, testContent); + // then 검증 + assertThat(validPost).isEqualTo(true); + } + @DisplayName("post 본문에 비속어가 있나 테스트") + @Test + void testValidPostIncludeSlang_content() { + // given 시나리오 + String testTitle = "본문"; + String testContent = "비속어"; + List slangList = List.of("비속어", "비속어2"); + + boolean validPost = postValidService.isSlangInclude(slangList, testTitle, testContent); + // then 검증 + assertThat(validPost).isEqualTo(true); + } +} \ No newline at end of file diff --git a/src/test/java/com/cnu/real_coding_server/service/week1/practice/service/fixture/PostFixture.java b/src/test/java/com/cnu/real_coding_server/service/week1/practice/service/fixture/PostFixture.java new file mode 100644 index 0000000..d53004b --- /dev/null +++ b/src/test/java/com/cnu/real_coding_server/service/week1/practice/service/fixture/PostFixture.java @@ -0,0 +1,71 @@ +package com.cnu.real_coding_server.service.week1.practice.service.fixture; + +import com.cnu.real_coding_server.model.request.PostRequest; +import com.cnu.real_coding_server.model.type.Tag; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class PostFixture { + + static ObjectMapper mapper = new ObjectMapper(); + + public static PostRequest getSlangPostRequest() { + String title = "비속어1"; + String content = "비속어2"; + Tag tag = Tag.SPRINGBOOT; + + try { + return mapper.readValue( + """ + { + "title": "%s", + "contents": "%s", + "tag": "%s" + } + """.formatted(title, content, tag) + , PostRequest.class); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + public static PostRequest getNormalPostRequest() { + String title = "정상 제목"; + String content = "정상 본문"; + Tag tag = Tag.SPRINGBOOT; + + try { + return mapper.readValue( + """ + { + "title": "%s", + "contents": "%s", + "tag": "%s" + } + """.formatted(title, content, tag) + , PostRequest.class); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + public static PostRequest getNormalPostRequestUpdated() { + String title = "정상 제목2"; + String content = "정상 본문2"; + Tag tag = Tag.JAVA; + + try { + return mapper.readValue( + """ + { + "title": "%s", + "contents": "%s", + "tag": "%s" + } + """.formatted(title, content, tag) + , PostRequest.class); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file diff --git a/src/test/resources/generate-dml.sql b/src/test/resources/generate-dml.sql new file mode 100644 index 0000000..e7621b4 --- /dev/null +++ b/src/test/resources/generate-dml.sql @@ -0,0 +1 @@ +insert into Posts (title, contents, tag, createdAt, updatedAt) values ('안녕', '하세요', 'JAVA', NOW(), NOW()); \ No newline at end of file