text: """
      test_ext_autodoc_mock
      ~~~~~~~~~~~~~~~~~~~~~
  
      Test the autodoc extension.
  
      :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
      :license: BSD, see LICENSE for details.
  """
  
  import abc
  import sys
  from importlib import import_module
  
  import pytest
  
  from sphinx.ext.autodoc.mock import _MockModule, _MockObject, mock
  
  
  def test_MockModule():
      mock = _MockModule('mocked_module')
      assert isinstance(mock.some_attr, _MockObject)
      assert isinstance(mock.some_method, _MockObject)
      assert isinstance(mock.attr1.attr2, _MockObject)
      assert isinstance(mock.attr1.attr2.meth(), _MockObject)
  
      assert repr(mock.some_attr) == 'mocked_module.some_attr'
      assert repr(mock.some_method) == 'mocked_module.some_method'
      assert repr(mock.attr1.attr2) == 'mocked_module.attr1.attr2'
      assert repr(mock.attr1.attr2.meth) == 'mocked_module.attr1.attr2.meth'
  
      assert repr(mock) == 'mocked_module'
  
  
  def test_MockObject():
      mock = _MockObject()
      assert isinstance(mock.some_attr, _MockObject)
      assert isinstance(mock.some_method, _MockObject)
      assert isinstance(mock.attr1.attr2, _MockObject)
      assert isinstance(mock.attr1.attr2.meth(), _MockObject)
  
      class SubClass(mock.SomeClass):
          """docstring of SubClass"""
  
          def method(self):
              return "string"
  
      obj = SubClass()
      assert SubClass.__doc__ == "docstring of SubClass"
      assert isinstance(obj, SubClass)
      assert obj.method() == "string"
      assert isinstance(obj.other_method(), SubClass)
  
  
  def test_mock():
      modname = 'sphinx.unknown'
      submodule = modname + '.submodule'
      assert modname not in sys.modules
      with pytest.raises(ImportError):
          import_module(modname)
  
      with mock([modname]):
          import_module(modname)
          assert modname in sys.modules
          assert isinstance(sys.modules[modname], _MockModule)
  
          # submodules are also mocked
          import_module(submodule)
          assert submodule in sys.modules
          assert isinstance(sys.modules[submodule], _MockModule)
  
      assert modname not in sys.modules
      with pytest.raises(ImportError):
          import_module(modname)
  
  
  def test_mock_does_not_follow_upper_modules():
      with mock(['sphinx.unknown.module']):
          with pytest.raises(ImportError):
              import_module('sphinx.unknown')
  
  
  @pytest.mark.skipif(sys.version_info < (3, 7), reason='Only for py37 or above')
  def test_abc_MockObject():
      mock = _MockObject()
  
      class Base:
          @abc.abstractmethod
          def __init__(self):
              pass
  
      class Derived(Base, mock.SubClass):
          pass
  
      obj = Derived()
      assert isinstance(obj, Base)
      assert isinstance(obj, _MockObject)
      assert isinstance(obj.some_method(), Derived)
  
  
  def test_mock_decorator():
      mock = _MockObject()
  
      @mock.function_deco
      def func():
          """docstring"""
  
      class Foo:
          @mock.method_deco
          def meth(self):
              """docstring"""
  
      @mock.class_deco
      class Bar:
          """docstring"""
  
      assert func.__doc__ == "docstring"
      assert Foo.meth.__doc__ == "docstring"
      assert Bar.__doc__ == "docstring"
  