From fc5a6393dae0be633eb683b47ba1f9d4df5c4400 Mon Sep 17 00:00:00 2001 From: Sebastien Deleuze Date: Fri, 4 May 2018 16:29:35 +0200 Subject: [PATCH] Initial commit --- .gitignore | 28 + .mvn/wrapper/maven-wrapper.jar | Bin 0 -> 47610 bytes .mvn/wrapper/maven-wrapper.properties | 1 + README.adoc | 897 ++++++++++++++++++ build.gradle | 66 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54413 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 172 ++++ gradlew.bat | 84 ++ images/initializr.png | Bin 0 -> 100605 bytes mvnw | 225 +++++ mvnw.cmd | 143 +++ pom.xml | 159 ++++ settings.gradle | 1 + src/main/kotlin/blog/BlogApplication.kt | 44 + src/main/kotlin/blog/BlogProperties.kt | 16 + src/main/kotlin/blog/Extensions.kt | 26 + src/main/kotlin/blog/HtmlController.kt | 52 + src/main/kotlin/blog/HttpApi.kt | 32 + src/main/kotlin/blog/MarkdownConverter.kt | 36 + src/main/kotlin/blog/Model.kt | 20 + src/main/kotlin/blog/Repositories.kt | 11 + src/main/resources/application.properties | 3 + src/main/resources/templates/article.mustache | 16 + src/main/resources/templates/blog.mustache | 29 + src/main/resources/templates/footer.mustache | 2 + src/main/resources/templates/header.mustache | 6 + src/test/kotlin/blog/BlogApplicationTests.kt | 16 + src/test/kotlin/blog/HttpApiTests.kt | 59 ++ src/test/kotlin/blog/IntegrationTests.kt | 47 + src/test/kotlin/blog/RepositoriesTests.kt | 41 + src/test/resources/junit-platform.properties | 1 + 32 files changed, 2238 insertions(+) create mode 100644 .gitignore create mode 100644 .mvn/wrapper/maven-wrapper.jar create mode 100644 .mvn/wrapper/maven-wrapper.properties create mode 100644 README.adoc create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 images/initializr.png create mode 100755 mvnw create mode 100644 mvnw.cmd create mode 100644 pom.xml create mode 100644 settings.gradle create mode 100644 src/main/kotlin/blog/BlogApplication.kt create mode 100644 src/main/kotlin/blog/BlogProperties.kt create mode 100644 src/main/kotlin/blog/Extensions.kt create mode 100644 src/main/kotlin/blog/HtmlController.kt create mode 100644 src/main/kotlin/blog/HttpApi.kt create mode 100644 src/main/kotlin/blog/MarkdownConverter.kt create mode 100644 src/main/kotlin/blog/Model.kt create mode 100644 src/main/kotlin/blog/Repositories.kt create mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/templates/article.mustache create mode 100644 src/main/resources/templates/blog.mustache create mode 100644 src/main/resources/templates/footer.mustache create mode 100644 src/main/resources/templates/header.mustache create mode 100644 src/test/kotlin/blog/BlogApplicationTests.kt create mode 100644 src/test/kotlin/blog/HttpApiTests.kt create mode 100644 src/test/kotlin/blog/IntegrationTests.kt create mode 100644 src/test/kotlin/blog/RepositoriesTests.kt create mode 100644 src/test/resources/junit-platform.properties diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..31c4dde --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +/.gradle/ +/build/ +/out/ +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/build/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..9cc84ea9b4d95453115d0c26488d6a78694e0bc6 GIT binary patch literal 47610 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 literal 0 HcmV?d00001 diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..b573bb5 --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1 @@ +distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.3/apache-maven-3.5.3-bin.zip diff --git a/README.adoc b/README.adoc new file mode 100644 index 0000000..332203e --- /dev/null +++ b/README.adoc @@ -0,0 +1,897 @@ +--- +tags: [kotlin,rest,data] +projects: [spring-data-jpa,spring-framework,spring-boot] +--- +:toc: +:icons: font +:source-highlighter: prettify +:project_id: spring-boot +:tabsize: 2 + +This guide shows you how to build efficiently a sample blog application by combining the power of https://projects.spring.io/spring-boot/[Spring Boot] and http://kotlinlang.org/[Kotlin]. + +If you are starting with Kotlin, you can learn the language by reading the https://kotlinlang.org/docs/reference/[reference documentation] and following the online https://try.kotlinlang.org[Kotlin Koans tutorial]. + +Spring Kotlin support is documented in https://docs.spring.io/spring/docs/current/spring-framework-reference/languages.html#kotlin[Spring Framework] and https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-kotlin.html[Spring Boot] reference documentation. If you need help, search or ask questions with https://stackoverflow.com/questions/tagged/kotlin+spring[`spring` and `kotlin` tags on StackOverflow] or come discuss in the `#spring` channel of http://slack.kotlinlang.org/[Kotlin Slack]. + +== Creating a New Project + +First we need to create a Spring Boot application, which can be done in a number of ways. For the sake of example, we will use Gradle build system since this is the most popular in Kotlin ecosystem, but feel free to use Maven if you prefer it (a Maven pom.xml equivalent to the Gradle build https://github.com/spring-guides/tut-spring-boot-kotlin/blob/master/pom.xml[is available] as part of the sample blog project). + +[[using-the-initializr-website]] +=== Using the Initializr Website + +Go to http://start.spring.io and choose Kotlin language. You can also directly go to https://start.spring.io/#!language=kotlin in order to get Kotlin preselected. + +Then choose Gradle build system, "blog" artifact, "blog" package name (in advanced settings) and also add "Web", "Mustache", "JPA" and "H2" dependencies as starting points, then click on "Generate Project". + +image::https://github.com/spring-guides/tut-spring-boot-kotlin/raw/master/images/initializr.png[] + +The .zip file contains a standard Gradle project in the root directory, so you might want to create an empty directory before you unpack it. + +[[using-command-line]] +=== Using command line + +You can use Initializr HTTP API https://docs.spring.io/initializr/docs/current/reference/htmlsingle/#command-line[from the command line] with, for example, curl on a UN*X like system: + +[source] +---- +$ mkdir blog && cd blog +$ curl https://start.spring.io/starter.zip -d type=gradle-project -d language=kotlin -d style=web,mustache,jpa,h2 -d packageName=blog -d name=Blog -o blog.zip +---- + +[[using-intellij-idea]] +=== Using IntelliJ IDEA + +Spring Initializr is also integrated in IntelliJ IDEA Ultimate edition and allows you to create and import a new project without having to leave the IDE for the command-line or the web UI. + +To access the wizard, go to File | New | Project, and select Spring Initializr. + +Follow the steps of the wizard to use the following parameters: + + - Package name: "blog" + - Artifact: "blog" + - Type: Gradle Project + - Language: Kotlin + - Name: "Blog" + - Dependencies: "Web", "Mustache", JPA" and "H2" + +== Understanding the generated project + +=== Gradle build + +==== Plugins + +In addition to the obvious https://kotlinlang.org/docs/reference/using-gradle.html[Kotlin Gradle plugin], the default configuration also declares the https://kotlinlang.org/docs/reference/compiler-plugins.html#spring-support[kotlin-spring plugin] which automatically opens classes and methods (unlike in Java, the defaut qualifier is `final` in Kotlin) annotated or meta-annotated with Spring annotations. This is useful to be able to create `@Configuration` or `@Transactional` beans without having to add the `open` qualifier required by CGLIB proxies for example. + +`build.gradle` +[source,groovy] +---- +buildscript { + ext { + kotlinVersion = '1.2.41' + springBootVersion = '2.0.1.RELEASE' + } + repositories { + mavenCentral() + } + dependencies { + classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}") + classpath("org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}") + } +} + +apply plugin: 'kotlin' +apply plugin: 'kotlin-spring' +apply plugin: 'org.springframework.boot' +apply plugin: 'io.spring.dependency-management' +---- + +==== Compiler options + +One of Kotlin's key features is https://kotlinlang.org/docs/reference/null-safety.html[null-safety] - which cleanly deals with `null` values at compile time rather than bumping into the famous `NullPointerException` at runtime. This makes applications safer through nullability declarations and expressing "value or no value" semantics without paying the cost of wrappers like `Optional`. Note that Kotlin allows using functional constructs with nullable values; check out this http://www.baeldung.com/kotlin-null-safety[comprehensive guide to Kotlin null-safety]. + +Although Java does not allow one to express null-safety in its type-system, Spring Framework provides null-safety of the whole Spring Framework API via tooling-friendly annotations declared in the `org.springframework.lang` package. By default, types from Java APIs used in Kotlin are recognized as https://kotlinlang.org/docs/reference/java-interop.html#null-safety-and-platform-types[platform types] for which null-checks are relaxed. https://kotlinlang.org/docs/reference/java-interop.html#jsr-305-support[Kotlin support for JSR 305 annotations] + Spring nullability annotations provide null-safety for the whole Spring Framework API to Kotlin developers, with the advantage of dealing with `null` related issues at compile time. + +This feature can be enabled by adding the `-Xjsr305` compiler flag with the `strict` options. + +Notice also that Kotlin compiler is configured to generate Java 8 bytecode (Java 6 by default). + +`build.gradle` +[source,groovy] +---- +sourceCompatibility = 1.8 +compileKotlin { + kotlinOptions { + freeCompilerArgs = ["-Xjsr305=strict"] + jvmTarget = "1.8" + } +} +compileTestKotlin { + kotlinOptions { + freeCompilerArgs = ["-Xjsr305=strict"] + jvmTarget = "1.8" + } +} +---- + +==== Dependencies + +3 Kotlin specific libraries are required for such Spring Boot web application and configured by default: + + - `kotlin-stdlib-jdk8` is the Java 8 variant of Kotlin standard library + - `kotlin-reflect` is Kotlin reflection library (mandatory as of Spring Framework 5) + - `jackson-module-kotlin` is almost mandatory to serialize/deserialize Kotlin classes + +`build.gradle` +[source,groovy] +---- +dependencies { + compile('org.springframework.boot:spring-boot-starter-data-jpa') + compile('org.springframework.boot:spring-boot-starter-web') + compile('org.springframework.boot:spring-boot-starter-mustache') + compile('com.fasterxml.jackson.module:jackson-module-kotlin') + compile("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + compile("org.jetbrains.kotlin:kotlin-reflect") + testCompile('org.springframework.boot:spring-boot-starter-test') +} +---- + +Spring Boot Gradle plugin automatically uses the Kotlin version declared on the Kotlin Gradle plugin. + +=== Application + +`src/main/kotlin/blog/BlogApplication.kt` +[source,kotlin] +---- +package blog + +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.runApplication + +@SpringBootApplication +class BlogApplication + +fun main(args: Array) { + runApplication(*args) +} +---- + +Compared to Java, you can notice the lack of semicolons, the lack of brackets on empty class (you can add some if you need to declare beans via `@Bean` annotation) and the use of `runApplication` top level function. `runApplication(*args)` is Kotlin idiomatic alternative to `SpringApplication.run(BlogApplication::class.java, *args)` and can be used to customize the application with following syntax. + +`src/main/kotlin/blog/BlogApplication.kt` +[source,kotlin] +---- +fun main(args: Array) { + runApplication(*args) { + setBannerMode(Banner.Mode.OFF) + } +} +---- + +== Writing your first Kotlin controller + +Let's create a simple controller to display a simple web page. + +`src/main/kotlin/blog/HtmlController.kt` +[source,kotlin] +---- +package blog.web + +import org.springframework.stereotype.Controller +import org.springframework.ui.Model +import org.springframework.ui.set +import org.springframework.web.bind.annotation.GetMapping + +@Controller +class HtmlController() { + + @GetMapping("/") + fun blog(model: Model): String { + model["title"] = "Blog" + return "blog" + } + +} +---- + +Notice that we are using here a https://kotlinlang.org/docs/reference/extensions.html[Kotlin extension] that allows to add Kotlin functions or operators to existing Spring types. Here we import the `org.springframework.ui.set` extension function in order to be able to write `model["title"] = "Blog"` instead of `model.addAttribute("title", "Blog")`. + +We also need to create the associated Mustache templates. + +`src/main/resources/templates/header.mustache` +[source] +---- + + + {{title}} + + +---- + +`src/main/resources/templates/footer.mustache` +[source] +---- + + +---- + +`src/main/resources/templates/blog.mustache` +[source] +---- +{{> header}} + +

