Yet Another OTP generator
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

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