def test_process_devhub_output(self):
     """ username is parsed from json response """
     del self.task_config.config["options"]["username"]
     task = CreateConnectedApp(self.project_config, self.task_config)
     task._process_devhub_output('{"result":[{"value":"' + self.username +
                                 '"}]}')
     self.assertEqual(task.options.get("username"), self.username)
 def test_process_json_output_invalid(self):
     """ _process_json_output with invalid input logs output and raises JSONDecodeError """
     task = CreateConnectedApp(self.project_config, self.task_config)
     with pytest.raises(JSONDecodeError):
         task._process_json_output("invalid")
     self.assertEqual(self.task_log["error"],
                      ["Failed to parse json from output: invalid"])
 def test_generate_id_and_secret(self):
     """ client_id and client_secret are generated correctly """
     task = CreateConnectedApp(self.project_config, self.task_config)
     task._generate_id_and_secret()
     self.assertEqual(len(task.client_id), task.client_id_length)
     self.assertEqual(len(task.client_secret), task.client_secret_length)
     self.assertNotEqual(re.match(r"^\w+$", task.client_id), None)
     self.assertNotEqual(re.match(r"^\w+$", task.client_secret), None)
Exemple #4
0
 def test_generate_id_and_secret(self):
     """ client_id and client_secret are generated correctly """
     task = CreateConnectedApp(self.project_config, self.task_config)
     task._generate_id_and_secret()
     self.assertEqual(len(task.client_id), task.client_id_length)
     self.assertEqual(len(task.client_secret), task.client_secret_length)
     self.assertNotEqual(re.match(r"^\w+$", task.client_id), None)
     self.assertNotEqual(re.match(r"^\w+$", task.client_secret), None)
 def test_process_json_output_invalid(self):
     """ _process_json_output with invalid input logs output and raises JSONDecodeError """
     task = CreateConnectedApp(self.project_config, self.task_config)
     with pytest.raises(JSONDecodeError):
         task._process_json_output("invalid")
     self.assertEqual(
         self.task_log["error"], ["Failed to parse json from output: invalid"]
     )
 def test_set_default_username(self, run_command_mock):
     """ _set_default_username calls _run_command """
     task = CreateConnectedApp(self.project_config, self.task_config)
     task._set_default_username()
     run_command_mock.assert_called_once()
     self.assertEqual(
         self.task_log["info"], ["Getting username for the default devhub from sfdx"]
     )
 def test_set_default_username(self, run_command_mock):
     """ _set_default_username calls _run_command """
     task = CreateConnectedApp(self.project_config, self.task_config)
     run_command_mock.side_effect = lambda **kw: kw["output_handler"](
         b'{"result":[{"value":"username"}]}')
     task._set_default_username()
     run_command_mock.assert_called_once()
     self.assertEqual(self.task_log["info"],
                      ["Getting username for the default devhub from sfdx"])
 def test_set_default_username(self, run_command_mock):
     """ _set_default_username calls _run_command """
     task = CreateConnectedApp(self.project_config, self.task_config)
     run_command_mock.side_effect = lambda **kw: kw["output_handler"](
         b'{"result":[{"value":"username"}]}'
     )
     task._set_default_username()
     run_command_mock.assert_called_once()
     self.assertEqual(
         self.task_log["info"], ["Getting username for the default devhub from sfdx"]
     )
 def test_run_task_connect(self, run_task_mock, connect_service_mock):
     """ _run_task calls _connect_service if connect option is True """
     self.project_config.config["services"] = {
         "connected_app": {
             "attributes": {"callback_url": {}, "client_id": {}, "client_secret": {}}
         }
     }
     self.task_config.config["options"]["connect"] = True
     task = CreateConnectedApp(self.project_config, self.task_config)
     task._run_task()
     run_task_mock.assert_called_once()
     connect_service_mock.assert_called_once()
Exemple #10
0
 def test_run_task_connect(self, run_task_mock, connect_service_mock):
     """ _run_task calls _connect_service if connect option is True """
     self.project_config.config["services"] = {
         "connected_app": {
             "attributes": {"callback_url": {}, "client_id": {}, "client_secret": {}}
         }
     }
     self.task_config.config["options"]["connect"] = True
     task = CreateConnectedApp(self.project_config, self.task_config)
     task._run_task()
     run_task_mock.assert_called_once()
     connect_service_mock.assert_called_once()
 def test_connect_service(self):
     """ connected app gets added to the keychain connected_app service """
     self.project_config.config["services"] = {
         "connected_app": {
             "attributes": {"callback_url": {}, "client_id": {}, "client_secret": {}}
         }
     }
     task = CreateConnectedApp(self.project_config, self.task_config)
     task._connect_service()
     connected_app = self.project_config.keychain.get_service("connected_app")
     self.assertEqual(connected_app.callback_url, "http://localhost:8080/callback")
     self.assertEqual(connected_app.client_id, task.client_id)
     self.assertEqual(connected_app.client_secret, task.client_secret)