{{title}}

+ +{{> footer}} +---- + +Start the web application by running the `main` function of `BlogApplication.kt`, and go to `http://localhost:8080/`, you should see a sober web page with a "Blog" headline. + +== Testing with JUnit 5 + +While JUnit 4 is still the default testing framework provided with Spring Boot 2, JUnit 5 provides various features very handy with Kotlin, including https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#testcontext-junit-jupiter-di[autowiring of contructor/method parameters] which allows to use non-nullable `val` properties and the possibility to use `@BeforeAll`/`@AfterAll` on regular non-static methods. + +=== Switching from JUnit 4 to JUnit 5 + +First make sure you are using Gradle 4.6+ by running `./gradlew -version` in order to be able to leverage https://docs.gradle.org/4.6/release-notes.html#junit-5-support[native JUnit 5 support]. If you are using an older version, you can update it by running `./gradlew wrapper --gradle-version 4.7` for a more recent https://docs.gradle.org/current/release-notes.html[Gradle release]. + +Enable JUnit 5 support by adding the following line to your `build.gradle` file: + +`build.gradle` +[source,groovy] +---- +test { + useJUnitPlatform() +} +---- + +Then exclude `junit` from `spring-boot-starter-test` transitive dependencies and add `junit-jupiter-api` and `junit-jupiter-engine` ones. + +`build.gradle` +[source,groovy] +---- +dependencies { + testCompile('org.springframework.boot:spring-boot-starter-test') { + exclude module: 'junit' + } + testImplementation('org.junit.jupiter:junit-jupiter-api') + testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine') +} +---- + +Refresh Gradle configuration, and open `BlogApplicationTests` to replace `@RunWith(SpringRunner::class)` by `@ExtendWith(SpringExtension::class)`. + +`src/test/kotlin/blog/BlogApplicationTests.kt` +[source,kotlin] +---- +@ExtendWith(SpringExtension::class) +@SpringBootTest +class BlogApplicationTests { + + @Test + fun contextLoads() { + } + +} +---- + +The test should run fine both in command line and in the IDE. + +=== Writing JUnit 5 tests in Kotlin + +For the sake of this example, let's create an integration test in order to demonstrate various features: + + - We use real sentences between backticks instead of camel-case to provide expressive test function names + - JUnit 5 allows to inject constructor and method parameters, which is a good fit with Kotlin immutable and non-nullable properties + - This code leverages `getForObject` and `getForEntity` Kotlin extensions (you need to import them) + +`src/test/kotlin/blog/IntegrationTests.kt` +[source,kotlin] +---- +@ExtendWith(SpringExtension::class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +class IntegrationTests(@Autowired val restTemplate: TestRestTemplate) { + + @Test + fun `Assert blog page title, content and status code`() { + val entity = restTemplate.getForEntity("/") + assertThat(entity.statusCode).isEqualTo(HttpStatus.OK) + assertThat(entity.body).contains("

