diff --git a/ops/framework.py b/ops/framework.py
index 0ba99e1..c9da35e 100755
--- a/ops/framework.py
+++ b/ops/framework.py
@@ -549,7 +549,7 @@ _event_regex = r'^(|.*/)on/[a-zA-Z_]+\[\d+\]$'
 
 
 class Framework(Object):
-    """Main interface to from the Charm to the Operator Framework internals."""
+    """Main interface from the Charm to the Operator Framework internals."""
 
     on = FrameworkEvents()
 
diff --git a/ops/model.py b/ops/model.py
index 7bf5576..141bd4f 100644
--- a/ops/model.py
+++ b/ops/model.py
@@ -2926,7 +2926,7 @@ class _ModelBackend:
         args = []  # type: List[str]
         if id is not None:
             args.append(id)
-        if label is not None:
+        elif label is not None:  # elif because Juju secret-info-get doesn't allow id and label
             args.extend(['--label', label])
         result = self._run_for_secret('secret-info-get', *args, return_output=True, use_json=True)
         info_dicts = typing.cast(Dict[str, 'JsonObject'], result)

diff --git a/ops/testing.py b/ops/testing.py
index 7082976..cf8912a 100755
--- a/ops/testing.py
+++ b/ops/testing.py
@@ -1116,7 +1116,7 @@ class Harness(Generic[CharmType]):
             self._charm.on.leader_elected.emit()
 
     def set_planned_units(self, num_units: int) -> None:
-        """Set the number of "planned" units  that "Application.planned_units" should return.
+        """Set the number of "planned" units that "Application.planned_units" should return.
 
         In real world circumstances, this number will be the number of units in the
         application. E.g., this number will be the number of peers this unit has, plus one, as we
diff --git a/test/test_model.py b/test/test_model.py
index 7859feb..976fb77 100755
--- a/test/test_model.py
+++ b/test/test_model.py
@@ -2993,14 +2993,34 @@ class TestSecretClass(unittest.TestCase):
     def test_get_info(self):
         fake_script(self, 'secret-info-get', """echo '{"x": {"label": "y", "revision": 7}}'""")
 
+        # Secret with ID only
+        secret = self.make_secret(id='x')
+        info = secret.get_info()
+        self.assertEqual(info.id, 'secret:x')
+        self.assertEqual(info.label, 'y')
+        self.assertEqual(info.revision, 7)
+
+        # Secret with label only
+        secret = self.make_secret(label='y')
+        info = secret.get_info()
+        self.assertEqual(info.id, 'secret:x')
+        self.assertEqual(info.label, 'y')
+        self.assertEqual(info.revision, 7)
+
+        # Secret with ID and label
         secret = self.make_secret(id='x', label='y')
         info = secret.get_info()
         self.assertEqual(info.id, 'secret:x')
         self.assertEqual(info.label, 'y')
         self.assertEqual(info.revision, 7)
 
-        self.assertEqual(fake_script_calls(self, clear=True),
-                         [['secret-info-get', 'secret:x', '--label', 'y', '--format=json']])
+        self.assertEqual(
+            fake_script_calls(self, clear=True),
+            [
+                ['secret-info-get', 'secret:x', '--format=json'],
+                ['secret-info-get', '--label', 'y', '--format=json'],
+                ['secret-info-get', 'secret:x', '--format=json'],
+            ])
 
     def test_set_content(self):
         fake_script(self, 'secret-set', """exit 0""")