Exemple #12
0
 def test_run_task(self, run_task_mock):
     """ _run_task formats command, calls SFDXBaseTask._run_task, and does not connect service by default """
     self.project_config.config["services"] = {
         "connected_app": {
             "attributes": {"callback_url": {}, "client_id": {}, "client_secret": {}}
         }
     }
     task = CreateConnectedApp(self.project_config, self.task_config)
     task._run_task()
     run_task_mock.assert_called_once()
     self.assertFalse(os.path.isdir(task.tempdir))
     connected_app = self.project_config.keychain.get_service("connected_app")
     assert connected_app is DEFAULT_CONNECTED_APP
Exemple #13
0
 def test_connect_service(self):
     """ connected app gets added to the keychain connected_app service """
     self.project_config.config["services"] = {
         "connected_app": {
             "attributes": {"callback_url": {}, "client_id": {}, "client_secret": {}}
         }
     }
     task = CreateConnectedApp(self.project_config, self.task_config)
     task._connect_service()
     connected_app = self.project_config.keychain.get_service("connected_app")
     self.assertEqual(connected_app.callback_url, "http://localhost:8080/callback")
     self.assertEqual(connected_app.client_id, task.client_id)
     self.assertEqual(connected_app.client_secret, task.client_secret)
 def test_run_task(self, run_task_mock):
     """ _run_task formats command, calls SFDXBaseTask._run_task, and does not connect service by default """
     self.project_config.config["services"] = {
         "connected_app": {
             "attributes": {"callback_url": {}, "client_id": {}, "client_secret": {}}
         }
     }
     task = CreateConnectedApp(self.project_config, self.task_config)
     task._run_task()
     run_task_mock.assert_called_once()
     self.assertFalse(os.path.isdir(task.tempdir))
     self.assertEqual(
         task.options["command"],
         self.base_command + " -u {} -d {}".format(self.username, task.tempdir),
     )
     with pytest.raises(ServiceNotConfigured):
         self.project_config.keychain.get_service("connected_app")
 def test_run_task(self, run_task_mock):
     """ _run_task formats command, calls SFDXBaseTask._run_task, and does not connect service by default """
     self.project_config.config["services"] = {
         "connected_app": {
             "attributes": {"callback_url": {}, "client_id": {}, "client_secret": {}}
         }
     }
     task = CreateConnectedApp(self.project_config, self.task_config)
     task._run_task()
     run_task_mock.assert_called_once()
     self.assertFalse(os.path.isdir(task.tempdir))
     self.assertEqual(
         task.options["command"],
         self.base_command + " -u {} -d {}".format(self.username, task.tempdir),
     )
     with pytest.raises(ServiceNotConfigured):
         self.project_config.keychain.get_service("connected_app")
Exemple #16
0
 def test_init_options_default_username(self, set_mock):
     """ Not passing username calls _get_default_username """
     del self.task_config.config["options"]["username"]
     try:
         CreateConnectedApp(self.project_config, self.task_config)
     except Exception:
         pass
     set_mock.assert_called_once()
 def test_init_options(self):
     """ Passed options are correctly initialized """
     self.task_config.config["options"]["connect"] = True
     self.task_config.config["options"]["overwrite"] = True
     task = CreateConnectedApp(self.project_config, self.task_config)
     self.assertEqual(task.options["label"], self.label)
     self.assertEqual(task.options["username"], self.username)
     self.assertEqual(task.options["email"], self.email)
     self.assertIs(task.options["connect"], True)
     self.assertIs(task.options["overwrite"], True)
Exemple #18
0
 def test_init_options_email_default(self):
     """ email option defaults to email from github service """
     del self.task_config.config["options"]["email"]
     self.project_config.config["services"] = {
         "github": {"attributes": {"email": {}}}
     }
     self.project_config.keychain.set_service(
         "github", ServiceConfig({"email": self.email}), True
     )
     task = CreateConnectedApp(self.project_config, self.task_config)
     self.assertEqual(task.options["email"], self.email)
