test: ExposedPostRepositoryのテストを追加

This commit is contained in:
usbharu 2024-09-11 09:44:20 +09:00
parent d9297b0992
commit 90a815cf5d
Signed by: usbharu
GPG Key ID: 6556747BF94EEBC8
3 changed files with 590 additions and 19 deletions

View File

@ -163,6 +163,8 @@ class ExposedPostRepository(
override suspend fun findById(id: PostId): Post? = query { override suspend fun findById(id: PostId): Post? = query {
Posts Posts
.leftJoin(PostsMedia) .leftJoin(PostsMedia)
.leftJoin(PostsEmojis)
.leftJoin(PostsVisibleActors)
.selectAll() .selectAll()
.where { .where {
Posts.id eq id.id Posts.id eq id.id
@ -174,6 +176,9 @@ class ExposedPostRepository(
override suspend fun findAllById(ids: List<PostId>): List<Post> { override suspend fun findAllById(ids: List<PostId>): List<Post> {
return query { return query {
Posts Posts
.leftJoin(PostsMedia)
.leftJoin(PostsEmojis)
.leftJoin(PostsVisibleActors)
.selectAll() .selectAll()
.where { .where {
Posts.id inList ids.map { it.id } Posts.id inList ids.map { it.id }
@ -182,21 +187,48 @@ class ExposedPostRepository(
} }
} }
override suspend fun findByActorId(id: ActorId, page: Page?): PaginationList<Post, PostId> = PaginationList( override suspend fun findByActorId(id: ActorId, page: Page?): PaginationList<Post, PostId> {
query { val postList = query {
Posts val query = Posts
.leftJoin(PostsMedia)
.leftJoin(PostsEmojis)
.leftJoin(PostsVisibleActors)
.selectAll() .selectAll()
.where { .where {
actorId eq actorId actorId eq id.id
} }
.let(postQueryMapper::map)
}, page(page, query)
page?.limit?.let { query.limit(it) }
query.let(postQueryMapper::map)
}
val posts = if (page?.minId != null) {
postList.reversed()
} else {
postList
}
return PaginationList(
posts,
null, null,
null null
) )
}
override suspend fun delete(post: Post) { override suspend fun delete(post: Post) {
query { query {
PostsMedia.deleteWhere {
postId eq post.id.id
}
PostsEmojis.deleteWhere {
postId eq post.id.id
}
PostsVisibleActors.deleteWhere {
postId eq post.id.id
}
Posts.deleteWhere { Posts.deleteWhere {
id eq post.id.id id eq post.id.id
} }
@ -213,20 +245,15 @@ class ExposedPostRepository(
): PaginationList<Post, PostId> { ): PaginationList<Post, PostId> {
val postList = query { val postList = query {
val query = Posts val query = Posts
.leftJoin(PostsMedia)
.leftJoin(PostsEmojis)
.leftJoin(PostsVisibleActors)
.selectAll() .selectAll()
.where { .where {
Posts.actorId eq actorId.id and (visibility inList visibilityList.map { it.name }) Posts.actorId eq actorId.id and (visibility inList visibilityList.map { it.name })
} }
if (of?.minId != null) { page(of, query)
query.orderBy(Posts.createdAt, SortOrder.ASC)
of.minId?.let { query.andWhere { Posts.id greater it } }
of.maxId?.let { query.andWhere { Posts.id less it } }
} else {
query.orderBy(Posts.createdAt, SortOrder.DESC)
of?.sinceId?.let { query.andWhere { Posts.id greater it } }
of?.maxId?.let { query.andWhere { Posts.id less it } }
}
of?.limit?.let { query.limit(it) } of?.limit?.let { query.limit(it) }
@ -246,6 +273,21 @@ class ExposedPostRepository(
) )
} }
private fun page(
page: Page?,
query: Query
) {
if (page?.minId != null) {
query.orderBy(createdAt, SortOrder.ASC)
page.minId?.let { query.andWhere { id greater it } }
page.maxId?.let { query.andWhere { id less it } }
} else {
query.orderBy(createdAt, SortOrder.DESC)
page?.sinceId?.let { query.andWhere { id greater it } }
page?.maxId?.let { query.andWhere { id less it } }
}
}
companion object { companion object {
private val logger = LoggerFactory.getLogger(ExposedPostRepository::class.java) private val logger = LoggerFactory.getLogger(ExposedPostRepository::class.java)
} }

View File

@ -1,6 +1,7 @@
package dev.usbharu.hideout.core.domain.model.post package dev.usbharu.hideout.core.domain.model.post
import dev.usbharu.hideout.core.domain.model.actor.ActorId import dev.usbharu.hideout.core.domain.model.actor.ActorId
import dev.usbharu.hideout.core.domain.model.emoji.CustomEmojiId
import dev.usbharu.hideout.core.domain.model.instance.InstanceId import dev.usbharu.hideout.core.domain.model.instance.InstanceId
import dev.usbharu.hideout.core.domain.model.media.MediaId import dev.usbharu.hideout.core.domain.model.media.MediaId
import dev.usbharu.hideout.core.infrastructure.other.TwitterSnowflakeIdGenerateService import dev.usbharu.hideout.core.infrastructure.other.TwitterSnowflakeIdGenerateService
@ -29,13 +30,14 @@ object TestPostFactory {
visibleActors: List<Long> = emptyList(), visibleActors: List<Long> = emptyList(),
hide: Boolean = false, hide: Boolean = false,
moveTo: Long? = null, moveTo: Long? = null,
emojiIds: List<Long> = emptyList(),
): Post { ): Post {
return Post( return Post(
PostId(id), PostId(id),
ActorId(actorId), ActorId(actorId),
instanceId = InstanceId(instanceId), instanceId = InstanceId(instanceId),
overview = overview?.let { PostOverview(it) }, overview = overview?.let { PostOverview(it) },
content = PostContent(content, content, emptyList()), content = PostContent(content, content, emojiIds.map { CustomEmojiId(it) }),
createdAt = createdAt, createdAt = createdAt,
visibility = visibility, visibility = visibility,
url = url, url = url,

View File

@ -0,0 +1,527 @@
package dev.usbharu.hideout.core.infrastructure.exposedrepository
import com.ninja_squad.dbsetup_kotlin.dbSetup
import dev.usbharu.hideout.core.domain.model.actor.ActorId
import dev.usbharu.hideout.core.domain.model.emoji.CustomEmojiId
import dev.usbharu.hideout.core.domain.model.instance.InstanceId
import dev.usbharu.hideout.core.domain.model.media.MediaId
import dev.usbharu.hideout.core.domain.model.post.*
import dev.usbharu.hideout.core.domain.shared.domainevent.DomainEventPublisher
import dev.usbharu.hideout.core.infrastructure.exposed.PostQueryMapper
import dev.usbharu.hideout.core.infrastructure.exposed.PostResultRowMapper
import kotlinx.coroutines.test.runTest
import org.assertj.core.api.Assertions.assertThat
import org.assertj.db.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.mockito.InjectMocks
import org.mockito.Mock
import org.mockito.Spy
import org.mockito.junit.jupiter.MockitoExtension
import utils.*
import java.net.URI
import java.sql.Timestamp
import java.time.Instant
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
import kotlin.test.assertNull
@ExtendWith(MockitoExtension::class)
class ExposedPostRepositoryTest : AbstractRepositoryTest(Posts) {
@InjectMocks
lateinit var repository: ExposedPostRepository
@Mock
lateinit var domainEventPublisher: DomainEventPublisher
@Spy
val postQueryMapper = PostQueryMapper(PostResultRowMapper())
@Test
fun save_idが同じレコードがない場合はinsert() = runTest {
dbSetup(to = dataSource) {
execute(disableReferenceIntegrityConstraints)
insertInto("public.actors") {
columns(Actors.columns)
values(
1,
"b",
"test-hideout-dev.usbharu.dev",
"b",
"",
"https://test-hideout-dev.usbharu.dev/users/b/inbox",
"https://test-hideout-dev.usbharu.dev/users/b/outbox",
"https://test-hideout-dev.usbharu.dev/users/b",
"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyuMjzmQBsSxzK6NkOpZh\nWuohaUbzCY7AafXt+3+tiL6LulYNg/YRIqKc7Q/vTJE6CHrqo7RA/OqYrSMxF/LC\nf8aX5aHwJE1A2gSgCcs1IL5GJaYRlp4NcuazpBC9NO4xIrvH//jcVnZGXGWsCbls\nHXZGZdurWOF0Bl3mYN8CdupVumrGuOPs+wbI/Gh+OHw611TcXMyAwFwU2UjvPEgk\nEACW9OvJaq1K40jVCAa3b1nXt53vlXXZEUlL78L0C9xuFbJG0K/GKMBN44GyftJO\nhA95Rf1Nhd0vKDLBiRocGcARmBo9PaSCR5651gJEk5/wfLUnNAf0xj3R8LBoOhnT\nCQIDAQAB\n-----END PUBLIC KEY-----",
"-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDK4yPOZAGxLHMr\no2Q6lmFa6iFpRvMJjsBp9e37f62Ivou6Vg2D9hEiopztD+9MkToIeuqjtED86pit\nIzEX8sJ/xpflofAkTUDaBKAJyzUgvkYlphGWng1y5rOkEL007jEiu8f/+NxWdkZc\nZawJuWwddkZl26tY4XQGXeZg3wJ26lW6asa44+z7Bsj8aH44fDrXVNxczIDAXBTZ\nSO88SCQQAJb068lqrUrjSNUIBrdvWde3ne+VddkRSUvvwvQL3G4VskbQr8YowE3j\ngbJ+0k6ED3lF/U2F3S8oMsGJGhwZwBGYGj09pIJHnrnWAkSTn/B8tSc0B/TGPdHw\nsGg6GdMJAgMBAAECggEAHkEhLEb70kdOGgJLUR9D/5zYBE0eXdz/MsMyd1AH+Shs\n9AmetKsYzWDmuhp9Cp5swyn328Hmn7B+DvInVn+5YvjNhY07SbaJcVls4g5UQFXk\nu6WC4ZfKap7IyAeaUg54858r8677xcWXuByN5dn+1iU2hJGYK3Cx7rx0PRrUURYG\n2BRaEEwkcPNm9u679OOTyvTmA3NhewUuDaTMkZnnAml87uYYnmFKjQcR+S2UqOm6\nvBZ/devG4TfPBeKEAya/ba8JJ8frGOtjmR9EIliTQoxI2izeAfoGs1OsCSpuPy6s\nV5f0X3HYM7CA+Fpkt2pnixuwg96LaVr4OpVxujhNlwKBgQD1827VuKFGrneNO+c+\n4EIvh+vLh462bJiaVsMHfRhNZF1/5i8gfNJ16ST60hJo11E4riHPzi3q6GWuxOYl\nCkVKvhJ2g3mgnhoehcgnT7UBkasaC7JYd+LsFDnWOTVSJOy2OqfLdLDGAuSTN3kO\nBF4p0ZqQ/AouFNin57WNRGVZ7wKBgQDTLUZtfTkOU3G1nIMTRKmZjqdER5glzHCm\n9o/1ZsQktL+nzSXqYeoWh9fr7fkmC0k/07+SHzzfWvOhWWWlRenUVL5mj7FRq+L9\n9kDjChLR3Jr4L6Sj1iaQ+0uqDSQNYSYO9ctMjAVjFiNhiAd+S6B451Q1VbDKTCHt\nkRW9omz6hwKBgBFTsgY6eJorJl77zmG+mMsSb0kqZqJxahrNa/X2GSUyoeelxsIq\nKQWHhERrUkKykJVGpzkllFSNRMSYOIJ5g8ItO82/m2z2Vm66DAzA78aJhZ1TH6Bd\n6c2p6x0tcJU15rs7zKBnuyBoCcRZTxzur9eQXaxDJVBzxYOmrkKig+VfAoGBAMCP\n2Fiehxh5HobsYNmBEuXjHsM0RZiyA0c8LakoPFL8PodUme5PupUw6cNJDJeUUwbQ\nny8vLOK+nMnUKsu6JK5pV/VNsfM3OZU6p5Bf7ylOcEE/sHF1JVWu0CAQO3+3xmx9\n1RPH2mGwHjMhRzPy4jFdP3wi10KgiY+HbLuvEJChAoGAYCsh3UhtTzGUOlPBkmLL\n17bD0wN4J/fOv8BoXPZ8H2CdqVgWy0s+s+QaPqRxNcA6YyGymBqrmQAn1Uii25r9\nKAwVAjg3S2KDEMSI2RbMMmQJSZ1u0GkxqOUC/MMeZqBYTYxVeqcQPoqJZ0Nk7IOA\nZPFif8bVfcZqeimxrFaV6YI=\n-----END PRIVATE KEY-----",
"2024-09-09 17:12:03.941339",
"https://test-hideout-dev.usbharu.dev/users/b#main-key",
"https://test-hideout-dev.usbharu.dev/users/b/following",
"https://test-hideout-dev.usbharu.dev/users/b/followers",
1,
false,
0,
0,
0,
null,
"2024-09-09 17:12:03.941339",
false,
null,
"",
false,
null,
null
)
values(
2,
"a",
"test-hideout-dev.usbharu.dev",
"a",
"",
"https://test-hideout-dev.usbharu.dev/users/a/inbox",
"https://test-hideout-dev.usbharu.dev/users/a/outbox",
"https://test-hideout-dev.usbharu.dev/users/a",
"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyuMjzmQBsSxzK6NkOpZh\nWuohaUbzCY7AafXt+3+tiL6LulYNg/YRIqKc7Q/vTJE6CHrqo7RA/OqYrSMxF/LC\nf8aX5aHwJE1A2gSgCcs1IL5GJaYRlp4NcuazpBC9NO4xIrvH//jcVnZGXGWsCbls\nHXZGZdurWOF0Bl3mYN8CdupVumrGuOPs+wbI/Gh+OHw611TcXMyAwFwU2UjvPEgk\nEACW9OvJaq1K40jVCAa3b1nXt53vlXXZEUlL78L0C9xuFbJG0K/GKMBN44GyftJO\nhA95Rf1Nhd0vKDLBiRocGcARmBo9PaSCR5651gJEk5/wfLUnNAf0xj3R8LBoOhnT\nCQIDAQAB\n-----END PUBLIC KEY-----",
"-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDK4yPOZAGxLHMr\no2Q6lmFa6iFpRvMJjsBp9e37f62Ivou6Vg2D9hEiopztD+9MkToIeuqjtED86pit\nIzEX8sJ/xpflofAkTUDaBKAJyzUgvkYlphGWng1y5rOkEL007jEiu8f/+NxWdkZc\nZawJuWwddkZl26tY4XQGXeZg3wJ26lW6asa44+z7Bsj8aH44fDrXVNxczIDAXBTZ\nSO88SCQQAJb068lqrUrjSNUIBrdvWde3ne+VddkRSUvvwvQL3G4VskbQr8YowE3j\ngbJ+0k6ED3lF/U2F3S8oMsGJGhwZwBGYGj09pIJHnrnWAkSTn/B8tSc0B/TGPdHw\nsGg6GdMJAgMBAAECggEAHkEhLEb70kdOGgJLUR9D/5zYBE0eXdz/MsMyd1AH+Shs\n9AmetKsYzWDmuhp9Cp5swyn328Hmn7B+DvInVn+5YvjNhY07SbaJcVls4g5UQFXk\nu6WC4ZfKap7IyAeaUg54858r8677xcWXuByN5dn+1iU2hJGYK3Cx7rx0PRrUURYG\n2BRaEEwkcPNm9u679OOTyvTmA3NhewUuDaTMkZnnAml87uYYnmFKjQcR+S2UqOm6\nvBZ/devG4TfPBeKEAya/ba8JJ8frGOtjmR9EIliTQoxI2izeAfoGs1OsCSpuPy6s\nV5f0X3HYM7CA+Fpkt2pnixuwg96LaVr4OpVxujhNlwKBgQD1827VuKFGrneNO+c+\n4EIvh+vLh462bJiaVsMHfRhNZF1/5i8gfNJ16ST60hJo11E4riHPzi3q6GWuxOYl\nCkVKvhJ2g3mgnhoehcgnT7UBkasaC7JYd+LsFDnWOTVSJOy2OqfLdLDGAuSTN3kO\nBF4p0ZqQ/AouFNin57WNRGVZ7wKBgQDTLUZtfTkOU3G1nIMTRKmZjqdER5glzHCm\n9o/1ZsQktL+nzSXqYeoWh9fr7fkmC0k/07+SHzzfWvOhWWWlRenUVL5mj7FRq+L9\n9kDjChLR3Jr4L6Sj1iaQ+0uqDSQNYSYO9ctMjAVjFiNhiAd+S6B451Q1VbDKTCHt\nkRW9omz6hwKBgBFTsgY6eJorJl77zmG+mMsSb0kqZqJxahrNa/X2GSUyoeelxsIq\nKQWHhERrUkKykJVGpzkllFSNRMSYOIJ5g8ItO82/m2z2Vm66DAzA78aJhZ1TH6Bd\n6c2p6x0tcJU15rs7zKBnuyBoCcRZTxzur9eQXaxDJVBzxYOmrkKig+VfAoGBAMCP\n2Fiehxh5HobsYNmBEuXjHsM0RZiyA0c8LakoPFL8PodUme5PupUw6cNJDJeUUwbQ\nny8vLOK+nMnUKsu6JK5pV/VNsfM3OZU6p5Bf7ylOcEE/sHF1JVWu0CAQO3+3xmx9\n1RPH2mGwHjMhRzPy4jFdP3wi10KgiY+HbLuvEJChAoGAYCsh3UhtTzGUOlPBkmLL\n17bD0wN4J/fOv8BoXPZ8H2CdqVgWy0s+s+QaPqRxNcA6YyGymBqrmQAn1Uii25r9\nKAwVAjg3S2KDEMSI2RbMMmQJSZ1u0GkxqOUC/MMeZqBYTYxVeqcQPoqJZ0Nk7IOA\nZPFif8bVfcZqeimxrFaV6YI=\n-----END PRIVATE KEY-----",
"2024-09-09 17:12:03.941339",
"https://test-hideout-dev.usbharu.dev/users/a#main-key",
"https://test-hideout-dev.usbharu.dev/users/a/following",
"https://test-hideout-dev.usbharu.dev/users/a/followers",
1,
false,
0,
0,
0,
null,
"2024-09-09 17:12:03.941339",
false,
null,
"",
false,
null,
null
)
}
insertInto(Instance.tableName) {
columns(Instance.columns)
values(
1,
"system",
"",
"https://example.com",
"",
null,
"",
"",
false,
false,
"",
"2024-09-10 16:59:50.160202"
)
}
insertInto("public.media") {
columns(Media.columns)
values(
3,
"pnc__picked_media_256f8e6d-68cd-4a76-bb38-57e35f6ca8c6.jpg",
"http://localhost:8081/files/18330354358862827520.jpeg",
null,
"http://localhost:8081/files/thumbn3ail-1833054358862827520.jpeg",
"Image",
null,
"image/jpeg",
null,
1
)
values(
2,
"pnc__picked_media_256f8e6d-68cd-4a76-bb38-57e35f6ca8c6.jpg",
"http://localhost:8081/files/18330545358862827520.jpeg",
"http://localhost:8081/files/183305453584862827520.jpeg",
null,
"Image",
"U\$JuAZWBxut7~qoLoft6j]t7Rjj[RjayWBay",
"image/jpeg",
null,
1
)
}
insertInto(CustomEmojis.tableName) {
columns(CustomEmojis.columns)
values(
4,
"emoji",
"example.com",
1,
"https://example.com",
null,
"2024-09-09 17:12:03.941339"
)
values(
5,
"emoji2",
"example.com",
1,
"https://example.com/2",
"test",
"2024-09-09 17:12:03.941339"
)
}
execute(enableReferenceIntegrityConstraints)
}.launch()
val post = TestPostFactory.create(
id = 1,
createdAt = Instant.parse("2021-01-01T00:00:00Z"),
mediaIds = listOf(2, 3),
emojiIds = listOf(4, 5),
visibility = Visibility.DIRECT,
visibleActors = listOf(1, 2)
)
repository.save(post)
assertThat(assertTable)
.row(0)
.isEqualTo(Posts.id, post.id.id)
.isEqualTo(Posts.actorId, post.actorId.id)
.isEqualTo(Posts.instanceId, post.instanceId.instanceId)
.isEqualTo(Posts.overview, post.overview?.overview)
.isEqualTo(Posts.content, post.content.content)
.isEqualTo(Posts.text, post.text)
.value(Posts.createdAt).isEqualTo(Timestamp.from(post.createdAt))
.isEqualTo(Posts.visibility, post.visibility.name)
.value(Posts.url).isEqualTo(post.url.toString())
.value(Posts.repostId).isEqualTo(post.repostId?.id)
.value(Posts.replyId).isEqualTo(post.replyId?.id)
.isEqualTo(Posts.sensitive, post.sensitive)
.value(Posts.apId).isEqualTo(post.apId.toString())
.isEqualTo(Posts.deleted, post.deleted)
.isEqualTo(Posts.hide, post.hide)
.value(Posts.moveTo).isEqualTo(post.moveTo?.id)
assertThat(getTable(PostsMedia.tableName))
.row(0)
.value(PostsMedia.postId).isEqualTo(post.id.id)
.value(PostsMedia.mediaId).isEqualTo(2)
.row(1)
.value(PostsMedia.postId).isEqualTo(post.id.id)
.value(PostsMedia.mediaId).isEqualTo(3)
assertThat(getTable(PostsEmojis.tableName))
.row(0)
.value(PostsEmojis.postId).isEqualTo(post.id.id)
.value(PostsEmojis.emojiId).isEqualTo(4)
.row(1)
.value(PostsEmojis.postId).isEqualTo(post.id.id)
.value(PostsEmojis.emojiId).isEqualTo(5)
assertThat(getTable(PostsVisibleActors.tableName))
.row(0)
.value(PostsVisibleActors.postId).isEqualTo(post.id.id)
.value(PostsVisibleActors.actorId).isEqualTo(1)
.row(1)
.value(PostsVisibleActors.postId).isEqualTo(post.id.id)
.value(PostsVisibleActors.actorId).isEqualTo(2)
}
@Test
fun save_idが同じレコードがある場合はupdate() = runTest {
dbSetup(to = dataSource) {
execute(disableReferenceIntegrityConstraints)
insertInto(Instance.tableName) {
columns(Instance.columns)
values(
1,
"system",
"",
"https://example.com",
"",
null,
"",
"",
false,
false,
"",
"2024-09-10 16:59:50.160202"
)
}
insertInto("public.posts") {
columns(Posts.columns)
values(
1,
1832779978794602496,
1832779642545639424,
null,
"<p>test</p>",
"test",
Timestamp.from(Instant.parse("2020-01-01T00:00:00Z")),
"PUBLIC",
"http://localhost:8081/users/a/posts/1832779994749734912",
2,
2,
false,
"http://localhost:8081/users/a/posts/1832779994749734912",
false,
false,
null
)
}
}.launch()
val post = TestPostFactory.create(
id = 1,
instanceId = 1,
overview = "aaaaaaaa",
createdAt = Instant.parse("2021-01-01T00:00:00Z"),
replyId = 2,
repostId = 2,
moveTo = 2
)
repository.save(post)
assertThat(assertTable)
.row(0)
.isEqualTo(Posts.id, post.id.id)
.isEqualTo(Posts.actorId, post.actorId.id)
.isEqualTo(Posts.instanceId, post.instanceId.instanceId)
.isEqualTo(Posts.overview, post.overview?.overview)
.isEqualTo(Posts.content, post.content.content)
.isEqualTo(Posts.text, post.text)
.value(Posts.createdAt).isEqualTo(Timestamp.from(post.createdAt))
.isEqualTo(Posts.visibility, post.visibility.name)
.value(Posts.url).isEqualTo(post.url.toString())
.value(Posts.repostId).isEqualTo(post.repostId?.id)
.value(Posts.replyId).isEqualTo(post.replyId?.id)
.isEqualTo(Posts.sensitive, post.sensitive)
.value(Posts.apId).isEqualTo(post.apId.toString())
.isEqualTo(Posts.deleted, post.deleted)
.isEqualTo(Posts.hide, post.hide)
.value(Posts.moveTo).isEqualTo(post.moveTo?.id)
}
@Test
fun findById_指定したIdがある場合は返す() = runTest {
dbSetup(to = dataSource) {
execute(disableReferenceIntegrityConstraints)
insertInto("public.posts") {
columns(Posts.columns)
values(
1,
1832779978794602496,
1832779642545639424,
"",
"<p>test</p>",
"test",
Timestamp.from(Instant.parse("2020-01-01T00:00:00Z")),
"PUBLIC",
"http://localhost:8081/users/a/posts/1832779994749734912",
null,
null,
false,
"http://localhost:8081/users/a/posts/1832779994749734912",
false,
false,
null
)
}
insertInto(PostsMedia.tableName) {
columns(PostsMedia.columns)
values(1, 2)
}
insertInto(PostsEmojis.tableName) {
columns(PostsEmojis.columns)
values(1, 3)
}
insertInto(PostsVisibleActors.tableName) {
columns(PostsVisibleActors.columns)
values(1, 4)
}
}.launch()
val actual = repository.findById(PostId(1))
val expect = Post(
id = PostId(1),
actorId = ActorId(1832779978794602496),
instanceId = InstanceId(1832779642545639424),
overview = PostOverview(""),
content = PostContent("test", "<p>test</p>", listOf(CustomEmojiId(3))),
createdAt = Instant.parse("2020-01-01T00:00:00Z"),
visibility = Visibility.PUBLIC,
url = URI.create("http://localhost:8081/users/a/posts/1832779994749734912"),
repostId = null,
replyId = null,
sensitive = false,
apId = URI.create("http://localhost:8081/users/a/posts/1832779994749734912"),
deleted = false,
mediaIds = listOf(MediaId(2)),
visibleActors = setOf(ActorId(4)),
hide = false, moveTo = null
)
assertNotNull(actual)
assertEquals(expect, actual)
assertEquals(expect.id, actual.id)
assertEquals(expect.actorId, actual.actorId)
assertEquals(expect.instanceId, actual.instanceId)
assertEquals(expect.overview, actual.overview)
assertEquals(expect.content, actual.content)
assertEquals(expect.createdAt, actual.createdAt)
assertEquals(expect.visibility, actual.visibility)
assertEquals(expect.url, actual.url)
assertEquals(expect.repostId, actual.repostId)
assertEquals(expect.replyId, actual.replyId)
assertEquals(expect.sensitive, actual.sensitive)
assertEquals(expect.apId, actual.apId)
assertEquals(expect.deleted, actual.deleted)
assertEquals(expect.mediaIds, actual.mediaIds)
assertEquals(expect.visibleActors, actual.visibleActors)
assertEquals(expect.hide, actual.hide)
}
@Test
fun findById_指定したIdで存在しないとnull() = runTest {
assertNull(repository.findById(PostId(1)))
}
@Test
fun findAllById_指定されたIdすべて返す() = runTest {
dbSetup(to = dataSource) {
execute(disableReferenceIntegrityConstraints)
insertInto("public.posts") {
columns(Posts.columns)
values(
1,
1832779978794602496,
1832779642545639424,
null,
"<p>test</p>",
"test",
Timestamp.from(Instant.parse("2020-01-01T00:00:00Z")),
"PUBLIC",
"http://localhost:8081/users/a/posts/1832779994749734912",
2,
2,
false,
"http://localhost:8081/users/a/posts/1832779994749734912",
false,
false,
null
)
values(
2,
1832779978794602496,
1832779642545639424,
null,
"<p>test</p>",
"test",
Timestamp.from(Instant.parse("2020-01-01T00:00:00Z")),
"PUBLIC",
"http://localhost:8081/users/a/posts/18327739994749734912",
null,
null,
false,
"http://localhost:8081/users/a/posts/18327793994749734912",
false,
false,
null
)
values(
3,
1832779978794602496,
1832779642545639424,
"",
"<p>test</p>",
"test",
Timestamp.from(Instant.parse("2020-01-01T00:00:00Z")),
"PUBLIC",
"http://localhost:8081/users/a/posts/183277399947494734912",
null,
null,
false,
"http://localhost:8081/users/a/posts/183277939947493734912",
false,
false,
2
)
}
}.launch()
val findAllById = repository.findAllById(listOf(PostId(1), PostId(3)))
assertThat(findAllById)
.hasSize(2)
}
@Test
fun findByActorId_指定されたActorIdすべて返す() = runTest {
dbSetup(to = dataSource) {
execute(disableReferenceIntegrityConstraints)
insertInto("public.posts") {
columns(Posts.columns)
values(
1,
1,
1832779642545639424,
null,
"<p>test</p>",
"test",
Timestamp.from(Instant.parse("2020-01-01T00:00:00Z")),
"PUBLIC",
"http://localhost:8081/users/a/posts/1832779994749734912",
2,
2,
false,
"http://localhost:8081/users/a/posts/1832779994749734912",
false,
false,
null
)
values(
2,
2,
1832779642545639424,
null,
"<p>test</p>",
"test",
Timestamp.from(Instant.parse("2020-01-01T00:00:00Z")),
"PUBLIC",
"http://localhost:8081/users/a/posts/18327739994749734912",
null,
null,
false,
"http://localhost:8081/users/a/posts/18327793994749734912",
false,
false,
null
)
values(
3,
1,
1832779642545639424,
"",
"<p>test</p>",
"test",
Timestamp.from(Instant.parse("2020-01-01T00:00:00Z")),
"PUBLIC",
"http://localhost:8081/users/a/posts/183277399947494734912",
null,
null,
false,
"http://localhost:8081/users/a/posts/183277939947493734912",
false,
false,
2
)
}
}.launch()
val findAllById = repository.findByActorId(ActorId(1))
assertThat(findAllById)
.hasSize(2)
}
}