2
0

AbsoluteFileTest.kt 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. /*
  2. * Copyright 2019-2023 Mamoe Technologies and contributors.
  3. *
  4. * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
  5. * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
  6. *
  7. * https://github.com/mamoe/mirai/blob/dev/LICENSE
  8. */
  9. package net.mamoe.mirai.mock.test
  10. import com.google.common.jimfs.Configuration
  11. import com.google.common.jimfs.Jimfs
  12. import kotlinx.coroutines.flow.count
  13. import kotlinx.coroutines.flow.first
  14. import kotlinx.coroutines.flow.firstOrNull
  15. import kotlinx.coroutines.flow.toList
  16. import net.mamoe.mirai.contact.MemberPermission
  17. import net.mamoe.mirai.event.events.GroupMessageEvent
  18. import net.mamoe.mirai.message.data.FileMessage
  19. import net.mamoe.mirai.mock.internal.contact.mockUploadAudio
  20. import net.mamoe.mirai.mock.internal.remotefile.absolutefile.MockRemoteFiles
  21. import net.mamoe.mirai.mock.internal.serverfs.MockServerFileSystemImpl
  22. import net.mamoe.mirai.mock.utils.simpleMemberInfo
  23. import net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource
  24. import net.mamoe.mirai.utils.cast
  25. import net.mamoe.mirai.utils.md5
  26. import net.mamoe.mirai.utils.runBIO
  27. import org.junit.jupiter.api.AfterEach
  28. import org.junit.jupiter.api.Test
  29. import java.nio.file.FileSystem
  30. import kotlin.test.assertContentEquals
  31. import kotlin.test.assertEquals
  32. import kotlin.test.assertNotEquals
  33. internal class AbsoluteFileTest : MockBotTestBase() {
  34. private val tmpfs: FileSystem = Jimfs.newFileSystem(Configuration.unix())
  35. private val disk = bot.tmpResourceServer.mockServerFileDisk
  36. private val group = bot.addGroup(11L, "a").also { println(it.owner) }
  37. private val fsys = MockServerFileSystemImpl(disk.cast())
  38. private val files = MockRemoteFiles(group, fsys)
  39. @AfterEach
  40. internal fun release() {
  41. tmpfs.close()
  42. }
  43. @Test
  44. internal fun listFileAndFolder() = runTest {
  45. val folder = files.root.createFolder("test1")
  46. files.root.createFolder("test2")
  47. val file = folder.uploadNewFile("test.txt", "cc".toByteArray().toExternalResource().toAutoCloseable())
  48. folder.uploadNewFile("test.txt", "cac".toByteArray().toExternalResource().toAutoCloseable())
  49. println(files.root.folders().toList())
  50. println(files.root.resolveFolder("test1")!!.files().toList())
  51. assertEquals(2, files.root.folders().toList().size)
  52. assertEquals(2, files.root.resolveFolder("test1")!!.files().toList().size)
  53. assertEquals("test.txt", files.root.resolveFolder("test1")!!.files().toList()[0].name)
  54. assertEquals("test1", files.root.resolveFolderById(folder.id)!!.name)
  55. assertEquals("test.txt", files.root.resolveFileById(file.id, true)!!.name)
  56. }
  57. @Test
  58. internal fun testDeleteAndMoveTo() = runTest {
  59. val f = files.root.createFolder("test")
  60. val ff = f.uploadNewFile("test.txt", "ccc".toByteArray().toExternalResource())
  61. val fff = files.root.resolveFileById(ff.id, true)!!
  62. assertEquals(fff, ff)
  63. f.renameTo("test2")
  64. assertEquals("test2", files.root.folders().first().name)
  65. fff.refresh()
  66. assertEquals(f.absolutePath + "/" + fff.name, fff.absolutePath)
  67. fff.moveTo(files.root)
  68. assertEquals("/${fff.name}", fff.absolutePath)
  69. assertEquals(files.root, fff.parent)
  70. fff.delete()
  71. assertEquals(false, fff.exists())
  72. assertEquals(null, files.root.resolveFileById(fff.id))
  73. }
  74. @Test
  75. internal fun testSendAndDownload() = runTest {
  76. val f = files.root.uploadNewFile("test.txt", "c".toByteArray().toExternalResource())
  77. println(files.fileSystem.findByPath("/test.txt").first().path)
  78. runAndReceiveEventBroadcast {
  79. group.addMember(simpleMemberInfo(222, "bb", permission = MemberPermission.MEMBER))
  80. .saysMessage { f.toMessage() }
  81. }.let { events ->
  82. assertEquals(1, events.size)
  83. assertEquals(true, events[0].cast<GroupMessageEvent>().message.contains(FileMessage))
  84. }
  85. assertEquals("c", f.getUrl()!!.toUrl().readText())
  86. }
  87. @Test
  88. fun testRename() = runTest {
  89. val folder = files.root.createFolder("test1")
  90. val file = folder.uploadNewFile("test.txt", "content".toByteArray().toExternalResource().toAutoCloseable())
  91. assertEquals(file.id, folder.resolveFiles("test.txt").first().id)
  92. folder.renameTo("test2")
  93. file.refresh()
  94. assertEquals(true, file.exists())
  95. assertNotEquals(null, folder.resolveFiles("test.txt").firstOrNull())
  96. }
  97. @Test
  98. fun testMD5() = runTest {
  99. val bytes = "test".toByteArray()
  100. val file = bytes.toExternalResource().use { res ->
  101. files.root.uploadNewFile("/test.txt", res)
  102. }
  103. assertContentEquals(bytes.md5(), file.md5)
  104. }
  105. @Test
  106. fun testMD5WithResolve() = runTest {
  107. val bytes = "test".toByteArray()
  108. bytes.toExternalResource().use { res ->
  109. files.root.uploadNewFile("/test.txt", res)
  110. }
  111. val file = files.root.resolveFiles("/test.txt").toList()
  112. assertEquals(1, file.size)
  113. assertContentEquals(bytes.md5(), file[0].md5)
  114. }
  115. @Test
  116. fun testMD5WithIDResolve() = runTest {
  117. val bytes = "test".toByteArray()
  118. val absFile = bytes.toExternalResource().use { res ->
  119. files.root.uploadNewFile("/test.txt", res)
  120. }
  121. val file = files.root.resolveFileById(absFile.id, true)!!
  122. assertContentEquals(bytes.md5(), file.md5)
  123. }
  124. @Test
  125. fun testResolveFiles() = runTest {
  126. val file = runBIO {
  127. kotlin.io.path.createTempFile("test", ".txt").toFile().apply {
  128. writeText("test")
  129. deleteOnExit()
  130. }
  131. }
  132. file.toExternalResource().use {
  133. group.files.root.uploadNewFile("/a/test.txt", it)
  134. }
  135. assertEquals(0, group.files.root.resolveFiles("/a").count())
  136. }
  137. @Test
  138. @Suppress("INVISIBLE_REFERENCE")
  139. fun testMockUploadAudio() = runTest {
  140. val file = runBIO {
  141. kotlin.io.path.createTempFile("test", ".txt").toFile().apply {
  142. writeText("test")
  143. deleteOnExit()
  144. }
  145. }
  146. file.toExternalResource().use {
  147. assertIsInstance<net.mamoe.mirai.internal.utils.ExternalResourceImplByFile>(it)
  148. it.mockUploadAudio(bot)
  149. }
  150. }
  151. }