Exemple #19
0
 def test_build_package(self):
     """ tempdir is populated with connected app and package.xml """
     task = CreateConnectedApp(self.project_config, self.task_config)
     with temporary_dir() as tempdir:
         task.tempdir = tempdir
         connected_app_path = os.path.join(
             task.tempdir, "connectedApps", "{}.connectedApp".format(self.label)
         )
         task._build_package()
         self.assertTrue(os.path.isdir(os.path.join(task.tempdir, "connectedApps")))
         self.assertTrue(os.path.isfile(os.path.join(task.tempdir, "package.xml")))
         self.assertTrue(os.path.isfile(connected_app_path))
         with open(connected_app_path, "r") as f:
             connected_app = f.read()
             self.assertTrue("<label>{}<".format(self.label) in connected_app)
             self.assertTrue("<contactEmail>{}<".format(self.email) in connected_app)
             self.assertTrue(
                 "<consumerKey>{}<".format(task.client_id) in connected_app
             )
             self.assertTrue(
                 "<consumerSecret>{}<".format(task.client_secret) in connected_app
             )
 def test_build_package(self):
     """ tempdir is populated with connected app and package.xml """
     task = CreateConnectedApp(self.project_config, self.task_config)
     with temporary_dir() as tempdir:
         task.tempdir = tempdir
         connected_app_path = os.path.join(
             task.tempdir, "connectedApps", "{}.connectedApp".format(self.label)
         )
         task._build_package()
         self.assertTrue(os.path.isdir(os.path.join(task.tempdir, "connectedApps")))
         self.assertTrue(os.path.isfile(os.path.join(task.tempdir, "package.xml")))
         self.assertTrue(os.path.isfile(connected_app_path))
         with open(connected_app_path, "r") as f:
             connected_app = f.read()
             self.assertTrue("<label>{}<".format(self.label) in connected_app)
             self.assertTrue("<contactEmail>{}<".format(self.email) in connected_app)
             self.assertTrue(
                 "<consumerKey>{}<".format(task.client_id) in connected_app
             )
             self.assertTrue(
                 "<consumerSecret>{}<".format(task.client_secret) in connected_app
             )
Exemple #21
0
 def test_validate_service_overwrite_false(self):
     """ attempting to overwrite connected_app service without overwrite = True fails """
     self.project_config.config["services"] = {
         "connected_app": {
             "attributes": {"callback_url": {}, "client_id": {}, "client_secret": {}}
         }
     }
     self.project_config.keychain.set_service(
         "connected_app",
         ServiceConfig(
             {
                 "callback_url": "http://callback",
                 "client_id": "ClientId",
                 "client_secret": "ClientSecret",
             }
         ),
         True,
     )
     task = CreateConnectedApp(self.project_config, self.task_config)
     with pytest.raises(
         TaskOptionsError, match="^The CumulusCI keychain already contains"
     ):
         task._validate_connect_service()
 def test_validate_service_overwrite_false(self):
     """ attempting to overwrite connected_app service without overwrite = True fails """
     self.project_config.config["services"] = {
         "connected_app": {
             "attributes": {"callback_url": {}, "client_id": {}, "client_secret": {}}
         }
     }
     self.project_config.keychain.set_service(
         "connected_app",
         ServiceConfig(
             {
                 "callback_url": "http://callback",
                 "client_id": "ClientId",
                 "client_secret": "ClientSecret",
             }
         ),
         True,
     )
     task = CreateConnectedApp(self.project_config, self.task_config)
     with pytest.raises(
         TaskOptionsError, match="^The CumulusCI keychain already contains"
     ):
         task._validate_connect_service()
 def test_process_devhub_output_not_configured(self):
     """ TaskOptionsError is raised if no username provided and no default found """
     del self.task_config.config["options"]["username"]
     task = CreateConnectedApp(self.project_config, self.task_config)
     with pytest.raises(TaskOptionsError, match="^No sfdx config found"):
         task._process_devhub_output('{"result":[{}]}')
Exemple #24
0
 def test_init_options_email_not_found(self):
     """ TaskOptionsError is raised if no email provided and no github service exists """
     del self.task_config.config["options"]["email"]
     self.project_config.config["services"] = {"github": {"attributes": {}}}
     with pytest.raises(TaskOptionsError, match="github"):
         CreateConnectedApp(self.project_config, self.task_config)
Exemple #25
0
 def test_init_options_invalid_label(self):
     """ Non-alphanumeric + _ label raises TaskOptionsError """
     self.task_config.config["options"]["label"] = "Test Label"
     with pytest.raises(TaskOptionsError, match="^label value must contain only"):
         CreateConnectedApp(self.project_config, self.task_config)
 def test_process_devhub_output(self):
     """ username is parsed from json response """
     del self.task_config.config["options"]["username"]
     task = CreateConnectedApp(self.project_config, self.task_config)
     task._process_devhub_output('{"result":[{"value":"' + self.username + '"}]}')
     self.assertEqual(task.options.get("username"), self.username)
 def test_process_json_output(self):
     """ _process_json_output returns valid json """
     task = CreateConnectedApp(self.project_config, self.task_config)
     output = task._process_json_output('{"foo":"bar"}')
     self.assertEqual(output, {"foo": "bar"})
Exemple #28
0
 def test_process_devhub_output_not_configured(self):
     """ TaskOptionsError is raised if no username provided and no default found """
     del self.task_config.config["options"]["username"]
     task = CreateConnectedApp(self.project_config, self.task_config)
     with pytest.raises(TaskOptionsError, match="^No sfdx config found"):
         task._process_devhub_output('{"result":[{}]}')
Exemple #29
0
 def test_process_json_output(self):
     """ _process_json_output returns valid json """
     task = CreateConnectedApp(self.project_config, self.task_config)
     output = task._process_json_output('{"foo":"bar"}')
     self.assertEqual(output, {"foo": "bar"})