Yet Another OTP generator
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

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. }