Explorar el Código

Fix test case

ryoii hace 3 años
padre
commit
f1027ed3a6

+ 6 - 0
mirai-api-http/build.gradle.kts

@@ -9,6 +9,11 @@ plugins {
 }
 
 val ktorVersion: String by rootProject.extra
+val miraiVersion: String by lazy {
+    rootProject.buildscript.configurations.getByName("classpath").dependencies
+        .first { it.name == "net.mamoe.mirai-console.gradle.plugin" }
+        .version!!
+}
 
 dependencies {
 
@@ -29,6 +34,7 @@ dependencies {
 
     // test
     testImplementation("net.mamoe.yamlkt:yamlkt:0.12.0")
+    testImplementation("net.mamoe:mirai-core-mock:$miraiVersion")
     testImplementation("org.slf4j:slf4j-simple:1.7.32")
     testImplementation(kotlin("test-junit5"))
     ktorTest("server-test-host")

+ 0 - 2
mirai-api-http/src/test/kotlin/test/core/mirai/RunMirai.kt → mirai-api-http/src/test/kotlin/RunMirai.kt

@@ -7,8 +7,6 @@
  * https://github.com/mamoe/mirai/blob/master/LICENSE
  */
 
-package test.core.mirai
-
 import kotlinx.coroutines.runBlocking
 import net.mamoe.mirai.api.http.HttpApiPluginBase
 import net.mamoe.mirai.console.MiraiConsole

+ 20 - 12
mirai-api-http/src/test/kotlin/net/mamoe/mirai/api/http/request/env/enviroment.kt → mirai-api-http/src/test/kotlin/net/mamoe/mirai/api/http/request/environment.kt

@@ -7,14 +7,16 @@
  * https://github.com/mamoe/mirai/blob/master/LICENSE
  */
 
-package net.mamoe.mirai.api.http.request.env
+package net.mamoe.mirai.api.http.request
 
 import io.ktor.client.*
 import io.ktor.client.engine.okhttp.*
 import io.ktor.client.plugins.websocket.*
 import io.ktor.client.request.*
 import io.ktor.client.statement.*
+import io.ktor.server.testing.*
 import io.ktor.util.*
+import io.ktor.websocket.*
 import kotlinx.coroutines.runBlocking
 import net.mamoe.mirai.api.http.MahPluginImpl
 import net.mamoe.mirai.api.http.adapter.MahAdapter
@@ -89,7 +91,7 @@ internal class AdapterOperation(val port: Int) {
 
 
     private val client by lazy { HttpClient(OkHttp) }
-    private val wsClient by lazy { HttpClient(OkHttp) { install(WebSockets) }}
+    private val wsClient by lazy { HttpClient(OkHttp) { install(WebSockets) } }
 
     suspend inline fun <reified T : DTO> get(path: String, query: Map<String, String> = emptyMap()): T {
         val content = client.get(path) {
@@ -107,21 +109,27 @@ internal class AdapterOperation(val port: Int) {
         return context.jsonParseOrNull()!!
     }
 
-    inline fun <reified T : DTO>wsConnect(query: Map<String, String>): T? {
-        var ret: WsOutgoing? = null
-        runBlocking {
+    fun <R> wsConnect(query: Map<String, String>, operation: suspend WsAdapterOperation.() -> R): R {
+        return runBlocking {
+            var ret: R? = null
             wsClient.ws({
                 url("ws", "localhost", [email protected], "all")
-                query.forEach { (k, v) -> parameter(k ,v) }
+                query.forEach { (k, v) -> parameter(k, v) }
             }) {
-                val frame = incoming.receive()
-                val content = String(frame.data)
-                // println(content)
-                ret = content.jsonParseOrNull()
-                return@ws
+                ret = operation.invoke(WsAdapterOperation(this))
             }
+            return@runBlocking ret!!
         }
-        return ret?.data?.jsonElementParseOrNull()
+    }
+}
+
+internal class WsAdapterOperation(val session: WebSocketSession) {
+
+    suspend inline fun <reified T : DTO> receiveDTO(): T? {
+        val frame = session.incoming.receive()
+        val content = String(frame.data)
+        val pkg: WsOutgoing? = content.jsonParseOrNull()
+        return pkg?.data?.jsonElementParseOrNull()
     }
 }
 

+ 21 - 22
mirai-api-http/src/test/kotlin/net/mamoe/mirai/api/http/request/http/HttpAuthTest.kt

@@ -15,12 +15,11 @@ import net.mamoe.mirai.api.http.adapter.internal.dto.*
 import net.mamoe.mirai.api.http.adapter.internal.serializer.jsonElementParseOrNull
 import net.mamoe.mirai.api.http.adapter.internal.serializer.toJson
 import net.mamoe.mirai.api.http.context.MahContext
-import net.mamoe.mirai.api.http.request.env.AdapterOperation
-import net.mamoe.mirai.api.http.request.env.startAdapter
-import test.core.annotation.ExtendWith
-import test.core.extenssion.SetupBotMock
-import test.core.mock.BotMockStub
-import test.core.mock.withSession
+import net.mamoe.mirai.api.http.request.AdapterOperation
+import net.mamoe.mirai.api.http.request.startAdapter
+import net.mamoe.mirai.api.http.util.ExtendWith
+import net.mamoe.mirai.api.http.util.SetupMockBot
+import net.mamoe.mirai.api.http.util.withSession
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertNotNull
@@ -28,7 +27,7 @@ import kotlin.test.assertNotNull
 /**
  * 测试 Session 在不同情况下的正确性
  */
-@ExtendWith(SetupBotMock::class)
+@ExtendWith(SetupMockBot::class)
 class HttpAuthTest {
 
     private val verifyKey = "session test"
@@ -48,7 +47,7 @@ class HttpAuthTest {
         debug = false,
     ) {
         // 单例 session 未认证
-        testAction(null, StateCode.NotVerifySession)
+        getSessionInfoAndExpect(null, StateCode.NotVerifySession)
 
         val data = VerifyDTO("wrong $verifyKey").toJson()
         val ret = post<StateCode>(verifyPath, data)
@@ -58,7 +57,7 @@ class HttpAuthTest {
         val correctRet = post<VerifyRetDTO>(Paths.httpPath("verify"), correctData)
         assertEquals(StateCode.Success.code, correctRet.code)
 
-        testAction(null)
+        getSessionInfoAndExpect(null)
     }
 
     /**
@@ -72,7 +71,7 @@ class HttpAuthTest {
         debug = false,
     ) {
         // 无需认证的单例 session 模式可以直接访问
-        testAction(null)
+        getSessionInfoAndExpect(null)
 
         val data = VerifyDTO(verifyKey).toJson()
         val ret = post<VerifyRetDTO>(verifyPath, data)
@@ -82,7 +81,7 @@ class HttpAuthTest {
         val wrongRet = post<VerifyRetDTO>(verifyPath, wrongData)
         assertEquals(StateCode.Success.code, wrongRet.code)
 
-        testAction(null)
+        getSessionInfoAndExpect(null)
     }
 
     /**
@@ -96,7 +95,7 @@ class HttpAuthTest {
         debug = false,
     ) {
         // 非单例 session 模式下,出现找不到 session 异常
-        testAction("nonexistent session", StateCode.IllegalSession)
+        getSessionInfoAndExpect("nonexistent session", StateCode.IllegalSession)
 
         var data = VerifyDTO("wrong $verifyKey").toJson()
         val wrongRet = post<StateCode>(verifyPath, data)
@@ -108,18 +107,18 @@ class HttpAuthTest {
         assertNotNull(verifyRet.session)
 
         // 认证但未绑定
-        testAction(verifyRet.session, errorState = StateCode.NotVerifySession)
+        getSessionInfoAndExpect(verifyRet.session, errorState = StateCode.NotVerifySession)
 
         // use session to bind
-        data = BindDTO(BotMockStub.ID).toJson()
+        data = BindDTO(SetupMockBot.ID).toJson()
         var bindRet: StateCode = post(bindPath, data)
         assertEquals(StateCode.IllegalSession.code, bindRet.code)
 
-        data = BindDTO(BotMockStub.ID).withSession(verifyRet.session).toJson()
+        data = BindDTO(SetupMockBot.ID).withSession(verifyRet.session).toJson()
         bindRet = post(bindPath, data)
         assertEquals(StateCode.Success.code, bindRet.code)
 
-        testAction(verifyRet.session)
+        getSessionInfoAndExpect(verifyRet.session)
     }
 
     @Test
@@ -130,7 +129,7 @@ class HttpAuthTest {
         debug = false,
     ) {
         // 非单例 session 模式下,出现找不到 session 异常
-        testAction("nonexistent session", StateCode.IllegalSession)
+        getSessionInfoAndExpect("nonexistent session", StateCode.IllegalSession)
 
         // 无需认证key,但仍需要通过认证接口获取 session
         var data = VerifyDTO("Arbitrary $verifyKey").toJson()
@@ -139,17 +138,17 @@ class HttpAuthTest {
         assertNotNull(verifyRet.session)
 
         // 认证但未绑定
-        testAction(verifyRet.session, errorState = StateCode.NotVerifySession)
+        getSessionInfoAndExpect(verifyRet.session, errorState = StateCode.NotVerifySession)
 
         // use session to bind
-        data = BindDTO(BotMockStub.ID).withSession(verifyRet.session).toJson()
+        data = BindDTO(SetupMockBot.ID).withSession(verifyRet.session).toJson()
         val bindRet = post<StateCode>(bindPath, data)
         assertEquals(StateCode.Success.code, bindRet.code)
 
-        testAction(verifyRet.session)
+        getSessionInfoAndExpect(verifyRet.session)
     }
 
-    private suspend fun AdapterOperation.testAction(sessionKey: String?, errorState: StateCode? = null) {
+    private suspend fun AdapterOperation.getSessionInfoAndExpect(sessionKey: String?, errorState: StateCode? = null) {
         val query = sessionKey?.let {
             mapOf("sessionKey" to it)
         } ?: emptyMap()
@@ -159,7 +158,7 @@ class HttpAuthTest {
                 .data.jsonElementParseOrNull<SessionDTO>()
             assertNotNull(ret)
             assertEquals(sessionKey ?: MahContext.SINGLE_SESSION_KEY, ret.sessionKey)
-            assertEquals(BotMockStub.ID, ret.qq.id)
+            assertEquals(SetupMockBot.ID, ret.qq.id)
         } else {
             val ret = get<StateCode>(action, query)
             assertEquals(errorState.code, ret.code)

+ 8 - 8
mirai-api-http/src/test/kotlin/net/mamoe/mirai/api/http/request/http/HttpSessionLifeCycle.kt

@@ -18,14 +18,14 @@ import net.mamoe.mirai.api.http.adapter.internal.dto.VerifyDTO
 import net.mamoe.mirai.api.http.adapter.internal.dto.VerifyRetDTO
 import net.mamoe.mirai.api.http.adapter.internal.serializer.toJson
 import net.mamoe.mirai.api.http.context.MahContextHolder
-import net.mamoe.mirai.api.http.request.env.startAdapter
-import test.core.annotation.ExtendWith
-import test.core.extenssion.SetupBotMock
-import test.core.mock.BotMockStub
-import test.core.mock.withSession
+import net.mamoe.mirai.api.http.request.startAdapter
+import net.mamoe.mirai.api.http.util.ExtendWith
+import net.mamoe.mirai.api.http.util.SetupMockBot
+import net.mamoe.mirai.api.http.util.withSession
+
 import kotlin.test.*
 
-@ExtendWith(SetupBotMock::class)
+@ExtendWith(SetupMockBot::class)
 open class HttpSessionLifeCycle {
 
     private val verifyKey = "HttpSessionLifeCycle"
@@ -49,7 +49,7 @@ open class HttpSessionLifeCycle {
         assertFalse(session.isAuthed)
         assertFalse(session.isHttpSession())
 
-        data = BindDTO(BotMockStub.ID).withSession(verifyRet.session).toJson()
+        data = BindDTO(SetupMockBot.ID).withSession(verifyRet.session).toJson()
         val bindRet = post<StateCode>(bindPath, data)
         assertEquals(StateCode.Success.code, bindRet.code)
 
@@ -62,7 +62,7 @@ open class HttpSessionLifeCycle {
         // same object
         assertSame(session, authedSession)
 
-        data = BindDTO(BotMockStub.ID).withSession(verifyRet.session).toJson()
+        data = BindDTO(SetupMockBot.ID).withSession(verifyRet.session).toJson()
         val releaseRet = post<StateCode>(releasePath, data)
         assertEquals(StateCode.Success.code, releaseRet.code)
 

+ 54 - 36
mirai-api-http/src/test/kotlin/net/mamoe/mirai/api/http/request/ws/WsAuthTest.kt

@@ -16,17 +16,16 @@ import net.mamoe.mirai.api.http.adapter.internal.dto.VerifyDTO
 import net.mamoe.mirai.api.http.adapter.internal.dto.VerifyRetDTO
 import net.mamoe.mirai.api.http.adapter.internal.serializer.toJson
 import net.mamoe.mirai.api.http.context.MahContext
-import net.mamoe.mirai.api.http.request.env.startAdapter
-import test.core.annotation.ExtendWith
-import test.core.extenssion.SetupBotMock
-import test.core.mock.BotMockStub
-import test.core.mock.withSession
+import net.mamoe.mirai.api.http.request.startAdapter
+import net.mamoe.mirai.api.http.util.ExtendWith
+import net.mamoe.mirai.api.http.util.SetupMockBot
+import net.mamoe.mirai.api.http.util.withSession
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertNotEquals
 import kotlin.test.assertNotNull
 
-@ExtendWith(SetupBotMock::class)
+@ExtendWith(SetupMockBot::class)
 class WsAuthTest {
 
     private val verifyKey = "session test"
@@ -44,11 +43,15 @@ class WsAuthTest {
         singleMode = true,
         debug = false,
     ) {
-        val stateCode = wsConnect<StateCode>(mapOf("verifyKey" to "wrong $verifyKey"))
-        assertEquals(StateCode.AuthKeyFail.code, stateCode?.code)
-
-        val ret = wsConnect<VerifyRetDTO>(mapOf("verifyKey" to verifyKey))
-        assertEquals(MahContext.SINGLE_SESSION_KEY, ret?.session)
+        wsConnect(mapOf("verifyKey" to "wrong $verifyKey")) {
+            val stateCode = receiveDTO<StateCode>()
+            assertEquals(StateCode.AuthKeyFail.code, stateCode?.code)
+        }
+
+        wsConnect(mapOf("verifyKey" to verifyKey)) {
+            val ret = receiveDTO<VerifyRetDTO>()
+            assertEquals(MahContext.SINGLE_SESSION_KEY, ret?.session)
+        }
     }
 
     /**
@@ -63,8 +66,10 @@ class WsAuthTest {
         debug = false,
     ) {
         // connect anyway
-        val ret = wsConnect<VerifyRetDTO>(emptyMap())
-        assertEquals(MahContext.SINGLE_SESSION_KEY, ret?.session)
+        wsConnect(emptyMap()) {
+            val ret = receiveDTO<VerifyRetDTO>()
+            assertEquals(MahContext.SINGLE_SESSION_KEY, ret?.session)
+        }
     }
 
     /**
@@ -79,18 +84,22 @@ class WsAuthTest {
         debug = false,
     ) {
         // 错误 verify key
-        var stateCode: StateCode? = wsConnect(mapOf("verifyKey" to "wrong $verifyKey"))
-        assertEquals(StateCode.AuthKeyFail.code, stateCode?.code)
+        wsConnect(mapOf("verifyKey" to "wrong $verifyKey")) {
+            val stateCode = receiveDTO<StateCode>()
+            assertEquals(StateCode.AuthKeyFail.code, stateCode?.code)
+        }
 
         // 不绑定账号
-        stateCode = wsConnect(mapOf("verifyKey" to verifyKey))
-        assertEquals(StateCode.InvalidParameter.code, stateCode?.code)
+        wsConnect(mapOf("verifyKey" to verifyKey)) {
+            val stateCode = receiveDTO<StateCode>()
+            assertEquals(StateCode.InvalidParameter.code, stateCode?.code)
+        }
 
         // 无法绑定账号(绑定错误账号)
-        stateCode = wsConnect(mapOf("verifyKey" to verifyKey, "qq" to "${BotMockStub.ID + 1}"))
-        assertEquals(StateCode.NoBot.code, stateCode?.code)
-
-
+        wsConnect(mapOf("verifyKey" to verifyKey, "qq" to "${SetupMockBot.ID + 1}")) {
+            val stateCode = receiveDTO<StateCode>()
+            assertEquals(StateCode.NoBot.code, stateCode?.code)
+        }
 
         // 通过已有 session 绑定
 
@@ -98,28 +107,37 @@ class WsAuthTest {
         val session = post<VerifyRetDTO>(verifyPath, VerifyDTO(verifyKey).toJson()).session
 
         // 通过 ws 绑定错误 session
-        stateCode = wsConnect(mapOf("verifyKey" to verifyKey, "sessionKey" to "wrong $session"))
-        assertEquals(StateCode.IllegalSession.code, stateCode?.code)
+        wsConnect(mapOf("verifyKey" to verifyKey, "sessionKey" to "wrong $session")) {
+            val stateCode = receiveDTO<StateCode>()
+            assertEquals(StateCode.IllegalSession.code, stateCode?.code)
+        }
 
         // 通过 ws 绑定已有未认证 session
-        stateCode = wsConnect(mapOf("verifyKey" to verifyKey, "sessionKey" to session))
-        assertEquals(StateCode.NotVerifySession.code, stateCode?.code)
+        wsConnect(mapOf("verifyKey" to verifyKey, "sessionKey" to session)) {
+            val stateCode = receiveDTO<StateCode>()
+            assertEquals(StateCode.NotVerifySession.code, stateCode?.code)
+        }
 
         // 通过 http 认证 session
-        post<StateCode>(bindPath, BindDTO(BotMockStub.ID).withSession(session).toJson())
+        post<StateCode>(bindPath, BindDTO(SetupMockBot.ID).withSession(session).toJson())
 
         // 通过 ws 绑定已有已认证 session
-        val ret = wsConnect<VerifyRetDTO>(mapOf("verifyKey" to verifyKey, "sessionKey" to session))
-        assertEquals(StateCode.Success.code, ret?.code)
-        assertNotNull(ret?.session)
-        assertNotEquals(MahContext.SINGLE_SESSION_KEY, ret?.session)
+        val ret = wsConnect(mapOf("verifyKey" to verifyKey, "sessionKey" to session)) {
+            val ret = receiveDTO<VerifyRetDTO>()
+            assertEquals(StateCode.Success.code, ret?.code)
+            assertNotNull(ret?.session)
+            assertNotEquals(MahContext.SINGLE_SESSION_KEY, ret?.session)
+            return@wsConnect ret
+        }
 
         // 通过 ws 创建新 session 并绑定
-        val wsRet = wsConnect<VerifyRetDTO>(mapOf("verifyKey" to verifyKey, "qq" to "${BotMockStub.ID}"))
-        assertEquals(StateCode.Success.code, wsRet?.code)
-        assertNotNull(wsRet?.session)
-        assertNotEquals(MahContext.SINGLE_SESSION_KEY, wsRet?.session)
-        // not same session
-        assertNotEquals(ret?.session, wsRet?.session)
+        wsConnect(mapOf("verifyKey" to verifyKey, "qq" to "${SetupMockBot.ID}")) {
+            val wsRet = receiveDTO<VerifyRetDTO>()
+            assertEquals(StateCode.Success.code, wsRet?.code)
+            assertNotNull(wsRet?.session)
+            assertNotEquals(MahContext.SINGLE_SESSION_KEY, wsRet?.session)
+            // not same session
+            assertNotEquals(ret?.session, wsRet?.session)
+        }
     }
 }

+ 18 - 13
mirai-api-http/src/test/kotlin/net/mamoe/mirai/api/http/request/ws/WsSessionLifeCycle.kt

@@ -9,11 +9,8 @@
 
 package net.mamoe.mirai.api.http.request.ws
 
-import test.core.extenssion.SetupBotMock
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.isActive
-import test.core.mock.BotMockStub
-import test.core.mock.withSession
 import net.mamoe.mirai.api.http.adapter.common.StateCode
 import net.mamoe.mirai.api.http.adapter.internal.consts.Paths
 import net.mamoe.mirai.api.http.adapter.internal.dto.BindDTO
@@ -21,11 +18,13 @@ import net.mamoe.mirai.api.http.adapter.internal.dto.VerifyDTO
 import net.mamoe.mirai.api.http.adapter.internal.dto.VerifyRetDTO
 import net.mamoe.mirai.api.http.adapter.internal.serializer.toJson
 import net.mamoe.mirai.api.http.context.MahContextHolder
-import net.mamoe.mirai.api.http.request.env.startAdapter
+import net.mamoe.mirai.api.http.request.startAdapter
+import net.mamoe.mirai.api.http.util.SetupMockBot
+import net.mamoe.mirai.api.http.util.withSession
 import org.junit.jupiter.api.extension.ExtendWith
 import kotlin.test.*
 
-@ExtendWith(SetupBotMock::class)
+@ExtendWith(SetupMockBot::class)
 class WsSessionLifeCycle {
 
     private val verifyKey = "HttpSessionLifeCycle"
@@ -41,9 +40,13 @@ class WsSessionLifeCycle {
         singleMode = false,
     ) {
         // 通过 ws 创建新 session 并绑定
-        val wsRet = wsConnect<VerifyRetDTO>(mapOf("verifyKey" to verifyKey, "qq" to "${BotMockStub.ID}"))
-        val sessionKey = wsRet?.session
-        assertNotNull(sessionKey)
+        val sessionKey = wsConnect(mapOf("verifyKey" to verifyKey, "qq" to "${SetupMockBot.ID}")) {
+            val wsRet = receiveDTO<VerifyRetDTO>()
+            val sessionKey = wsRet?.session
+            assertNotNull(sessionKey)
+
+            return@wsConnect sessionKey
+        }
 
         // socket 由客户端主动断开, 服务端需要一定时间感知
         delay(1000)
@@ -70,15 +73,17 @@ class WsSessionLifeCycle {
         assertEquals(0, session.getRefCount())
 
         // 认证 http session 并引用
-        data = BindDTO(BotMockStub.ID).withSession(verifyRet.session).toJson()
+        data = BindDTO(SetupMockBot.ID).withSession(verifyRet.session).toJson()
         val bindRet = post<StateCode>(bindPath, data)
         assertEquals(StateCode.Success.code, bindRet.code)
         assertEquals(1, session.getRefCount())
 
         // 通过 websocket 复用 session
-        val wsRet = wsConnect<VerifyRetDTO>(mapOf("verifyKey" to verifyKey, "sessionKey" to verifyRet.session))
-        val sessionKey = wsRet?.session
-        assertEquals(verifyRet.session, sessionKey)
+        wsConnect(mapOf("verifyKey" to verifyKey, "sessionKey" to verifyRet.session)) {
+            val wsRet = receiveDTO<VerifyRetDTO>()
+            val sessionKey = wsRet?.session
+            assertEquals(verifyRet.session, sessionKey)
+        }
 
         // socket 由客户端主动断开, 服务端需要一定时间感知
         delay(1000)
@@ -89,7 +94,7 @@ class WsSessionLifeCycle {
         assertTrue(session.isActive)
 
         // http 释放 session
-        data = BindDTO(BotMockStub.ID).withSession(verifyRet.session).toJson()
+        data = BindDTO(SetupMockBot.ID).withSession(verifyRet.session).toJson()
         val releaseRet = post<StateCode>(releasePath, data)
         assertEquals(StateCode.Success.code, releaseRet.code)
         assertEquals(0, session.getRefCount())

+ 13 - 5
mirai-api-http/src/test/kotlin/test/core/extenssion/SetupBotMock.kt → mirai-api-http/src/test/kotlin/net/mamoe/mirai/api/http/util/extend.kt

@@ -7,16 +7,24 @@
  * https://github.com/mamoe/mirai/blob/master/LICENSE
  */
 
-package test.core.extenssion
+package net.mamoe.mirai.api.http.util
 
-import kotlinx.coroutines.runBlocking
-import test.core.mock.BotMockStub
+import net.mamoe.mirai.mock.MockBotFactory
 import org.junit.jupiter.api.extension.BeforeAllCallback
 import org.junit.jupiter.api.extension.ExtensionContext
 
-class SetupBotMock: BeforeAllCallback {
+typealias ExtendWith = org.junit.jupiter.api.extension.ExtendWith
+
+class SetupMockBot : BeforeAllCallback {
 
     override fun beforeAll(context: ExtensionContext?) {
-        runBlocking { BotMockStub().login() }
+        MockBotFactory.initialize()
+        MockBotFactory.newMockBotBuilder()
+            .id(ID)
+            .create()
+    }
+
+    companion object {
+        const val ID = 1L
     }
 }

+ 12 - 0
mirai-api-http/src/test/kotlin/net/mamoe/mirai/api/http/util/session.kt

@@ -0,0 +1,12 @@
+package net.mamoe.mirai.api.http.util
+
+import net.mamoe.mirai.api.http.adapter.internal.dto.AuthedDTO
+import kotlin.reflect.jvm.javaField
+
+internal fun <T: AuthedDTO> T.withSession(sessionKey: String): T {
+    this::sessionKey.javaField?.apply {
+        isAccessible = true
+        set(this@withSession, sessionKey)
+    }
+    return this
+}

+ 0 - 16
mirai-api-http/src/test/kotlin/test/core/annotation/annotations.kt

@@ -1,16 +0,0 @@
-/*
- * Copyright 2020 Mamoe Technologies and contributors.
- *
- * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
- * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
- *
- * https://github.com/mamoe/mirai/blob/master/LICENSE
- */
-
-package test.core.annotation
-
-/**
- * annotation alias
- */
-
-typealias ExtendWith = org.junit.jupiter.api.extension.ExtendWith

+ 0 - 81
mirai-api-http/src/test/kotlin/test/core/mock/BotMockStub.kt

@@ -1,81 +0,0 @@
-/*
- * Copyright 2020-2021 Mamoe Technologies and contributors.
- *
- * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
- * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
- *
- * https://github.com/mamoe/mirai/blob/master/LICENSE
- */
-
-package test.core.mock
-
-import net.mamoe.mirai.Bot
-import net.mamoe.mirai.contact.*
-import net.mamoe.mirai.contact.friendgroup.FriendGroups
-import net.mamoe.mirai.event.EventChannel
-import net.mamoe.mirai.event.GlobalEventChannel
-import net.mamoe.mirai.event.events.BotEvent
-import net.mamoe.mirai.utils.BotConfiguration
-import net.mamoe.mirai.utils.MiraiInternalApi
-import net.mamoe.mirai.utils.MiraiLogger
-import java.util.concurrent.ConcurrentHashMap
-import kotlin.coroutines.CoroutineContext
-import kotlin.coroutines.EmptyCoroutineContext
-import kotlin.reflect.KProperty
-import kotlin.reflect.full.companionObject
-
-class BotMockStub : Bot {
-
-    companion object {
-        const val ID = 0L
-        const val NICK_NAME = "Mock Bot"
-    }
-
-    override val asFriend: Friend by lazy { FriendMockStub(this) }
-    override val asStranger: Stranger by lazy { StrangerMockStub(this) }
-
-    override val configuration: BotConfiguration
-        get() = TODO("Not yet implemented")
-
-    override val coroutineContext: CoroutineContext = EmptyCoroutineContext
-
-    override val eventChannel: EventChannel<BotEvent> =
-        GlobalEventChannel.filterIsInstance<BotEvent>().filter { it.bot === this }
-    override val friendGroups: FriendGroups
-        get() = TODO("Not yet implemented")
-
-    @OptIn(MiraiInternalApi::class)
-    override val friends: ContactList<Friend> by lazy {
-        ContactList(mutableListOf(asFriend))
-    }
-
-    @OptIn(MiraiInternalApi::class)
-    override val groups: ContactList<Group> by lazy {
-        ContactList(mutableListOf(GroupMockStub(this)))
-    }
-
-    override val id: Long = ID
-    override val isOnline: Boolean = true
-    override val logger: MiraiLogger = MiraiLogger.Factory.create(BotMockStub::class, "Mock bot")
-    override val nick: String = NICK_NAME
-
-    @OptIn(MiraiInternalApi::class)
-    override val otherClients: ContactList<OtherClient> = ContactList(mutableListOf())
-
-    @OptIn(MiraiInternalApi::class)
-    override val strangers: ContactList<Stranger> by lazy {
-        ContactList(mutableListOf(asStranger))
-    }
-
-    override fun close(cause: Throwable?) {}
-
-    @Suppress("UNCHECKED_CAST")
-    override suspend fun login() {
-        Bot::class.companionObject?.members?.first { it.name == "_instances" }?.let {
-            it as KProperty<ConcurrentHashMap<Long, Bot>>
-            val map = it.call(Bot::class.companionObject?.objectInstance)
-            map[ID] = this
-        }
-    }
-
-}

+ 0 - 52
mirai-api-http/src/test/kotlin/test/core/mock/FriendMockStub.kt

@@ -1,52 +0,0 @@
-/*
- * Copyright 2020 Mamoe Technologies and contributors.
- *
- * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
- * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
- *
- * https://github.com/mamoe/mirai/blob/master/LICENSE
- */
-
-package test.core.mock
-
-import net.mamoe.mirai.Bot
-import net.mamoe.mirai.contact.Friend
-import net.mamoe.mirai.contact.friendgroup.FriendGroup
-import net.mamoe.mirai.contact.roaming.RoamingMessages
-import net.mamoe.mirai.message.MessageReceipt
-import net.mamoe.mirai.message.data.Image
-import net.mamoe.mirai.message.data.Message
-import net.mamoe.mirai.message.data.OfflineAudio
-import net.mamoe.mirai.utils.ExternalResource
-import kotlin.coroutines.CoroutineContext
-import kotlin.coroutines.EmptyCoroutineContext
-
-class FriendMockStub(
-    override val bot: Bot
-) : Friend {
-
-    override val coroutineContext: CoroutineContext = EmptyCoroutineContext
-    override val friendGroup: FriendGroup
-        get() = TODO("Not yet implemented")
-    override val id: Long = bot.id
-    override val nick: String = bot.nick
-    override var remark: String = bot.nick
-    override val roamingMessages: RoamingMessages
-        get() = TODO("Not yet implemented")
-
-    override suspend fun delete() {
-    }
-
-    override suspend fun sendMessage(message: Message): MessageReceipt<Friend> {
-        TODO("Not yet implemented")
-    }
-
-    override suspend fun uploadAudio(resource: ExternalResource): OfflineAudio {
-        TODO("Not yet implemented")
-    }
-
-    override suspend fun uploadImage(resource: ExternalResource): Image {
-        TODO("Not yet implemented")
-    }
-
-}

+ 0 - 103
mirai-api-http/src/test/kotlin/test/core/mock/GroupMockStub.kt

@@ -1,103 +0,0 @@
-/*
- * Copyright 2020-2021 Mamoe Technologies and contributors.
- *
- * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
- * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
- *
- * https://github.com/mamoe/mirai/blob/master/LICENSE
- */
-
-package test.core.mock
-
-import net.mamoe.mirai.Bot
-import net.mamoe.mirai.contact.ContactList
-import net.mamoe.mirai.contact.Group
-import net.mamoe.mirai.contact.GroupSettings
-import net.mamoe.mirai.contact.NormalMember
-import net.mamoe.mirai.contact.active.GroupActive
-import net.mamoe.mirai.contact.announcement.Announcements
-import net.mamoe.mirai.contact.file.RemoteFiles
-import net.mamoe.mirai.message.MessageReceipt
-import net.mamoe.mirai.message.data.Image
-import net.mamoe.mirai.message.data.Message
-import net.mamoe.mirai.message.data.MessageSource
-import net.mamoe.mirai.message.data.OfflineAudio
-import net.mamoe.mirai.utils.ExternalResource
-import net.mamoe.mirai.utils.MiraiInternalApi
-import kotlin.coroutines.CoroutineContext
-
-class GroupMockStub(
-    override val bot: Bot
-) : Group {
-
-    companion object {
-        const val ID = 1L
-        const val NAME = "Mock Group"
-    }
-
-    override val id: Long = ID
-    override var name = NAME
-
-    override val owner: NormalMember = MemberMockStub(this)
-
-    @OptIn(MiraiInternalApi::class)
-    override val members: ContactList<NormalMember> = ContactList(mutableListOf(owner))
-
-    override fun contains(id: Long): Boolean {
-        return id == MemberMockStub.ID
-    }
-
-    override fun get(id: Long): NormalMember? {
-        return if (id == MemberMockStub.ID) {
-            owner
-        } else {
-            null
-        }
-    }
-
-    override suspend fun quit(): Boolean {
-        TODO("Not yet implemented")
-    }
-
-    override suspend fun sendMessage(message: Message): MessageReceipt<Group> {
-        TODO("Not yet implemented")
-    }
-
-    override suspend fun setEssenceMessage(source: MessageSource): Boolean {
-        TODO("Not yet implemented")
-    }
-
-    override suspend fun uploadAudio(resource: ExternalResource): OfflineAudio {
-        TODO("Not yet implemented")
-    }
-
-    override suspend fun uploadImage(resource: ExternalResource): Image {
-        TODO("Not yet implemented")
-    }
-
-
-    @Deprecated("use uploadAudio", replaceWith = ReplaceWith("uploadAudio(resource)"), level = DeprecationLevel.HIDDEN)
-    @Suppress("DEPRECATION", "DEPRECATION_ERROR")
-    override suspend fun uploadVoice(resource: ExternalResource): net.mamoe.mirai.message.data.Voice {
-        TODO("Not yet implemented")
-    }
-
-    override val active: GroupActive
-        get() = TODO("Not yet implemented")
-
-    override val announcements: Announcements
-        get() = TODO("Not yet implemented")
-    override val botAsMember: NormalMember
-        get() = TODO("Not yet implemented")
-    override val coroutineContext: CoroutineContext
-        get() = TODO("Not yet implemented")
-    override val files: RemoteFiles
-        get() = TODO("Not yet implemented")
-
-    @Suppress("DEPRECATION")
-    @Deprecated("Please use files instead.", replaceWith = ReplaceWith("files.root"))
-    override val filesRoot: net.mamoe.mirai.utils.RemoteFile
-        get() = TODO("Not yet implemented")
-    override val settings: GroupSettings
-        get() = TODO("Not yet implemented")
-}

+ 0 - 75
mirai-api-http/src/test/kotlin/test/core/mock/MemberMockStub.kt

@@ -1,75 +0,0 @@
-/*
- * Copyright 2020-2021 Mamoe Technologies and contributors.
- *
- * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
- * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
- *
- * https://github.com/mamoe/mirai/blob/master/LICENSE
- */
-
-package test.core.mock
-
-import net.mamoe.mirai.Bot
-import net.mamoe.mirai.contact.Group
-import net.mamoe.mirai.contact.MemberPermission
-import net.mamoe.mirai.contact.NormalMember
-import net.mamoe.mirai.contact.active.MemberActive
-import net.mamoe.mirai.message.MessageReceipt
-import net.mamoe.mirai.message.data.Image
-import net.mamoe.mirai.message.data.Message
-import net.mamoe.mirai.utils.ExternalResource
-import kotlin.coroutines.CoroutineContext
-import kotlin.coroutines.EmptyCoroutineContext
-
-class MemberMockStub(
-    override val group: Group
-): NormalMember {
-
-    companion object {
-        const val ID = 2L
-        const val TIMESTAMP = 9
-        const val NAME = "Mock Member"
-    }
-
-    override val coroutineContext: CoroutineContext = EmptyCoroutineContext
-    override val active: MemberActive
-        get() = TODO("Not yet implemented")
-
-    override val bot: Bot = group.bot
-    override val id: Long = ID
-
-    override val joinTimestamp: Int = TIMESTAMP
-    override val lastSpeakTimestamp: Int = TIMESTAMP
-    private var muteRemain = 0
-    override val muteTimeRemaining: Int get() = muteRemain
-    override var nameCard: String = NAME
-    override val nick: String = NAME
-    override val permission: MemberPermission = MemberPermission.OWNER
-    override val remark: String = NAME
-    override var specialTitle: String = NAME
-
-    override suspend fun kick(message: String) {
-    }
-
-    override suspend fun kick(message: String, block: Boolean) {
-    }
-
-    override suspend fun modifyAdmin(operation: Boolean) {
-    }
-
-    override suspend fun mute(durationSeconds: Int) {
-        muteRemain = durationSeconds
-    }
-
-    override suspend fun sendMessage(message: Message): MessageReceipt<NormalMember> {
-        TODO("Not yet implemented")
-    }
-
-    override suspend fun unmute() {
-        muteRemain = 0
-    }
-
-    override suspend fun uploadImage(resource: ExternalResource): Image {
-        TODO("Not yet implemented")
-    }
-}

+ 0 - 21
mirai-api-http/src/test/kotlin/test/core/mock/SessionMockUtil.kt

@@ -1,21 +0,0 @@
-/*
- * Copyright 2020 Mamoe Technologies and contributors.
- *
- * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
- * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
- *
- * https://github.com/mamoe/mirai/blob/master/LICENSE
- */
-
-package test.core.mock
-
-import net.mamoe.mirai.api.http.adapter.internal.dto.AuthedDTO
-import kotlin.reflect.jvm.javaField
-
-internal fun <T: AuthedDTO> T.withSession(sessionKey: String): T {
-    this::sessionKey.javaField?.apply {
-        isAccessible = true
-        set(this@withSession, sessionKey)
-    }
-    return this
-}

+ 0 - 40
mirai-api-http/src/test/kotlin/test/core/mock/StrangerMockStub.kt

@@ -1,40 +0,0 @@
-/*
- * Copyright 2020 Mamoe Technologies and contributors.
- *
- * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
- * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
- *
- * https://github.com/mamoe/mirai/blob/master/LICENSE
- */
-
-package test.core.mock
-
-import net.mamoe.mirai.Bot
-import net.mamoe.mirai.contact.Stranger
-import net.mamoe.mirai.message.MessageReceipt
-import net.mamoe.mirai.message.data.Image
-import net.mamoe.mirai.message.data.Message
-import net.mamoe.mirai.utils.ExternalResource
-import kotlin.coroutines.CoroutineContext
-import kotlin.coroutines.EmptyCoroutineContext
-
-class StrangerMockStub(
-    override val bot: Bot,
-) : Stranger {
-
-    override val coroutineContext: CoroutineContext = EmptyCoroutineContext
-    override val id: Long = bot.id
-    override val nick: String = bot.nick
-    override val remark: String = bot.nick
-
-    override suspend fun delete() {
-    }
-
-    override suspend fun sendMessage(message: Message): MessageReceipt<Stranger> {
-        TODO("Not yet implemented")
-    }
-
-    override suspend fun uploadImage(resource: ExternalResource): Image {
-        TODO("Not yet implemented")
-    }
-}