git cl: refactor common user interactions.

R=machenbach@chromium.org
BUG=

Change-Id: Id3e3fe6223a875d997ac5569137db270818a08f4
Reviewed-on: https://chromium-review.googlesource.com/453439
Commit-Queue: Andrii Shyshkalov <tandrii@chromium.org>
Reviewed-by: Michael Achenbach <machenbach@chromium.org>
diff --git a/tests/git_cl_test.py b/tests/git_cl_test.py
index 7401195..dbcb26a 100755
--- a/tests/git_cl_test.py
+++ b/tests/git_cl_test.py
@@ -464,7 +464,8 @@
                   self._mocked_call(['get_or_create_merge_base']+list(a))))
     self.mock(git_cl, 'BranchExists', lambda _: True)
     self.mock(git_cl, 'FindCodereviewSettingsFile', lambda: '')
-    self.mock(git_cl, 'ask_for_data', self._mocked_call)
+    self.mock(git_cl, 'ask_for_data', lambda *a, **k: self._mocked_call(
+        *(['ask_for_data'] + list(a)), **k))
     self.mock(git_cl, 'write_json', lambda path, contents:
         self._mocked_call('write_json', path, contents))
     self.mock(git_cl.presubmit_support, 'DoPresubmitChecks', PresubmitMock)
@@ -550,6 +551,20 @@
       raise result
     return result
 
+  def test_ask_for_explicit_yes_true(self):
+    self.calls = [
+        (('ask_for_data', 'prompt [Yes/No]: '), 'blah'),
+        (('ask_for_data', 'Please, type yes or no: '), 'ye'),
+    ]
+    self.assertTrue(git_cl.ask_for_explicit_yes('prompt'))
+
+  def test_ask_for_explicit_yes_true(self):
+    self.calls = [
+        (('ask_for_data', 'prompt [Yes/No]: '), 'yesish'),
+        (('ask_for_data', 'Please, type yes or no: '), 'nO'),
+    ]
+    self.assertFalse(git_cl.ask_for_explicit_yes('prompt'))
+
   def test_LoadCodereviewSettingsFromFile_gerrit(self):
     codereview_file = StringIO.StringIO('GERRIT_HOST: true')
     self.calls = [
@@ -1247,7 +1262,7 @@
       if not title:
         calls += [
             ((['git', 'show', '-s', '--format=%s', 'HEAD'],), ''),
-            (('Title for patchset []: ',), 'User input'),
+            (('ask_for_data', 'Title for patchset []: '), 'User input'),
         ]
         title = 'User_input'
     if not git_footers.get_footer_change_id(description) and not squash:
@@ -1562,8 +1577,10 @@
     self.mock(git_cl, 'CMDupload', mock_CMDupload)
 
     self.calls = [
-        (('[Press enter to continue or ctrl-C to quit]',), ''),
-      ]
+        (('ask_for_data', 'This command will checkout all dependent branches '
+                          'and run "git cl upload". Press Enter to continue, '
+                          'or Ctrl+C to abort'), ''),
+    ]
 
     class MockChangelist():
       def __init__(self):
@@ -1950,8 +1967,6 @@
               CookiesAuthenticatorMockFactory(hosts_with_creds=auth))
     self.mock(git_cl, 'DieWithError',
               lambda msg, change=None: self._mocked_call(['DieWithError', msg]))
-    self.mock(git_cl, 'ask_for_data',
-              lambda msg: self._mocked_call(['ask_for_data', msg]))
     self.calls = self._gerrit_ensure_auth_calls(skip_auth_check=skip_auth_check)
     cl = git_cl.Changelist(codereview='gerrit')
     cl.branch = 'master'
@@ -1979,8 +1994,8 @@
       'chromium-review.googlesource.com': 'other',
     })
     self.calls.append(
-        ((['ask_for_data', 'If you know what you are doing, '
-                           'press Enter to continue, Ctrl+C to abort.'],), ''))
+        (('ask_for_data', 'If you know what you are doing '
+                          'press Enter to continue, or Ctrl+C to abort'), ''))
     self.assertIsNone(cl.EnsureAuthenticated(force=False))
 
   def test_gerrit_ensure_authenticated_ok(self):
@@ -2678,7 +2693,7 @@
         ((['exists', '/abs/git_repo_root/.git/hooks/commit-msg'],), True),
         ((['FileRead', '/abs/git_repo_root/.git/hooks/commit-msg'],),
          '...\n# From Gerrit Code Review\n...\nadd_ChangeId()\n'),
-        (('Do you want to remove it now? [Yes/No]',), 'Yes'),
+        (('ask_for_data', 'Do you want to remove it now? [Yes/No]: '), 'Yes'),
         ((['rm_file_or_tree', '/abs/git_repo_root/.git/hooks/commit-msg'],),
          ''),
     ]