Merge pull request #429 from usbharu/test

テストの追加
This commit is contained in:
usbharu 2024-06-21 17:01:42 +09:00 committed by GitHub
commit ab4a346935
34 changed files with 1050 additions and 44 deletions

View File

@ -49,9 +49,9 @@ data class Relationship(
muting = relationship.muting,
followRequesting = relationship.followRequesting,
followRequestedBy = relationship2.followRequesting,
domainBlocking = actorInstanceRelationship.isBlocking(),
domainMuting = actorInstanceRelationship.isMuting(),
domainDoNotSendPrivate = actorInstanceRelationship.isDoNotSendPrivate()
domainBlocking = actorInstanceRelationship.blocking,
domainMuting = actorInstanceRelationship.muting,
domainDoNotSendPrivate = actorInstanceRelationship.doNotSendPrivate
)
}
}

View File

@ -34,9 +34,9 @@ class ActorInstanceRelationshipEventBody(actorInstanceRelationship: ActorInstanc
mapOf(
"actorId" to actorInstanceRelationship.actorId,
"instanceId" to actorInstanceRelationship.instanceId,
"muting" to actorInstanceRelationship.isMuting(),
"blocking" to actorInstanceRelationship.isBlocking(),
"doNotSendPrivate" to actorInstanceRelationship.isDoNotSendPrivate(),
"muting" to actorInstanceRelationship.muting,
"blocking" to actorInstanceRelationship.blocking,
"doNotSendPrivate" to actorInstanceRelationship.doNotSendPrivate,
)
)

View File

