From 8e171e5d795fc2a14613c90ca1f27fe91b603973 Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Thu, 30 Nov 2023 23:01:18 +0900 Subject: [PATCH] =?UTF-8?q?test:=20e2e=E3=83=86=E3=82=B9=E3=83=88=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 39 +++++++++-- src/e2eTest/kotlin/oauth2/OAuth2LoginTest.kt | 69 ++++++++++++++++++++ src/e2eTest/resources/application.yml | 42 ++++++++++++ src/e2eTest/resources/logback.xml | 11 ++++ 4 files changed, 156 insertions(+), 5 deletions(-) create mode 100644 src/e2eTest/kotlin/oauth2/OAuth2LoginTest.kt create mode 100644 src/e2eTest/resources/application.yml create mode 100644 src/e2eTest/resources/logback.xml diff --git a/build.gradle.kts b/build.gradle.kts index 7a5f4242..002d9613 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,4 +1,3 @@ - import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.openapitools.generator.gradle.plugin.tasks.GenerateTask @@ -32,6 +31,10 @@ sourceSets { compileClasspath += sourceSets.main.get().output runtimeClasspath += sourceSets.main.get().output } + create("e2eTest") { + compileClasspath += sourceSets.main.get().output + runtimeClasspath += sourceSets.main.get().output + } } val intTestImplementation by configurations.getting { @@ -41,6 +44,14 @@ val intTestRuntimeOnly by configurations.getting { extendsFrom(configurations.runtimeOnly.get()) } +val e2eTestImplementation by configurations.getting { + extendsFrom(configurations.implementation.get()) +} + +val e2eTestRuntimeOnly by configurations.getting { + extendsFrom(configurations.runtimeOnly.get()) +} + val integrationTest = task("integrationTest") { description = "Runs integration tests." group = "verification" @@ -52,13 +63,24 @@ val integrationTest = task("integrationTest") { useJUnitPlatform() } -tasks.check { dependsOn(integrationTest) } +val e2eTest = task("e2eTest") { + description = "Runs e2e tests." + group = "verification" + + testClassesDirs = sourceSets["e2eTest"].output.classesDirs + classpath = sourceSets["e2eTest"].runtimeClasspath + shouldRunAfter("test") + + useJUnitPlatform() +} + +tasks.check { + dependsOn(integrationTest) + dependsOn(e2eTest) +} tasks.withType { useJUnitPlatform() - val cpus = Runtime.getRuntime().availableProcessors() -// maxParallelForks = max(1, cpus - 1) -// setForkEvery(4) doFirst { jvmArgs = arrayOf( "--add-opens", "java.base/java.lang=ALL-UNNAMED" @@ -207,6 +229,13 @@ dependencies { intTestImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4") intTestImplementation("org.mockito.kotlin:mockito-kotlin:4.1.0") + e2eTestImplementation("org.springframework.boot:spring-boot-starter-test") + e2eTestImplementation("org.springframework.security:spring-security-test") + e2eTestImplementation("org.springframework.boot:spring-boot-starter-webflux") + e2eTestImplementation("org.jsoup:jsoup:1.17.1") + + + } detekt { diff --git a/src/e2eTest/kotlin/oauth2/OAuth2LoginTest.kt b/src/e2eTest/kotlin/oauth2/OAuth2LoginTest.kt new file mode 100644 index 00000000..e3c29202 --- /dev/null +++ b/src/e2eTest/kotlin/oauth2/OAuth2LoginTest.kt @@ -0,0 +1,69 @@ +package oauth2 + +import dev.usbharu.hideout.SpringApplication +import org.jsoup.Jsoup +import org.junit.jupiter.api.MethodOrderer.OrderAnnotation +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.http.MediaType +import org.springframework.test.web.reactive.server.WebTestClient +import org.springframework.web.reactive.function.BodyInserters + +@SpringBootTest( + classes = [SpringApplication::class], + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, +) +@TestMethodOrder(OrderAnnotation::class) +class OAuth2LoginTest { + + @Autowired + private lateinit var webTestClient: WebTestClient + + @Test + @Order(2) + fun アカウント作成() { + val returnResult = webTestClient.get() + .uri("/auth/sign_up") + .exchange() + .expectStatus() + .isOk + .returnResult(String::class.java) + + val html = returnResult + .responseBody + .toStream() + .toList() + .toList() + .joinToString("") + + val session = returnResult.responseCookies["JSESSIONID"]?.first()?.value!! + + val attr = Jsoup.parse(html).selectXpath("//input[@name=\"_csrf\"]").attr("value") + + println("CSRF TOKEN = $attr") + + val csrfToken = attr + + webTestClient + .post() + .uri("/api/v1/accounts") + .contentType(MediaType.APPLICATION_FORM_URLENCODED) + .body( + BodyInserters.fromFormData("username", "oatuh-login-test") + .with("password", "very-secure-password").with("_csrf", csrfToken) + ) + .cookie("JSESSIONID", session) + .exchange() + .expectStatus().isFound + .expectCookie() + + } + +// @Test +// fun `OAuth2で権限read writeを持ったトークンでのログインができる`() { +//// webTestClient.post().uri("/api/v1/apps") +// } +} diff --git a/src/e2eTest/resources/application.yml b/src/e2eTest/resources/application.yml new file mode 100644 index 00000000..b40fcd91 --- /dev/null +++ b/src/e2eTest/resources/application.yml @@ -0,0 +1,42 @@ +hideout: + url: "https://localhost:8080" + use-mongodb: true + security: + jwt: + generate: true + key-id: a + private-key: "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC7VJTUt9Us8cKjMzEfYyjiWA4R4/M2bS1GB4t7NXp98C3SC6dVMvDuictGeurT8jNbvJZHtCSuYEvuNMoSfm76oqFvAp8Gy0iz5sxjZmSnXyCdPEovGhLa0VzMaQ8s+CLOyS56YyCFGeJZqgtzJ6GR3eqoYSW9b9UMvkBpZODSctWSNGj3P7jRFDO5VoTwCQAWbFnOjDfH5Ulgp2PKSQnSJP3AJLQNFNe7br1XbrhV//eO+t51mIpGSDCUv3E0DDFcWDTH9cXDTTlRZVEiR2BwpZOOkE/Z0/BVnhZYL71oZV34bKfWjQIt6V/isSMahdsAASACp4ZTGtwiVuNd9tybAgMBAAECggEBAKTmjaS6tkK8BlPXClTQ2vpz/N6uxDeS35mXpqasqskVlaAidgg/sWqpjXDbXr93otIMLlWsM+X0CqMDgSXKejLS2jx4GDjI1ZTXg++0AMJ8sJ74pWzVDOfmCEQ/7wXs3+cbnXhKriO8Z036q92Qc1+N87SI38nkGa0ABH9CN83HmQqt4fB7UdHzuIRe/me2PGhIq5ZBzj6h3BpoPGzEP+x3l9YmK8t/1cN0pqI+dQwYdgfGjackLu/2qH80MCF7IyQaseZUOJyKrCLtSD/Iixv/hzDEUPfOCjFDgTpzf3cwta8+oE4wHCo1iI1/4TlPkwmXx4qSXtmw4aQPz7IDQvECgYEA8KNThCO2gsC2I9PQDM/8Cw0O983WCDY+oi+7JPiNAJwv5DYBqEZB1QYdj06YD16XlC/HAZMsMku1na2TN0driwenQQWzoev3g2S7gRDoS/FCJSI3jJ+kjgtaA7Qmzlgk1TxODN+G1H91HW7t0l7VnL27IWyYo2qRRK3jzxqUiPUCgYEAx0oQs2reBQGMVZnApD1jeq7n4MvNLcPvt8b/eU9iUv6Y4Mj0Suo/AU8lYZXm8ubbqAlwz2VSVunD2tOplHyMUrtCtObAfVDUAhCndKaA9gApgfb3xw1IKbuQ1u4IF1FJl3VtumfQn//LiH1B3rXhcdyo3/vIttEk48RakUKClU8CgYEAzV7W3COOlDDcQd935DdtKBFRAPRPAlspQUnzMi5eSHMD/ISLDY5IiQHbIH83D4bvXq0X7qQoSBSNP7Dvv3HYuqMhf0DaegrlBuJllFVVq9qPVRnKxt1Il2HgxOBvbhOT+9in1BzA+YJ99UzC85O0Qz06A+CmtHEy4aZ2kj5hHjECgYEAmNS4+A8Fkss8Js1RieK2LniBxMgmYml3pfVLKGnzmng7H2+cwPLhPIzIuwytXywh2bzbsYEfYx3EoEVgMEpPhoarQnYPukrJO4gwE2o5Te6T5mJSZGlQJQj9q4ZB2Dfzet6INsK0oG8XVGXSpQvQh3RUYekCZQkBBFcpqWpbIEsCgYAnM3DQf3FJoSnXaMhrVBIovic5l0xFkEHskAjFTevO86Fsz1C2aSeRKSqGFoOQ0tmJzBEs1R6KqnHInicDTQrKhArgLXX4v3CddjfTRJkFWDbE/CkvKZNOrcf1nhaGCPspRJj2KUkj1Fhl9Cncdn/RsYEONbwQSjIfMPkvxF+8HQ==" + public-key: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu1SU1LfVLPHCozMxH2Mo4lgOEePzNm0tRgeLezV6ffAt0gunVTLw7onLRnrq0/IzW7yWR7QkrmBL7jTKEn5u+qKhbwKfBstIs+bMY2Zkp18gnTxKLxoS2tFczGkPLPgizskuemMghRniWaoLcyehkd3qqGElvW/VDL5AaWTg0nLVkjRo9z+40RQzuVaE8AkAFmxZzow3x+VJYKdjykkJ0iT9wCS0DRTXu269V264Vf/3jvredZiKRkgwlL9xNAwxXFg0x/XFw005UWVRIkdgcKWTjpBP2dPwVZ4WWC+9aGVd+Gyn1o0CLelf4rEjGoXbAAEgAqeGUxrcIlbjXfbcmwIDAQAB" + storage: + use-s3: true + endpoint: "http://localhost:8082/test-hideout" + public-url: "http://localhost:8082/test-hideout" + bucket: "test-hideout" + region: "auto" + access-key: "" + secret-key: "" + +spring: + flyway: + enabled: true + clean-disabled: false + datasource: + driver-class-name: org.h2.Driver + url: "jdbc:h2:mem:test;MODE=POSTGRESQL;DB_CLOSE_DELAY=-1;CASE_INSENSITIVE_IDENTIFIERS=true;TRACE_LEVEL_FILE=4;" + username: "" + password: + data: + mongodb: + auto-index-creation: true + host: localhost + port: 27017 + database: hideout + h2: + console: + enabled: true + +# exposed: +# generate-ddl: true +# excluded-packages: dev.usbharu.hideout.core.infrastructure.kjobexposed +server: + port: 8080 diff --git a/src/e2eTest/resources/logback.xml b/src/e2eTest/resources/logback.xml new file mode 100644 index 00000000..a8bb21c4 --- /dev/null +++ b/src/e2eTest/resources/logback.xml @@ -0,0 +1,11 @@ + + + + %d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%X{x-request-id}] %logger{36} - %msg%n + + + + + + +