[Mock] Support image isUploaded (#2582)

* finish image mock isUploaded

* typo

* move MockService register

* update implement

* chore: format

* suppress remove redundant qualifier name

* format
This commit is contained in:
Eritque arcus 2023-03-25 10:46:58 -04:00 committed by GitHub
parent 0f1bddcb24
commit 48db1a022f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 72 additions and 4 deletions

View File

@ -29,10 +29,7 @@ import net.mamoe.mirai.mock.MockBotFactory
import net.mamoe.mirai.mock.contact.MockGroup
import net.mamoe.mirai.mock.database.queryMessageInfo
import net.mamoe.mirai.mock.database.removeMessageInfo
import net.mamoe.mirai.mock.internal.contact.AQQ_RECALL_FAILED_MESSAGE
import net.mamoe.mirai.mock.internal.contact.MockFriendImpl
import net.mamoe.mirai.mock.internal.contact.MockImage
import net.mamoe.mirai.mock.internal.contact.MockStrangerImpl
import net.mamoe.mirai.mock.internal.contact.*
import net.mamoe.mirai.mock.internal.msgsrc.registerMockMsgSerializers
import net.mamoe.mirai.mock.utils.mock
import net.mamoe.mirai.mock.utils.simpleMemberInfo
@ -42,6 +39,7 @@ internal class MockMiraiImpl : MiraiImpl() {
companion object {
init {
registerMockMsgSerializers()
registerMockServices()
}
}

View File

@ -13,6 +13,7 @@ package net.mamoe.mirai.mock.internal.contact
import kotlinx.serialization.Serializable
import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.Contact
import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.contact.Member
import net.mamoe.mirai.contact.PermissionDeniedException
@ -26,6 +27,7 @@ import net.mamoe.mirai.mock.utils.mock
import net.mamoe.mirai.mock.utils.plusHttpSubpath
import net.mamoe.mirai.utils.ExternalResource
import net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource
import net.mamoe.mirai.utils.Services
import net.mamoe.mirai.utils.cast
import net.mamoe.mirai.utils.toUHexString
@ -155,3 +157,35 @@ internal class MockImage(
return this.imageId == other.imageId
}
}
internal object MockInternalImageProtocolImpl : InternalImageProtocol {
override fun createImage(
imageId: String,
size: Long,
type: ImageType,
width: Int,
height: Int,
isEmoji: Boolean
): Image = MockImage(imageId, "images/" + imageId.substring(1..36), width, height, size, type)
override suspend fun isUploaded(
bot: Bot,
md5: ByteArray,
size: Long,
context: Contact?,
type: ImageType,
width: Int,
height: Int
): Boolean = bot.cast<MockBot>().tmpResourceServer.isImageUploaded(md5, size)
}
internal fun registerMockServices() {
Services.registerAsOverride(
Services.qualifiedNameOrFail(InternalImageProtocol::class),
"net.mamoe.mirai.mock.internal.contact.MockInternalImageProtocolImpl"
) {
MockInternalImageProtocolImpl
}
}

View File

@ -21,6 +21,7 @@ import java.net.ServerSocket
import java.net.URI
import java.net.URLDecoder
import java.net.URLEncoder
import java.nio.file.Files
import java.nio.file.Path
import kotlin.io.path.*
@ -65,6 +66,15 @@ internal class TmpResourceServerImpl(
}
}
override fun isImageUploaded(md5: ByteArray, size: Long): Boolean {
val img = images.resolve(generateUUID(md5))
if (img.exists()) {
return Files.size(img) == size
}
return false
}
override suspend fun uploadResourceAsImage(resource: ExternalResource): URI {
val imgId = generateUUID(resource.md5)
val resId = uploadResource(resource)

View File

@ -47,6 +47,11 @@ public interface TmpResourceServer : Closeable {
* @return 图片的 http 链接
*/
public suspend fun uploadResourceAsImage(resource: ExternalResource): URI
/**
* 通过图片 md5 size 判断图片是否已经上传
*/
public fun isImageUploaded(md5: ByteArray, size: Long): Boolean
public suspend fun uploadResourceAndGetUrl(resource: ExternalResource): String {
return resolveHttpUrl(uploadResource(resource)).toString()
}

View File

@ -11,15 +11,18 @@ package net.mamoe.mirai.mock.test
import kotlinx.coroutines.runBlocking
import net.mamoe.mirai.message.data.Image
import net.mamoe.mirai.message.data.Image.Key.isUploaded
import net.mamoe.mirai.message.data.Image.Key.queryUrl
import net.mamoe.mirai.mock.MockBotFactory
import net.mamoe.mirai.mock.utils.randomImageContent
import net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource
import net.mamoe.mirai.utils.getRandomByteArray
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.TestInstance
import java.net.URL
import kotlin.test.assertEquals
import kotlin.test.assertFalse
import kotlin.test.assertNotEquals
import kotlin.test.assertTrue
@ -56,4 +59,22 @@ internal class ImageUploadTest {
assertEquals(img1, img2)
}
}
@Test
fun testImageIsUploaded(): Unit = runBlocking {
val img = Image.randomImageContent().toExternalResource().use { imgData ->
bot.asFriend.uploadImage(imgData)
}
assertTrue { img.isUploaded(bot) }
}
@Test
@Suppress("RemoveRedundantQualifierName")
fun testImageIsUploadedNotTrue(): Unit = runBlocking {
assertFalse { Image.isUploaded(bot, getRandomByteArray(16), 10) }
val img = Image.randomImageContent().toExternalResource().use { imgData ->
bot.asFriend.uploadImage(imgData)
}
assertFalse { Image.isUploaded(bot, img.md5, img.size + 5) }
}
}