From be1656f6063f11b8f331eb8a93a6ad03eac3630c Mon Sep 17 00:00:00 2001
From: Oliver Zimmerman <oezimmerman@gmail.com>
Date: Tue, 10 Nov 2020 09:06:17 +0000
Subject: [PATCH] "Invalid Tan" message is displayed when the TAN input screen
 is opened (EXPOSUREAPP-3646) (#1560)

* Small change to check length of TAN before checking it's validity

* Unit test adjustment to reflect changes.

* Adjusted comparison to use less than operator. Additional tests.

* Seperated tan valid and tan length check fore better readibility. Adjusted tests

* lint fix

* use new isCorrectLength in isTanValidFormat

Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com>
---
 .../submission/tan/SubmissionTanFragment.kt   |  6 +++++-
 .../submission/tan/SubmissionTanViewModel.kt  |  6 ++++--
 .../coronawarnapp/ui/submission/tan/Tan.kt    |  3 ++-
 .../tan/SubmissionTanViewModelTest.kt         |  4 ++++
 .../ui/submission/tan/TanTest.kt              | 20 +++++++++++++++++++
 5 files changed, 35 insertions(+), 4 deletions(-)

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanFragment.kt
index a9c953118..7f95fa7c8 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanFragment.kt
@@ -40,7 +40,11 @@ class SubmissionTanFragment : Fragment(R.layout.fragment_submission_tan), AutoIn
             binding.uiState = it
 
             submission_tan_character_error.setGone(it.areCharactersCorrect)
-            submission_tan_error.setGone(it.isTanValidFormat)
+            if (it.isCorrectLength) {
+                submission_tan_error.setGone(it.isTanValid)
+            } else {
+                submission_tan_error.setGone(true)
+            }
         }
 
         binding.submissionTanContent.submissionTanInput.listener = { tan ->
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanViewModel.kt
index c947e09a9..28dbe39bc 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanViewModel.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanViewModel.kt
@@ -28,7 +28,8 @@ class SubmissionTanViewModel @AssistedInject constructor(
         UIState(
             isTanValid = currentTan.isTanValid,
             isTanValidFormat = currentTan.isTanValidFormat,
-            areCharactersCorrect = currentTan.areCharactersValid
+            areCharactersCorrect = currentTan.areCharactersValid,
+            isCorrectLength = currentTan.isCorrectLength
         )
     }.asLiveData(context = dispatcherProvider.Default)
 
@@ -73,7 +74,8 @@ class SubmissionTanViewModel @AssistedInject constructor(
     data class UIState(
         val isTanValid: Boolean = false,
         val areCharactersCorrect: Boolean = false,
-        val isTanValidFormat: Boolean = false
+        val isTanValidFormat: Boolean = false,
+        val isCorrectLength: Boolean = false
     )
 
     @AssistedInject.Factory
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/Tan.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/Tan.kt
index a4d883605..8cfc0e094 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/Tan.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/tan/Tan.kt
@@ -8,8 +8,9 @@ data class Tan(
     val value: String
 ) {
 
+    val isCorrectLength = value.length == MAX_LENGTH
     val areCharactersValid = allCharactersValid(value)
-    val isTanValidFormat = value.length == MAX_LENGTH && isChecksumValid(value)
+    val isTanValidFormat = isCorrectLength && isChecksumValid(value)
     val isTanValid = areCharactersValid && isTanValidFormat
 
     companion object {
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanViewModelTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanViewModelTest.kt
index fe2bd9043..ee57585af 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanViewModelTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/tan/SubmissionTanViewModelTest.kt
@@ -28,15 +28,19 @@ class SubmissionTanViewModelTest : BaseTest() {
 
         viewModel.onTanChanged("ZWFPC7NG47")
         viewModel.state.value!!.isTanValid shouldBe true
+        viewModel.state.value!!.isCorrectLength shouldBe true
 
         viewModel.onTanChanged("ABC")
         viewModel.state.value!!.isTanValid shouldBe false
+        viewModel.state.value!!.isCorrectLength shouldBe false
 
         viewModel.onTanChanged("ZWFPC7NG48")
         viewModel.state.value!!.isTanValid shouldBe false
+        viewModel.state.value!!.isCorrectLength shouldBe true
 
         viewModel.onTanChanged("ZWFPC7NG4A")
         viewModel.state.value!!.isTanValid shouldBe false
+        viewModel.state.value!!.isCorrectLength shouldBe true
     }
 
     @Test
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/tan/TanTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/tan/TanTest.kt
index 4a011b972..927c107ed 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/tan/TanTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/tan/TanTest.kt
@@ -46,6 +46,26 @@ class TanTest : BaseTest() {
         }
     }
 
+    @Test
+    fun isTanValid() {
+        val validTans = arrayOf(
+            "9A3B578UMG", "DEU7TKSV3H", "PTPHM35RP4", "V923D59AT8", "H9NC5CQ34E"
+        )
+        for (tan in validTans) {
+            Tan.allCharactersValid(tan)  shouldBe true
+            Tan.isChecksumValid(tan) shouldBe true
+            (tan.length == Tan.MAX_LENGTH) shouldBe true
+        }
+
+        // invalid tans due to length and/or invalid characters
+        val invalidTans = arrayOf(
+            "ABÖAA1", "-1234", "PTPHM15RP4", "aAASd A"
+        )
+        for (tan in invalidTans) {
+           Tan.allCharactersValid(tan) shouldBe false
+        }
+    }
+
     @Test
     fun isChecksumValid() {
         // valid
-- 
GitLab