Skip to content

Commit a57c3f4

Browse files
authored
Unit tests for new and modified features (#33)
* ADD: unit tests for adaptive streaming URL method * ADD: unit tests for raw transforms method * ADD: unit tests for responsive URL constructor method * ADD: unit tests for upload policy validations checker method * ADD: unit tests for image upload preprocessor * ADD: unit test for upload API request body * ADD: unit tests for Coil and Fresco extensions * ADD: unit test for image rotation preprocess * ADD: JaCoCo build config in Coil and Fresco extension modules
1 parent 3f771d4 commit a57c3f4

File tree

16 files changed

+746
-50
lines changed

16 files changed

+746
-50
lines changed

imagekit-coil-extension/build.gradle

+55
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@ plugins {
22
id 'com.android.library'
33
id 'org.jetbrains.kotlin.android'
44
id 'maven-publish'
5+
id 'jacoco'
56
}
67

8+
group = 'com.github.imagekit-developer'
9+
710
android {
811
namespace = "com.imagekit.android.coil_extension"
912
compileSdkVersion 33
@@ -50,6 +53,58 @@ dependencies {
5053
api "io.coil-kt:coil:2.4.0"
5154

5255
testImplementation 'junit:junit:4.13.2'
56+
testImplementation 'org.jetbrains.kotlin:kotlin-test-junit:1.0.6'
57+
testImplementation 'org.robolectric:robolectric:4.9'
5358
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
5459
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
60+
}
61+
62+
apply plugin: 'org.jetbrains.dokka'
63+
64+
jacoco {
65+
toolVersion "0.8.8"
66+
}
67+
68+
tasks.withType(Test) {
69+
jacoco {
70+
includeNoLocationClasses = true
71+
excludes = ['jdk.internal.*']
72+
}
73+
finalizedBy jacocoTestReport
74+
}
75+
76+
tasks.register('jacocoTestCoverageVerification', JacocoCoverageVerification) {
77+
violationRules {
78+
rule {
79+
enabled = true
80+
element = 'CLASS'
81+
}
82+
}
83+
}
84+
85+
task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest']) {
86+
reports {
87+
csv.enabled false
88+
html.enabled true
89+
xml.enabled true
90+
}
91+
classDirectories.setFrom(files(classDirectories.files.collect {
92+
fileTree(dir: it, excludes: [
93+
'**/R.class',
94+
'**/BR.class',
95+
'**/R$*.class',
96+
'**/*$ViewInjector*.*',
97+
'**/*$ViewBinder*.*',
98+
'**/BuildConfig.*',
99+
'android/**',
100+
'**/Manifest*.*',
101+
'**/*$Lambda$*.*', // Jacoco can not handle several "$" in class name.
102+
'**/*Module.*', // Modules for Dagger.
103+
'**/*Dagger*.*', // Dagger auto-generated code.
104+
'**/*MembersInjector*.*', // Dagger auto-generated code.
105+
'**/*_Provide*Factory*.*',
106+
'**/*_Factory.*', //Dagger auto-generated code
107+
'**/*$*$*.*' // Anonymous classes generated by kotlin
108+
])
109+
}))
55110
}

imagekit-coil-extension/src/test/java/com/example/imagekit/android/coil_extension/ExampleUnitTest.kt

-17
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.example.imagekit.android.coil_extension
2+
3+
import com.imagekit.android.ImageKit
4+
import com.imagekit.android.entity.Rotation
5+
import org.junit.Assert.*
6+
7+
import org.junit.Before
8+
import org.junit.Test
9+
import org.junit.runner.RunWith
10+
import org.robolectric.RobolectricTestRunner
11+
import org.robolectric.RuntimeEnvironment
12+
13+
@RunWith(RobolectricTestRunner::class)
14+
class IKCoilExtensionTest {
15+
16+
@Before
17+
fun setUp() {
18+
ImageKit.init(
19+
context = RuntimeEnvironment.getApplication(),
20+
urlEndpoint = "https://ik.imagekit.io/demo"
21+
)
22+
}
23+
24+
@Test
25+
fun createWithCoilUrlTest() {
26+
val expectedUrl = "https://ik.imagekit.io/demo/medium_cafe_B1iTdD0C.jpg?x-test-header=Test&tr=h-300,w-300,rt-90"
27+
val imageRequest = ImageKit.getInstance()
28+
.url(
29+
src = "https://ik.imagekit.io/demo/medium_cafe_B1iTdD0C.jpg"
30+
)
31+
.height(300)
32+
.width(300)
33+
.rotation(Rotation.VALUE_90)
34+
.addCustomQueryParameter("x-test-header", "Test")
35+
.createWithCoil()
36+
.build()
37+
38+
kotlin.test.assertEquals(expectedUrl, imageRequest.data)
39+
}
40+
}

imagekit-fresco-extension/build.gradle

+55
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@ plugins {
22
id 'com.android.library'
33
id 'org.jetbrains.kotlin.android'
44
id 'maven-publish'
5+
id 'jacoco'
56
}
67

8+
group = 'com.github.imagekit-developer'
9+
710
android {
811
namespace = "com.imagekit.android.fresco_extension"
912
compileSdkVersion 33
@@ -55,6 +58,58 @@ dependencies {
5558
}
5659

5760
testImplementation 'junit:junit:4.13.2'
61+
testImplementation 'org.jetbrains.kotlin:kotlin-test-junit:1.0.6'
62+
testImplementation 'org.robolectric:robolectric:4.9'
5863
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
5964
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
65+
}
66+
67+
apply plugin: 'org.jetbrains.dokka'
68+
69+
jacoco {
70+
toolVersion "0.8.8"
71+
}
72+
73+
tasks.withType(Test) {
74+
jacoco {
75+
includeNoLocationClasses = true
76+
excludes = ['jdk.internal.*']
77+
}
78+
finalizedBy jacocoTestReport
79+
}
80+
81+
tasks.register('jacocoTestCoverageVerification', JacocoCoverageVerification) {
82+
violationRules {
83+
rule {
84+
enabled = true
85+
element = 'CLASS'
86+
}
87+
}
88+
}
89+
90+
task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest']) {
91+
reports {
92+
csv.enabled false
93+
html.enabled true
94+
xml.enabled true
95+
}
96+
classDirectories.setFrom(files(classDirectories.files.collect {
97+
fileTree(dir: it, excludes: [
98+
'**/R.class',
99+
'**/BR.class',
100+
'**/R$*.class',
101+
'**/*$ViewInjector*.*',
102+
'**/*$ViewBinder*.*',
103+
'**/BuildConfig.*',
104+
'android/**',
105+
'**/Manifest*.*',
106+
'**/*$Lambda$*.*', // Jacoco can not handle several "$" in class name.
107+
'**/*Module.*', // Modules for Dagger.
108+
'**/*Dagger*.*', // Dagger auto-generated code.
109+
'**/*MembersInjector*.*', // Dagger auto-generated code.
110+
'**/*_Provide*Factory*.*',
111+
'**/*_Factory.*', //Dagger auto-generated code
112+
'**/*$*$*.*' // Anonymous classes generated by kotlin
113+
])
114+
}))
60115
}