uncaught error in `Secret.get_info()`
the following error appears while running the `owner` charm in [this demo bundle](https://github.com/PietroPasotti/secrets-demo-charms/tree/main)

![image](https://user-images.githubusercontent.com/6230162/216614436-164e80c9-0649-4d68-af38-a2ec516b83af.png)

test/test_model.py::TestSecretClass::test_get_info
test/test_model.py::TestModel::test_active_message_default test/test_model.py::TestModel::test_app_immutable test/test_model.py::TestModel::test_app_relation_data_modify_local_as_leader test/test_model.py::TestModel::test_app_relation_data_modify_local_as_minion test/test_model.py::TestModel::test_base_status_instance_raises test/test_model.py::TestModel::test_config test/test_model.py::TestModel::test_config_immutable test/test_model.py::TestModel::test_get_app_relation_data test/test_model.py::TestModel::test_get_relation test/test_model.py::TestModel::test_invalid_type_relation_data test/test_model.py::TestModel::test_is_leader test/test_model.py::TestModel::test_local_set_valid_app_status test/test_model.py::TestModel::test_local_set_valid_unit_status test/test_model.py::TestModel::test_model_attributes test/test_model.py::TestModel::test_model_name_from_backend test/test_model.py::TestModel::test_our_unit_is_our test/test_model.py::TestModel::test_peer_relation_app test/test_model.py::TestModel::test_pod_immutable test/test_model.py::TestModel::test_pod_spec test/test_model.py::TestModel::test_relation_data_access_peer_leader test/test_model.py::TestModel::test_relation_data_access_peer_minion test/test_model.py::TestModel::test_relation_data_del_key test/test_model.py::TestModel::test_relation_data_del_missing_key test/test_model.py::TestModel::test_relation_data_modify_our test/test_model.py::TestModel::test_relation_data_modify_remote test/test_model.py::TestModel::test_relation_data_type_check test/test_model.py::TestModel::test_relation_local_app_data_readability_follower test/test_model.py::TestModel::test_relation_local_app_data_readability_leader test/test_model.py::TestModel::test_relation_no_units test/test_model.py::TestModel::test_relation_set_fail test/test_model.py::TestModel::test_relations_immutable test/test_model.py::TestModel::test_relations_keys test/test_model.py::TestModel::test_remote_app_relation_data test/test_model.py::TestModel::test_remote_app_status test/test_model.py::TestModel::test_remote_unit_status test/test_model.py::TestModel::test_remote_units_is_our test/test_model.py::TestModel::test_resources test/test_model.py::TestModel::test_resources_immutable test/test_model.py::TestModel::test_run_error test/test_model.py::TestModel::test_set_app_status_invalid test/test_model.py::TestModel::test_set_app_status_non_leader_raises test/test_model.py::TestModel::test_set_unit_status_invalid test/test_model.py::TestModel::test_status_eq test/test_model.py::TestModel::test_status_repr test/test_model.py::TestModel::test_storage test/test_model.py::TestModel::test_storages_immutable test/test_model.py::TestModel::test_unit_immutable test/test_model.py::TestModel::test_unit_relation_data test/test_model.py::TestModel::test_workload_version test/test_model.py::TestModel::test_workload_version_invalid test/test_model.py::test_recursive_list[case0] test/test_model.py::test_recursive_list[case1] test/test_model.py::test_recursive_list[case2] test/test_model.py::test_recursive_push_and_pull[case0] test/test_model.py::test_recursive_push_and_pull[case1] test/test_model.py::test_recursive_push_and_pull[case2] test/test_model.py::test_recursive_push_and_pull[case3] test/test_model.py::test_recursive_push_and_pull[case4] test/test_model.py::test_recursive_push_and_pull[case5] test/test_model.py::test_recursive_push_and_pull[case6] test/test_model.py::test_recursive_push_and_pull[case7] test/test_model.py::test_recursive_push_and_pull[case8] test/test_model.py::TestApplication::test_mocked_get_services test/test_model.py::TestApplication::test_planned_units test/test_model.py::TestApplication::test_planned_units_garbage_values test/test_model.py::TestApplication::test_planned_units_override test/test_model.py::TestApplication::test_planned_units_user_set test/test_model.py::TestContainers::test_unit_containers test/test_model.py::TestContainers::test_unit_get_container test/test_model.py::TestContainerPebble::test_add_layer test/test_model.py::TestContainerPebble::test_autostart test/test_model.py::TestContainerPebble::test_can_connect test/test_model.py::TestContainerPebble::test_can_connect_api_error test/test_model.py::TestContainerPebble::test_can_connect_connection_error test/test_model.py::TestContainerPebble::test_can_connect_file_not_found_error test/test_model.py::TestContainerPebble::test_can_connect_simple test/test_model.py::TestContainerPebble::test_exec test/test_model.py::TestContainerPebble::test_get_check test/test_model.py::TestContainerPebble::test_get_checks test/test_model.py::TestContainerPebble::test_get_plan test/test_model.py::TestContainerPebble::test_get_service test/test_model.py::TestContainerPebble::test_get_services test/test_model.py::TestContainerPebble::test_list_files test/test_model.py::TestContainerPebble::test_make_dir test/test_model.py::TestContainerPebble::test_pull test/test_model.py::TestContainerPebble::test_push test/test_model.py::TestContainerPebble::test_remove_path test/test_model.py::TestContainerPebble::test_replan test/test_model.py::TestContainerPebble::test_restart test/test_model.py::TestContainerPebble::test_restart_fallback test/test_model.py::TestContainerPebble::test_restart_fallback_non_400_error test/test_model.py::TestContainerPebble::test_restart_no_arguments test/test_model.py::TestContainerPebble::test_send_signal test/test_model.py::TestContainerPebble::test_socket_path test/test_model.py::TestContainerPebble::test_start test/test_model.py::TestContainerPebble::test_start_no_arguments test/test_model.py::TestContainerPebble::test_stop test/test_model.py::TestContainerPebble::test_stop_no_arguments test/test_model.py::TestContainerPebble::test_type_errors test/test_model.py::TestModelBindings::test_binding_by_relation test/test_model.py::TestModelBindings::test_binding_by_relation_name test/test_model.py::TestModelBindings::test_binding_no_iface_name test/test_model.py::TestModelBindings::test_dead_relations test/test_model.py::TestModelBindings::test_empty_bind_addresses test/test_model.py::TestModelBindings::test_empty_interface_info test/test_model.py::TestModelBindings::test_invalid_keys test/test_model.py::TestModelBindings::test_missing_bind_addresses test/test_model.py::TestModelBindings::test_missing_egress_subnets test/test_model.py::TestModelBindings::test_missing_ingress_addresses test/test_model.py::TestModelBindings::test_no_bind_addresses test/test_model.py::TestModelBindings::test_unresolved_ingress_addresses test/test_model.py::TestModelBackend::test_action_fail test/test_model.py::TestModelBackend::test_action_get test/test_model.py::TestModelBackend::test_action_get_error test/test_model.py::TestModelBackend::test_action_log test/test_model.py::TestModelBackend::test_action_log_error test/test_model.py::TestModelBackend::test_action_set test/test_model.py::TestModelBackend::test_action_set_dotted_dict test/test_model.py::TestModelBackend::test_action_set_duplicated_keys test/test_model.py::TestModelBackend::test_action_set_error test/test_model.py::TestModelBackend::test_action_set_key_validation test/test_model.py::TestModelBackend::test_action_set_more_nested test/test_model.py::TestModelBackend::test_action_set_nested test/test_model.py::TestModelBackend::test_application_version_set test/test_model.py::TestModelBackend::test_application_version_set_invalid test/test_model.py::TestModelBackend::test_invalid_metric_label_values test/test_model.py::TestModelBackend::test_invalid_metric_labels test/test_model.py::TestModelBackend::test_invalid_metric_names test/test_model.py::TestModelBackend::test_invalid_metric_values test/test_model.py::TestModelBackend::test_is_leader_refresh test/test_model.py::TestModelBackend::test_juju_log test/test_model.py::TestModelBackend::test_local_get_status test/test_model.py::TestModelBackend::test_local_set_invalid_status test/test_model.py::TestModelBackend::test_network_get test/test_model.py::TestModelBackend::test_network_get_errors test/test_model.py::TestModelBackend::test_relation_get_juju_version_quirks test/test_model.py::TestModelBackend::test_relation_get_set_is_app_arg test/test_model.py::TestModelBackend::test_relation_remote_app_name_env test/test_model.py::TestModelBackend::test_relation_remote_app_name_script_errors test/test_model.py::TestModelBackend::test_relation_remote_app_name_script_success test/test_model.py::TestModelBackend::test_relation_set_juju_version_quirks test/test_model.py::TestModelBackend::test_relation_tool_errors test/test_model.py::TestModelBackend::test_status_get test/test_model.py::TestModelBackend::test_status_is_app_forced_kwargs test/test_model.py::TestModelBackend::test_status_set_is_app_not_bool_raises test/test_model.py::TestModelBackend::test_storage_tool_errors test/test_model.py::TestModelBackend::test_valid_metrics test/test_model.py::TestLazyMapping::test_invalidate test/test_model.py::TestSecrets::test_add_secret_errors test/test_model.py::TestSecrets::test_app_add_secret_args test/test_model.py::TestSecrets::test_app_add_secret_simple test/test_model.py::TestSecrets::test_get_secret_id test/test_model.py::TestSecrets::test_get_secret_id_and_label test/test_model.py::TestSecrets::test_get_secret_no_args test/test_model.py::TestSecrets::test_get_secret_not_found test/test_model.py::TestSecrets::test_get_secret_other_error test/test_model.py::TestSecrets::test_unit_add_secret_args test/test_model.py::TestSecrets::test_unit_add_secret_errors test/test_model.py::TestSecrets::test_unit_add_secret_simple test/test_model.py::TestSecretInfo::test_from_dict test/test_model.py::TestSecretInfo::test_init test/test_model.py::TestSecretClass::test_get_content_cached test/test_model.py::TestSecretClass::test_get_content_refresh test/test_model.py::TestSecretClass::test_get_content_uncached test/test_model.py::TestSecretClass::test_grant test/test_model.py::TestSecretClass::test_id_and_label test/test_model.py::TestSecretClass::test_peek_content test/test_model.py::TestSecretClass::test_remove_all_revisions test/test_model.py::TestSecretClass::test_remove_revision test/test_model.py::TestSecretClass::test_revoke test/test_model.py::TestSecretClass::test_set_content test/test_model.py::TestSecretClass::test_set_info