code: def test_user_input(self):
      zipline.extension_args = Namespace()
  
      runner = CliRunner()
      result = runner.invoke(
          main.main,
          [
              "-xfirst.second.a=blah1",
              "-xfirst.second.b=blah2",
              "-xfirst.third=blah3",
              "-xsecond.a.b=blah4",
              "-xsecond.b.a=blah5",
              "-xa1=value1",
              "-xb_=value2",
              "bundles",
          ],
      )
  
      assert_equal(result.exit_code, 0)  # assert successful invocation
      assert_equal(zipline.extension_args.first.second.a, "blah1")
      assert_equal(zipline.extension_args.first.second.b, "blah2")
      assert_equal(zipline.extension_args.first.third, "blah3")
      assert_equal(zipline.extension_args.second.a.b, "blah4")
      assert_equal(zipline.extension_args.second.b.a, "blah5")
      assert_equal(zipline.extension_args.a1, "value1")
      assert_equal(zipline.extension_args.b_, "value2")
  
file_path: zipline/tests/test_cmdline.py
imports: import mock
  import zipline.__main__
  import zipline
  from zipline.testing import ZiplineTestCase
  from zipline.testing.fixtures import WithTmpDir
  from zipline.testing.predicates import assert_equal, assert_raises_str
  from click.testing import CliRunner
  from zipline.extensions import Namespace, create_args, parse_extension_arg
label_desc: Use image node_id 4 for calling the CmdLineTestCase obj's underlying member method code with example usage: obj.test_user_input() without return types