@ -79,7 +79,7 @@ class Actor(
private set
fun setRole(roles: Set<Role>, actor: Actor) {
require(actor.roles.contains(Role.ADMINISTRATOR).not())
require(actor.roles.contains(Role.ADMINISTRATOR))
this.roles = roles
}

View File

@ -17,4 +17,8 @@
package dev.usbharu.hideout.core.domain.model.actor
@JvmInline
value class ActorKeyId(val keyId: String)
value class ActorKeyId(val keyId: String) {
init {
require(keyId.isNotBlank())
}
}

View File

@ -17,5 +17,8 @@
package dev.usbharu.hideout.core.domain.model.actor
enum class Role {
LOCAL, MODERATOR, ADMINISTRATOR, REMOTE
LOCAL,
MODERATOR,
ADMINISTRATOR,
REMOTE;
}

View File

@ -22,13 +22,20 @@ import dev.usbharu.hideout.core.domain.model.actor.ActorId
import dev.usbharu.hideout.core.domain.model.instance.InstanceId
import dev.usbharu.hideout.core.domain.shared.domainevent.DomainEventStorable
data class ActorInstanceRelationship(
class ActorInstanceRelationship(
val actorId: ActorId,
val instanceId: InstanceId,
private var blocking: Boolean = false,
private var muting: Boolean = false,
private var doNotSendPrivate: Boolean = false,
blocking: Boolean = false,
muting: Boolean = false,
doNotSendPrivate: Boolean = false,
) : DomainEventStorable() {
var doNotSendPrivate = doNotSendPrivate
private set
var muting = muting
private set
var blocking = blocking
private set
fun block(): ActorInstanceRelationship {
addDomainEvent(ActorInstanceRelationshipDomainEventFactory(this).createEvent(BLOCK))
blocking = true
@ -62,12 +69,6 @@ data class ActorInstanceRelationship(
return this
}
fun isBlocking() = blocking
fun isMuting() = muting
fun isDoNotSendPrivate() = doNotSendPrivate
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false

View File

@ -17,4 +17,8 @@
package dev.usbharu.hideout.core.domain.model.application
@JvmInline
value class ApplicationId(val id: Long)
value class ApplicationId(val id: Long) {
init {
require(0 <= id)
}
}

View File

@ -17,4 +17,12 @@
package dev.usbharu.hideout.core.domain.model.application
@JvmInline
value class ApplicationName(val name: String)
value class ApplicationName(val name: String) {
init {
require(name.length <= LENGTH)
}
companion object {
const val LENGTH = 300
}
}

View File

@ -17,4 +17,8 @@
package dev.usbharu.hideout.core.domain.model.emoji
@JvmInline
value class EmojiId(val emojiId: Long)
value class EmojiId(val emojiId: Long) {
init {
require(0 <= emojiId)
}
}

View File

@ -21,6 +21,11 @@ class Filter(
this.filterKeywords = filterKeywords
}
/**
* フィルターを正規表現として表現したものを返します
*
* @return フィルターの正規表現
*/
fun compileFilter(): Regex {
val words = mutableListOf<String>()
val wholeWords = mutableListOf<String>()
@ -33,10 +38,11 @@ class Filter(
NONE -> words.add(filterKeyword.keyword.keyword)
}
}
val wholeWordsRegex = wholeWords.takeIf { it.isNotEmpty() }?.joinToString("|", "\\b(", ")\\b")
val noneWordsRegex = words.takeIf { it.isNotEmpty() }?.joinToString("|", "(", ")")
val regex = regexes.takeIf { it.isNotEmpty() }?.joinToString("|", "(", ")")
return (wholeWords + regexes + wholeWords)
.joinToString("|")
.toRegex()
return listOfNotNull(wholeWordsRegex, noneWordsRegex, regex).joinToString("|").toRegex()
}
fun reconstructWith(filterKeywords: Set<FilterKeyword>): Filter {

View File

@ -1,4 +1,8 @@
package dev.usbharu.hideout.core.domain.model.filter
@JvmInline
value class FilterId(val id: Long)
value class FilterId(val id: Long) {
init {
require(0 <= id)
}
}

View File

@ -1,4 +1,12 @@
package dev.usbharu.hideout.core.domain.model.filter
@JvmInline
value class FilterName(val name: String)
class FilterName(name: String) {
val name = name.take(LENGTH)
companion object {
const val LENGTH = 300
}
}

View File

@ -184,6 +184,7 @@ class Post(
}
fun restore(content: PostContent, overview: PostOverview?, mediaIds: List<MediaId>) {
require(deleted)
deleted = false
this.content = content
this.overview = overview
@ -298,9 +299,6 @@ class Post(
fun isAllow(actor: Actor, action: Action, resource: Post): Boolean {
return when (action) {
UPDATE -> {
if (actor.deleted) {
return true
}
resource.actorId == actor.id || actor.roles.contains(Role.ADMINISTRATOR) || actor.roles.contains(
Role.MODERATOR
)

View File

@ -34,7 +34,7 @@ class LocalActorMigrationCheckDomainServiceImpl : LocalActorMigrationCheckDomain
return AccountMigrationCheck.AlreadyMoved("${from.name}@${from.domain} was move to ${from.moveTo}")
}
if (to.alsoKnownAs.contains(to.id).not()) {
if (to.alsoKnownAs.contains(from.id).not()) {
return AccountMigrationCheck.AlsoKnownAsNotFound("${to.id} has ${to.alsoKnownAs}")
}

View File

@ -41,9 +41,9 @@ class ExposedActorInstanceRelationshipRepository(override val domainEventPublish
ActorInstanceRelationships.upsert {
it[actorId] = actorInstanceRelationship.actorId.id
it[instanceId] = actorInstanceRelationship.instanceId.instanceId
it[blocking] = actorInstanceRelationship.isBlocking()
it[muting] = actorInstanceRelationship.isMuting()
it[doNotSendPrivate] = actorInstanceRelationship.isDoNotSendPrivate()
it[blocking] = actorInstanceRelationship.blocking
it[muting] = actorInstanceRelationship.muting
it[doNotSendPrivate] = actorInstanceRelationship.doNotSendPrivate
}
}
update(actorInstanceRelationship)

View File

@ -19,7 +19,6 @@ package dev.usbharu.hideout
import com.fasterxml.jackson.module.kotlin.isKotlinClass
import com.jparams.verifier.tostring.ToStringVerifier
import com.jparams.verifier.tostring.preset.Presets
import dev.usbharu.hideout.core.domain.model.emoji.UnicodeEmoji
import nl.jqno.equalsverifier.EqualsVerifier
import nl.jqno.equalsverifier.Warning
import nl.jqno.equalsverifier.internal.reflection.PackageScanner
@ -115,7 +114,6 @@ class EqualsAndToStringTest {
.filterNot {
it.superclass.isSealed
}
.filterNot { it == UnicodeEmoji::class.java }
.map {
dynamicTest(it.name) {

View File

@ -1,3 +1,13 @@
package dev.usbharu.hideout.core.domain.model.actor
class ActorDescriptionTest
import org.junit.jupiter.api.Test
import kotlin.test.assertEquals
class ActorDescriptionTest {
@Test
fun actorDescriptionがlength以上なら無視される() {
val actorScreenName = ActorDescription("a".repeat(100000))
assertEquals(ActorDescription.LENGTH, actorScreenName.description.length)
}
}

View File

@ -0,0 +1,25 @@
package dev.usbharu.hideout.core.domain.model.actor
import org.junit.jupiter.api.Assertions.assertDoesNotThrow
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows
class ActorKeyIdTest {
@Test
fun keyIdはblankではいけない() {
assertThrows<IllegalArgumentException> {
ActorKeyId("")
}
assertThrows<IllegalArgumentException> {
ActorKeyId(" ")
}
}
@Test
fun keyIdがblankでなければ作成できる() {
assertDoesNotThrow {
ActorKeyId("aiueo")
}
}
}

View File

@ -0,0 +1,20 @@
package dev.usbharu.hideout.core.domain.model.actor
import org.junit.jupiter.api.Assertions.assertDoesNotThrow
import org.junit.jupiter.api.Test
class ActorPostsCountTest {
@Test
fun postsCountが負になることはない() {
org.junit.jupiter.api.assertThrows<IllegalArgumentException> {
ActorPostsCount(-1)
}
}
@Test
fun postsCountが正の数値なら設定できる() {
assertDoesNotThrow {
ActorPostsCount(1)
}
}
}

View File

@ -0,0 +1,18 @@
package dev.usbharu.hideout.core.domain.model.actor
import dev.usbharu.hideout.util.Base64Util
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
import java.security.KeyPairGenerator
class ActorPrivateKeyTest {
@Test
fun privateKeyから生成できる() {
val genKeyPair = KeyPairGenerator.getInstance("RSA").genKeyPair()
val actorPrivateKey = ActorPrivateKey.create(genKeyPair.private)
val key = "-----BEGIN PRIVATE KEY-----\n" +
Base64Util.encode(genKeyPair.private.encoded).chunked(64)
.joinToString("\n") + "\n-----END PRIVATE KEY-----"
assertEquals(key, actorPrivateKey.privateKey)
}
}

View File

@ -1,3 +1,18 @@
package dev.usbharu.hideout.core.domain.model.actor
class ActorPublicKeyTest
import dev.usbharu.hideout.util.Base64Util
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
import java.security.KeyPairGenerator
class ActorPublicKeyTest {
@Test
fun publicKeyから生成できる() {
val genKeyPair = KeyPairGenerator.getInstance("RSA").genKeyPair()
val actorPublicKey = ActorPublicKey.create(genKeyPair.public)
val key = "-----BEGIN PUBLIC KEY-----\n" +
Base64Util.encode(genKeyPair.public.encoded).chunked(64)
.joinToString("\n") + "\n-----END PUBLIC KEY-----"
assertEquals(key, actorPublicKey.publicKey)
}
}

View File

@ -0,0 +1,21 @@
package dev.usbharu.hideout.core.domain.model.actor
import org.junit.jupiter.api.Assertions.assertDoesNotThrow
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows
class ActorRelationshipCountTest {
@Test
fun relationshipCountが負になることはない() {
assertThrows<IllegalArgumentException> {
ActorRelationshipCount(-1)
}
}
@Test
fun relationshipCountが正の数値なら設定できる() {
assertDoesNotThrow {
ActorRelationshipCount(1)
}
}
}

View File

@ -1,7 +1,9 @@
package dev.usbharu.hideout.core.domain.model.actor
import dev.usbharu.hideout.core.domain.event.actor.ActorEvent
import dev.usbharu.hideout.core.domain.model.media.MediaId
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertDoesNotThrow
import org.junit.jupiter.api.assertThrows
import utils.AssertDomainEvent.assertContainsEvent
import utils.AssertDomainEvent.assertEmpty
@ -127,4 +129,44 @@ class ActorsTest {
assertContainsEvent(actor, ActorEvent.CHECK_UPDATE.eventName)
}
@Test
fun bannerが設定されたらupdateイベントが発生する() {
val actor = TestActorFactory.create(publicKey = ActorPublicKey(""))
actor.setBannerUrl(MediaId(1), actor)
assertContainsEvent(actor, ActorEvent.UPDATE.eventName)
}
@Test
fun iconが設定されたらupdateイベントが発生する() {
val actor = TestActorFactory.create(publicKey = ActorPublicKey(""))
actor.setIconUrl(MediaId(1), actor)
assertContainsEvent(actor, ActorEvent.UPDATE.eventName)
}
@Test
fun administratorロールを持っている人はroleを設定できる() {
val admin = TestActorFactory.create(roles = setOf(Role.ADMINISTRATOR))
val actor = TestActorFactory.create()
assertDoesNotThrow {
actor.setRole(setOf(Role.MODERATOR), admin)
}
}
@Test
fun administratorロールを持ってないとはroleを設定できない() {
val admin = TestActorFactory.create(roles = setOf(Role.MODERATOR))
val actor = TestActorFactory.create()
assertThrows<IllegalArgumentException> {
actor.setRole(setOf(Role.MODERATOR), admin)
}
}
}

View File

@ -34,9 +34,10 @@ object TestActorFactory {
lastPostDate: Instant? = null,
suspend: Boolean = false,
alsoKnownAs: Set<ActorId> = emptySet(),
moveTo: ActorId? = null,
moveTo: Long? = null,
emojiIds: Set<EmojiId> = emptySet(),
deleted: Boolean = false,
roles: Set<Role> = emptySet(),
): Actor {
return runBlocking {
Actor(
@ -62,12 +63,13 @@ object TestActorFactory {
lastPostAt = lastPostDate,
suspend = suspend,
alsoKnownAs = alsoKnownAs,
moveTo = moveTo,
moveTo = moveTo?.let { ActorId(it) },
emojiIds = emojiIds,
deleted = deleted,
roles = emptySet(),
roles = roles,
icon = null,
banner = null
banner = null,
)
}
}

View File

@ -0,0 +1,77 @@
package dev.usbharu.hideout.core.domain.model.actorinstancerelationship
import dev.usbharu.hideout.core.domain.event.actorinstancerelationship.ActorInstanceRelationshipEvent
import dev.usbharu.hideout.core.domain.model.actor.ActorId
import dev.usbharu.hideout.core.domain.model.instance.InstanceId
import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import utils.AssertDomainEvent.assertContainsEvent
class ActorInstanceRelationshipTest {
@Test
fun blockするとBLOCKイベントが発生する() {
val actorInstanceRelationship = ActorInstanceRelationship(ActorId(1), InstanceId(2), false)
actorInstanceRelationship.block()
assertContainsEvent(actorInstanceRelationship, ActorInstanceRelationshipEvent.BLOCK.eventName)
assertTrue(actorInstanceRelationship.blocking)
}
@Test
fun muteするとMUTEイベントが発生する() {
val actorInstanceRelationship = ActorInstanceRelationship(ActorId(1), InstanceId(2), false)
actorInstanceRelationship.mute()
assertContainsEvent(actorInstanceRelationship, ActorInstanceRelationshipEvent.MUTE.eventName)
assertTrue(actorInstanceRelationship.muting)
}
@Test
fun unmuteするとUNMUTEイベントが発生する() {
val actorInstanceRelationship = ActorInstanceRelationship(ActorId(1), InstanceId(2), muting = true)
actorInstanceRelationship.unmute()
assertContainsEvent(actorInstanceRelationship, ActorInstanceRelationshipEvent.UNMUTE.eventName)
assertFalse(actorInstanceRelationship.muting)
}
@Test
fun unblockで解除される() {
val actorInstanceRelationship = ActorInstanceRelationship(ActorId(1), InstanceId(2), true)
actorInstanceRelationship.unblock()
assertFalse(actorInstanceRelationship.blocking)
}
@Test
fun doNotSendPrivateで設定される() {
val actorInstanceRelationship = ActorInstanceRelationship(ActorId(1), InstanceId(2))
actorInstanceRelationship.doNotSendPrivate()
assertTrue(actorInstanceRelationship.doNotSendPrivate)
}
@Test
fun doSendPrivateで解除される() {
val actorInstanceRelationship = ActorInstanceRelationship(ActorId(1), InstanceId(2), doNotSendPrivate = true)
actorInstanceRelationship.doSendPrivate()
assertFalse(actorInstanceRelationship.doNotSendPrivate)
}
@Test
fun defaultで全部falseが作られる() {
val default = ActorInstanceRelationship.default(ActorId(1), InstanceId(2))
assertFalse(default.muting)
assertFalse(default.blocking)
assertFalse(default.doNotSendPrivate)
}
}

View File

@ -0,0 +1,20 @@
package dev.usbharu.hideout.core.domain.model.application
import org.junit.jupiter.api.Assertions.assertDoesNotThrow
import org.junit.jupiter.api.Test
class ApplicationIdTest {
@Test
fun applicationIdは0以上である必要がある() {
org.junit.jupiter.api.assertThrows<IllegalArgumentException> {
ApplicationId(-1)
}
}
@Test
fun applicationIdが0以上なら設定できる() {
assertDoesNotThrow {
ApplicationId(1)
}
}
}

View File

@ -0,0 +1,20 @@
package dev.usbharu.hideout.core.domain.model.application
import org.junit.jupiter.api.Assertions.assertDoesNotThrow
import org.junit.jupiter.api.Test
class ApplicationNameTest {
@Test
fun applicationNameがlength以上の時エラー() {
org.junit.jupiter.api.assertThrows<IllegalArgumentException> {
ApplicationName("a".repeat(1000))
}
}
@Test
fun applicationNameがlength未満の時設定できる() {
assertDoesNotThrow {
ApplicationName("a".repeat(100))
}
}
}

View File

@ -0,0 +1,13 @@
package dev.usbharu.hideout.core.domain.model.application
import org.junit.jupiter.api.Test
class ApplicationTest {
@Test
fun インスタンスを生成できる() {
Application(
ApplicationId(1),
ApplicationName("aiueo")
)
}
}

View File

@ -0,0 +1,20 @@
package dev.usbharu.hideout.core.domain.model.emoji
import org.junit.jupiter.api.Assertions.assertDoesNotThrow
import org.junit.jupiter.api.Test
class EmojiIdTest {
@Test
fun emojiIdは0以上である必要がある() {
org.junit.jupiter.api.assertThrows<IllegalArgumentException> {
EmojiId(-1)
}
}
@Test
fun emojiIdは0以上なら設定できる() {
assertDoesNotThrow {
EmojiId(1)
}
}
}

View File

@ -0,0 +1,20 @@
package dev.usbharu.hideout.core.domain.model.filter
import org.junit.jupiter.api.Assertions.assertDoesNotThrow
import org.junit.jupiter.api.Test
class FilterIdTest {
@Test
fun filterIdは0以上である必要がある() {
org.junit.jupiter.api.assertThrows<IllegalArgumentException> {
FilterId(-1)
}
}
@Test
fun filterIdが0以上なら設定できる() {
assertDoesNotThrow {
FilterId(1)
}
}
}

View File

@ -0,0 +1,13 @@
package dev.usbharu.hideout.core.domain.model.filter
import org.junit.jupiter.api.Test
import kotlin.test.assertEquals
class FilterNameTest {
@Test
fun FilterNameがlength以上のときは無視される() {
val filterName = FilterName("a".repeat(1000))
assertEquals(FilterName.LENGTH, filterName.name.length)
}
}

View File

@ -0,0 +1,138 @@
package dev.usbharu.hideout.core.domain.model.filter
import dev.usbharu.hideout.core.domain.model.actor.ActorId
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetail
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailHashedPassword
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailId
import org.junit.jupiter.api.Assertions.assertDoesNotThrow
import org.junit.jupiter.api.Test
class FilterTest {
@Test
fun `setFilterKeywords 所有者のみ変更できる`() {
val filter = Filter.create(
id = FilterId(1),
userDetailId = UserDetailId(1),
name = FilterName("aiueo"),
filterContext = setOf(),
filterAction = FilterAction.HIDE,
filterKeywords = setOf()
)
val userDetail = UserDetail.create(
id = UserDetailId(1),
actorId = ActorId(1),
password = UserDetailHashedPassword(""),
autoAcceptFolloweeFollowRequest = false,
lastMigration = null
)
assertDoesNotThrow {
filter.setFilterKeywords(
setOf(
FilterKeyword(
FilterKeywordId(1),
FilterKeywordKeyword("keyword"),
FilterMode.NONE
)
), userDetail
)
}
}
@Test
fun compileFilterで正規表現として表すことができるNONE() {
val filter = Filter(
id = FilterId(1),
userDetailId = UserDetailId(1),
name = FilterName("aiueo"),
filterContext = setOf(),
filterAction = FilterAction.HIDE,
filterKeywords = setOf(
FilterKeyword(
FilterKeywordId(1),
FilterKeywordKeyword("hoge"),
FilterMode.NONE
)
)
)
kotlin.test.assertEquals("(hoge)", filter.compileFilter().pattern)
}
@Test
fun compileFilterで正規表現として表すことができるWHOLE_WORD() {
val filter = Filter(
id = FilterId(1),
userDetailId = UserDetailId(1),
name = FilterName("aiueo"),
filterContext = setOf(),
filterAction = FilterAction.HIDE,
filterKeywords = setOf(
FilterKeyword(
FilterKeywordId(1),
FilterKeywordKeyword("hoge"),
FilterMode.WHOLE_WORD
)
)
)
kotlin.test.assertEquals("\\b(hoge)\\b", filter.compileFilter().pattern)
}
@Test
fun compileFilterで正規表現として表すことができるREGEX() {
val filter = Filter(
id = FilterId(1),
userDetailId = UserDetailId(1),
name = FilterName("aiueo"),
filterContext = setOf(),
filterAction = FilterAction.HIDE,
filterKeywords = setOf(
FilterKeyword(
FilterKeywordId(1),
FilterKeywordKeyword("hoge"),
FilterMode.REGEX
)
)
)
kotlin.test.assertEquals("(hoge)", filter.compileFilter().pattern)
}
@Test
fun compileFilterで正規表現として表すことができる() {
val filter = Filter(
id = FilterId(1),
userDetailId = UserDetailId(1),
name = FilterName("aiueo"),
filterContext = setOf(),
filterAction = FilterAction.HIDE,
filterKeywords = setOf(
FilterKeyword(
FilterKeywordId(1),
FilterKeywordKeyword("hoge"),
FilterMode.WHOLE_WORD
),
FilterKeyword(
FilterKeywordId(2),
FilterKeywordKeyword("hoge"),
FilterMode.REGEX
),
FilterKeyword(
FilterKeywordId(3),
FilterKeywordKeyword("hoge"),
FilterMode.NONE
)
)
)
kotlin.test.assertEquals("\\b(hoge)\\b|(hoge)|(hoge)", filter.compileFilter().pattern)
}
}

View File

@ -4,12 +4,18 @@ import dev.usbharu.hideout.core.domain.event.post.PostEvent
import dev.usbharu.hideout.core.domain.model.actor.ActorId
import dev.usbharu.hideout.core.domain.model.actor.ActorPublicKey
import dev.usbharu.hideout.core.domain.model.actor.TestActorFactory
import dev.usbharu.hideout.core.domain.model.emoji.EmojiId
import dev.usbharu.hideout.core.domain.model.media.MediaId
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertDoesNotThrow
import org.junit.jupiter.api.assertThrows
import utils.AssertDomainEvent.assertContainsEvent
import utils.AssertDomainEvent.assertEmpty
import java.net.URI
import java.time.Instant
import kotlin.test.assertEquals
import kotlin.test.assertFalse
import kotlin.test.assertNull
class PostTest {
@ -260,5 +266,422 @@ class PostTest {
assertEmpty(post)
}
@Test
fun sensitiveが変更されるとupdateイベントが発生する() {
val post = TestPostFactory.create()
val actor = TestActorFactory.create(id = post.actorId.id, publicKey = ActorPublicKey(""))
post.setSensitive(true, actor)
assertContainsEvent(post, PostEvent.UPDATE.eventName)
}
}
@Test
fun 削除されている場合sensitiveを変更できない() {
val post = TestPostFactory.create(deleted = true)
val actor = TestActorFactory.create(id = post.actorId.id, publicKey = ActorPublicKey(""))
assertThrows<IllegalArgumentException> {
post.setSensitive(true, actor)
}
}
@Test
fun sensitiveが変更されなかった場合イベントが発生しない() {
val post = TestPostFactory.create(overview = "aaaa")
val actor = TestActorFactory.create(id = post.actorId.id, publicKey = ActorPublicKey(""))
post.setSensitive(false, actor)
assertEmpty(post)
}
@Test
fun hideがtrueの時emptyが帰る() {
val post = TestPostFactory.create(hide = true)
assertEquals(PostContent.empty.text, post.text)
}
@Test
fun hideがfalseの時textが返る() {
val post = TestPostFactory.create(hide = false, content = "aaaa")
assertEquals("aaaa", post.text)
}
@Test
fun `create actorが削除済みの時作成できない`() {
val actor = TestActorFactory.create(deleted = true)
assertThrows<IllegalArgumentException> {
Post.create(
id = PostId(1),
actorId = actor.id,
overview = null,
content = PostContent.empty,
createdAt = Instant.now(),
visibility = Visibility.PUBLIC,
url = URI.create("https://example.com"),
repostId = null,
replyId = null,
sensitive = false,
apId = URI.create("https://example.com"),
deleted = false,
mediaIds = emptyList(),
visibleActors = emptySet(),
hide = false,
moveTo = null,
actor = actor
)
}
}
@Test
fun `create actorがsuspedの時visibilityがpublicの登校はunlistedになる`() {
val actor = TestActorFactory.create(suspend = true)
val post = Post.create(
id = PostId(1),
actorId = actor.id,
overview = null,
content = PostContent.empty,
createdAt = Instant.now(),
visibility = Visibility.PUBLIC,
url = URI.create("https://example.com"),
repostId = null,
replyId = null,
sensitive = false,
apId = URI.create("https://example.com"),
deleted = false,
mediaIds = emptyList(),
visibleActors = emptySet(),
hide = false,
moveTo = null,
actor = actor
)
assertEquals(Visibility.UNLISTED, post.visibility)
}
@Test
fun `create actorがsuspedの時visibilityがunlistedの登校は変わらない`() {
val actor = TestActorFactory.create(suspend = true)
val post = Post.create(
id = PostId(1),
actorId = actor.id,
overview = null,
content = PostContent.empty,
createdAt = Instant.now(),
visibility = Visibility.UNLISTED,
url = URI.create("https://example.com"),
repostId = null,
replyId = null,
sensitive = false,
apId = URI.create("https://example.com"),
deleted = false,
mediaIds = emptyList(),
visibleActors = emptySet(),
hide = false,
moveTo = null,
actor = actor
)
assertEquals(Visibility.UNLISTED, post.visibility)
}
@Test
fun `create 作成できる`() {
val actor = TestActorFactory.create(suspend = true)
assertDoesNotThrow {
Post.create(
id = PostId(1),
actorId = actor.id,
overview = null,
content = PostContent.empty,
createdAt = Instant.now(),
visibility = Visibility.PUBLIC,
url = URI.create("https://example.com"),
repostId = null,
replyId = null,
sensitive = false,
apId = URI.create("https://example.com"),
deleted = false,
mediaIds = emptyList(),
visibleActors = emptySet(),
hide = false,
moveTo = null,
actor = actor
)
}
}
@Test
fun `create 作成できる2`() {
val actor = TestActorFactory.create(suspend = true)
assertDoesNotThrow {
Post.create(
id = PostId(1),
actorId = actor.id,
content = PostContent.empty,
createdAt = Instant.now(),
visibility = Visibility.PUBLIC,
url = URI.create("https://example.com"),
repostId = null,
replyId = null,
sensitive = false,
apId = URI.create("https://example.com"),
deleted = false,
mediaIds = emptyList(),
actor = actor
)
}
}
@Test
fun `emojiIds hideがtrueの時empty`() {
val actor = TestActorFactory.create()
val emojiIds = listOf(EmojiId(1), EmojiId(2))
val post = Post.create(
id = PostId(1),
actorId = actor.id,
content = PostContent("aaa", "aaa", emojiIds),
createdAt = Instant.now(),
visibility = Visibility.PUBLIC,
url = URI.create("https://example.com"),
repostId = null,
replyId = null,
sensitive = false,
apId = URI.create("https://example.com"),
deleted = false,
mediaIds = emptyList(),
actor = actor,
hide = true
)
assertEquals(PostContent.empty.emojiIds, post.emojiIds)
}
@Test
fun `emojiIds hideがfalseの時中身が返される`() {
val actor = TestActorFactory.create()
val emojiIds = listOf(EmojiId(1), EmojiId(2))
val post = Post.create(
id = PostId(1),
actorId = actor.id,
content = PostContent("aaa", "aaa", emojiIds),
createdAt = Instant.now(),
visibility = Visibility.PUBLIC,
url = URI.create("https://example.com"),
repostId = null,
replyId = null,
sensitive = false,
apId = URI.create("https://example.com"),
deleted = false,
mediaIds = emptyList(),
actor = actor,
hide = false
)
assertEquals(emojiIds, post.emojiIds)
}
@Test
fun `reconstructWith 与えた引数で上書きされる`() {
val post = TestPostFactory.create()
val mediaIds = listOf<MediaId>(MediaId(1))
val visibleActors = setOf<ActorId>((ActorId(2)))
val emojis = listOf<EmojiId>(EmojiId(3))
val reconstructWith = post.reconstructWith(mediaIds, emojis, visibleActors)
assertEquals(mediaIds, reconstructWith.mediaIds)
assertEquals(visibleActors, reconstructWith.visibleActors)
assertEquals(emojis, reconstructWith.emojiIds)
}
@Test
fun `mediaIds hideがtrueの時emptyが返される`() {
val actor = TestActorFactory.create()
val emojiIds = listOf(EmojiId(1), EmojiId(2))
val mediaIds = listOf(MediaId(1))
val post = Post.create(
id = PostId(1),
actorId = actor.id,
content = PostContent("aaa", "aaa", emojiIds),
createdAt = Instant.now(),
visibility = Visibility.PUBLIC,
url = URI.create("https://example.com"),
repostId = null,
replyId = null,
sensitive = false,
apId = URI.create("https://example.com"),
deleted = false,
mediaIds = mediaIds,
actor = actor,
hide = true
)
assertEquals(emptyList(), post.mediaIds)
}
@Test
fun `mediaIds hideがfalseの時中身が返される`() {
val actor = TestActorFactory.create()
val emojiIds = listOf(EmojiId(1), EmojiId(2))
val mediaIds = listOf(MediaId(2))
val post = Post.create(
id = PostId(1),
actorId = actor.id,
content = PostContent("aaa", "aaa", emojiIds),
createdAt = Instant.now(),
visibility = Visibility.PUBLIC,
url = URI.create("https://example.com"),
repostId = null,
replyId = null,
sensitive = false,
apId = URI.create("https://example.com"),
deleted = false,
mediaIds = mediaIds,
actor = actor,
hide = false
)
assertEquals(mediaIds, post.mediaIds)
}
@Test
fun `delete deleteイベントが発生する`() {
val actor = TestActorFactory.create()
val post = TestPostFactory.create(deleted = false, actorId = actor.id.id)
post.delete(actor)
assertContainsEvent(post, PostEvent.DELETE.eventName)
}
@Test
fun `delete すでにdeletedがtrueの時deleteイベントは発生しない`() {
val actor = TestActorFactory.create()
val post = TestPostFactory.create(deleted = true, actorId = actor.id.id)
post.delete(actor)
assertEmpty(post)
}
@Test
fun `delete contentがemptyにoverviewがnullにmediaIdsがemptyになる`() {
val actor = TestActorFactory.create()
val post = TestPostFactory.create(deleted = false, actorId = actor.id.id)
post.delete(actor)
assertEquals(PostContent.empty, post.content)
assertNull(post.overview)
assertEquals(emptyList(), post.mediaIds)
assertTrue(post.deleted)
}
@Test
fun `checkUpdate CHECKUPDATEイベントが発生する`() {
val post = TestPostFactory.create()
post.checkUpdate()
assertContainsEvent(post, PostEvent.CHECK_UPDATE.eventName)
}
@Test
fun `restore 指定された引数で再構成されCHECKUPDATEイベントが発生する`() {
val post = TestPostFactory.create(deleted = true)
val postContent = PostContent("aiueo", "aiueo", listOf(EmojiId(1)))
val overview = PostOverview("overview")
val mediaIds = listOf(MediaId(1))
post.restore(
postContent,
overview,
mediaIds
)
assertContainsEvent(post, PostEvent.CHECK_UPDATE.eventName)
assertEquals(postContent, post.content)
assertEquals(overview, post.overview)
assertEquals(mediaIds, post.mediaIds)
}
@Test
fun deletedがfalseの時失敗する() {
val post = TestPostFactory.create(deleted = false)
val postContent = PostContent("aiueo", "aiueo", listOf(EmojiId(1)))
val overview = PostOverview("overview")
val mediaIds = listOf(MediaId(1))
assertThrows<IllegalArgumentException> {
post.restore(
postContent,
overview,
mediaIds
)
}
}
@Test
fun `addMediaIds deletedがtrueの時失敗する`() {
val post = TestPostFactory.create(deleted = true)
val actor = TestActorFactory.create(id = post.actorId.id)
assertThrows<IllegalArgumentException> {
post.addMediaIds(listOf(MediaId(1)), actor)
}
}
@Test
fun `addMediaIds updateイベントが発生する`() {
val post = TestPostFactory.create(deleted = false)
val actor = TestActorFactory.create(id = post.actorId.id)
post.addMediaIds(listOf(MediaId(2)), actor)
assertContainsEvent(post, PostEvent.UPDATE.eventName)
}
@Test
fun `hide hideがtrueになる`() {
val post = TestPostFactory.create(hide = false)
post.hide()
assertTrue(post.hide)
}
@Test
fun `show hideがfalseになる`() {
val post = TestPostFactory.create(hide = true)
post.show()
assertFalse(post.hide)
}
@Test
fun `moveTo すでに設定されている場合は失敗する`() {
val post = TestPostFactory.create(moveTo = 100)
val actor = TestActorFactory.create(post.actorId.id)
assertThrows<IllegalArgumentException> {
post.moveTo(PostId(2), actor)
}
}
@Test
fun `moveTo moveToが設定される`() {
val post = TestPostFactory.create(moveTo = null)
val actor = TestActorFactory.create(post.actorId.id)
assertDoesNotThrow {
post.moveTo(PostId(2), actor)
}
assertEquals(PostId(2), post.moveTo)
}
}

View File

@ -0,0 +1,71 @@
package dev.usbharu.hideout.core.domain.service.actor.local
import dev.usbharu.hideout.core.domain.model.actor.ActorId
import dev.usbharu.hideout.core.domain.model.actor.TestActorFactory
import kotlinx.coroutines.test.runTest
import org.junit.jupiter.api.Assertions.assertInstanceOf
import org.junit.jupiter.api.Test
class LocalActorMigrationCheckDomainServiceImplTest {
@Test
fun 自分自身に引っ越しできない(): Unit = runTest {
val from = TestActorFactory.create()
val to = TestActorFactory.create()
val localActorMigrationCheckDomainServiceImpl = LocalActorMigrationCheckDomainServiceImpl()
val canAccountMigration = localActorMigrationCheckDomainServiceImpl.canAccountMigration(from, from)
assertInstanceOf(AccountMigrationCheck.SelfReferences::class.java, canAccountMigration)
}
@Test
fun 引越し先が引っ越している場合は引っ越しできない(): Unit = runTest {
val from = TestActorFactory.create()
val to = TestActorFactory.create(moveTo = 100)
val localActorMigrationCheckDomainServiceImpl = LocalActorMigrationCheckDomainServiceImpl()
val canAccountMigration = localActorMigrationCheckDomainServiceImpl.canAccountMigration(from, to)
assertInstanceOf(AccountMigrationCheck.AlreadyMoved::class.java, canAccountMigration)
}
@Test
fun 自分自身が引っ越している場合は引っ越しできない() = runTest {
val from = TestActorFactory.create(moveTo = 100)
val to = TestActorFactory.create()
val localActorMigrationCheckDomainServiceImpl = LocalActorMigrationCheckDomainServiceImpl()
val canAccountMigration = localActorMigrationCheckDomainServiceImpl.canAccountMigration(from, to)
assertInstanceOf(AccountMigrationCheck.AlreadyMoved::class.java, canAccountMigration)
}
@Test
fun 引越し先のalsoKnownAsに引越し元が含まれてない場合失敗する() = runTest {
val from = TestActorFactory.create()
val to = TestActorFactory.create(alsoKnownAs = setOf(ActorId(100)))
val localActorMigrationCheckDomainServiceImpl = LocalActorMigrationCheckDomainServiceImpl()
val canAccountMigration = localActorMigrationCheckDomainServiceImpl.canAccountMigration(from, to)
assertInstanceOf(AccountMigrationCheck.AlsoKnownAsNotFound::class.java, canAccountMigration)
}
@Test
fun 正常に設定されている場合は成功する() = runTest {
val from = TestActorFactory.create()
val to = TestActorFactory.create(alsoKnownAs = setOf(from.id, ActorId(100)))
val localActorMigrationCheckDomainServiceImpl = LocalActorMigrationCheckDomainServiceImpl()
val canAccountMigration = localActorMigrationCheckDomainServiceImpl.canAccountMigration(from, to)
assertInstanceOf(AccountMigrationCheck.CanAccountMigration::class.java, canAccountMigration)
}
}