Blog

", "reactor") + } + +} +---- + +=== Test instance lifecycle + +Sometimes you need to execute a method before or after all tests of a given class. Like Junit 4, JUnit 5 requires by default these methods to be static (which translates to https://kotlinlang.org/docs/reference/object-declarations.html#companion-objects[`companion object`] in Kotlin, which is quite verbose and not straightforward) because test classes are instantiated one time per test. + +But Junit 5 allows you to change this default behavior and instantiate test classes one time per class. This can be done in https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-instance-lifecycle[various ways], here we will use a property file to change the default behavior for the whole project: + +`src/test/resources/junit-platform.properties` +[source,properties] +---- +junit.jupiter.testinstance.lifecycle.default = per_class +---- + +With this configuration, we can now use `@BeforeAll` and `@AfterAll` annotations on regular methods like shown in updated version of `IntegrationTests` above. + +`src/test/kotlin/blog/IntegrationTests.kt` +[source,kotlin] +---- +@ExtendWith(SpringExtension::class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +class IntegrationTests(@Autowired val restTemplate: TestRestTemplate) { + + @BeforeAll + fun setup() { + println(">> Setup") + } + + @Test + fun `Assert blog page title, content and status code`() { + println(">> Assert blog page title, content and status code") + val entity = restTemplate.getForEntity("/") + assertThat(entity.statusCode).isEqualTo(HttpStatus.OK) + assertThat(entity.body).contains("

Blog

