Yet Another OTP generator
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

OtpItemViewModelTest.kt 3.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package com.chameth.yaotp.viewmodel
  2. import androidx.arch.core.executor.testing.InstantTaskExecutorRule
  3. import androidx.lifecycle.Observer
  4. import com.chameth.yaotp.algos.Otp
  5. import com.nhaarman.mockitokotlin2.argThat
  6. import com.nhaarman.mockitokotlin2.doReturn
  7. import com.nhaarman.mockitokotlin2.mock
  8. import com.nhaarman.mockitokotlin2.verify
  9. import org.junit.Assert.assertEquals
  10. import org.junit.Rule
  11. import org.junit.Test
  12. class OtpItemViewModelTest {
  13. @get:Rule
  14. val instantTaskExecutorRule = InstantTaskExecutorRule()
  15. private val viewModel = OtpItemViewModel()
  16. @Test
  17. fun testCalculateTimeLeft_withFutureTimes() {
  18. assertEquals(1, viewModel.calculateTimeLeft(100L, 99L))
  19. assertEquals(1000, viewModel.calculateTimeLeft(1000L, 0L))
  20. assertEquals(1000, viewModel.calculateTimeLeft(99999991000L, 99999990000L))
  21. }
  22. @Test
  23. fun testCalculateTimeLeft_withPastTimes() {
  24. assertEquals(0, viewModel.calculateTimeLeft(100L, 100L))
  25. assertEquals(0, viewModel.calculateTimeLeft(100L, 1000L))
  26. assertEquals(0, viewModel.calculateTimeLeft(100L, 100000000000L))
  27. }
  28. @Test
  29. fun testSetAccount_updatesLabel() {
  30. val observer = mock<Observer<String>>()
  31. viewModel.label.observeForever(observer)
  32. viewModel.account = mock { on { label } doReturn "My label" }
  33. verify(observer).onChanged("My label")
  34. }
  35. @Test
  36. fun testSetAccount_updatesOtp() {
  37. val otp = mock<Otp>()
  38. val observer = mock<Observer<Otp>>()
  39. viewModel.otp.observeForever(observer)
  40. viewModel.account = mock { on { generateOtp() } doReturn otp }
  41. verify(observer).onChanged(otp)
  42. }
  43. @Test
  44. fun testSetAccount_updatesShowTime_withTimeBasedAccount() {
  45. val observer = mock<Observer<Boolean>>()
  46. viewModel.showTime.observeForever(observer)
  47. viewModel.account = mock { on { timeBased } doReturn true }
  48. verify(observer).onChanged(true)
  49. }
  50. @Test
  51. fun testSetAccount_updatesShowTime_withNonTimeBasedAccount() {
  52. val observer = mock<Observer<Boolean>>()
  53. viewModel.showTime.observeForever(observer)
  54. viewModel.account = mock { on { timeBased } doReturn false }
  55. verify(observer).onChanged(false)
  56. }
  57. @Test
  58. fun testSetAccount_updatesTimeLeft_withTimeBasedAccount() {
  59. val otp = mock<Otp> { on { expiresAt } doReturn (System.currentTimeMillis() / 1000) + 10 }
  60. val observer = mock<Observer<String>>()
  61. viewModel.timeLeft.observeForever(observer)
  62. viewModel.account = mock { on { generateOtp() } doReturn otp; on { timeBased } doReturn true }
  63. verify(observer).onChanged(argThat { matches(Regex("(9|10)s")) })
  64. }
  65. @Test
  66. fun testSetAccount_updatesTimeLeft_withNonTimeBasedAccount() {
  67. val otp = mock<Otp>()
  68. val observer = mock<Observer<String>>()
  69. viewModel.timeLeft.observeForever(observer)
  70. viewModel.account = mock { on { generateOtp() } doReturn otp; on { timeBased } doReturn false }
  71. verify(observer).onChanged("")
  72. }
  73. }