imagekit-fresco-extension/src/test/java/com/example/imagekit/android/fresco_extension/ExampleUnitTest.kt

-17
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.example.imagekit.android.fresco_extension
2+
3+
import com.imagekit.android.ImageKit
4+
import com.imagekit.android.entity.Rotation
5+
import org.junit.Assert.*
6+
7+
import org.junit.Before
8+
import org.junit.Test
9+
import org.junit.runner.RunWith
10+
import org.robolectric.RobolectricTestRunner
11+
import org.robolectric.RuntimeEnvironment
12+
13+
@RunWith(RobolectricTestRunner::class)
14+
class IKFrescoExtensionTest {
15+
16+
@Before
17+
fun setUp() {
18+
ImageKit.init(
19+
context = RuntimeEnvironment.getApplication(),
20+
urlEndpoint = "https://ik.imagekit.io/demo"
21+
)
22+
}
23+
24+
@Test
25+
fun createWithFresco() {
26+
val expectedUrl = "https://ik.imagekit.io/demo/medium_cafe_B1iTdD0C.jpg?x-test-header=Test&tr=h-300,w-300,rt-90"
27+
val imageRequest = ImageKit.getInstance()
28+
.url(
29+
src = "https://ik.imagekit.io/demo/medium_cafe_B1iTdD0C.jpg"
30+
)
31+
.height(300)
32+
.width(300)
33+
.rotation(Rotation.VALUE_90)
34+
.addCustomQueryParameter("x-test-header", "Test")
35+
.createWithFresco()
36+
kotlin.test.assertEquals(expectedUrl, imageRequest.sourceUri.toString())
37+
}
38+
}

imagekit/build.gradle

+4-6
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ android {
2121

2222
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
2323

24-
buildConfigField "String", "API_VERSION", "\"1.0.0\""
24+
buildConfigField "String", "API_VERSION", "\"3.0.0\""
2525
}
2626