") + } + + @Test + fun `Assert article page title, content and status code`() { + println(">> TODO") + + } + + @AfterAll + fun teardown() { + println(">> Tear down") + } + +} +---- + +== Persistence with JPA + +In order to be able to use Kotlin immutable classes, we need to enable https://kotlinlang.org/docs/reference/compiler-plugins.html#jpa-support[Kotlin JPA plugin]. It will generate no-arg constructors for any class annotated with `@Entity`, `@MappedSuperclass` or `@Embeddable`. + +`build.gradle` +[source,groovy] +---- +buildscript { + dependencies { + classpath("org.jetbrains.kotlin:kotlin-noarg:${kotlinVersion}") + } +} +apply plugin: 'kotlin-jpa' +---- + +Then we create our model by using Kotlin https://kotlinlang.org/docs/reference/data-classes.html[data classes] which are designed to hold data and automatically provide `equals()`, `hashCode()`, `toString()`, `componentN()` functions and `copy()`. + +`src/main/kotlin/blog/Model.kt` +[source,kotlin] +---- +@Entity +data class Article( + val title: String, + val headline: String, + val content: String, + @ManyToOne @JoinColumn val author: User, + @Id @GeneratedValue val id: Long? = null, + val addedAt: LocalDateTime = LocalDateTime.now()) + +@Entity +data class User( + @Id val login: String, + val firstname: String, + val lastname: String, + val description: String? = null) +---- + +Optional parameters with default values are defined at the last position in order to make in possible to omit them when using positional arguments (Kotlin also supports https://kotlinlang.org/docs/reference/functions.html#named-arguments[named arguments]). Notice that in Kotlin it is not unusual to group concise class declarations in the same file. + +We also declares our Spring Data JPA repositories as following. + +`src/main/kotlin/blog/Repositories.kt` +[source,kotlin] +---- +interface ArticleRepository : CrudRepository { + fun findAllByOrderByAddedAtDesc(): Iterable
+} + +interface UserRepository : CrudRepository +---- + +And we write JPA tests to check basic use case works as expected. + +`src/test/kotlin/blog/RepositoriesTests.kt` +[source,kotlin] +---- +@ExtendWith(SpringExtension::class) +@DataJpaTest +class RepositoriesTests(@Autowired val entityManager: TestEntityManager, + @Autowired val userRepository: UserRepository, + @Autowired val articleRepository: ArticleRepository) { + + @Test + fun `When findById then return Article`() { + val juergen = User("springjuergen", "Juergen", "Hoeller") + entityManager.persist(juergen) + val article = Article("Spring Framework 5.0 goes GA", "Dear Spring community ...", "Lorem ipsum", juergen) + entityManager.persist(article) + entityManager.flush() + + val found = articleRepository.findById(article.id!!) + + assertThat(found.get()).isEqualTo(article) + } + + @Test + fun `When findById then return User`() { + val juergen = User("springjuergen", "Juergen", "Hoeller") + entityManager.persist(juergen) + entityManager.flush() + + val found = userRepository.findById(juergen.login) + + assertThat(found.get()).isEqualTo(juergen) + } + +} +---- + +== Creating your own extensions + +Instead of using util classes with abstract methods like in Java, it is usual in Kotlin to provide such functionalities via Kotlin extensions. Here we are going to add a `format()` function to the existing `LocalDateTime` type in order to generate text with the english date format. + +`src/main/kotlin/blog/Extensions.kt` +[source,kotlin] +---- + +fun LocalDateTime.format() = this.format(englishDateFormatter) + +private val daysLookup = (1..31).associate { it.toLong() to getOrdinal(it) } + +private val englishDateFormatter = DateTimeFormatterBuilder() + .appendPattern("MMMM") + .appendLiteral(" ") + .appendText(ChronoField.DAY_OF_MONTH, daysLookup) + .appendLiteral(" ") + .appendPattern("yyyy") + .toFormatter(Locale.ENGLISH) + +private fun getOrdinal(n: Int) = when { + n in 11..13 -> "${n}th" + n % 10 == 1 -> "${n}st" + n % 10 == 2 -> "${n}nd" + n % 10 == 3 -> "${n}rd" + else -> "${n}th" +} +---- + +we will leverage this extension in the next section. + +== Implementing the blog engine + +The blog engine we are implementing needs to render Markdown to HTML, and we are going to use `commonmark` library for that purpose. + +`build.gradle` +[source,groovy] +---- +dependencies { + compile("com.atlassian.commonmark:commonmark:0.11.0") + compile("com.atlassian.commonmark:commonmark-ext-autolink:0.11.0") +} +---- + +We introduce a `MarkdownConverter` bean, which leverages https://kotlinlang.org/docs/reference/lambdas.html#function-types[Kotlin function type]. + +`src/main/kotlin/blog/MarkdownConverter.kt` +[source,kotlin] +---- +@Service +class MarkdownConverter : (String?) -> String { + + private val parser = Parser.builder().extensions(Arrays.asList(AutolinkExtension.create())).build() + private val renderer = HtmlRenderer.builder().build() + + override fun invoke(input: String?): String { + if (input == null || input == "") { + return "" + } + return renderer.render(parser.parse(input)) + } +} +---- + +And we provide a custom `Mustache.Compiler` bean to be able to render HTML. + +`src/main/kotlin/blog/BlogApplication.kt` +[source,kotlin] +---- +@SpringBootApplication +class BlogApplication { + + @Bean + fun mustacheCompiler(loader: Mustache.TemplateLoader?) = + Mustache.compiler().escapeHTML(false).withLoader(loader) + +} +---- + +The nullable `Mustache.TemplateLoader?` means that it is an optional bean (in order to avoid failure when running JPA-only tests). + +We update the "blog" Mustache templates. + +`src/main/resources/templates/blog.mustache` +[source] +---- +{{> header}} + +
+ + {{#articles}} +
+
+

{{title}}

+ +
+
+ {{headline}} +
+
+ {{/articles}} +
+ +{{> footer}} +---- + +And we create an "article new one". + +`src/main/resources/templates/blog.mustache` +[source] +---- +{{> header}} + +
+
+

{{article.title}}

+ +
+ +
+ {{article.headline}} + + {{article.content}} +
+
+ +{{> footer}} +---- + +We update the `HtmlController` in order to render blog and article pages with rendered markdown and formatted date. + +`src/main/kotlin/blog/HtmlController.kt` +[source,kotlin] +---- +@Controller +class HtmlController(private val repository: ArticleRepository, + private val markdownConverter: MarkdownConverter) { + + @GetMapping("/") + fun blog(model: Model): String { + model["title"] = properties.title + model["banner"] = properties.banner + model["articles"] = repository.findAllByOrderByAddedAtDesc().map { it.render() } + return "blog" + } + + @GetMapping("/article/{id}") + fun article(@PathVariable id: Long, model: Model): String { + val article = repository + .findById(id) + .orElseThrow { IllegalArgumentException("Wrong article slug provided") } + .render() + model["title"] = article.title + model["article"] = article + return "article" + } + + fun Article.render() = RenderedArticle( + title, + markdownConverter.invoke(headline), + markdownConverter.invoke(content), + author, + id, + addedAt.format() + ) + + data class RenderedArticle( + val title: String, + val headline: String, + val content: String, + val author: User, + val id: Long?, + val addedAt: String) + +} +---- + +We add data initialization to `BlogApplication`. + +`src/main/kotlin/blog/BlogApplication.kt` +[source,kotlin] +---- +@Bean +fun databaseInitializer(userRepository: UserRepository, articleRepository: ArticleRepository) = CommandLineRunner { + val smaldlini = User("smaldini", "Stéphane", "Maldini") + userRepository.save(smaldlini) + articleRepository.save(Article( + "Reactor Bismuth is out", + "Lorem ipsum", + "dolor **sit** amet https://projectreactor.io/", + smaldlini, + 1 + + )) + articleRepository.save(Article( + "Reactor Aluminium has landed", + "Lorem ipsum", + "dolor **sit** amet https://projectreactor.io/", + smaldlini, + 2 + + )) +} +---- + +And we also update the integration tests accordingly. + +`src/test/kotlin/blog/IntegrationTests.kt` +[source,kotlin] +---- +@ExtendWith(SpringExtension::class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +class IntegrationTests(@Autowired val restTemplate: TestRestTemplate) { + + @BeforeAll + fun setup() { + println(">> Setup") + } + + @Test + fun `Assert blog page title, content and status code`() { + println(">> Assert blog page title, content and status code") + val entity = restTemplate.getForEntity("/") + assertThat(entity.statusCode).isEqualTo(HttpStatus.OK) + assertThat(entity.body).contains("

Blog

", "Reactor") + } + + @Test + fun `Assert article page title, content and status code`() { + println(">> Assert article page title, content and status code") + val entity = restTemplate.getForEntity("/article/2") + assertThat(entity.statusCode).isEqualTo(HttpStatus.OK) + assertThat(entity.body).contains("https://projectreactor.io/") + + } + + @AfterAll + fun teardown() { + println(">> Tear down") + } + + +} +---- + +Start (or restart) the web application, and go to `http://localhost:8080/`, you should see the list of articles with clickable links to see a specific article. + +== Exposing HTTP API + +We are now going to implement the HTTP API via `@RestController` annotated controllers. + +`src/main/kotlin/blog/HttpApi.kt` +[source,kotlin] +---- +@RestController +@RequestMapping("/api/article") +class ArticleController(private val repository: ArticleRepository, + private val markdownConverter: MarkdownConverter) { + + @GetMapping("/") + fun findAll() = repository.findAllByOrderByAddedAtDesc() + + @GetMapping("/{id}") + fun findOne(@PathVariable id: Long, @RequestParam converter: String?) = when (converter) { + "markdown" -> repository.findById(id).map { it.copy( + headline = markdownConverter.invoke(it.headline), + content = markdownConverter.invoke(it.content)) } + null -> repository.findById(id) + else -> throw IllegalArgumentException("Only markdown converter is supported") + } +} + +@RestController +@RequestMapping("/api/user") +class UserController(private val repository: UserRepository) { + + @GetMapping("/") + fun findAll() = repository.findAll() + + @GetMapping("/{login}") + fun findOne(@PathVariable login: String) = repository.findById(login) +} +---- + +For tests, instead of integration tests we choose to leverage `@WebMvcTest` and `@MockBean` to test only the web layer. + +`src/test/kotlin/blog/HttpApiTests.kt` +[source,kotlin] +---- +@ExtendWith(SpringExtension::class) +@WebMvcTest +class HttpApiTests(@Autowired val mockMvc: MockMvc) { + + @MockBean + private lateinit var userRepository: UserRepository + + @MockBean + private lateinit var articleRepository: ArticleRepository + + @MockBean + private lateinit var markdownConverter: MarkdownConverter + + @Test + fun `List articles`() { + val juergen = User("springjuergen", "Juergen", "Hoeller") + val spring5Article = Article("Spring Framework 5.0 goes GA", "Dear Spring community ...", "Lorem ipsum", juergen, 1) + val spring43Article = Article("Spring Framework 4.3 goes GA", "Dear Spring community ...", "Lorem ipsum", juergen, 2) + whenever(articleRepository.findAllByOrderByAddedAtDesc()).thenReturn(listOf(spring5Article, spring43Article)) + whenever(markdownConverter.invoke(any())).thenAnswer { it.arguments[0] } + mockMvc.perform(get("/api/article/").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)) + .andExpect(jsonPath("\$.[0].author.login").value(juergen.login)) + .andExpect(jsonPath("\$.[0].id").value(spring5Article.id!!)) + .andExpect(jsonPath("\$.[1].author.login").value(juergen.login)) + .andExpect(jsonPath("\$.[1].id").value(spring43Article.id!!)) + } + + @Test + fun `List users`() { + val juergen = User("springjuergen", "Juergen", "Hoeller") + val smaldlini = User("smaldini", "Stéphane", "Maldini") + whenever(userRepository.findAll()).thenReturn(listOf(juergen, smaldlini)) + mockMvc.perform(get("/api/user/").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)) + .andExpect(jsonPath("\$.[0].login").value(juergen.login)) + .andExpect(jsonPath("\$.[1].login").value(smaldlini.login)) + } + +} +---- + +Notice that `when` is a reserved Kotlin keyword, that's why we choose to use https://github.com/nhaarman/mockito-kotlin/[mockito-kotlin] library which provides a `whenever` alias (using escaped `{backtick}when{backtick}`). In order to use it, add following dependency. + +`build.gradle` +[source,groovy] +---- +dependencies { + testCompile("com.nhaarman:mockito-kotlin:1.5.0") +} +---- + +`$` also needs to be escaped in strings as it is used for string interpolation. There is https://github.com/spring-projects/spring-boot/issues/13113[not yet] `@MockBean` JUnit 5 parameter resolver, so we need to use `lateinit var` for now. + +== Configuration properties + +The recommended way to manage your application properties is to leverage `@ConfigurationProperties`. Immutable properties are https://github.com/spring-projects/spring-boot/issues/8762[not yet supported], but you can use `lateinit var` when you need to deal with non-nullable properties. + +`src/main/kotlin/blog/BlogProperties.kt` +[source,kotlin] +---- +@ConfigurationProperties("blog") +class BlogProperties { + + lateinit var title: String + val banner = Banner() + + class Banner { + var title: String? = null + lateinit var content: String + } +} +---- + +Then we enable it at `BlogApplication` level. + +`src/main/kotlin/blog/BlogApplication.kt` +[source,kotlin] +---- +@SpringBootApplication +@EnableConfigurationProperties(BlogProperties::class) +class BlogApplication { + // ... +} +---- + +To generate https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#configuration-metadata-annotation-processor[your own metadata] in order to get these custom properties recognized by your IDE, https://kotlinlang.org/docs/reference/kapt.html[kapt should be configured] with the `spring-boot-configuration-processor` dependency as following. + +`build.gradle` +[source,groovy] +---- +apply plugin: 'kotlin-kapt' +dependencies { + kapt("org.springframework.boot:spring-boot-configuration-processor") +} + +---- + +In IntelliJ IDEA: + + - Make sure Spring Boot plugin in enabled in menu File | Settings | Plugins | Spring Boot + - Enable annotation processing via menu File | Settings | Build, Execution, Deployement | Compiler | Annotation Processors | Enable annotation processing + - Since https://youtrack.jetbrains.com/issue/KT-15040[Kapt is not yet integrated in IDEA], you need to run manually the command `./gradlew kaptKotlin` to generate the metadata + +Your custom properties should now be recognized when editing `application.properties` (autocomplete, validation, etc.). + +`src/main/resources/application.properties` +[source,properties] +---- +blog.title=Blog +blog.banner.title=Warning +blog.banner.content=The blog will be down tomorrow. +---- + +Edit the template and the controller accordingly. + +`src/main/resources/templates/blog.mustache` +[source] +---- +{{> header}} + +
+ + {{#banner.title}} +
+ + +
+ {{/banner.title}} + + ... + +
+ +{{> footer}} +---- + +`src/main/kotlin/blog/HtmlController.kt` +[source,kotlin] +---- +@Controller +class HtmlController(private val repository: ArticleRepository, + private val markdownConverter: MarkdownConverter, + private val properties: BlogProperties) { + + @GetMapping("/") + fun blog(model: Model): String { + model["title"] = properties.title + model["banner"] = properties.banner + model["articles"] = repository.findAllByOrderByAddedAtDesc().map { it.render() } + return "blog" + } + + // ... + +} +---- + +Restart the web application, refresh `http://localhost:8080/`, you should see the banner on the blog homepage. diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..121bda9 --- /dev/null +++ b/build.gradle @@ -0,0 +1,66 @@ +buildscript { + ext { + kotlinVersion = '1.2.41' + springBootVersion = '2.0.1.RELEASE' + } + repositories { + mavenCentral() + } + dependencies { + classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}") + classpath("org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}") + classpath("org.jetbrains.kotlin:kotlin-noarg:${kotlinVersion}") + } +} + +apply plugin: 'kotlin' +apply plugin: 'kotlin-spring' +apply plugin: 'kotlin-jpa' +apply plugin: 'kotlin-kapt' +apply plugin: 'org.springframework.boot' +apply plugin: 'io.spring.dependency-management' + +group = 'com.example' +version = '0.0.1-SNAPSHOT' +sourceCompatibility = 1.8 +compileKotlin { + kotlinOptions { + freeCompilerArgs = ["-Xjsr305=strict"] + jvmTarget = "1.8" + } +} +compileTestKotlin { + kotlinOptions { + freeCompilerArgs = ["-Xjsr305=strict"] + jvmTarget = "1.8" + } +} + +repositories { + mavenCentral() +} + +test { + useJUnitPlatform() +} + + +dependencies { + compile('org.springframework.boot:spring-boot-starter-data-jpa') + compile('org.springframework.boot:spring-boot-starter-web') + compile('org.springframework.boot:spring-boot-starter-mustache') + compile('com.fasterxml.jackson.module:jackson-module-kotlin') + compile("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + compile("org.jetbrains.kotlin:kotlin-reflect") + compile("com.atlassian.commonmark:commonmark:0.11.0") + compile("com.atlassian.commonmark:commonmark-ext-autolink:0.11.0") + runtime("com.h2database:h2") + kapt("org.springframework.boot:spring-boot-configuration-processor") + testCompile('org.springframework.boot:spring-boot-starter-test') { + exclude module: 'junit' + } + testCompile("com.nhaarman:mockito-kotlin:1.5.0") + testImplementation('org.junit.jupiter:junit-jupiter-api') + testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine') +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..91ca28c8b802289c3a438766657a5e98f20eff03 GIT binary patch literal 54413 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/images/initializr.png b/images/initializr.png new file mode 100644 index 0000000000000000000000000000000000000000..b9c1eb1a7e041e5563579a5872cf03092b77c62e GIT binary patch literal 100605 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 literal 0 HcmV?d00001 diff --git a/mvnw b/mvnw new file mode 100755 index 0000000..5bf251c --- /dev/null +++ b/mvnw @@ -0,0 +1,225 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Migwn, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +echo $MAVEN_PROJECTBASEDIR +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..019bd74 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,143 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" + +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..fe5cb44 --- /dev/null +++ b/pom.xml @@ -0,0 +1,159 @@ + + + 4.0.0 + + com.example + blog + 0.0.1-SNAPSHOT + jar + + blog + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 2.0.1.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + 1.2.41 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-mustache + + + com.fasterxml.jackson.module + jackson-module-kotlin + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + + + org.jetbrains.kotlin + kotlin-reflect + + + com.atlassian.commonmark + commonmark + 0.11.0 + + + com.atlassian.commonmark + commonmark-ext-autolink + 0.11.0 + + + com.h2database + h2 + runtime + + + + org.springframework.boot + spring-boot-starter-test + test + + + junit + junit + + + + + org.junit.jupiter + junit-jupiter-engine + test + + + com.nhaarman + mockito-kotlin + 1.5.0 + + + + + ${project.basedir}/src/main/kotlin + ${project.basedir}/src/test/kotlin + + + org.springframework.boot + spring-boot-maven-plugin + + + kotlin-maven-plugin + org.jetbrains.kotlin + + + -Xjsr305=strict + + + spring + jpa + + + + + org.jetbrains.kotlin + kotlin-maven-allopen + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-maven-noarg + ${kotlin.version} + + + + + kapt + + kapt + + + + src/main/kotlin + + + + org.springframework.boot + spring-boot-configuration-processor + ${project.parent.version} + + + + + + + + maven-surefire-plugin + + + org.junit.platform + junit-platform-surefire-provider + ${junit-platform.version} + + + + + + + + diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..0a383dd --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'demo' diff --git a/src/main/kotlin/blog/BlogApplication.kt b/src/main/kotlin/blog/BlogApplication.kt new file mode 100644 index 0000000..6fae682 --- /dev/null +++ b/src/main/kotlin/blog/BlogApplication.kt @@ -0,0 +1,44 @@ +package blog + +import com.samskivert.mustache.Mustache +import org.springframework.boot.CommandLineRunner +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.context.properties.EnableConfigurationProperties +import org.springframework.boot.runApplication +import org.springframework.context.annotation.Bean + +@SpringBootApplication +@EnableConfigurationProperties(BlogProperties::class) +class BlogApplication { + + @Bean + fun mustacheCompiler(loader: Mustache.TemplateLoader?) = + Mustache.compiler().escapeHTML(false).withLoader(loader) + + @Bean + fun databaseInitializer(userRepository: UserRepository, articleRepository: ArticleRepository) = CommandLineRunner { + val smaldlini = User("smaldini", "Stéphane", "Maldini") + userRepository.save(smaldlini) + articleRepository.save(Article( + "Reactor Bismuth is out", + "Lorem ipsum", + "dolor **sit** amet https://projectreactor.io/", + smaldlini, + 1 + + )) + articleRepository.save(Article( + "Reactor Aluminium has landed", + "Lorem ipsum", + "dolor **sit** amet https://projectreactor.io/", + smaldlini, + 2 + + )) + } + +} + +fun main(args: Array) { + runApplication(*args) +} diff --git a/src/main/kotlin/blog/BlogProperties.kt b/src/main/kotlin/blog/BlogProperties.kt new file mode 100644 index 0000000..779382d --- /dev/null +++ b/src/main/kotlin/blog/BlogProperties.kt @@ -0,0 +1,16 @@ +package blog + +import org.springframework.boot.context.properties.ConfigurationProperties + +// TODO Use "val" instead of "lateinit var" when spring-boot#8762 will be fixed +@ConfigurationProperties("blog") +class BlogProperties { + + lateinit var title: String + val banner = Banner() + + class Banner { + var title: String? = null + lateinit var content: String + } +} \ No newline at end of file diff --git a/src/main/kotlin/blog/Extensions.kt b/src/main/kotlin/blog/Extensions.kt new file mode 100644 index 0000000..232602b --- /dev/null +++ b/src/main/kotlin/blog/Extensions.kt @@ -0,0 +1,26 @@ +package blog + +import java.time.LocalDateTime +import java.time.format.DateTimeFormatterBuilder +import java.time.temporal.ChronoField +import java.util.* + +fun LocalDateTime.format() = this.format(englishDateFormatter) + +private val daysLookup = (1..31).associate { it.toLong() to getOrdinal(it) } + +private val englishDateFormatter = DateTimeFormatterBuilder() + .appendPattern("MMMM") + .appendLiteral(" ") + .appendText(ChronoField.DAY_OF_MONTH, daysLookup) + .appendLiteral(" ") + .appendPattern("yyyy") + .toFormatter(Locale.ENGLISH) + +private fun getOrdinal(n: Int) = when { + n in 11..13 -> "${n}th" + n % 10 == 1 -> "${n}st" + n % 10 == 2 -> "${n}nd" + n % 10 == 3 -> "${n}rd" + else -> "${n}th" +} \ No newline at end of file diff --git a/src/main/kotlin/blog/HtmlController.kt b/src/main/kotlin/blog/HtmlController.kt new file mode 100644 index 0000000..2d26a9f --- /dev/null +++ b/src/main/kotlin/blog/HtmlController.kt @@ -0,0 +1,52 @@ +package blog + +import org.springframework.stereotype.Controller +import org.springframework.ui.Model +import org.springframework.ui.set +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable + +@Controller +class HtmlController(private val repository: ArticleRepository, + private val markdownConverter: MarkdownConverter, + private val properties: BlogProperties) { + + @GetMapping("/") + fun blog(model: Model): String { + model["title"] = properties.title + model["banner"] = properties.banner + model["articles"] = repository.findAllByOrderByAddedAtDesc().map { it.render() } + return "blog" + } + + @GetMapping("/article/{id}") + fun article(@PathVariable id: Long, model: Model): String { + val article = repository + .findById(id) + .orElseThrow { IllegalArgumentException("Wrong article slug provided") } + .render() + model["title"] = article.title + model["article"] = article + return "article" + } + + fun Article.render() = RenderedArticle( + title, + markdownConverter.invoke(headline), + markdownConverter.invoke(content), + author, + id, + addedAt.format() + ) + + data class RenderedArticle( + val title: String, + val headline: String, + val content: String, + val author: User, + val id: Long?, + val addedAt: String) + +} + + diff --git a/src/main/kotlin/blog/HttpApi.kt b/src/main/kotlin/blog/HttpApi.kt new file mode 100644 index 0000000..4daa0cb --- /dev/null +++ b/src/main/kotlin/blog/HttpApi.kt @@ -0,0 +1,32 @@ +package blog + +import org.springframework.web.bind.annotation.* + +@RestController +@RequestMapping("/api/article") +class ArticleController(private val repository: ArticleRepository, + private val markdownConverter: MarkdownConverter) { + + @GetMapping("/") + fun findAll() = repository.findAllByOrderByAddedAtDesc() + + @GetMapping("/{id}") + fun findOne(@PathVariable id: Long, @RequestParam converter: String?) = when (converter) { + "markdown" -> repository.findById(id).map { it.copy( + headline = markdownConverter.invoke(it.headline), + content = markdownConverter.invoke(it.content)) } + null -> repository.findById(id) + else -> throw IllegalArgumentException("Only markdown converter is supported") + } +} + +@RestController +@RequestMapping("/api/user") +class UserController(private val repository: UserRepository) { + + @GetMapping("/") + fun findAll() = repository.findAll() + + @GetMapping("/{login}") + fun findOne(@PathVariable login: String) = repository.findById(login) +} \ No newline at end of file diff --git a/src/main/kotlin/blog/MarkdownConverter.kt b/src/main/kotlin/blog/MarkdownConverter.kt new file mode 100644 index 0000000..4dcc4e1 --- /dev/null +++ b/src/main/kotlin/blog/MarkdownConverter.kt @@ -0,0 +1,36 @@ +/* + * Copyright 2002-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package blog + +import org.commonmark.ext.autolink.AutolinkExtension +import org.commonmark.parser.Parser +import org.commonmark.renderer.html.HtmlRenderer + +import org.springframework.stereotype.Service + +@Service +class MarkdownConverter : (String?) -> String { + + private val parser = Parser.builder().extensions(listOf(AutolinkExtension.create())).build() + private val renderer = HtmlRenderer.builder().build() + + override fun invoke(input: String?): String { + if (input == null || input == "") { + return "" + } + return renderer.render(parser.parse(input)) + } +} diff --git a/src/main/kotlin/blog/Model.kt b/src/main/kotlin/blog/Model.kt new file mode 100644 index 0000000..77d8195 --- /dev/null +++ b/src/main/kotlin/blog/Model.kt @@ -0,0 +1,20 @@ +package blog + +import java.time.LocalDateTime +import javax.persistence.* + +@Entity +data class Article( + val title: String, + val headline: String, + val content: String, + @ManyToOne @JoinColumn val author: User, + @Id @GeneratedValue val id: Long? = null, // At the end to make it optional + val addedAt: LocalDateTime = LocalDateTime.now()) + +@Entity +data class User( + @Id val login: String, + val firstname: String, + val lastname: String, + val description: String? = null) \ No newline at end of file diff --git a/src/main/kotlin/blog/Repositories.kt b/src/main/kotlin/blog/Repositories.kt new file mode 100644 index 0000000..fd34027 --- /dev/null +++ b/src/main/kotlin/blog/Repositories.kt @@ -0,0 +1,11 @@ +package blog + +import org.springframework.data.repository.CrudRepository + +// @Repository is not required +interface ArticleRepository : CrudRepository { + fun findAllByOrderByAddedAtDesc(): Iterable
+} + +// @Repository is not required +interface UserRepository : CrudRepository \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..9349931 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,3 @@ +blog.title=Blog +blog.banner.title=Warning +blog.banner.content=The blog will be down tomorrow. \ No newline at end of file diff --git a/src/main/resources/templates/article.mustache b/src/main/resources/templates/article.mustache new file mode 100644 index 0000000..57618e8 --- /dev/null +++ b/src/main/resources/templates/article.mustache @@ -0,0 +1,16 @@ +{{> header}} + +
+
+

{{article.title}}

+ +
+ +
+ {{article.headline}} + + {{article.content}} +
+
+ +{{> footer}} \ No newline at end of file diff --git a/src/main/resources/templates/blog.mustache b/src/main/resources/templates/blog.mustache new file mode 100644 index 0000000..9db0095 --- /dev/null +++ b/src/main/resources/templates/blog.mustache @@ -0,0 +1,29 @@ +{{> header}} + +
+ +{{> footer}} \ No newline at end of file diff --git a/src/main/resources/templates/footer.mustache b/src/main/resources/templates/footer.mustache new file mode 100644 index 0000000..308b1d0 --- /dev/null +++ b/src/main/resources/templates/footer.mustache @@ -0,0 +1,2 @@ + + diff --git a/src/main/resources/templates/header.mustache b/src/main/resources/templates/header.mustache new file mode 100644 index 0000000..a616a5a --- /dev/null +++ b/src/main/resources/templates/header.mustache @@ -0,0 +1,6 @@ + + + {{title}} + + +

{{title}}

diff --git a/src/test/kotlin/blog/BlogApplicationTests.kt b/src/test/kotlin/blog/BlogApplicationTests.kt new file mode 100644 index 0000000..c4861e5 --- /dev/null +++ b/src/test/kotlin/blog/BlogApplicationTests.kt @@ -0,0 +1,16 @@ +package blog + +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.test.context.junit.jupiter.SpringExtension + +@ExtendWith(SpringExtension::class) +@SpringBootTest +class BlogApplicationTests { + + @Test + fun contextLoads() { + } + +} diff --git a/src/test/kotlin/blog/HttpApiTests.kt b/src/test/kotlin/blog/HttpApiTests.kt new file mode 100644 index 0000000..7a651ab --- /dev/null +++ b/src/test/kotlin/blog/HttpApiTests.kt @@ -0,0 +1,59 @@ +package blog + +import com.nhaarman.mockito_kotlin.whenever +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest +import org.springframework.test.context.junit.jupiter.SpringExtension +import org.springframework.boot.test.mock.mockito.MockBean +import org.springframework.test.web.servlet.MockMvc +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get +import org.mockito.Mockito.any +import org.springframework.http.MediaType +import org.springframework.test.web.servlet.result.MockMvcResultMatchers.* + + +@ExtendWith(SpringExtension::class) +@WebMvcTest +// TODO Use constructor-based val property for @MockBean when supported, see issue spring-boot#13113 +class HttpApiTests(@Autowired val mockMvc: MockMvc) { + + @MockBean + private lateinit var userRepository: UserRepository + + @MockBean + private lateinit var articleRepository: ArticleRepository + + @MockBean + private lateinit var markdownConverter: MarkdownConverter + + @Test + fun `List articles`() { + val juergen = User("springjuergen", "Juergen", "Hoeller") + val spring5Article = Article("Spring Framework 5.0 goes GA", "Dear Spring community ...", "Lorem ipsum", juergen, 1) + val spring43Article = Article("Spring Framework 4.3 goes GA", "Dear Spring community ...", "Lorem ipsum", juergen, 2) + whenever(articleRepository.findAllByOrderByAddedAtDesc()).thenReturn(listOf(spring5Article, spring43Article)) + whenever(markdownConverter.invoke(any())).thenAnswer { it.arguments[0] } + mockMvc.perform(get("/api/article/").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)) + .andExpect(jsonPath("\$.[0].author.login").value(juergen.login)) + .andExpect(jsonPath("\$.[0].id").value(spring5Article.id!!)) + .andExpect(jsonPath("\$.[1].author.login").value(juergen.login)) + .andExpect(jsonPath("\$.[1].id").value(spring43Article.id!!)) + } + + @Test + fun `List users`() { + val juergen = User("springjuergen", "Juergen", "Hoeller") + val smaldlini = User("smaldini", "Stéphane", "Maldini") + whenever(userRepository.findAll()).thenReturn(listOf(juergen, smaldlini)) + mockMvc.perform(get("/api/user/").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)) + .andExpect(jsonPath("\$.[0].login").value(juergen.login)) + .andExpect(jsonPath("\$.[1].login").value(smaldlini.login)) + } + +} \ No newline at end of file diff --git a/src/test/kotlin/blog/IntegrationTests.kt b/src/test/kotlin/blog/IntegrationTests.kt new file mode 100644 index 0000000..3894233 --- /dev/null +++ b/src/test/kotlin/blog/IntegrationTests.kt @@ -0,0 +1,47 @@ +package blog + +import org.assertj.core.api.Assertions.* +import org.junit.jupiter.api.AfterAll +import org.junit.jupiter.api.BeforeAll +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.boot.test.web.client.TestRestTemplate +import org.springframework.boot.test.web.client.getForEntity +import org.springframework.boot.test.web.client.getForObject +import org.springframework.http.HttpStatus +import org.springframework.test.context.junit.jupiter.SpringExtension + +@ExtendWith(SpringExtension::class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +class IntegrationTests(@Autowired val restTemplate: TestRestTemplate) { + + @BeforeAll + fun setup() { + println(">> Setup") + } + + @Test + fun `Assert blog page title, content and status code`() { + println(">> Assert blog page title, content and status code") + val entity = restTemplate.getForEntity("/") + assertThat(entity.statusCode).isEqualTo(HttpStatus.OK) + assertThat(entity.body).contains("

Blog

", "Reactor") + } + + @Test + fun `Assert article page title, content and status code`() { + println(">> Assert article page title, content and status code") + val entity = restTemplate.getForEntity("/article/2") + assertThat(entity.statusCode).isEqualTo(HttpStatus.OK) + assertThat(entity.body).contains("https://projectreactor.io/") + + } + + @AfterAll + fun teardown() { + println(">> Tear down") + } + +} \ No newline at end of file diff --git a/src/test/kotlin/blog/RepositoriesTests.kt b/src/test/kotlin/blog/RepositoriesTests.kt new file mode 100644 index 0000000..0b0133f --- /dev/null +++ b/src/test/kotlin/blog/RepositoriesTests.kt @@ -0,0 +1,41 @@ +package blog + +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest +import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager +import org.springframework.test.context.junit.jupiter.SpringExtension + +@ExtendWith(SpringExtension::class) +@DataJpaTest +class RepositoriesTests(@Autowired val entityManager: TestEntityManager, + @Autowired val userRepository: UserRepository, + @Autowired val articleRepository: ArticleRepository) { + + @Test + fun `When findById then return Article`() { + val juergen = User("springjuergen", "Juergen", "Hoeller") + entityManager.persist(juergen) + val article = Article("Spring Framework 5.0 goes GA", "Dear Spring community ...", "Lorem ipsum", juergen) + entityManager.persist(article) + entityManager.flush() + + val found = articleRepository.findById(article.id!!) + + assertThat(found.get()).isEqualTo(article) + } + + @Test + fun `When findById then return User`() { + val juergen = User("springjuergen", "Juergen", "Hoeller") + entityManager.persist(juergen) + entityManager.flush() + + val found = userRepository.findById(juergen.login) + + assertThat(found.get()).isEqualTo(juergen) + } + +} \ No newline at end of file diff --git a/src/test/resources/junit-platform.properties b/src/test/resources/junit-platform.properties new file mode 100644 index 0000000..e6d55f8 --- /dev/null +++ b/src/test/resources/junit-platform.properties @@ -0,0 +1 @@ +junit.jupiter.testinstance.lifecycle.default = per_class \ No newline at end of file