test: メディア付き投稿とリプライの投稿のテストを追加

This commit is contained in:
usbharu 2023-11-13 15:04:11 +09:00
parent 31d61435dd
commit 875650c2c0
5 changed files with 78 additions and 6 deletions

View File

@ -17,6 +17,7 @@ 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 import util.WithHttpSignature
import util.WithMockHttpSignature
@SpringBootTest(classes = [SpringApplication::class]) @SpringBootTest(classes = [SpringApplication::class])
@AutoConfigureMockMvc @AutoConfigureMockMvc
@ -143,12 +144,38 @@ class NoteTest {
} }
@Test @Test
@Sql("/sql/note/リプライになっている投稿はinReplyToが存在する.sql")
@WithMockHttpSignature
fun リプライになっている投稿はinReplyToが存在する() { fun リプライになっている投稿はinReplyToが存在する() {
mockMvc
.get("/users/test-user10/posts/1241") {
accept(MediaType("application", "activity+json"))
}
.asyncDispatch()
.andDo { print() }
.andExpect { status { isOk() } }
.andExpect { content { contentType("application/activity+json") } }
.andExpect { jsonPath("\$.type") { value("Note") } }
.andExpect { jsonPath("\$.inReplyTo") { value("https://example.com/users/test-user10/posts/1240") } }
} }
@Test @Test
@Sql("/sql/note/メディア付き投稿はattachmentにDocumentとして画像が存在する.sql")
@WithMockHttpSignature
fun メディア付き投稿はattachmentにDocumentとして画像が存在する() { fun メディア付き投稿はattachmentにDocumentとして画像が存在する() {
mockMvc
.get("/users/test-user10/posts/1242") {
accept(MediaType("application", "activity+json"))
}
.asyncDispatch()
.andDo { print() }
.andExpect { status { isOk() } }
.andExpect { content { contentType("application/activity+json") } }
.andExpect { jsonPath("\$.type") { value("Note") } }
.andExpect { jsonPath("\$.attachment") { isArray() } }
.andExpect { jsonPath("\$.attachment[0].type") { value("Document") } }
.andExpect { jsonPath("\$.attachment[0].url") { value("https://example.com/media/test-media.png") } }
.andExpect { jsonPath("\$.attachment[1].type") { value("Document") } }
.andExpect { jsonPath("\$.attachment[1].url") { value("https://example.com/media/test-media2.png") } }
} }
} }

View File

@ -0,0 +1,22 @@
insert into "USERS" (ID, NAME, DOMAIN, SCREEN_NAME, DESCRIPTION, PASSWORD, INBOX, OUTBOX, URL, PUBLIC_KEY, PRIVATE_KEY,
CREATED_AT, KEY_ID, FOLLOWING, FOLLOWERS)
VALUES (11, 'test-user11', 'example.com', 'Im test-user11.', 'THis account is test-user11.',
'5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8',
'https://example.com/users/test-user11/inbox',
'https://example.com/users/test-user11/outbox', 'https://example.com/users/test-user11',
'-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----',
'-----BEGIN PRIVATE KEY-----...-----END PRIVATE KEY-----', 12345678,
'https://example.com/users/test-user11#pubkey', 'https://example.com/users/test-user11/following',
'https://example.com/users/test-user11/followers');
insert into POSTS (ID, "userId", OVERVIEW, TEXT, "createdAt", VISIBILITY, URL, "repostId", "replyId", SENSITIVE, AP_ID)
VALUES (1242, 11, null, 'test post', 12345680, 0, 'https://example.com/users/test-user11/posts/1242', null, null, false,
'https://example.com/users/test-user11/posts/1242');
insert into MEDIA (ID, NAME, URL, REMOTE_URL, THUMBNAIL_URL, TYPE, BLURHASH)
VALUES (1, 'test-media', 'https://example.com/media/test-media.png', null, null, 0, null),
(2, 'test-media2', 'https://example.com/media/test-media2.png', null, null, 0, null);
insert into POSTSMEDIA(POST_ID, MEDIA_ID)
VALUES (1242, 1),
(1242, 2);

View File

