mirror of https://github.com/usbharu/Hideout.git
commit
ab4a346935
|
@ -49,9 +49,9 @@ data class Relationship(
|
||||||
muting = relationship.muting,
|
muting = relationship.muting,
|
||||||
followRequesting = relationship.followRequesting,
|
followRequesting = relationship.followRequesting,
|
||||||
followRequestedBy = relationship2.followRequesting,
|
followRequestedBy = relationship2.followRequesting,
|
||||||
domainBlocking = actorInstanceRelationship.isBlocking(),
|
domainBlocking = actorInstanceRelationship.blocking,
|
||||||
domainMuting = actorInstanceRelationship.isMuting(),
|
domainMuting = actorInstanceRelationship.muting,
|
||||||
domainDoNotSendPrivate = actorInstanceRelationship.isDoNotSendPrivate()
|
domainDoNotSendPrivate = actorInstanceRelationship.doNotSendPrivate
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,9 +34,9 @@ class ActorInstanceRelationshipEventBody(actorInstanceRelationship: ActorInstanc
|
||||||
mapOf(
|
mapOf(
|
||||||
"actorId" to actorInstanceRelationship.actorId,
|
"actorId" to actorInstanceRelationship.actorId,
|
||||||
"instanceId" to actorInstanceRelationship.instanceId,
|
"instanceId" to actorInstanceRelationship.instanceId,
|
||||||
"muting" to actorInstanceRelationship.isMuting(),
|
"muting" to actorInstanceRelationship.muting,
|
||||||
"blocking" to actorInstanceRelationship.isBlocking(),
|
"blocking" to actorInstanceRelationship.blocking,
|
||||||
"doNotSendPrivate" to actorInstanceRelationship.isDoNotSendPrivate(),
|
"doNotSendPrivate" to actorInstanceRelationship.doNotSendPrivate,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -79,7 +79,7 @@ class Actor(
|
||||||
private set
|
private set
|
||||||
|
|
||||||
fun setRole(roles: Set<Role>, actor: Actor) {
|
fun setRole(roles: Set<Role>, actor: Actor) {
|
||||||
require(actor.roles.contains(Role.ADMINISTRATOR).not())
|
require(actor.roles.contains(Role.ADMINISTRATOR))
|
||||||
|
|
||||||
this.roles = roles
|
this.roles = roles
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,4 +17,8 @@
|
||||||
package dev.usbharu.hideout.core.domain.model.actor
|
package dev.usbharu.hideout.core.domain.model.actor
|
||||||
|
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class ActorKeyId(val keyId: String)
|
value class ActorKeyId(val keyId: String) {
|
||||||
|
init {
|
||||||
|
require(keyId.isNotBlank())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -17,5 +17,8 @@
|
||||||
package dev.usbharu.hideout.core.domain.model.actor
|
package dev.usbharu.hideout.core.domain.model.actor
|
||||||
|
|
||||||
enum class Role {
|
enum class Role {
|
||||||
LOCAL, MODERATOR, ADMINISTRATOR, REMOTE
|
LOCAL,
|
||||||
|
MODERATOR,
|
||||||
|
ADMINISTRATOR,
|
||||||
|
REMOTE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.model.instance.InstanceId
|
||||||
import dev.usbharu.hideout.core.domain.shared.domainevent.DomainEventStorable
|
import dev.usbharu.hideout.core.domain.shared.domainevent.DomainEventStorable
|
||||||
|
|
||||||
data class ActorInstanceRelationship(
|
class ActorInstanceRelationship(
|
||||||
val actorId: ActorId,
|
val actorId: ActorId,
|
||||||
val instanceId: InstanceId,
|
val instanceId: InstanceId,
|
||||||
private var blocking: Boolean = false,
|
blocking: Boolean = false,
|
||||||
private var muting: Boolean = false,
|
muting: Boolean = false,
|
||||||
private var doNotSendPrivate: Boolean = false,
|
doNotSendPrivate: Boolean = false,
|
||||||
) : DomainEventStorable() {
|
) : DomainEventStorable() {
|
||||||
|
var doNotSendPrivate = doNotSendPrivate
|
||||||
|
private set
|
||||||
|
var muting = muting
|
||||||
|
private set
|
||||||
|
var blocking = blocking
|
||||||
|
private set
|
||||||
|
|
||||||
fun block(): ActorInstanceRelationship {
|
fun block(): ActorInstanceRelationship {
|
||||||
addDomainEvent(ActorInstanceRelationshipDomainEventFactory(this).createEvent(BLOCK))
|
addDomainEvent(ActorInstanceRelationshipDomainEventFactory(this).createEvent(BLOCK))
|
||||||
blocking = true
|
blocking = true
|
||||||
|
@ -62,12 +69,6 @@ data class ActorInstanceRelationship(
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isBlocking() = blocking
|
|
||||||
|
|
||||||
fun isMuting() = muting
|
|
||||||
|
|
||||||
fun isDoNotSendPrivate() = doNotSendPrivate
|
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
if (this === other) return true
|
if (this === other) return true
|
||||||
if (javaClass != other?.javaClass) return false
|
if (javaClass != other?.javaClass) return false
|
||||||
|
|
|
@ -17,4 +17,8 @@
|
||||||
package dev.usbharu.hideout.core.domain.model.application
|
package dev.usbharu.hideout.core.domain.model.application
|
||||||
|
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class ApplicationId(val id: Long)
|
value class ApplicationId(val id: Long) {
|
||||||
|
init {
|
||||||
|
require(0 <= id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -17,4 +17,12 @@
|
||||||
package dev.usbharu.hideout.core.domain.model.application
|
package dev.usbharu.hideout.core.domain.model.application
|
||||||
|
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class ApplicationName(val name: String)
|
value class ApplicationName(val name: String) {
|
||||||
|
init {
|
||||||
|
require(name.length <= LENGTH)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val LENGTH = 300
|
||||||
|
}
|
||||||
|
}
|
|
@ -17,4 +17,8 @@
|
||||||
package dev.usbharu.hideout.core.domain.model.emoji
|
package dev.usbharu.hideout.core.domain.model.emoji
|
||||||
|
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class EmojiId(val emojiId: Long)
|
value class EmojiId(val emojiId: Long) {
|
||||||
|
init {
|
||||||
|
require(0 <= emojiId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -21,6 +21,11 @@ class Filter(
|
||||||
this.filterKeywords = filterKeywords
|
this.filterKeywords = filterKeywords
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* フィルターを正規表現として表現したものを返します
|
||||||
|
*
|
||||||
|
* @return フィルターの正規表現
|
||||||
|
*/
|
||||||
fun compileFilter(): Regex {
|
fun compileFilter(): Regex {
|
||||||
val words = mutableListOf<String>()
|
val words = mutableListOf<String>()
|
||||||
val wholeWords = mutableListOf<String>()
|
val wholeWords = mutableListOf<String>()
|
||||||
|
@ -33,10 +38,11 @@ class Filter(
|
||||||
NONE -> words.add(filterKeyword.keyword.keyword)
|
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)
|
return listOfNotNull(wholeWordsRegex, noneWordsRegex, regex).joinToString("|").toRegex()
|
||||||
.joinToString("|")
|
|
||||||
.toRegex()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun reconstructWith(filterKeywords: Set<FilterKeyword>): Filter {
|
fun reconstructWith(filterKeywords: Set<FilterKeyword>): Filter {
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
package dev.usbharu.hideout.core.domain.model.filter
|
package dev.usbharu.hideout.core.domain.model.filter
|
||||||
|
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class FilterId(val id: Long)
|
value class FilterId(val id: Long) {
|
||||||
|
init {
|
||||||
|
require(0 <= id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,4 +1,12 @@
|
||||||
package dev.usbharu.hideout.core.domain.model.filter
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -184,6 +184,7 @@ class Post(
|
||||||
}
|
}
|
||||||
|
|
||||||
fun restore(content: PostContent, overview: PostOverview?, mediaIds: List<MediaId>) {
|
fun restore(content: PostContent, overview: PostOverview?, mediaIds: List<MediaId>) {
|
||||||
|
require(deleted)
|
||||||
deleted = false
|
deleted = false
|
||||||
this.content = content
|
this.content = content
|
||||||
this.overview = overview
|
this.overview = overview
|
||||||
|
@ -298,9 +299,6 @@ class Post(
|
||||||
fun isAllow(actor: Actor, action: Action, resource: Post): Boolean {
|
fun isAllow(actor: Actor, action: Action, resource: Post): Boolean {
|
||||||
return when (action) {
|
return when (action) {
|
||||||
UPDATE -> {
|
UPDATE -> {
|
||||||
if (actor.deleted) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
resource.actorId == actor.id || actor.roles.contains(Role.ADMINISTRATOR) || actor.roles.contains(
|
resource.actorId == actor.id || actor.roles.contains(Role.ADMINISTRATOR) || actor.roles.contains(
|
||||||
Role.MODERATOR
|
Role.MODERATOR
|
||||||
)
|
)
|
||||||
|
|
|
@ -34,7 +34,7 @@ class LocalActorMigrationCheckDomainServiceImpl : LocalActorMigrationCheckDomain
|
||||||
return AccountMigrationCheck.AlreadyMoved("${from.name}@${from.domain} was move to ${from.moveTo}")
|
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}")
|
return AccountMigrationCheck.AlsoKnownAsNotFound("${to.id} has ${to.alsoKnownAs}")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,9 +41,9 @@ class ExposedActorInstanceRelationshipRepository(override val domainEventPublish
|
||||||
ActorInstanceRelationships.upsert {
|
ActorInstanceRelationships.upsert {
|
||||||
it[actorId] = actorInstanceRelationship.actorId.id
|
it[actorId] = actorInstanceRelationship.actorId.id
|
||||||
it[instanceId] = actorInstanceRelationship.instanceId.instanceId
|
it[instanceId] = actorInstanceRelationship.instanceId.instanceId
|
||||||
it[blocking] = actorInstanceRelationship.isBlocking()
|
it[blocking] = actorInstanceRelationship.blocking
|
||||||
it[muting] = actorInstanceRelationship.isMuting()
|
it[muting] = actorInstanceRelationship.muting
|
||||||
it[doNotSendPrivate] = actorInstanceRelationship.isDoNotSendPrivate()
|
it[doNotSendPrivate] = actorInstanceRelationship.doNotSendPrivate
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
update(actorInstanceRelationship)
|
update(actorInstanceRelationship)
|
||||||
|
|
|
@ -19,7 +19,6 @@ package dev.usbharu.hideout
|
||||||
import com.fasterxml.jackson.module.kotlin.isKotlinClass
|
import com.fasterxml.jackson.module.kotlin.isKotlinClass
|
||||||
import com.jparams.verifier.tostring.ToStringVerifier
|
import com.jparams.verifier.tostring.ToStringVerifier
|
||||||
import com.jparams.verifier.tostring.preset.Presets
|
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.EqualsVerifier
|
||||||
import nl.jqno.equalsverifier.Warning
|
import nl.jqno.equalsverifier.Warning
|
||||||
import nl.jqno.equalsverifier.internal.reflection.PackageScanner
|
import nl.jqno.equalsverifier.internal.reflection.PackageScanner
|
||||||
|
@ -115,7 +114,6 @@ class EqualsAndToStringTest {
|
||||||
.filterNot {
|
.filterNot {
|
||||||
it.superclass.isSealed
|
it.superclass.isSealed
|
||||||
}
|
}
|
||||||
.filterNot { it == UnicodeEmoji::class.java }
|
|
||||||
.map {
|
.map {
|
||||||
|
|
||||||
dynamicTest(it.name) {
|
dynamicTest(it.name) {
|
||||||
|
|
|
@ -1,3 +1,13 @@
|
||||||
package dev.usbharu.hideout.core.domain.model.actor
|
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)
|
||||||
|
}
|
||||||
|
}
|
|
@ -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")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,3 +1,18 @@
|
||||||
package dev.usbharu.hideout.core.domain.model.actor
|
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)
|
||||||
|
}
|
||||||
|
}
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,9 @@
|
||||||
package dev.usbharu.hideout.core.domain.model.actor
|
package dev.usbharu.hideout.core.domain.model.actor
|
||||||
|
|
||||||
import dev.usbharu.hideout.core.domain.event.actor.ActorEvent
|
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.Test
|
||||||
|
import org.junit.jupiter.api.assertDoesNotThrow
|
||||||
import org.junit.jupiter.api.assertThrows
|
import org.junit.jupiter.api.assertThrows
|
||||||
import utils.AssertDomainEvent.assertContainsEvent
|
import utils.AssertDomainEvent.assertContainsEvent
|
||||||
import utils.AssertDomainEvent.assertEmpty
|
import utils.AssertDomainEvent.assertEmpty
|
||||||
|
@ -127,4 +129,44 @@ class ActorsTest {
|
||||||
|
|
||||||
assertContainsEvent(actor, ActorEvent.CHECK_UPDATE.eventName)
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -34,9 +34,10 @@ object TestActorFactory {
|
||||||
lastPostDate: Instant? = null,
|
lastPostDate: Instant? = null,
|
||||||
suspend: Boolean = false,
|
suspend: Boolean = false,
|
||||||
alsoKnownAs: Set<ActorId> = emptySet(),
|
alsoKnownAs: Set<ActorId> = emptySet(),
|
||||||
moveTo: ActorId? = null,
|
moveTo: Long? = null,
|
||||||
emojiIds: Set<EmojiId> = emptySet(),
|
emojiIds: Set<EmojiId> = emptySet(),
|
||||||
deleted: Boolean = false,
|
deleted: Boolean = false,
|
||||||
|
roles: Set<Role> = emptySet(),
|
||||||
): Actor {
|
): Actor {
|
||||||
return runBlocking {
|
return runBlocking {
|
||||||
Actor(
|
Actor(
|
||||||
|
@ -62,12 +63,13 @@ object TestActorFactory {
|
||||||
lastPostAt = lastPostDate,
|
lastPostAt = lastPostDate,
|
||||||
suspend = suspend,
|
suspend = suspend,
|
||||||
alsoKnownAs = alsoKnownAs,
|
alsoKnownAs = alsoKnownAs,
|
||||||
moveTo = moveTo,
|
moveTo = moveTo?.let { ActorId(it) },
|
||||||
emojiIds = emojiIds,
|
emojiIds = emojiIds,
|
||||||
deleted = deleted,
|
deleted = deleted,
|
||||||
roles = emptySet(),
|
roles = roles,
|
||||||
icon = null,
|
icon = null,
|
||||||
banner = null
|
banner = null,
|
||||||
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
|
@ -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)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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.ActorId
|
||||||
import dev.usbharu.hideout.core.domain.model.actor.ActorPublicKey
|
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.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.Test
|
||||||
import org.junit.jupiter.api.assertDoesNotThrow
|
import org.junit.jupiter.api.assertDoesNotThrow
|
||||||
import org.junit.jupiter.api.assertThrows
|
import org.junit.jupiter.api.assertThrows
|
||||||
import utils.AssertDomainEvent.assertContainsEvent
|
import utils.AssertDomainEvent.assertContainsEvent
|
||||||
import utils.AssertDomainEvent.assertEmpty
|
import utils.AssertDomainEvent.assertEmpty
|
||||||
|
import java.net.URI
|
||||||
|
import java.time.Instant
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
|
import kotlin.test.assertFalse
|
||||||
import kotlin.test.assertNull
|
import kotlin.test.assertNull
|
||||||
|
|
||||||
class PostTest {
|
class PostTest {
|
||||||
|
@ -260,5 +266,422 @@ class PostTest {
|
||||||
assertEmpty(post)
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue