testing restassured for mock

This commit is contained in:
Sidharth Bamba
2021-09-13 11:51:46 +05:30
parent af05f27fc5
commit 3d7ca50961
11 changed files with 219 additions and 10 deletions

View File

@@ -398,6 +398,9 @@ dependencies {
// For local unit tests
testImplementation 'com.google.dagger:hilt-android-testing:2.38.1'
kaptTest 'com.google.dagger:hilt-compiler:2.38.1'
// RestAssured
implementation(group: 'io.rest-assured', name: 'rest-assured', version: '4.3.0')
}
tasks.withType(Compiler) {

View File

@@ -6,33 +6,34 @@ import com.naviapp.jsonOperations.JsonParser
import com.naviapp.DbCore.clients.CustomerReadDbClient
import com.naviapp.DbCore.clients.CustomersDbClient
import com.naviapp.DbCore.clients.LoanAccountsDbClient
import com.naviapp.clients.OtpClient
import org.junit.Test
import java.io.File
import java.nio.file.Paths
import kotlin.math.pow
import kotlin.random.Random
class CustomerDataCleanup {
val RootDirectory: String = Paths.get(System.getProperty("user.dir")).toString()
val browserStackFilePath = File(Paths.get(RootDirectory, "BrowserStackConfig.json").toString()).toString()
val browserStackFilePath =
File(Paths.get(RootDirectory, "BrowserStackConfig.json").toString()).toString()
val browserStack: BrowserStack = JsonParser.getData(browserStackFilePath)
@Test
fun cleanUpCustomer(){
fun cleanUpCustomer() {
val gson = Gson()
for (i in 1..4) {
val phoneNumber = getRandomMockedPhoneNumber()
when(i){
1 ->{
when (i) {
1 -> {
browserStack.e2e.phoneNumberNewLoan = phoneNumber
}
2 ->{
2 -> {
browserStack.e2e.phoneNumberForeclosureLoan = phoneNumber
}
3 ->{
3 -> {
browserStack.e2e.phoneNumberHomeLoan = phoneNumber
}
4 ->{
4 -> {
browserStack.e2e.phoneNumberBalanceTransfer = phoneNumber
}
}
@@ -64,8 +65,23 @@ class CustomerDataCleanup {
return m + Random.nextLong(9 * m)
}
public fun getPhoneNumber(): String {
return getRandomMockedPhoneNumber()
@Test
fun `Validate Loan Closure`() {
val appVersionCode = "73"
val androidVersion = "Android_10"
val phoneNumber = getRandomMockedPhoneNumber()
var loanApplicationId: String
var disbursementBankReferenceId: String
var customerId: String
val deviceId = generateDigits(16).toString()
var sessionToken: String
with(OtpClient(phoneNumber, deviceId, appVersionCode, androidVersion)) {
registerDevice()
}
}
}

View File

@@ -0,0 +1,44 @@
package com.naviapp
import com.naviapp.constants.ContentType
import com.naviapp.entity.MultiPartParams
data class RequestWrapper(
val endPoint: String,
val method: String,
val body: Any?,
val headers: Map<String, String>?,
val contentType: String?,
val queryParams: Any?,
val formParams: Any?,
val multiPartParams: MultiPartParams?
) {
private constructor(builder: Builder) : this(
endPoint = builder.endPoint,
method = builder.method,
body = builder.body,
headers = builder.headers,
contentType = builder.contentType,
queryParams = builder.queryParams,
formParams = builder.formParams,
multiPartParams = builder.multiPartParams
)
companion object {
inline fun build(block: Builder.() -> Unit) = Builder().apply(block).build()
}
class Builder {
lateinit var endPoint: String
lateinit var method: String
var body: Any? = null
var headers: Map<String, String>? = null
var contentType: String? = ContentType.Json
var queryParams: Any? = null
var formParams: Any? = null
var multiPartParams: MultiPartParams? = null
fun build() = RequestWrapper(this)
}
}

View File

@@ -0,0 +1,71 @@
package com.naviapp
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.naviapp.constants.ContentType
import com.naviapp.constants.HttpMethods
import io.restassured.RestAssured.given
import io.restassured.response.Response
import io.restassured.response.ResponseBodyExtractionOptions
import io.restassured.specification.RequestSpecification
object ServiceWrapper {
inline fun <reified T> getResponse(requestSpecification: RequestWrapper): T {
val gson = Gson()
val request: RequestSpecification = given().apply {
requestSpecification.body?.let { body(gson.toJson(requestSpecification.body)) }
requestSpecification.queryParams?.let {
val json = gson.toJson(requestSpecification.queryParams)
val queryParams: Map<String, Any> = gson.fromJson(json, object : TypeToken<Map<String, Any>>() {}.type)
queryParams(queryParams)
}
requestSpecification.formParams?.let {
val json = gson.toJson(requestSpecification.formParams)
val formParams: Map<String, Any> =
gson.fromJson(json, object : TypeToken<Map<String, String>>() {}.type)
formParams(formParams)
}
requestSpecification.multiPartParams?.let {
multiPart(
requestSpecification.multiPartParams.controlName,
requestSpecification.multiPartParams.file,
requestSpecification.multiPartParams.mimeType
)
}
requestSpecification.headers?.let { headers(requestSpecification.headers) }
contentType(requestSpecification.contentType)
}
val endPoint = requestSpecification.endPoint
val response = when (requestSpecification.method) {
HttpMethods.GET -> request.get(endPoint)
HttpMethods.POST -> request.post(endPoint)
HttpMethods.PATCH -> request.patch(endPoint)
HttpMethods.PUT -> request.put(endPoint)
else -> throw Exception("METHOD: ${requestSpecification.method} not valid")
}
if (response.statusCode >= 400 || response.contentType.contains(ContentType.Html)) {
throw error("Response: ${response.body.prettyPrint()}")
}
return if (T::class == Response::class) response as T
else response.body.deserialize()
}
inline fun <reified T> ResponseBodyExtractionOptions.deserialize(): T {
return this.`as`(T::class.java)
}
}

View File

@@ -0,0 +1,28 @@
package com.naviapp.clients
import com.naviapp.RequestWrapper
import com.naviapp.ServiceWrapper
import com.naviapp.constants.BaseUrls
import com.naviapp.constants.Endpoints
import com.naviapp.constants.HttpMethods
import com.naviapp.entity.RegisterDeviceRequest
import io.restassured.response.Response
class OtpClient(
private val phoneNumber: String, private val deviceId: String,
private val appVersionCode: String, private val androidVersion: String, private val otp: String = "1234"
) {
fun registerDevice() {
val registerRequest = RegisterDeviceRequest(deviceId)
val endpoint =
"${BaseUrls.MobileApplicationService}${Endpoints.MobileApplication.RegisterDevice}"
val request = RequestWrapper.build {
endPoint = endpoint
body = registerRequest
method = HttpMethods.PUT
}
ServiceWrapper.getResponse<Response>(request)
}
}

View File

@@ -0,0 +1,7 @@
package com.naviapp.constants
object BaseUrls {
val MobileApplicationService = "https://dev-api.navi.com"
}

View File

@@ -0,0 +1,8 @@
package com.naviapp.constants
object ContentType {
const val Json = "application/json"
const val FormUrlEncoded = "application/x-www-form-urlencoded"
const val MultiPartFormData = "multipart/form-data"
const val Html = "text/html"
}

View File

@@ -0,0 +1,8 @@
package com.naviapp.constants
class Endpoints {
object MobileApplication {
const val RegisterDevice = "/app-installations/register"
}
}

View File

@@ -0,0 +1,9 @@
package com.naviapp.constants
object HttpMethods {
const val GET = "GET"
const val POST = "POST"
const val PATCH = "PATCH"
const val PUT = "PUT"
}

View File

@@ -0,0 +1,9 @@
package com.naviapp.entity
import java.io.File
data class MultiPartParams(
val controlName: String,
val file: File,
val mimeType: String
)

View File

@@ -0,0 +1,6 @@
package com.naviapp.entity
data class RegisterDeviceRequest(
val deviceId: String,
val channelId: String = "channel-8"
)