code: def test_copy_files_without_permissions(self, src_dir, dst_dir):
      cases = [
          dict(src_path="foo.txt", expected="foo.txt"),
          dict(src_path="bar.txt", expected="bar.txt"),
          dict(src_path="baz.txt", expected="baz.txt"),
      ]
  
      try:
          for case in cases:
              src, expected = case["src_path"], case["expected"]
              with self.subTest(src):
                  src = os.path.join(src_dir, src)
                  with open(src, "w") as f:
                      f.write("content")
                  # Set src file to read-only
                  os.chmod(src, stat.S_IRUSR)
                  utils.copy_file(src, dst_dir)
                  self.assertTrue(
                      os.path.isfile(os.path.join(dst_dir, expected))
                  )
                  self.assertNotEqual(
                      os.stat(src).st_mode,
                      os.stat(os.path.join(dst_dir, expected)).st_mode,
                  )
                  # While src was read-only, dst must remain writable
                  self.assertTrue(
                      os.access(
                          os.path.join(dst_dir, expected), os.W_OK
                      )
                  )
      finally:
          for case in cases:
              # Undo read-only so we can delete temp files
              src = os.path.join(src_dir, case["src_path"])
              if os.path.exists(src):
                  os.chmod(src, stat.S_IRUSR | stat.S_IWUSR)
  
imports: import dataclasses
  import datetime
  import logging
  import os
  import posixpath
  import stat
  import unittest
  from unittest import mock
  from mkdocs import exceptions, utils
  from mkdocs.tests.base import dedent, tempdir
  from mkdocs.utils import meta
label_desc: Use image node_id 16 for calling the UtilsTests obj's underlying member method code with example usage: obj.test_copy_files_without_permissions(src_dir, dst_dir) without return types