mirror of https://github.com/usbharu/Hideout.git
test: フォロワーがフォロワー限定投稿の取得のテストを追加
This commit is contained in:
parent
ee029fe31c
commit
5a7a4c0bb9
|
@ -16,6 +16,7 @@ import org.springframework.test.web.servlet.setup.DefaultMockMvcBuilder
|
||||||
import org.springframework.test.web.servlet.setup.MockMvcBuilders
|
import org.springframework.test.web.servlet.setup.MockMvcBuilders
|
||||||
import org.springframework.transaction.annotation.Transactional
|
import org.springframework.transaction.annotation.Transactional
|
||||||
import org.springframework.web.context.WebApplicationContext
|
import org.springframework.web.context.WebApplicationContext
|
||||||
|
import util.WithHttpSignature
|
||||||
|
|
||||||
@SpringBootTest(classes = [SpringApplication::class])
|
@SpringBootTest(classes = [SpringApplication::class])
|
||||||
@AutoConfigureMockMvc
|
@AutoConfigureMockMvc
|
||||||
|
@ -88,4 +89,66 @@ class NoteTest {
|
||||||
.asyncDispatch()
|
.asyncDispatch()
|
||||||
.andExpect { status { isNotFound() } }
|
.andExpect { status { isNotFound() } }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Sql("/sql/note/httpSignature認証でフォロワーがpublic投稿を取得できる.sql")
|
||||||
|
@WithHttpSignature(keyId = "https://follower.example.com/users/test-user5#pubkey")
|
||||||
|
fun HttpSignature認証でフォロワーがpublic投稿を取得できる() {
|
||||||
|
mockMvc
|
||||||
|
.get("/users/test-user4/posts/1237") {
|
||||||
|
accept(MediaType("application", "activity+json"))
|
||||||
|
}
|
||||||
|
.asyncDispatch()
|
||||||
|
.andDo { print() }
|
||||||
|
.andExpect { status { isOk() } }
|
||||||
|
.andExpect { content { contentType("application/activity+json") } }
|
||||||
|
.andExpect { jsonPath("\$.type") { value("Note") } }
|
||||||
|
.andExpect { jsonPath("\$.to") { value("https://www.w3.org/ns/activitystreams#Public") } }
|
||||||
|
.andExpect { jsonPath("\$.cc") { value("https://www.w3.org/ns/activitystreams#Public") } }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Sql("/sql/note/httpSignature認証でフォロワーがunlisted投稿を取得できる.sql")
|
||||||
|
@WithHttpSignature(keyId = "https://follower.example.com/users/test-user7#pubkey")
|
||||||
|
fun httpSignature認証でフォロワーがunlisted投稿を取得できる() {
|
||||||
|
mockMvc
|
||||||
|
.get("/users/test-user6/posts/1238") {
|
||||||
|
accept(MediaType("application", "activity+json"))
|
||||||
|
}
|
||||||
|
.asyncDispatch()
|
||||||
|
.andDo { print() }
|
||||||
|
.andExpect { status { isOk() } }
|
||||||
|
.andExpect { content { contentType("application/activity+json") } }
|
||||||
|
.andExpect { jsonPath("\$.type") { value("Note") } }
|
||||||
|
.andExpect { jsonPath("\$.to") { value("https://example.com/users/test-user6/followers") } }
|
||||||
|
.andExpect { jsonPath("\$.cc") { value("https://www.w3.org/ns/activitystreams#Public") } }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Sql("/sql/note/httpSignature認証でフォロワーがfollowers投稿を取得できる.sql")
|
||||||
|
@WithHttpSignature(keyId = "https://follower.example.com/users/test-user9#pubkey")
|
||||||
|
fun httpSignature認証でフォロワーがfollowers投稿を取得できる() {
|
||||||
|
mockMvc
|
||||||
|
.get("/users/test-user8/posts/1239") {
|
||||||
|
accept(MediaType("application", "activity+json"))
|
||||||
|
}
|
||||||
|
.asyncDispatch()
|
||||||
|
.andDo { print() }
|
||||||
|
.andExpect { status { isOk() } }
|
||||||
|
.andExpect { content { contentType("application/activity+json") } }
|
||||||
|
.andExpect { jsonPath("\$.type") { value("Note") } }
|
||||||
|
.andExpect { jsonPath("\$.to") { value("https://example.com/users/test-user8/followers") } }
|
||||||
|
.andExpect { jsonPath("\$.cc") { value("https://example.com/users/test-user8/followers") } }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun リプライになっている投稿はinReplyToが存在する() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun メディア付き投稿はattachmentにDocumentとして画像が存在する() {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,12 @@
|
||||||
package util
|
package util
|
||||||
|
|
||||||
import dev.usbharu.hideout.application.external.Transaction
|
import dev.usbharu.hideout.application.external.Transaction
|
||||||
import dev.usbharu.hideout.core.infrastructure.springframework.httpsignature.HttpSignatureUserDetailsService
|
import dev.usbharu.hideout.core.infrastructure.springframework.httpsignature.HttpSignatureUser
|
||||||
import dev.usbharu.hideout.core.query.UserQueryService
|
import dev.usbharu.hideout.core.query.UserQueryService
|
||||||
import dev.usbharu.httpsignature.common.HttpHeaders
|
import dev.usbharu.httpsignature.common.HttpHeaders
|
||||||
import dev.usbharu.httpsignature.common.HttpMethod
|
import dev.usbharu.httpsignature.common.HttpMethod
|
||||||
import dev.usbharu.httpsignature.common.HttpRequest
|
import dev.usbharu.httpsignature.common.HttpRequest
|
||||||
import dev.usbharu.httpsignature.sign.RsaSha256HttpSignatureSigner
|
import kotlinx.coroutines.runBlocking
|
||||||
import dev.usbharu.httpsignature.verify.DefaultSignatureHeaderParser
|
|
||||||
import dev.usbharu.httpsignature.verify.RsaSha256HttpSignatureVerifier
|
|
||||||
import org.springframework.security.core.context.SecurityContext
|
import org.springframework.security.core.context.SecurityContext
|
||||||
import org.springframework.security.core.context.SecurityContextHolder
|
import org.springframework.security.core.context.SecurityContextHolder
|
||||||
import org.springframework.security.test.context.support.WithSecurityContextFactory
|
import org.springframework.security.test.context.support.WithSecurityContextFactory
|
||||||
|
@ -16,32 +14,35 @@ import org.springframework.security.web.authentication.preauth.PreAuthenticatedA
|
||||||
import java.net.URL
|
import java.net.URL
|
||||||
|
|
||||||
class WithHttpSignatureSecurityContextFactory(
|
class WithHttpSignatureSecurityContextFactory(
|
||||||
userQueryService: UserQueryService,
|
private val userQueryService: UserQueryService,
|
||||||
transaction: Transaction
|
private val transaction: Transaction
|
||||||
) : WithSecurityContextFactory<WithHttpSignature> {
|
) : WithSecurityContextFactory<WithHttpSignature> {
|
||||||
|
|
||||||
private val securityContextStrategy = SecurityContextHolder.getContextHolderStrategy()
|
private val securityContextStrategy = SecurityContextHolder.getContextHolderStrategy()
|
||||||
|
|
||||||
private val httpSignatureUserDetailsService: HttpSignatureUserDetailsService = HttpSignatureUserDetailsService(
|
override fun createSecurityContext(annotation: WithHttpSignature): SecurityContext = runBlocking {
|
||||||
userQueryService,
|
|
||||||
RsaSha256HttpSignatureVerifier(DefaultSignatureHeaderParser(), RsaSha256HttpSignatureSigner()),
|
|
||||||
transaction
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
override fun createSecurityContext(annotation: WithHttpSignature): SecurityContext {
|
|
||||||
val preAuthenticatedAuthenticationToken = PreAuthenticatedAuthenticationToken(
|
val preAuthenticatedAuthenticationToken = PreAuthenticatedAuthenticationToken(
|
||||||
annotation.keyId, HttpRequest(
|
annotation.keyId, HttpRequest(
|
||||||
URL("https://example.com/inbox"),
|
URL("https://example.com/inbox"),
|
||||||
HttpHeaders(mapOf()), HttpMethod.GET
|
HttpHeaders(mapOf()), HttpMethod.GET
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
val httpSignatureUser = httpSignatureUserDetailsService.loadUserDetails(preAuthenticatedAuthenticationToken)
|
val httpSignatureUser = transaction.transaction {
|
||||||
|
val findByKeyId = userQueryService.findByKeyId(annotation.keyId)
|
||||||
|
HttpSignatureUser(
|
||||||
|
findByKeyId.name,
|
||||||
|
findByKeyId.domain,
|
||||||
|
findByKeyId.id,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
mutableListOf()
|
||||||
|
)
|
||||||
|
}
|
||||||
preAuthenticatedAuthenticationToken.details = httpSignatureUser
|
preAuthenticatedAuthenticationToken.details = httpSignatureUser
|
||||||
preAuthenticatedAuthenticationToken.isAuthenticated = true
|
preAuthenticatedAuthenticationToken.isAuthenticated = true
|
||||||
val emptyContext = securityContextStrategy.createEmptyContext()
|
val emptyContext = securityContextStrategy.createEmptyContext()
|
||||||
emptyContext.authentication = preAuthenticatedAuthenticationToken
|
emptyContext.authentication = preAuthenticatedAuthenticationToken
|
||||||
return emptyContext
|
return@runBlocking emptyContext
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
insert into "USERS" (ID, NAME, DOMAIN, SCREEN_NAME, DESCRIPTION, PASSWORD, INBOX, OUTBOX, URL, PUBLIC_KEY, PRIVATE_KEY,
|
||||||
|
CREATED_AT, KEY_ID, FOLLOWING, FOLLOWERS)
|
||||||
|
VALUES (8, 'test-user8', 'example.com', 'Im test-user8.', 'THis account is test-user8.',
|
||||||
|
'5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8',
|
||||||
|
'https://example.com/users/test-user8/inbox',
|
||||||
|
'https://example.com/users/test-user8/outbox', 'https://example.com/users/test-user8',
|
||||||
|
'-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----',
|
||||||
|
'-----BEGIN PRIVATE KEY-----...-----END PRIVATE KEY-----', 12345678,
|
||||||
|
'https://example.com/users/test-user8#pubkey', 'https://example.com/users/test-user8/following',
|
||||||
|
'https://example.com/users/test-user8/followers');
|
||||||
|
|
||||||
|
insert into "USERS" (ID, NAME, DOMAIN, SCREEN_NAME, DESCRIPTION, PASSWORD, INBOX, OUTBOX, URL, PUBLIC_KEY, PRIVATE_KEY,
|
||||||
|
CREATED_AT, KEY_ID, FOLLOWING, FOLLOWERS)
|
||||||
|
VALUES (9, 'test-user9', 'follower.example.com', 'Im test-user9.', 'THis account is test-user9.',
|
||||||
|
null,
|
||||||
|
'https://follower.example.com/users/test-user9/inbox',
|
||||||
|
'https://follower.example.com/users/test-user9/outbox', 'https://follower.example.com/users/test-user9',
|
||||||
|
'-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----',
|
||||||
|
null, 12345678,
|
||||||
|
'https://follower.example.com/users/test-user9#pubkey',
|
||||||
|
'https://follower.example.com/users/test-user9/following',
|
||||||
|
'https://follower.example.com/users/test-user9/followers');
|
||||||
|
|
||||||
|
insert into USERS_FOLLOWERS (USER_ID, FOLLOWER_ID)
|
||||||
|
VALUES (8, 9);
|
||||||
|
|
||||||
|
insert into POSTS (ID, "userId", OVERVIEW, TEXT, "createdAt", VISIBILITY, URL, "repostId", "replyId", SENSITIVE, AP_ID)
|
||||||
|
VALUES (1239, 8, null, 'test post', 12345680, 2, 'https://example.com/users/test-user8/posts/1239', null, null, false,
|
||||||
|
'https://example.com/users/test-user8/posts/1239');
|
|
@ -0,0 +1,29 @@
|
||||||
|
insert into "USERS" (ID, NAME, DOMAIN, SCREEN_NAME, DESCRIPTION, PASSWORD, INBOX, OUTBOX, URL, PUBLIC_KEY, PRIVATE_KEY,
|
||||||
|
CREATED_AT, KEY_ID, FOLLOWING, FOLLOWERS)
|
||||||
|
VALUES (4, 'test-user4', 'example.com', 'Im test user4.', 'THis account is test user4.',
|
||||||
|
'5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8',
|
||||||
|
'https://example.com/users/test-user4/inbox',
|
||||||
|
'https://example.com/users/test-user4/outbox', 'https://example.com/users/test-user4',
|
||||||
|
'-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----',
|
||||||
|
'-----BEGIN PRIVATE KEY-----...-----END PRIVATE KEY-----', 12345678,
|
||||||
|
'https://example.com/users/test-user4#pubkey', 'https://example.com/users/test-user4/following',
|
||||||
|
'https://example.com/users/test-user4/followers');
|
||||||
|
|
||||||
|
insert into "USERS" (ID, NAME, DOMAIN, SCREEN_NAME, DESCRIPTION, PASSWORD, INBOX, OUTBOX, URL, PUBLIC_KEY, PRIVATE_KEY,
|
||||||
|
CREATED_AT, KEY_ID, FOLLOWING, FOLLOWERS)
|
||||||
|
VALUES (5, 'test-user5', 'follower.example.com', 'Im test user5.', 'THis account is test user5.',
|
||||||
|
null,
|
||||||
|
'https://follower.example.com/users/test-user5/inbox',
|
||||||
|
'https://follower.example.com/users/test-user5/outbox', 'https://follower.example.com/users/test-user5',
|
||||||
|
'-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----',
|
||||||
|
null, 12345678,
|
||||||
|
'https://follower.example.com/users/test-user5#pubkey',
|
||||||
|
'https://follower.example.com/users/test-user5/following',
|
||||||
|
'https://follower.example.com/users/test-user5/followers');
|
||||||
|
|
||||||
|
insert into USERS_FOLLOWERS (USER_ID, FOLLOWER_ID)
|
||||||
|
VALUES (4, 5);
|
||||||
|
|
||||||
|
insert into POSTS (ID, "userId", OVERVIEW, TEXT, "createdAt", VISIBILITY, URL, "repostId", "replyId", SENSITIVE, AP_ID)
|
||||||
|
VALUES (1237, 4, null, 'test post', 12345680, 0, 'https://example.com/users/test-user4/posts/1237', null, null, false,
|
||||||
|
'https://example.com/users/test-user4/posts/1237');
|
|
@ -0,0 +1,29 @@
|
||||||
|
insert into "USERS" (ID, NAME, DOMAIN, SCREEN_NAME, DESCRIPTION, PASSWORD, INBOX, OUTBOX, URL, PUBLIC_KEY, PRIVATE_KEY,
|
||||||
|
CREATED_AT, KEY_ID, FOLLOWING, FOLLOWERS)
|
||||||
|
VALUES (6, 'test-user6', 'example.com', 'Im test-user6.', 'THis account is test-user6.',
|
||||||
|
'5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8',
|
||||||
|
'https://example.com/users/test-user6/inbox',
|
||||||
|
'https://example.com/users/test-user6/outbox', 'https://example.com/users/test-user6',
|
||||||
|
'-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----',
|
||||||
|
'-----BEGIN PRIVATE KEY-----...-----END PRIVATE KEY-----', 12345678,
|
||||||
|
'https://example.com/users/test-user6#pubkey', 'https://example.com/users/test-user6/following',
|
||||||
|
'https://example.com/users/test-user6/followers');
|
||||||
|
|
||||||
|
insert into "USERS" (ID, NAME, DOMAIN, SCREEN_NAME, DESCRIPTION, PASSWORD, INBOX, OUTBOX, URL, PUBLIC_KEY, PRIVATE_KEY,
|
||||||
|
CREATED_AT, KEY_ID, FOLLOWING, FOLLOWERS)
|
||||||
|
VALUES (7, 'test-user7', 'follower.example.com', 'Im test-user7.', 'THis account is test-user7.',
|
||||||
|
null,
|
||||||
|
'https://follower.example.com/users/test-user7/inbox',
|
||||||
|
'https://follower.example.com/users/test-user7/outbox', 'https://follower.example.com/users/test-user7',
|
||||||
|
'-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----',
|
||||||
|
null, 12345678,
|
||||||
|
'https://follower.example.com/users/test-user7#pubkey',
|
||||||
|
'https://follower.example.com/users/test-user7/following',
|
||||||
|
'https://follower.example.com/users/test-user7/followers');
|
||||||
|
|
||||||
|
insert into USERS_FOLLOWERS (USER_ID, FOLLOWER_ID)
|
||||||
|
VALUES (6, 7);
|
||||||
|
|
||||||
|
insert into POSTS (ID, "userId", OVERVIEW, TEXT, "createdAt", VISIBILITY, URL, "repostId", "replyId", SENSITIVE, AP_ID)
|
||||||
|
VALUES (1238, 6, null, 'test post', 12345680, 1, 'https://example.com/users/test-user6/posts/1238', null, null, false,
|
||||||
|
'https://example.com/users/test-user6/posts/1238');
|
Loading…
Reference in New Issue