@ -0,0 +1,16 @@
insert into "USERS" (ID, NAME, DOMAIN, SCREEN_NAME, DESCRIPTION, PASSWORD, INBOX, OUTBOX, URL, PUBLIC_KEY, PRIVATE_KEY,
CREATED_AT, KEY_ID, FOLLOWING, FOLLOWERS)
VALUES (10, 'test-user10', 'example.com', 'Im test-user10.', 'THis account is test-user10.',
'5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8',
'https://example.com/users/test-user10/inbox',
'https://example.com/users/test-user10/outbox', 'https://example.com/users/test-user10',
'-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----',
'-----BEGIN PRIVATE KEY-----...-----END PRIVATE KEY-----', 12345678,
'https://example.com/users/test-user10#pubkey', 'https://example.com/users/test-user10/following',
'https://example.com/users/test-user10/followers');
insert into POSTS (ID, "userId", OVERVIEW, TEXT, "createdAt", VISIBILITY, URL, "repostId", "replyId", SENSITIVE, AP_ID)
VALUES (1240, 10, null, 'test post', 12345680, 0, 'https://example.com/users/test-user10/posts/1240', null, null, false,
'https://example.com/users/test-user10/posts/1240'),
(1241, 10, null, 'test post', 12345680, 0, 'https://example.com/users/test-user10/posts/1241', null, 1240, false,
'https://example.com/users/test-user10/posts/1241');

View File

@ -6,6 +6,7 @@ import dev.usbharu.hideout.application.external.Transaction
import dev.usbharu.hideout.core.domain.exception.FailedToGetResourcesException import dev.usbharu.hideout.core.domain.exception.FailedToGetResourcesException
import dev.usbharu.hideout.core.domain.model.post.Visibility import dev.usbharu.hideout.core.domain.model.post.Visibility
import dev.usbharu.hideout.core.query.FollowerQueryService import dev.usbharu.hideout.core.query.FollowerQueryService
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service import org.springframework.stereotype.Service
@Service @Service
@ -17,7 +18,8 @@ class NoteApApiServiceImpl(
override suspend fun getNote(postId: Long, userId: Long?): Note? = transaction.transaction { override suspend fun getNote(postId: Long, userId: Long?): Note? = transaction.transaction {
val findById = try { val findById = try {
noteQueryService.findById(postId) noteQueryService.findById(postId)
} catch (_: FailedToGetResourcesException) { } catch (e: FailedToGetResourcesException) {
logger.warn("Note not found.", e)
return@transaction null return@transaction null
} }
when (findById.second.visibility) { when (findById.second.visibility) {
@ -39,4 +41,8 @@ class NoteApApiServiceImpl(
Visibility.DIRECT -> return@transaction null Visibility.DIRECT -> return@transaction null
} }
} }
companion object {
private val logger = LoggerFactory.getLogger(NoteApApiServiceImpl::class.java)
}
} }

View File

@ -5,6 +5,7 @@ import dev.usbharu.hideout.application.service.id.IdGenerateService
import dev.usbharu.hideout.core.domain.exception.FailedToGetResourcesException import dev.usbharu.hideout.core.domain.exception.FailedToGetResourcesException
import dev.usbharu.hideout.core.domain.model.post.Post import dev.usbharu.hideout.core.domain.model.post.Post
import dev.usbharu.hideout.core.domain.model.post.PostRepository import dev.usbharu.hideout.core.domain.model.post.PostRepository
import dev.usbharu.hideout.util.singleOr
import org.jetbrains.exposed.sql.* import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
import org.springframework.stereotype.Repository import org.springframework.stereotype.Repository
@ -67,11 +68,11 @@ class PostRepositoryImpl(
} }
override suspend fun findById(id: Long): Post = override suspend fun findById(id: Long): Post =
Posts.innerJoin(PostsMedia, onColumn = { Posts.id }, otherColumn = { postId }) Posts.leftJoin(PostsMedia)
.select { Posts.id eq id } .select { Posts.id eq id }
.let(postQueryMapper::map) .let(postQueryMapper::map)
.singleOrNull() .singleOr { FailedToGetResourcesException("id: $id was not found.", it) }
?: throw FailedToGetResourcesException("id: $id was not found.")
override suspend fun delete(id: Long) { override suspend fun delete(id: Long) {
Posts.deleteWhere { Posts.id eq id } Posts.deleteWhere { Posts.id eq id }