2727
buildTypes {
@@ -43,7 +43,7 @@ android {
4343
release(MavenPublication) {
4444
groupId = group
4545
artifactId = 'imagekit-android'
46-
version = '2.0.1'
46+
version = '3.0.0'
4747

4848
afterEvaluate {
4949
from components.release
@@ -61,6 +61,7 @@ dependencies {
6161
api "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
6262
testImplementation 'org.jetbrains.kotlin:kotlin-test-junit:1.0.6'
6363
testImplementation 'junit:junit:4.13.2'
64+
testImplementation 'org.robolectric:robolectric:4.9'
6465
androidTestImplementation 'androidx.test:runner:1.5.2'
6566
testImplementation 'org.mockito:mockito-core:4.2.0'
6667
testImplementation 'org.powermock:powermock-api-mockito2:2.0.7'
@@ -77,14 +78,12 @@ dependencies {
7778
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
7879
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0'
7980
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
80-
testImplementation 'com.squareup.okhttp3:mockwebserver:3.12.0'
81-
// compileOnly 'com.github.pengrad:jdk9-deps:1.0'
81+
testImplementation 'com.squareup.okhttp3:mockwebserver:4.9.3'
8282

8383
implementation "com.linkedin.android.litr:litr:1.4.16"
8484
}
8585

8686
apply plugin: 'org.jetbrains.dokka'
87-
//
8887

8988
jacoco {
9089
toolVersion "0.8.8"
@@ -103,7 +102,6 @@ tasks.register('jacocoTestCoverageVerification', JacocoCoverageVerification) {
103102
rule {
104103
enabled = true
105104
element = 'CLASS'
106-
107105
}
108106
}
109107
}

imagekit/src/main/java/com/imagekit/android/ImagekitUploader.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ class ImagekitUploader @Inject constructor(
358358
imageKitCallback
359359
)
360360

361-
private fun checkUploadPolicy(policy: UploadPolicy, imageKitCallback: ImageKitCallback): Boolean {
361+
internal fun checkUploadPolicy(policy: UploadPolicy, imageKitCallback: ImageKitCallback): Boolean {
362362
if (policy.networkType == UploadPolicy.NetworkType.UNMETERED) {
363363
val service =
364364
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

imagekit/src/main/java/com/imagekit/android/preprocess/ImageCrop.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ internal class ImageCrop(
1212
source,
1313
topLeft.x,
1414
topLeft.y,
15-
bottomRight.x - topLeft.x,
16-
bottomRight.y - topLeft.y
15+
bottomRight.x - topLeft.x + 1,
16+
bottomRight.y - topLeft.y + 1
1717
)
1818
}

imagekit/src/main/java/com/imagekit/android/preprocess/VideoUploadPreprocessor.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class VideoUploadPreprocessor private constructor(
5050
val targetAudio = MediaFormat().apply {
5151
setString(MediaFormat.KEY_MIME, audioTrack?.getString(MediaFormat.KEY_MIME))
5252
setInteger(MediaFormat.KEY_CHANNEL_COUNT, audioTrack?.getInteger(MediaFormat.KEY_CHANNEL_COUNT) ?: 2)
53-
setInteger(MediaFormat.KEY_SAMPLE_RATE, audioTrack?.getInteger(MediaFormat.KEY_SAMPLE_RATE)!!)
53+
setInteger(MediaFormat.KEY_SAMPLE_RATE, audioTrack?.getInteger(MediaFormat.KEY_SAMPLE_RATE) ?: 0)
5454
setInteger(MediaFormat.KEY_BIT_RATE, targetAudioBitrate)
5555
}
5656
MediaTransformer(context.applicationContext).transform(

imagekit/src/main/java/com/imagekit/android/retrofit/NetworkManager.kt

+10-6
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package com.imagekit.android.retrofit
22

3+
import android.content.pm.ApplicationInfo
34
import android.util.Log
45
import com.google.gson.Gson
5-
import com.imagekit.android.BuildConfig
6+
import com.imagekit.android.ImageKit
67
import com.imagekit.android.entity.SignatureResponse
78
import io.reactivex.Single
89
import io.reactivex.android.schedulers.AndroidSchedulers
@@ -19,18 +20,18 @@ import retrofit2.converter.gson.GsonConverterFactory
1920
import java.io.File
2021
import java.util.concurrent.TimeUnit
2122

22-
object NetworkManager {
23+
internal object NetworkManager {
2324
private const val TAG = "Application Handler"
2425
private var apiInterface: ApiInterface? = null
2526
fun initialize() {
26-
createRetrofitObject()
27+
// createRetrofitObject()
2728
}
2829

2930
private fun createRetrofitObject() {
3031
val okHttpClient = OkHttpClient.Builder()
3132
.readTimeout(0, TimeUnit.SECONDS)
3233
.apply {
33-
if (BuildConfig.DEBUG) {
34+
if (ImageKit.getInstance().context.applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE != 0) {
3435
addInterceptor(HttpLoggingInterceptor()
3536
.setLevel(HttpLoggingInterceptor.Level.BODY)
3637
)
@@ -46,8 +47,7 @@ object NetworkManager {
4647
apiInterface = retrofit.create(ApiInterface::class.java)
4748
}
4849

49-
private val baseURL: String
50-
get() = "https://upload.imagekit.io/"
50+
private var baseURL: String = "https://upload.imagekit.io/"
5151

5252
fun getApiInterface(): ApiInterface {
5353
if (apiInterface == null) {
@@ -166,4 +166,8 @@ object NetworkManager {
166166
private fun getCommaSeparatedTagsFromTags(tags: Array<String>?): String? {
167167
return tags?.joinToString(",")
168168
}
169+
170+
fun setBaseUrl(url: String) {
171+
baseURL = url
172+
}
169173
}

0 commit comments

Comments
 (0)