Last active
November 30, 2019 06:20
-
-
Save seoft/d0f7f5d92cd3df285da0ceef2ab2b304 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock | |
import android.content.Context | |
import androidx.arch.core.executor.testing.InstantTaskExecutorRule | |
import androidx.lifecycle.LiveData | |
import androidx.lifecycle.Observer | |
import androidx.test.ext.junit.runners.AndroidJUnit4 | |
import androidx.test.rule.ActivityTestRule | |
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.data.BookRepo | |
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.data.api.createGsonFactory | |
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.data.api.createOkHttpFactory | |
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.data.api.createWebService | |
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.data.local.PrefRepo | |
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.data.model.Book | |
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.ui.main.MainActivity | |
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.ui.main.MainVM | |
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.ui.sub.SubVM | |
import kr.co.seoft.std_of_android_with_kt_mvvm_aac_mock.util.get | |
import org.junit.Assert.assertEquals | |
import org.junit.Before | |
import org.junit.Rule | |
import org.junit.Test | |
import org.junit.runner.RunWith | |
import java.sql.Timestamp | |
/** | |
* ref : | |
* https://www.slideshare.net/imkimkevin/android-jetpack-viewmodel-and-testing | |
* https://medium.com/pxhouse/unit-testing-with-mutablelivedata-22b3283a7819 | |
* https://bonoogi.postype.com/post/3514910 | |
* https://mvnrepository.com/artifact/androidx.arch.core/core-testing/2.0.0-alpha1 | |
* https://eclipse-owl.tistory.com/8 | |
*/ | |
@RunWith(AndroidJUnit4::class) | |
class ViewModelTest { | |
val DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" | |
@JvmField | |
@Rule | |
val main = ActivityTestRule(MainActivity::class.java) | |
@JvmField | |
@Rule | |
val instantTaskExecutorRule = InstantTaskExecutorRule() | |
lateinit var context: Context | |
lateinit var mainVM: MainVM | |
lateinit var subVM: SubVM | |
var callbackOrder = 0 | |
fun <T> LiveData<T>.observeByOrder(observer: Observer<T>, _order: Int) { | |
if (_order != callbackOrder) return | |
observeForever(object : Observer<T> { | |
override fun onChanged(t: T?) { | |
observer.onChanged(t) | |
removeObserver(this) | |
callbackOrder++ | |
} | |
}) | |
} | |
@Before | |
fun setUp() { | |
context = main.activity | |
mainVM = MainVM(PrefRepo(context)) | |
subVM = SubVM( | |
BookRepo( | |
createWebService( | |
createOkHttpFactory(), | |
createGsonFactory(DATE_FORMAT), | |
BuildConfig.BASE_URL | |
), BuildConfig.AUTH_KEY | |
) | |
) | |
} | |
@Test | |
fun testMainVM() { | |
// clickSearch | |
var latelyStr: String? = null | |
mainVM.clickSearch("") | |
assertEquals(latelyStr, mainVM.doSearch.value) | |
val keyword = "테스트" | |
mainVM.clickSearch(keyword) | |
assertEquals(keyword, mainVM.doSearch.get()) | |
latelyStr = keyword | |
mainVM.clickSearch("") | |
assertEquals(latelyStr, mainVM.doSearch.get()) | |
// calc | |
val myBook1 = Book( | |
arrayListOf("aut1", "aut2"), | |
"this_is_contents", | |
Timestamp(System.currentTimeMillis()), | |
1000, | |
800, | |
"this_is_title" | |
) | |
mainVM.calc(myBook1) | |
assertEquals(-800, mainVM.balance.get()) | |
val myBook2 = Book( | |
arrayListOf("aut1", "aut2"), | |
"this_is_contents", | |
Timestamp(System.currentTimeMillis()), | |
1000, | |
900, | |
"this_is_title" | |
) | |
mainVM.calc(myBook2) | |
assertEquals(100, mainVM.balance.get()) | |
} | |
@Test | |
fun testSubVM() { | |
val abcTestKeywrod = "abc" | |
val androidTestKeyword = "android" | |
val rxjavaTestKeyword = "rxjava" | |
// check init value | |
assertEquals(1, subVM.page) | |
assertEquals(1, subVM.refreshCount) | |
// search abc | |
subVM.addData(abcTestKeywrod) | |
subVM.doRefresh.observeByOrder(Observer { | |
assertEquals(11, subVM.books.size) | |
assertEquals(2, subVM.page) | |
subVM.books.forEach { | |
if(it is Book) assertEquals(true, it.title.contains(Regex("(?i)abc"))) | |
} | |
// search android | |
subVM.addData(androidTestKeyword) | |
}, 0) | |
subVM.doRefresh.observeByOrder(Observer { | |
assertEquals(21, subVM.books.size) | |
assertEquals(3, subVM.page) | |
subVM.books.forEach { | |
if(it is Book) assertEquals(true, it.title.contains(Regex("(?i)android"))) | |
} | |
// search rxjava | |
subVM.addData(rxjavaTestKeyword) | |
}, 1) | |
subVM.doRefresh.observeByOrder(Observer { | |
assertEquals(31, subVM.books.size) | |
assertEquals(4, subVM.page) | |
subVM.books.forEach { | |
if(it is Book) assertEquals(true, it.title.contains(Regex("(?i)rxjava"))) | |
} | |
// cleared list | |
subVM.clearBooks() | |
assertEquals(1, subVM.page) | |
assertEquals(1, subVM.refreshCount) | |
assertEquals(1, subVM.books.size) | |
}, 2) | |
} | |
@Test | |
fun testSubVM2() { | |
val emptyResultTestKeyword = "34[@?&*vf2narㄱ㈜tyi2q[ac!@()vs" | |
assertEquals(1, subVM.page) | |
assertEquals(1, subVM.refreshCount) | |
subVM.addData(emptyResultTestKeyword) | |
subVM.doEmptyData.observeForever { | |
assertEquals(1, subVM.page) | |
assertEquals(1, subVM.books.size) | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment