From 1f4df77f98da9ff7899855af1799b8c2ff273e8c Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Sat, 29 Apr 2023 13:25:12 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20Accept=E3=83=98=E3=83=83=E3=83=80?= =?UTF-8?q?=E3=83=BC=E3=81=AE=E3=83=AD=E3=82=B0=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../routing/activitypub/UserRouting.kt | 7 +- .../routing/activitypub/UsersAPTest.kt | 87 ++++++++++++++++++- 2 files changed, 90 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/dev/usbharu/hideout/routing/activitypub/UserRouting.kt b/src/main/kotlin/dev/usbharu/hideout/routing/activitypub/UserRouting.kt index 6f5e8f2b..70201496 100644 --- a/src/main/kotlin/dev/usbharu/hideout/routing/activitypub/UserRouting.kt +++ b/src/main/kotlin/dev/usbharu/hideout/routing/activitypub/UserRouting.kt @@ -35,8 +35,11 @@ class ContentTypeRouteSelector(private vararg val contentType: ContentType) : Ro val requestContentType = ContentType.parse(context.call.request.accept() ?: return RouteSelectorEvaluation.FailedParameter) - context.call.application.log.debug("Content-Type: {}", contentType) - return if (contentType.any { contentType -> contentType.match(requestContentType) }) { + context.call.application.log.debug("Content-Type: {}", requestContentType) + return if (contentType.any { contentType -> + context.call.application.log.debug(contentType.toString()) + contentType.match(requestContentType) + }) { RouteSelectorEvaluation.Constant } else { RouteSelectorEvaluation.FailedParameter diff --git a/src/test/kotlin/dev/usbharu/hideout/routing/activitypub/UsersAPTest.kt b/src/test/kotlin/dev/usbharu/hideout/routing/activitypub/UsersAPTest.kt index d4db2cff..30a3e0bd 100644 --- a/src/test/kotlin/dev/usbharu/hideout/routing/activitypub/UsersAPTest.kt +++ b/src/test/kotlin/dev/usbharu/hideout/routing/activitypub/UsersAPTest.kt @@ -14,19 +14,21 @@ import dev.usbharu.hideout.plugins.configureSerialization import dev.usbharu.hideout.service.activitypub.ActivityPubService import dev.usbharu.hideout.service.activitypub.ActivityPubUserService import dev.usbharu.hideout.service.impl.IUserService -import dev.usbharu.hideout.service.impl.UserService import dev.usbharu.hideout.service.signature.HttpSignatureVerifyService import dev.usbharu.hideout.util.HttpUtil.Activity +import dev.usbharu.hideout.util.HttpUtil.JsonLd import io.ktor.client.request.* import io.ktor.client.statement.* import io.ktor.http.* import io.ktor.server.config.* import io.ktor.server.testing.* +import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import org.mockito.ArgumentMatchers.anyString import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock import kotlin.test.assertEquals +import kotlin.test.assertTrue class UsersAPTest { @@ -71,7 +73,13 @@ class UsersAPTest { application { configureSerialization() - configureRouting(httpSignatureVerifyService, activityPubService, userService, activityPubUserService,mock()) + configureRouting( + httpSignatureVerifyService, + activityPubService, + userService, + activityPubUserService, + mock() + ) } client.get("/users/test") { accept(ContentType.Application.Activity) @@ -89,4 +97,79 @@ class UsersAPTest { assertEquals(person, readValue) } } + + @Test() + @Disabled + fun `ユーザのURLにAcceptヘッダーをActivityとJson-LDにしてアクセスしたときPersonが返ってくる`() = testApplication { + environment { + config = ApplicationConfig("empty.conf") + } + val person = Person( + type = emptyList(), + name = "test", + id = "http://example.com/users/test", + preferredUsername = "test", + summary = "test user", + inbox = "http://example.com/users/test/inbox", + outbox = "http://example.com/users/test/outbox", + url = "http://example.com/users/test", + icon = Image( + type = emptyList(), + name = "http://example.com/users/test/icon.png", + mediaType = "image/png", + url = "http://example.com/users/test/icon.png" + ), + publicKey = Key( + type = emptyList(), + name = "Public Key", + id = "http://example.com/users/test#pubkey", + owner = "https://example.com/users/test", + publicKeyPem = "-----BEGIN PUBLIC KEY-----\n\n-----END PUBLIC KEY-----" + ) + ) + person.context = listOf("https://www.w3.org/ns/activitystreams") + + val httpSignatureVerifyService = mock {} + val activityPubService = mock {} + val userService = mock {} + + val activityPubUserService = mock { + onBlocking { getPersonByName(anyString()) } doReturn person + } + + application { + configureSerialization() + configureRouting( + httpSignatureVerifyService, + activityPubService, + userService, + activityPubUserService, + mock() + ) + } + client.get("/users/test") { + accept(ContentType.Application.JsonLd) + accept(ContentType.Application.Activity) + }.let { + val objectMapper = jacksonObjectMapper().enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY) + .setSerializationInclusion(JsonInclude.Include.NON_EMPTY) + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + objectMapper.configOverride(List::class.java).setSetterInfo( + JsonSetter.Value.forValueNulls( + Nulls.AS_EMPTY + ) + ) + val actual = it.bodyAsText() + val readValue = objectMapper.readValue(actual) + assertEquals(person, readValue) + } + } + + @Test + @Disabled + fun contentType_Test() { + val listOf = listOf(ContentType.Application.JsonLd, ContentType.Application.Activity) + assertTrue(listOf.any { contentType -> contentType.match("application/ld+json; profile=\"\\\"https://www.w3.org/ns/activitystreams\\\",application/activity+json\"") }) + assertTrue(ContentType.Application.JsonLd.match("application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"")) + } }