Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
Batu committed Mar 8, 2022
2 parents 68b5d3c + 0b91558 commit 8e8cfb9
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 39 deletions.
1 change: 1 addition & 0 deletions .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package tw.dcard.bubblemock.sample.api.member

import tw.dcard.bubblemock.model.MockScenario
import tw.dcard.bubblemock.model.api
import tw.dcard.bubblemock.model.apiDetail
import tw.dcard.bubblemock.model.apiRegex
import tw.dcard.bubblemock.model.scenario
import tw.dcard.bubblemock.module.MockBubbleManager
import tw.dcard.bubblemock.sample.model.Member
Expand All @@ -13,7 +14,7 @@ object MemberMockScenario {
true
}
add {
api("members") {
apiRegex("members") {
response {
getMembers(5)
}
Expand All @@ -22,7 +23,7 @@ object MemberMockScenario {
},
scenario(page = "Main Page", name = "Member List - lots data with long delay") {
add {
api("members") {
apiDetail("members") {
response {
getMembers(20)
}
Expand All @@ -34,7 +35,7 @@ object MemberMockScenario {
},
scenario(page = "Main Page", name = "Member List - empty") {
add {
api("members") {
apiDetail("members") {
response {
getMembers(0)
}
Expand All @@ -43,7 +44,7 @@ object MemberMockScenario {
},
scenario(page = "Main Page", name = "Member List - Error") {
add {
api("members") {
apiDetail("members") {
response {
MockBubbleManager.RESPONSE_ERROR
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package tw.dcard.bubblemock.sample.api.member

import tw.dcard.bubblemock.model.MockApi
import tw.dcard.bubblemock.model.MockScenario
import tw.dcard.bubblemock.model.api
import tw.dcard.bubblemock.model.scenario
import tw.dcard.bubblemock.model.*

object MemberMockScenario2 {

Expand All @@ -14,7 +11,7 @@ object MemberMockScenario2 {
false
}
add {
api("members") {
apiDetail("members") {
response {
getMembers()
}
Expand All @@ -24,7 +21,7 @@ object MemberMockScenario2 {
// Regular Declaration Method
MockScenario(page = "Main Page", name = "Member List - same data with address").apply {
mockApiList = mutableListOf(
MockApi(listOf("members")).apply {
MockApi(UrlSpec.Detail(listOf("members"))).apply {
responseObject = getMembersWithAddress()
}
)
Expand Down
82 changes: 54 additions & 28 deletions library/src/main/java/tw/dcard/bubblemock/model/MockApi.kt
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package tw.dcard.bubblemock.model

import android.util.Log
import okhttp3.Request

/**
* @author Batu
*/
data class MockApi(
private val urlSpecs: List<String>
private val urlSpec: UrlSpec
) {

companion object {
Expand All @@ -15,12 +16,13 @@ data class MockApi(
}

var htmlMethod: String = "GET"
var urlParams: MutableMap<String, String?> = mutableMapOf()

var delay: Long = 0L
var responseObject: Any? = null

fun handle(request: Request): Any? {
val url = request.url
Log.d("badu", "url: $url")
val segments = url.pathSegments

if (responseObject == null) {
Expand All @@ -31,28 +33,42 @@ data class MockApi(
return null
}

if (segments.size != urlSpecs.size) {
return null
}

urlSpecs.forEachIndexed { index, spec ->
if (spec != ANY_PATH && spec != segments[index]) {
return null
}
}

if (url.querySize != urlParams.size) {
return null
}

urlParams.forEach {
val realValue = url.queryParameter(it.key)
val mockValue = it.value
if (mockValue == ANY_PARAM_VALUE && realValue != null) {
return@forEach
when (urlSpec) {
is UrlSpec.Detail -> {
if (segments.size != urlSpec.urlSpecs.size) {
return null
}

urlSpec.urlSpecs.forEachIndexed { index, spec ->
if (spec != ANY_PATH && spec != segments[index]) {
return null
}
}

if (url.querySize != urlSpec.urlParams.size) {
return null
}

urlSpec.urlParams.forEach {
val realValue = url.queryParameter(it.key)
val mockValue = it.value
if (mockValue == ANY_PARAM_VALUE && realValue != null) {
return@forEach
}
if (realValue != mockValue) {
return null
}
}
}
if (realValue != mockValue) {
return null
is UrlSpec.Regex -> {
if (urlSpec.isContainsMatched) {
if (urlSpec.rules.toRegex().containsMatchIn(url.toString()).not())
return null

} else {
if (urlSpec.rules.toRegex().matches(url.toString()).not())
return null
}
}
}

Expand All @@ -69,7 +85,7 @@ data class MockApi(
fun params(init: Params.() -> Unit) {
val params = Params()
params.init()
urlParams.putAll(params)
(urlSpec as? UrlSpec.Detail)?.urlParams?.putAll(params)
}

fun response(block: () -> Any) {
Expand All @@ -86,19 +102,29 @@ data class MockApi(
}
}

fun api(vararg urlSpecs: String, init: MockApi.() -> Unit = {}): MockApi {
fun apiDetail(vararg urlSpecs: String, init: MockApi.() -> Unit = {}): MockApi {
val list = mutableListOf<String>().apply {
for (urlSpec in urlSpecs) {
add(urlSpec)
}
}
val api = MockApi(list)
val api = MockApi(UrlSpec.Detail(list))
api.init()
return api
}

fun apiDetail(urlSpecs: List<String>, init: MockApi.() -> Unit = {}): MockApi {
val api = MockApi(UrlSpec.Detail(urlSpecs))
api.init()
return api
}

fun api(urlSpecs: List<String>, init: MockApi.() -> Unit = {}): MockApi {
val api = MockApi(urlSpecs)
fun apiRegex(
rule: String,
isContainsMatched: Boolean = true,
init: MockApi.() -> Unit = {}
): MockApi {
val api = MockApi(UrlSpec.Regex(rule, isContainsMatched))
api.init()
return api
}
16 changes: 16 additions & 0 deletions library/src/main/java/tw/dcard/bubblemock/model/UrlSpec.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package tw.dcard.bubblemock.model

/**
* @author Batu
*/
sealed class UrlSpec{
data class Detail(
val urlSpecs: List<String>,
var urlParams: MutableMap<String, String?> = mutableMapOf(),
): UrlSpec()

data class Regex(
val rules: String,
val isContainsMatched: Boolean = true,
): UrlSpec()
}

0 comments on commit 8e8cfb9

Please sign in to comment.