### Is there an existing issue for this?

- [X] I have searched the existing issues

### Current Behavior

The Complete Multipart Upload operation generates the **InternalError** error for non-existing uploads.

### Expected Behavior

The Complete Multipart Upload operation generates the **NoSuchUpload** error for non-existing uploads.

### How are you starting LocalStack?

With a `docker run` command

### Steps To Reproduce

    docker run -it --rm -p 4566:4566 localstack/localstack

    aws s3api create-bucket --bucket test --endpoint-url http://localhost:4566 --create-bucket-configuration LocationConstraint=us-west-2

    aws s3api complete-multipart-upload --bucket test --endpoint-url http://localhost:4566 --key test --upload-id test

### Environment

```markdown
- OS: Windows 11
- LocalStack: latest
```


### Anything else?

The Abort Multipart Upload operation works correctly in LocalStack.

The official documentation: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html
Amazon S3 throws the correct **NoSuchUpload** error for both Abort and Complete operations.
self, context: RequestContext, bucket: BucketName, expected_bucket_owner: AccountId = None
    ) -> None:
        call_moto(context)
        self._clear_bucket_from_store(bucket)
        self._cors_handler.invalidate_cache()
    def get_bucket_location(
        self, context: RequestContext, bucket: BucketName, expected_bucket_owner: AccountId = None
    ) -> GetBucketLocationOutput:
        """
        When implementing the ASF provider, this operation is implemented because:
        - The spec defines a root element GetBucketLocationOutput containing a LocationConstraint member, where
          S3 actually just returns the LocationConstraint on the root level (only operation so far that we know of).
        - We circumvent the root level element here by patching the spec such that this operation returns a
          single "payload" (the XML body response), which causes the serializer to directly take the payload element.
        - The above "hack" causes the fix in the serializer to not be picked up here as we're passing the XML body as
          the payload, which is why we need to manually do this here by manipulating the string.
        Botocore implements this hack for parsing the response in `botocore.handlers.py#parse_get_bucket_location`
        """
        response = call_moto(context)
        location_constraint_xml = response["LocationConstraint"]
        xml_root_end = location_constraint_xml.find(">") + 1
        location_constraint_xml = (
            f"{location_constraint_xml[:xml_root_end]}\n{location_constraint_xml[xml_root_end:]}"
        )
        response["LocationConstraint"] = location_constraint_xml[:]
        return response
    @handler("ListObjects", expand=False)
    def list_objects(