Repository: getmoto/moto (python)

Issue:
SESV2 send_email saves wrong body in ses_backend
When using sesv2 send_email, the email saved in the ses_backend is not what it should be. The body of the email is replaced by the subject.

The issue comes from moto/sesv2/responses.py line 45-50:
```
message = self.sesv2_backend.send_email(  # type: ignore
    source=from_email_address,
    destinations=destination,
    subject=content["Simple"]["Subject"]["Data"],
    body=content["Simple"]["Subject"]["Data"],
)
```
I think it should be corrected like this:
```
message = self.sesv2_backend.send_email(  # type: ignore
    source=from_email_address,
    destinations=destination,
    subject=content["Simple"]["Subject"]["Data"],
    body=content["Simple"]["Body"]["Text"]["Data"],
)
```
It doesn't looks like there is any test to update with this change.

I tried to create a pull request but I'm really not comfortable with github and I could not do it. Could this bug me resolved ? 


Pull request description:
SESv2 send_email(): Ensure email-body is persisted
Fixes #6909 

Patch:
diff --git a/moto/iot/models.py b/moto/iot/models.py
index 14289a00d..1ebce5eaa 100644
--- a/moto/iot/models.py
+++ b/moto/iot/models.py
@@ -883,7 +883,7 @@ class IoTBackend(BaseBackend):
             if not do_merge:
                 thing.attributes = attributes
             else:
-                thing.attributes.update(attributes)
+                thing.attributes = {k: v for k, v in attributes.items() if v}
 
     def create_keys_and_certificate(
         self, set_as_active: bool
@@ -1307,7 +1307,6 @@ class IoTBackend(BaseBackend):
         return thing_names
 
     def list_thing_principals(self, thing_name: str) -> List[str]:
-
         things = [_ for _ in self.things.values() if _.thing_name == thing_name]
         if len(things) == 0:
             raise ResourceNotFoundException(
diff --git a/moto/sesv2/responses.py b/moto/sesv2/responses.py
index 84dc36cff..6eb4c1ca7 100644
--- a/moto/sesv2/responses.py
+++ b/moto/sesv2/responses.py
@@ -46,7 +46,7 @@ class SESV2Response(BaseResponse):
                 source=from_email_address,
                 destinations=destination,
                 subject=content["Simple"]["Subject"]["Data"],
-                body=content["Simple"]["Subject"]["Data"],
+                body=content["Simple"]["Body"]["Text"]["Data"],
             )
         elif "Template" in content:
             raise NotImplementedError("Template functionality not ready")


Test patch:
diff --git a/tests/test_iot/test_iot_things.py b/tests/test_iot/test_iot_things.py
index 65f605ea5..773bdab3e 100644
--- a/tests/test_iot/test_iot_things.py
+++ b/tests/test_iot/test_iot_things.py
@@ -54,6 +54,15 @@ def test_update_thing():
     assert res["things"][0]["thingArn"] is not None
     assert res["things"][0]["attributes"]["k1"] == "v1"
 
+    client.update_thing(
+        thingName=name, attributePayload={"attributes": {"k1": ""}, "merge": True}
+    )
+    res = client.list_things()
+    assert len(res["things"]) == 1
+    assert res["things"][0]["thingName"] is not None
+    assert res["things"][0]["thingArn"] is not None
+    assert res["things"][0]["attributes"] == {}
+
 
 @mock_iot
 def test_describe_thing():
diff --git a/tests/test_sesv2/test_sesv2.py b/tests/test_sesv2/test_sesv2.py
index 7f9179d02..bf167597c 100644
--- a/tests/test_sesv2/test_sesv2.py
+++ b/tests/test_sesv2/test_sesv2.py
@@ -46,6 +46,12 @@ def test_send_email(ses_v1):  # pylint: disable=redefined-outer-name
     sent_count = int(send_quota["SentLast24Hours"])
     assert sent_count == 3
 
+    if not settings.TEST_SERVER_MODE:
+        backend = ses_backends[DEFAULT_ACCOUNT_ID]["us-east-1"]
+        msg: RawMessage = backend.sent_messages[0]
+        assert msg.subject == "test subject"
+        assert msg.body == "test body"
+
 
 @mock_sesv2
 def test_send_raw_email(ses_v1):  # pylint: disable=redefined-outer-name