diff --git a/.idea/Ticketing.iml b/.idea/Ticketing.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/Ticketing.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..a49272c --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..797acea --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..4b8631d --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + 1653958362269 + + + + \ No newline at end of file diff --git a/server/build.gradle.kts b/server/build.gradle.kts index 04abc61..6cee94b 100644 --- a/server/build.gradle.kts +++ b/server/build.gradle.kts @@ -31,8 +31,11 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-validation") implementation("org.springframework.boot:spring-boot-starter-web") implementation("org.springframework.boot:spring-boot-starter-actuator") - implementation("com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.4") implementation("org.springframework.boot:spring-boot-starter-log4j2") + implementation("org.projectlombok:lombok:1.18.20") + implementation("io.springfox:springfox-swagger2:3.0.0") + implementation("io.springfox:springfox-swagger-ui:3.0.0") + implementation("com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.4") implementation("com.lmax:disruptor:3.4.2") implementation("io.jsonwebtoken:jjwt-api:0.11.2") @@ -42,6 +45,10 @@ dependencies { } } + testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.security:spring-security-test") + testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.1") + compileOnly("org.projectlombok:lombok") runtimeOnly("mysql:mysql-connector-java") runtimeOnly("io.jsonwebtoken:jjwt-impl:0.11.2") @@ -49,6 +56,7 @@ dependencies { annotationProcessor("org.projectlombok:lombok") annotationProcessor("org.springframework.boot:spring-boot-configuration-processor") + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.8.1") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.security:spring-security-test") } diff --git a/server/src/main/java/com/ticketing/server/global/config/SwaggerConfig.java b/server/src/main/java/com/ticketing/server/global/config/SwaggerConfig.java new file mode 100644 index 0000000..c451b62 --- /dev/null +++ b/server/src/main/java/com/ticketing/server/global/config/SwaggerConfig.java @@ -0,0 +1,69 @@ +package com.ticketing.server.global.config; + +import java.util.Arrays; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.ApiKey; +import springfox.documentation.service.AuthorizationScope; +import springfox.documentation.service.SecurityReference; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spi.service.contexts.SecurityContext; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger.web.UiConfiguration; +import springfox.documentation.swagger.web.UiConfigurationBuilder; + +@Configuration +@RequiredArgsConstructor +public class SwaggerConfig { + + public static final String SECURITY_SCHEMA_NAME = "Authorization"; + public static final String AUTHORIZATION_SCOPE_GLOBAL = "global"; + public static final String AUTHORIZATION_SCOPE_GLOBAL_DESC = "accessEverything"; + + @Bean + public Docket api() { + return new Docket(DocumentationType.OAS_30) + .useDefaultResponseMessages(false) + .select() + .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.ant("/api/**")).build() + .apiInfo(apiInfo()) + .securityContexts(Arrays.asList(securityContext())) + .securitySchemes(Arrays.asList(apiKey())); + } + + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("Ticketing REST API Document") + .version("v1") + .description("Ticketing REST API 문서").build(); + } + + private ApiKey apiKey() { + return new ApiKey(SECURITY_SCHEMA_NAME, "Authorization", "header"); + } + + private SecurityContext securityContext() { + return SecurityContext.builder().securityReferences(defaultAuth()).build(); + } + + private List defaultAuth() { + AuthorizationScope authorizationScope = new AuthorizationScope(AUTHORIZATION_SCOPE_GLOBAL, + AUTHORIZATION_SCOPE_GLOBAL_DESC); + AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; + authorizationScopes[0] = authorizationScope; + return Arrays.asList(new SecurityReference(SECURITY_SCHEMA_NAME, authorizationScopes)); + } + + @Bean + UiConfiguration uiConfig() { + return UiConfigurationBuilder.builder() + .build(); + } +} diff --git a/server/src/main/java/com/ticketing/server/movie/domain/Movie.java b/server/src/main/java/com/ticketing/server/movie/domain/Movie.java index 0529484..4c6e377 100644 --- a/server/src/main/java/com/ticketing/server/movie/domain/Movie.java +++ b/server/src/main/java/com/ticketing/server/movie/domain/Movie.java @@ -1,18 +1,24 @@ package com.ticketing.server.movie.domain; import com.ticketing.server.global.dto.repository.AbstractEntity; +import javax.persistence.Column; import javax.persistence.Entity; import javax.validation.constraints.NotNull; +import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; @Entity @Getter +@NoArgsConstructor +@AllArgsConstructor public class Movie extends AbstractEntity { - @NotNull - private String title; + @NotNull + @Column(unique = true) + private String title; - @NotNull - private Integer runningTime; + @NotNull + private Integer runningTime; } diff --git a/server/src/main/java/com/ticketing/server/movie/domain/Theater.java b/server/src/main/java/com/ticketing/server/movie/domain/Theater.java index a29dbb9..9f8a736 100644 --- a/server/src/main/java/com/ticketing/server/movie/domain/Theater.java +++ b/server/src/main/java/com/ticketing/server/movie/domain/Theater.java @@ -3,10 +3,14 @@ package com.ticketing.server.movie.domain; import com.ticketing.server.global.dto.repository.AbstractEntity; import javax.persistence.Entity; import javax.validation.constraints.NotNull; +import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; @Entity @Getter +@NoArgsConstructor +@AllArgsConstructor public class Theater extends AbstractEntity { @NotNull diff --git a/server/src/main/java/com/ticketing/server/movie/domain/TicketStatus.java b/server/src/main/java/com/ticketing/server/movie/domain/TicketStatus.java index e02118b..57996c8 100644 --- a/server/src/main/java/com/ticketing/server/movie/domain/TicketStatus.java +++ b/server/src/main/java/com/ticketing/server/movie/domain/TicketStatus.java @@ -6,10 +6,10 @@ import lombok.Getter; @Getter @AllArgsConstructor public enum TicketStatus { - SALE("판매가능"), - SCHEDULED("환불"), - SOLD("판매완료"); + SALE("판매가능"), + SCHEDULED("환불"), + SOLD("판매완료"); - private String name; + private String name; } diff --git a/server/src/main/java/com/ticketing/server/movie/domain/repository/MovieRepository.java b/server/src/main/java/com/ticketing/server/movie/domain/repository/MovieRepository.java index d2021e0..630bd4f 100644 --- a/server/src/main/java/com/ticketing/server/movie/domain/repository/MovieRepository.java +++ b/server/src/main/java/com/ticketing/server/movie/domain/repository/MovieRepository.java @@ -1,10 +1,13 @@ package com.ticketing.server.movie.domain.repository; import com.ticketing.server.movie.domain.Movie; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface MovieRepository extends JpaRepository { + Optional findByTitle(String title); + } diff --git a/server/src/main/java/com/ticketing/server/movie/domain/repository/TheaterRepository.java b/server/src/main/java/com/ticketing/server/movie/domain/repository/TheaterRepository.java index 2b0b6b4..3610de3 100644 --- a/server/src/main/java/com/ticketing/server/movie/domain/repository/TheaterRepository.java +++ b/server/src/main/java/com/ticketing/server/movie/domain/repository/TheaterRepository.java @@ -1,10 +1,13 @@ package com.ticketing.server.movie.domain.repository; import com.ticketing.server.movie.domain.Theater; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface TheaterRepository extends JpaRepository { + Optional findByTheaterNumber(Integer theaterNumber); + } diff --git a/server/src/test/java/com/ticketing/server/movie/domain/MovieTest.java b/server/src/test/java/com/ticketing/server/movie/domain/MovieTest.java new file mode 100644 index 0000000..864aada --- /dev/null +++ b/server/src/test/java/com/ticketing/server/movie/domain/MovieTest.java @@ -0,0 +1,5 @@ +package com.ticketing.server.movie.domain; + +public class MovieTest { + +} diff --git a/server/src/test/java/com/ticketing/server/movie/domain/repository/MovieRepositoryTest.java b/server/src/test/java/com/ticketing/server/movie/domain/repository/MovieRepositoryTest.java new file mode 100644 index 0000000..df0ccb5 --- /dev/null +++ b/server/src/test/java/com/ticketing/server/movie/domain/repository/MovieRepositoryTest.java @@ -0,0 +1,63 @@ +package com.ticketing.server.movie.domain.repository; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.ticketing.server.movie.domain.Movie; +import java.util.Optional; +import javax.transaction.Transactional; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.Rollback; + +@SpringBootTest +@Transactional +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class MovieRepositoryTest { + + @Autowired + MovieRepository movieRepository; + + @Order(1) + @Test + @Rollback(value = false) + @DisplayName("Movie Repository - test saving movie") + void shouldAbleToSaveMovie() { + // given + Movie movie = new Movie("범죄도시 2", 106); + + // when + Movie savedMovie = movieRepository.save(movie); + + // then + assertEquals(movie.getTitle(), savedMovie.getTitle()); + } + + @Order(2) + @Test + @DisplayName("Movie Repository Test - finding movie with title") + void ShouldAbleToFindMovieWithTitle() { + // given, when + Optional optionalMovie = movieRepository.findByTitle("범죄도시 2"); + + // then + assertTrue(optionalMovie.isPresent()); + } + + @Order(3) + @Test + @DisplayName("Movie Repository Test - finding movie that doesn't exist") + void ShouldNotAbleToFindMovie() { + // given, when + Optional optionalMovie = movieRepository.findByTitle("존재하지 않는 영화"); + + // then + assertFalse(optionalMovie.isPresent()); + } +} diff --git a/server/src/test/java/com/ticketing/server/movie/domain/repository/MovieTimesRepositoryTest.java b/server/src/test/java/com/ticketing/server/movie/domain/repository/MovieTimesRepositoryTest.java new file mode 100644 index 0000000..912ff57 --- /dev/null +++ b/server/src/test/java/com/ticketing/server/movie/domain/repository/MovieTimesRepositoryTest.java @@ -0,0 +1,5 @@ +package com.ticketing.server.movie.domain.repository; + +public class MovieTimesRepositoryTest { + +} diff --git a/server/src/test/java/com/ticketing/server/movie/domain/repository/SeatRepositoryTest.java b/server/src/test/java/com/ticketing/server/movie/domain/repository/SeatRepositoryTest.java new file mode 100644 index 0000000..70ee9b6 --- /dev/null +++ b/server/src/test/java/com/ticketing/server/movie/domain/repository/SeatRepositoryTest.java @@ -0,0 +1,5 @@ +package com.ticketing.server.movie.domain.repository; + +public class SeatRepositoryTest { + +} diff --git a/server/src/test/java/com/ticketing/server/movie/domain/repository/TheaterRepositoryTest.java b/server/src/test/java/com/ticketing/server/movie/domain/repository/TheaterRepositoryTest.java new file mode 100644 index 0000000..38420d2 --- /dev/null +++ b/server/src/test/java/com/ticketing/server/movie/domain/repository/TheaterRepositoryTest.java @@ -0,0 +1,32 @@ +package com.ticketing.server.movie.domain.repository; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.ticketing.server.movie.domain.Theater; +import javax.transaction.Transactional; +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; + +@SpringBootTest +@Transactional +public class TheaterRepositoryTest { + + @Autowired + TheaterRepository theaterRepository; + + @Test + @DisplayName("Theater Repository Test - saving theater") + void ShouldAbleToSaveTheater() { + // given + Theater theater = new Theater(1, 100); + + // when + Theater savedTheater = theaterRepository.save(theater); + + // then + assertEquals(theater.getTheaterNumber(), savedTheater.getTheaterNumber()); + } + +} diff --git a/server/src/test/java/com/ticketing/server/movie/domain/repository/TicketRepositoryTest.java b/server/src/test/java/com/ticketing/server/movie/domain/repository/TicketRepositoryTest.java new file mode 100644 index 0000000..152aee6 --- /dev/null +++ b/server/src/test/java/com/ticketing/server/movie/domain/repository/TicketRepositoryTest.java @@ -0,0 +1,5 @@ +package com.ticketing.server.movie.domain.repository; + +public class TicketRepositoryTest { + +} diff --git a/server/src/test/java/com/ticketing/server/movie/service/MovieServiceImplTest.java b/server/src/test/java/com/ticketing/server/movie/service/MovieServiceImplTest.java new file mode 100644 index 0000000..f3d75e6 --- /dev/null +++ b/server/src/test/java/com/ticketing/server/movie/service/MovieServiceImplTest.java @@ -0,0 +1,9 @@ +package com.ticketing.server.movie.service; + +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +public class MovieServiceImplTest { + +}