From 54cd5e8c5c005d94e1d062e2f3a8a6d56ad1ddac Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Sat, 11 Nov 2023 11:59:54 +0900 Subject: [PATCH] =?UTF-8?q?test:=20WebFinger=E3=81=AE=E7=B5=B1=E5=90=88?= =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 2 + .../activitypub/webfinger/WebFingerTest.kt | 83 +++++++++++++++++++ .../kotlin/util/SpringApplicationTestBase.kt | 6 ++ src/intTest/kotlin/util/TestTransaction.kt | 9 ++ src/intTest/resources/application.yml | 39 +++++++++ src/intTest/resources/sql/test-user.sql | 9 ++ 6 files changed, 148 insertions(+) create mode 100644 src/intTest/kotlin/activitypub/webfinger/WebFingerTest.kt create mode 100644 src/intTest/kotlin/util/SpringApplicationTestBase.kt create mode 100644 src/intTest/kotlin/util/TestTransaction.kt create mode 100644 src/intTest/resources/application.yml create mode 100644 src/intTest/resources/sql/test-user.sql diff --git a/build.gradle.kts b/build.gradle.kts index aff08d05..7b52ac31 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -200,6 +200,8 @@ dependencies { implementation("org.drewcarlson:kjob-mongo:0.6.0") detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:1.23.1") + + intTestImplementation("org.springframework.boot:spring-boot-starter-test") } detekt { diff --git a/src/intTest/kotlin/activitypub/webfinger/WebFingerTest.kt b/src/intTest/kotlin/activitypub/webfinger/WebFingerTest.kt new file mode 100644 index 00000000..d0faaa7f --- /dev/null +++ b/src/intTest/kotlin/activitypub/webfinger/WebFingerTest.kt @@ -0,0 +1,83 @@ +package activitypub.webfinger + +import dev.usbharu.hideout.SpringApplication +import dev.usbharu.hideout.application.external.Transaction +import org.junit.jupiter.api.Test +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.boot.test.context.TestConfiguration +import org.springframework.context.annotation.Bean +import org.springframework.test.context.jdbc.Sql +import org.springframework.test.web.servlet.MockMvc +import org.springframework.test.web.servlet.get +import org.springframework.transaction.annotation.Transactional +import util.TestTransaction +import java.net.URL + +@SpringBootTest(classes = [SpringApplication::class]) +@AutoConfigureMockMvc +@Transactional +class WebFingerTest { + @Autowired + private lateinit var mockMvc: MockMvc + + @Test + @Sql("/sql/test-user.sql") + fun `webfinger 存在するユーザーを取得`() { + mockMvc + .get("/.well-known/webfinger?resource=acct:test-user@example.com") + .andExpect { status { isOk() } } + .andExpect { header { string("Content-Type", "application/json") } } + .andExpect { + jsonPath("\$.subject") { + value("acct:test-user@example.com") + } + } + .andExpect { + jsonPath("\$.links[0].rel") { + value("self") + } + } + .andExpect { + jsonPath("\$.links[0].href") { value("https://example.com/users/test-user") } + } + .andExpect { + jsonPath("\$.links[0].type") { + value("application/activity+json") + } + } + } + + @Test + fun `webfinger 存在しないユーザーに404`() { + mockMvc + .get("/.well-known/webfinger?resource=acct:test-user@example.com") + .andExpect { status { isNotFound() } } + } + + @Test + fun `webfinger 不正なリクエストは400`() { + mockMvc + .get("/.well-known/webfinger?res=acct:test") + .andExpect { status { isBadRequest() } } + } + + @Test + fun `webfinger acctのパースが出来なくても400`() { + mockMvc + .get("/.well-known/webfinger?resource=acct:@a@b@c@d") + .andExpect { status { isBadRequest() } } + } + + @TestConfiguration + class Configuration { + @Bean + fun url(): URL { + return URL("https://example.com") + } + + @Bean + fun testTransaction(): Transaction = TestTransaction + } +} diff --git a/src/intTest/kotlin/util/SpringApplicationTestBase.kt b/src/intTest/kotlin/util/SpringApplicationTestBase.kt new file mode 100644 index 00000000..f1f686b2 --- /dev/null +++ b/src/intTest/kotlin/util/SpringApplicationTestBase.kt @@ -0,0 +1,6 @@ +package util + +import org.springframework.boot.test.context.SpringBootTest + +@SpringBootTest +abstract class SpringApplicationTestBase diff --git a/src/intTest/kotlin/util/TestTransaction.kt b/src/intTest/kotlin/util/TestTransaction.kt new file mode 100644 index 00000000..2dc53d5e --- /dev/null +++ b/src/intTest/kotlin/util/TestTransaction.kt @@ -0,0 +1,9 @@ +package util + +import dev.usbharu.hideout.application.external.Transaction + +object TestTransaction : Transaction { + override suspend fun transaction(block: suspend () -> T): T = block() + + override suspend fun transaction(transactionLevel: Int, block: suspend () -> T): T = block() +} diff --git a/src/intTest/resources/application.yml b/src/intTest/resources/application.yml new file mode 100644 index 00000000..9760e828 --- /dev/null +++ b/src/intTest/resources/application.yml @@ -0,0 +1,39 @@ +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: + datasource: + driver-class-name: org.h2.Driver + url: "jdbc:h2:mem:test;MODE=POSTGRESQL;DB_CLOSE_DELAY=-1" + 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/intTest/resources/sql/test-user.sql b/src/intTest/resources/sql/test-user.sql new file mode 100644 index 00000000..8b6df0d4 --- /dev/null +++ b/src/intTest/resources/sql/test-user.sql @@ -0,0 +1,9 @@ +insert into "USERS" (ID, NAME, DOMAIN, SCREEN_NAME, DESCRIPTION, PASSWORD, INBOX, OUTBOX, URL, PUBLIC_KEY, PRIVATE_KEY, + CREATED_AT, KEY_ID, FOLLOWING, FOLLOWERS) +VALUES (1, 'test-user', 'example.com', 'Im test user.', 'THis account is test user.', + '5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8', 'https://example.com/users/test-user/inbox', + 'https://example.com/users/test-user/outbox', 'https://example.com/users/test-user', + '-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----', + '-----BEGIN PRIVATE KEY-----...-----END PRIVATE KEY-----', 12345678, + 'https://example.com/users/test-user#pubkey', 'https://example.com/users/test-user/following', + 'https://example.com/users/test-users/followers');