mirror of https://github.com/usbharu/Hideout.git
test: postServiceImplのテストを追加
This commit is contained in:
parent
9e7d833a3d
commit
c6cd6e82cf
|
@ -0,0 +1,144 @@
|
||||||
|
package dev.usbharu.hideout.core.service.post
|
||||||
|
|
||||||
|
import dev.usbharu.hideout.activitypub.service.activity.create.ApSendCreateService
|
||||||
|
import dev.usbharu.hideout.application.config.CharacterLimit
|
||||||
|
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.user.UserRepository
|
||||||
|
import dev.usbharu.hideout.core.query.PostQueryService
|
||||||
|
import dev.usbharu.hideout.core.service.timeline.TimelineService
|
||||||
|
import kotlinx.coroutines.test.runTest
|
||||||
|
import org.assertj.core.api.Assertions.assertThat
|
||||||
|
import org.jetbrains.exposed.exceptions.ExposedSQLException
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import org.junit.jupiter.api.extension.ExtendWith
|
||||||
|
import org.mockito.InjectMocks
|
||||||
|
import org.mockito.Mock
|
||||||
|
import org.mockito.Mockito
|
||||||
|
import org.mockito.Mockito.mockStatic
|
||||||
|
import org.mockito.Spy
|
||||||
|
import org.mockito.junit.jupiter.MockitoExtension
|
||||||
|
import org.mockito.kotlin.*
|
||||||
|
import org.springframework.dao.DuplicateKeyException
|
||||||
|
import utils.PostBuilder
|
||||||
|
import utils.UserBuilder
|
||||||
|
import java.time.Instant
|
||||||
|
|
||||||
|
@ExtendWith(MockitoExtension::class)
|
||||||
|
class PostServiceImplTest {
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private lateinit var postRepository: PostRepository
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private lateinit var userRepository: UserRepository
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private lateinit var timelineService: TimelineService
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private lateinit var postQueryService: PostQueryService
|
||||||
|
|
||||||
|
@Spy
|
||||||
|
private var postBuilder: Post.PostBuilder = Post.PostBuilder(CharacterLimit())
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private lateinit var apSendCreateService: ApSendCreateService
|
||||||
|
|
||||||
|
@InjectMocks
|
||||||
|
private lateinit var postServiceImpl: PostServiceImpl
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `createLocal 正常にpostを作成できる`() = runTest {
|
||||||
|
|
||||||
|
val now = Instant.now()
|
||||||
|
val post = PostBuilder.of(createdAt = now.toEpochMilli())
|
||||||
|
|
||||||
|
whenever(postRepository.save(eq(post))).doReturn(true)
|
||||||
|
whenever(postRepository.generateId()).doReturn(post.id)
|
||||||
|
whenever(userRepository.findById(eq(post.userId))).doReturn(UserBuilder.localUserOf(id = post.userId))
|
||||||
|
whenever(timelineService.publishTimeline(eq(post), eq(true))).doReturn(Unit)
|
||||||
|
|
||||||
|
mockStatic(Instant::class.java, Mockito.CALLS_REAL_METHODS).use {
|
||||||
|
|
||||||
|
it.`when`<Instant>(Instant::now).doReturn(now)
|
||||||
|
val createLocal = postServiceImpl.createLocal(
|
||||||
|
PostCreateDto(
|
||||||
|
post.text,
|
||||||
|
post.overview,
|
||||||
|
post.visibility,
|
||||||
|
post.repostId,
|
||||||
|
post.replyId,
|
||||||
|
post.userId,
|
||||||
|
post.mediaIds
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
assertThat(createLocal).isEqualTo(post)
|
||||||
|
}
|
||||||
|
|
||||||
|
verify(postRepository, times(1)).save(eq(post))
|
||||||
|
verify(timelineService, times(1)).publishTimeline(eq(post), eq(true))
|
||||||
|
verify(apSendCreateService, times(1)).createNote(eq(post))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `createRemote 正常にリモートのpostを作成できる`() = runTest {
|
||||||
|
val post = PostBuilder.of()
|
||||||
|
|
||||||
|
whenever(postRepository.save(eq(post))).doReturn(true)
|
||||||
|
whenever(timelineService.publishTimeline(eq(post), eq(false))).doReturn(Unit)
|
||||||
|
|
||||||
|
val createLocal = postServiceImpl.createRemote(post)
|
||||||
|
|
||||||
|
assertThat(createLocal).isEqualTo(post)
|
||||||
|
|
||||||
|
|
||||||
|
verify(postRepository, times(1)).save(eq(post))
|
||||||
|
verify(timelineService, times(1)).publishTimeline(eq(post), eq(false))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `createRemote 既に作成されていた場合はそのまま帰す`() = runTest {
|
||||||
|
val post = PostBuilder.of()
|
||||||
|
|
||||||
|
whenever(postRepository.save(eq(post))).doReturn(false)
|
||||||
|
|
||||||
|
val createLocal = postServiceImpl.createRemote(post)
|
||||||
|
|
||||||
|
assertThat(createLocal).isEqualTo(post)
|
||||||
|
|
||||||
|
verify(postRepository, times(1)).save(eq(post))
|
||||||
|
verify(timelineService, times(0)).publishTimeline(any(), any())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `createRemote 既に作成されていることを検知できず例外が発生した場合はDBから取得して返す`() = runTest {
|
||||||
|
val post = PostBuilder.of()
|
||||||
|
|
||||||
|
whenever(postRepository.save(eq(post))).doAnswer { throw ExposedSQLException(null, emptyList(), mock()) }
|
||||||
|
whenever(postQueryService.findByApId(eq(post.apId))).doReturn(post)
|
||||||
|
|
||||||
|
val createLocal = postServiceImpl.createRemote(post)
|
||||||
|
|
||||||
|
assertThat(createLocal).isEqualTo(post)
|
||||||
|
|
||||||
|
verify(postRepository, times(1)).save(eq(post))
|
||||||
|
verify(timelineService, times(0)).publishTimeline(any(), any())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `createRemote 既に作成されていることを検知出来ずタイムラインにpush出来なかった場合何もしない`() = runTest {
|
||||||
|
val post = PostBuilder.of()
|
||||||
|
|
||||||
|
whenever(postRepository.save(eq(post))).doReturn(true)
|
||||||
|
whenever(timelineService.publishTimeline(eq(post), eq(false))).doThrow(DuplicateKeyException::class)
|
||||||
|
|
||||||
|
val createLocal = postServiceImpl.createRemote(post)
|
||||||
|
|
||||||
|
assertThat(createLocal).isEqualTo(post)
|
||||||
|
|
||||||
|
verify(postRepository, times(1)).save(eq(post))
|
||||||
|
verify(timelineService, times(1)).publishTimeline(eq(post), eq(false))
|
||||||
|
}
|
||||||
|
}
|
|
@ -20,15 +20,15 @@ object UserBuilder {
|
||||||
screenName: String = name,
|
screenName: String = name,
|
||||||
description: String = "This user is test user.",
|
description: String = "This user is test user.",
|
||||||
password: String = "password-$id",
|
password: String = "password-$id",
|
||||||
inbox: String = "https://$domain/$id/inbox",
|
inbox: String = "https://$domain/users/$id/inbox",
|
||||||
outbox: String = "https://$domain/$id/outbox",
|
outbox: String = "https://$domain/users/$id/outbox",
|
||||||
url: String = "https://$domain/$id/",
|
url: String = "https://$domain/users/$id",
|
||||||
publicKey: String = "-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----",
|
publicKey: String = "-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----",
|
||||||
privateKey: String = "-----BEGIN PRIVATE KEY-----...-----END PRIVATE KEY-----",
|
privateKey: String = "-----BEGIN PRIVATE KEY-----...-----END PRIVATE KEY-----",
|
||||||
createdAt: Instant = Instant.now(),
|
createdAt: Instant = Instant.now(),
|
||||||
keyId: String = "https://$domain/$id#pubkey",
|
keyId: String = "https://$domain/users/$id#pubkey",
|
||||||
followers: String = "https://$domain/$id/followers",
|
followers: String = "https://$domain/users/$id/followers",
|
||||||
following: String = "https://$domain/$id/following"
|
following: String = "https://$domain/users/$id/following"
|
||||||
): User {
|
): User {
|
||||||
return userBuilder.of(
|
return userBuilder.of(
|
||||||
id = id,
|
id = id,
|
||||||
|
|
Loading…
Reference in New Issue