diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml index 93ab000..e2bb99f 100644 --- a/.github/workflows/blank.yml +++ b/.github/workflows/blank.yml @@ -20,4 +20,4 @@ jobs: # do not forget `git update-index --chmod=+x gradlew` to fix permission before ! - uses: eskatos/gradle-command-action@v1 with: - arguments: test + arguments: check diff --git a/README.MD b/README.MD new file mode 100644 index 0000000..62dd0b4 --- /dev/null +++ b/README.MD @@ -0,0 +1,3 @@ +# Projet GL51 +[![CodeFactor](https://www.codefactor.io/repository/github/hawlink/gl51td1/badge)](https://www.codefactor.io/repository/github/hawlink/gl51td1) +![CI](https://github.com/Hawlink/GL51TD1/workflows/CI/badge.svg) \ No newline at end of file diff --git a/build.gradle b/build.gradle index 6ea7404..05b66e1 100644 --- a/build.gradle +++ b/build.gradle @@ -3,6 +3,7 @@ plugins { //id "com.github.johnrengelman.shadow" version "5.2.0" id "com.github.johnrengelman.shadow" version "4.0.2" id "application" + id "codenarc" } diff --git a/config/codenarc/codenarc.xml b/config/codenarc/codenarc.xml new file mode 100644 index 0000000..921f1be --- /dev/null +++ b/config/codenarc/codenarc.xml @@ -0,0 +1,14 @@ + + + Sample rule set + + + + + + + + \ No newline at end of file diff --git a/src/main/groovy/gl51/MovieController.groovy b/src/main/groovy/gl51/MovieController.groovy new file mode 100644 index 0000000..ed2098b --- /dev/null +++ b/src/main/groovy/gl51/MovieController.groovy @@ -0,0 +1,30 @@ +package gl51 + +import gl51.movie.data.Movie +import gl51.movie.data.MovieRequest +import gl51.movie.service.MovieRegistry +import io.micronaut.http.annotation.Controller +import io.micronaut.http.annotation.Get +import io.micronaut.http.HttpStatus +import io.micronaut.http.annotation.Post + +import javax.inject.Inject + + +@Controller("/movie") +class MovieController { + + @Inject + MovieRegistry registry + + @Get("/") + List index() { + registry.listFavorites() + } + + @Post('/') + HttpStatus addMovie(MovieRequest movieRequest) { + registry.addMovieToFavorites(movieRequest.imdbId) + HttpStatus.CREATED + } +} diff --git a/src/main/groovy/gl51/movie/data/MovieRequest.groovy b/src/main/groovy/gl51/movie/data/MovieRequest.groovy new file mode 100644 index 0000000..e97f472 --- /dev/null +++ b/src/main/groovy/gl51/movie/data/MovieRequest.groovy @@ -0,0 +1,8 @@ +package gl51.movie.data + +/**Class representing a movie request**/ +class MovieRequest { + + String imdbId; + +} diff --git a/src/test/groovy/MovieControllerSpec.groovy b/src/test/groovy/MovieControllerSpec.groovy new file mode 100644 index 0000000..57e0a5b --- /dev/null +++ b/src/test/groovy/MovieControllerSpec.groovy @@ -0,0 +1,62 @@ +package gl51 + +import gl51.movie.data.Movie +import gl51.movie.data.MovieRequest +import gl51.movie.service.MovieClient +import gl51.movie.service.impl.MovieRegistryImpl +import io.micronaut.http.client.annotation.Client +import io.micronaut.runtime.server.EmbeddedServer +import io.micronaut.test.annotation.MicronautTest +import io.micronaut.http.client.RxHttpClient +import io.micronaut.http.HttpResponse +import io.micronaut.http.HttpStatus +import io.reactivex.Flowable +import spock.lang.AutoCleanup +import spock.lang.Specification +import spock.lang.Shared +import io.micronaut.test.annotation.MockBean +import io.micronaut.http.HttpRequest +import io.micronaut.core.type.Argument + +import javax.inject.Inject + +@MicronautTest +class MovieControllerSpec extends Specification { + + @Shared @Inject + EmbeddedServer embeddedServer + + @Shared @AutoCleanup @Inject @Client("/") + RxHttpClient client + + @Inject + MovieRegistryImpl registry + + void "test index"() { + given: + Flowable flowable = client.retrieve(HttpRequest.GET("/movie"), Argument.listOf(Movie)) + def content = flowable.firstElement().blockingGet() + expect: + content == [] + } + + void "test film creation"() { + given: + HttpResponse response = client.toBlocking().exchange( + HttpRequest.POST("/movie", new MovieRequest(imdbId: "aaaaa")) + ) + Flowable flowable = client.retrieve(HttpRequest.GET("/movie"), Argument.listOf(Movie)) + def content = flowable.firstElement().blockingGet() + expect: + response.status == HttpStatus.CREATED + //content.find(it.title == 'my movie' && it.imdbId == "aaaaa") + } + + @MockBean() + MovieClient movieClient() { + def mock = Mock(MovieClient) + mock.getMovieDetail("aaaaa") >> new Movie(imdbID: "aaaaa", title: 'my movie') + mock + } + +}