def test_append_conf_existing_yaml_on_root_with_invalid_setting(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) # We can't use ``@pytest.mark.parametrize`` on a Django test case yaml_contents = [ {'docs_dir': ['docs']}, {'extra_css': 'a string here'}, {'extra_javascript': None}, ] for content in yaml_contents: yaml.safe_dump( content, open(yaml_file, 'w'), ) with self.assertRaises(MkDocsYAMLParseError): self.searchbuilder.append_conf()
def test_append_conf_create_yaml(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) # There is a mkdocs.yml file created generated_yaml = os.path.join(tmpdir, 'mkdocs.yml') self.assertTrue(os.path.exists(generated_yaml)) config = yaml.safe_load(open(generated_yaml)) self.assertEqual(config['docs_dir'], os.path.join(tmpdir, 'docs')) self.assertEqual(config['extra_css'], [ 'http://readthedocs.org/static/css/badge_only.css', 'http://readthedocs.org/static/css/readthedocs-doc-embed.css' ]) self.assertEqual(config['extra_javascript'], [ 'readthedocs-data.js', 'http://readthedocs.org/static/core/js/readthedocs-doc-embed.js', 'http://readthedocs.org/static/javascript/readthedocs-analytics.js', ]) self.assertIsNone(config['google_analytics'], ) self.assertEqual(config['site_name'], 'mkdocs')
def test_dont_override_theme(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'theme': 'not-readthedocs', 'theme_dir': 'not-readthedocs', 'site_name': 'mkdocs', 'docs_dir': 'docs', }, open(yaml_file, 'w'), ) checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) config = yaml.safe_load(open(yaml_file)) self.assertEqual( config['theme_dir'], 'not-readthedocs', )
def test_write_js_data_docs_dir(self, checkout_path, run, generate_rtd_data): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'site_name': 'mkdocs', 'docs_dir': 'docs', }, open(yaml_file, 'w'), ) checkout_path.return_value = tmpdir generate_rtd_data.return_value = '' python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) self.searchbuilder.append_conf() generate_rtd_data.assert_called_with( docs_dir='docs', mkdocs_config=mock.ANY, )
def test_write_js_data_on_invalid_docs_dir(self, checkout_path, generate_rtd_data): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'site_name': 'mkdocs', 'google_analytics': ['UA-1234-5', 'mkdocs.org'], 'docs_dir': 'invalid_docs_dir', 'extra_css': ['http://readthedocs.org/static/css/badge_only.css'], 'extra_javascript': ['readthedocs-data.js'], }, open(yaml_file, 'w'), ) checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) with self.assertRaises(MkDocsYAMLParseError): self.searchbuilder.append_conf()
def test_override_theme_new_style(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'theme': { 'name': 'readthedocs', }, 'site_name': 'mkdocs', 'docs_dir': 'docs', }, open(yaml_file, 'w')) checkout_path.return_value = tmpdir self.searchbuilder = MkdocsHTML(build_env=self.build_env, python_env=None) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) config = yaml.safe_load(open(yaml_file)) self.assertEqual( config['theme'], { 'name': 'readthedocs', 'custom_dir': BaseMkdocs.READTHEDOCS_TEMPLATE_OVERRIDE_DIR })
def test_append_conf_existing_yaml_on_root(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'site_name': 'mkdocs', 'google_analytics': ['UA-1234-5', 'mkdocs.org'], 'docs_dir': 'docs', }, open(yaml_file, 'w')) checkout_path.return_value = tmpdir self.searchbuilder = MkdocsHTML(build_env=self.build_env, python_env=None) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) config = yaml.safe_load(open(yaml_file)) self.assertEqual(config['docs_dir'], 'docs') self.assertEqual(config['extra_css'], [ 'http://readthedocs.org/media/css/badge_only.css', 'http://readthedocs.org/media/css/readthedocs-doc-embed.css' ]) self.assertEqual(config['extra_javascript'], [ 'readthedocs-data.js', 'http://readthedocs.org/media/static/core/js/readthedocs-doc-embed.js', 'http://readthedocs.org/media/javascript/readthedocs-analytics.js', ]) self.assertIsNone(config['google_analytics'], ) self.assertEqual(config['site_name'], 'mkdocs')
def test_get_theme_name_with_feature_flag(self, checkout_path, run): tmpdir = tempfile.mkdtemp() checkout_path.return_value = tmpdir feature = get( Feature, feature_id=Feature.MKDOCS_THEME_RTD, ) feature.projects.add(self.project) python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) builder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) self.assertEqual(builder.get_theme_name({}), 'readthedocs') with patch('readthedocs.doc_builder.backends.mkdocs.yaml') as mock_yaml: with patch('readthedocs.doc_builder.backends.mkdocs.MkdocsHTML.load_yaml_config') as mock_load_yaml_config: mock_load_yaml_config.return_value = {'site_name': self.project.name} builder.append_conf() mock_yaml.safe_dump.assert_called_once_with( { 'site_name': mock.ANY, 'docs_dir': mock.ANY, 'extra_javascript': mock.ANY, 'extra_css': mock.ANY, 'google_analytics': mock.ANY, 'theme': 'readthedocs', }, mock.ANY, ) mock_yaml.reset_mock() config = { 'theme': 'customtheme', } self.assertEqual(builder.get_theme_name(config), 'customtheme') with patch('readthedocs.doc_builder.backends.mkdocs.MkdocsHTML.load_yaml_config') as mock_load_yaml_config: mock_load_yaml_config.return_value = { 'site_name': self.project.name, 'theme': 'customtheme', } builder.append_conf() mock_yaml.safe_dump.assert_called_once_with( { 'site_name': mock.ANY, 'docs_dir': mock.ANY, 'extra_javascript': mock.ANY, 'extra_css': mock.ANY, 'google_analytics': mock.ANY, 'theme': 'customtheme', }, mock.ANY, )
def test_write_js_data_on_invalid_docs_dir(self, checkout_path, generate_rtd_data): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'site_name': 'mkdocs', 'google_analytics': ['UA-1234-5', 'mkdocs.org'], 'docs_dir': 'invalid_docs_dir', 'extra_css': [ 'http://readthedocs.org/static/css/badge_only.css' ], 'extra_javascript': ['readthedocs-data.js'], }, open(yaml_file, 'w'), ) checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) with self.assertRaises(MkDocsYAMLParseError): self.searchbuilder.append_conf()
def test_dont_override_theme(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'theme': 'not-readthedocs', 'theme_dir': 'not-readthedocs', 'site_name': 'mkdocs', 'docs_dir': 'docs', }, open(yaml_file, 'w') ) checkout_path.return_value = tmpdir self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=None ) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) config = yaml.safe_load(open(yaml_file)) self.assertEqual( config['theme_dir'], 'not-readthedocs' )
def test_override_theme_new_style(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'theme': { 'name': 'readthedocs', }, 'site_name': 'mkdocs', 'docs_dir': 'docs', }, open(yaml_file, 'w') ) checkout_path.return_value = tmpdir self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=None ) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) config = yaml.safe_load(open(yaml_file)) self.assertEqual( config['theme'], { 'name': 'readthedocs', 'custom_dir': BaseMkdocs.READTHEDOCS_TEMPLATE_OVERRIDE_DIR } )
def test_get_theme_name(self): builder = MkdocsHTML(build_env=self.build_env, python_env=None) # The default theme is mkdocs but in mkdocs>=1.0, theme is required self.assertEqual(builder.get_theme_name({}), 'mkdocs') # mkdocs<0.17 syntax config = { 'theme': 'readthedocs', } self.assertEqual(builder.get_theme_name(config), 'readthedocs') # mkdocs>=0.17 syntax config = { 'theme': { 'name': 'test_theme', }, } self.assertEqual(builder.get_theme_name(config), 'test_theme') # No theme but just a directory config = { 'theme_dir': '/path/to/mydir', } self.assertEqual(builder.get_theme_name(config), 'mydir') config = { 'theme_dir': '/path/to/mydir/', } self.assertEqual(builder.get_theme_name(config), 'mydir')
def test_append_conf_existing_yaml_on_root(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'site_name': 'mkdocs', 'google_analytics': ['UA-1234-5', 'mkdocs.org'], 'docs_dir': 'docs', }, open(yaml_file, 'w'), ) checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) config = yaml.safe_load(open(yaml_file)) self.assertEqual( config['docs_dir'], 'docs', ) self.assertEqual( config['extra_css'], [ 'http://readthedocs.org/static/css/badge_only.css', 'http://readthedocs.org/static/css/readthedocs-doc-embed.css', ], ) self.assertEqual( config['extra_javascript'], [ 'readthedocs-data.js', 'http://readthedocs.org/static/core/js/readthedocs-doc-embed.js', 'http://readthedocs.org/static/javascript/readthedocs-analytics.js', ], ) self.assertIsNone( config['google_analytics'], ) self.assertEqual( config['site_name'], 'mkdocs', )
def test_yaml_config_not_returns_dict(self, checkout_path): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( 'test_string', open(yaml_file, 'w'), ) checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) with self.assertRaisesMessage(MkDocsYAMLParseError, MkDocsYAMLParseError.CONFIG_NOT_DICT): self.searchbuilder.append_conf()
def test_append_conf_create_yaml(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) # There is a mkdocs.yml file created generated_yaml = os.path.join(tmpdir, 'mkdocs.yml') self.assertTrue(os.path.exists(generated_yaml)) config = yaml.safe_load(open(generated_yaml)) self.assertEqual( config['docs_dir'], os.path.join(tmpdir, 'docs'), ) self.assertEqual( config['extra_css'], [ 'http://readthedocs.org/static/css/badge_only.css', 'http://readthedocs.org/static/css/readthedocs-doc-embed.css', ], ) self.assertEqual( config['extra_javascript'], [ 'readthedocs-data.js', 'http://readthedocs.org/static/core/js/readthedocs-doc-embed.js', 'http://readthedocs.org/static/javascript/readthedocs-analytics.js', ], ) self.assertIsNone( config['google_analytics'], ) self.assertEqual( config['site_name'], 'mkdocs', )
def test_get_theme_name(self, checkout_path): tmpdir = tempfile.mkdtemp() checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) builder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) # The default theme is mkdocs but in mkdocs>=1.0, theme is required self.assertEqual(builder.get_theme_name({}), 'mkdocs') # mkdocs<0.17 syntax config = { 'theme': 'readthedocs', } self.assertEqual(builder.get_theme_name(config), 'readthedocs') # mkdocs>=0.17 syntax config = { 'theme': { 'name': 'test_theme', }, } self.assertEqual(builder.get_theme_name(config), 'test_theme') # No theme but just a directory config = { 'theme_dir': '/path/to/mydir', } self.assertEqual(builder.get_theme_name(config), 'mydir') config = { 'theme_dir': '/path/to/mydir/', } self.assertEqual(builder.get_theme_name(config), 'mydir')
class MkdocsBuilderTest(TestCase): def setUp(self): self.project = get(Project, documentation_type='mkdocs', name='mkdocs') self.version = get(Version, project=self.project) self.build_env = namedtuple('project', 'version') self.build_env.project = self.project self.build_env.version = self.version @patch('readthedocs.projects.models.Project.checkout_path') def test_get_theme_name(self, checkout_path): tmpdir = tempfile.mkdtemp() checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) builder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) # The default theme is mkdocs but in mkdocs>=1.0, theme is required self.assertEqual(builder.get_theme_name({}), 'mkdocs') # mkdocs<0.17 syntax config = { 'theme': 'readthedocs', } self.assertEqual(builder.get_theme_name(config), 'readthedocs') # mkdocs>=0.17 syntax config = { 'theme': { 'name': 'test_theme', }, } self.assertEqual(builder.get_theme_name(config), 'test_theme') # No theme but just a directory config = { 'theme_dir': '/path/to/mydir', } self.assertEqual(builder.get_theme_name(config), 'mydir') config = { 'theme_dir': '/path/to/mydir/', } self.assertEqual(builder.get_theme_name(config), 'mydir') @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_get_theme_name_with_feature_flag(self, checkout_path, run): tmpdir = tempfile.mkdtemp() checkout_path.return_value = tmpdir feature = get( Feature, feature_id=Feature.MKDOCS_THEME_RTD, ) feature.projects.add(self.project) python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) builder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) self.assertEqual(builder.get_theme_name({}), 'readthedocs') with patch('readthedocs.doc_builder.backends.mkdocs.yaml') as mock_yaml: with patch('readthedocs.doc_builder.backends.mkdocs.MkdocsHTML.load_yaml_config') as mock_load_yaml_config: mock_load_yaml_config.return_value = {'site_name': self.project.name} builder.append_conf() mock_yaml.safe_dump.assert_called_once_with( { 'site_name': mock.ANY, 'docs_dir': mock.ANY, 'extra_javascript': mock.ANY, 'extra_css': mock.ANY, 'google_analytics': mock.ANY, 'theme': 'readthedocs', }, mock.ANY, ) mock_yaml.reset_mock() config = { 'theme': 'customtheme', } self.assertEqual(builder.get_theme_name(config), 'customtheme') with patch('readthedocs.doc_builder.backends.mkdocs.MkdocsHTML.load_yaml_config') as mock_load_yaml_config: mock_load_yaml_config.return_value = { 'site_name': self.project.name, 'theme': 'customtheme', } builder.append_conf() mock_yaml.safe_dump.assert_called_once_with( { 'site_name': mock.ANY, 'docs_dir': mock.ANY, 'extra_javascript': mock.ANY, 'extra_css': mock.ANY, 'google_analytics': mock.ANY, 'theme': 'customtheme', }, mock.ANY, ) @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_append_conf_create_yaml(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) # There is a mkdocs.yml file created generated_yaml = os.path.join(tmpdir, 'mkdocs.yml') self.assertTrue(os.path.exists(generated_yaml)) config = yaml.safe_load(open(generated_yaml)) self.assertEqual( config['docs_dir'], os.path.join(tmpdir, 'docs'), ) self.assertEqual( config['extra_css'], [ 'http://readthedocs.org/static/css/badge_only.css', 'http://readthedocs.org/static/css/readthedocs-doc-embed.css', ], ) self.assertEqual( config['extra_javascript'], [ 'readthedocs-data.js', 'http://readthedocs.org/static/core/js/readthedocs-doc-embed.js', 'http://readthedocs.org/static/javascript/readthedocs-analytics.js', ], ) self.assertIsNone( config['google_analytics'], ) self.assertEqual( config['site_name'], 'mkdocs', ) @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_append_conf_existing_yaml_on_root(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'site_name': 'mkdocs', 'google_analytics': ['UA-1234-5', 'mkdocs.org'], 'docs_dir': 'docs', }, open(yaml_file, 'w'), ) checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) config = yaml.safe_load(open(yaml_file)) self.assertEqual( config['docs_dir'], 'docs', ) self.assertEqual( config['extra_css'], [ 'http://readthedocs.org/static/css/badge_only.css', 'http://readthedocs.org/static/css/readthedocs-doc-embed.css', ], ) self.assertEqual( config['extra_javascript'], [ 'readthedocs-data.js', 'http://readthedocs.org/static/core/js/readthedocs-doc-embed.js', 'http://readthedocs.org/static/javascript/readthedocs-analytics.js', ], ) self.assertIsNone( config['google_analytics'], ) self.assertEqual( config['site_name'], 'mkdocs', ) @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_append_conf_existing_yaml_on_root_with_invalid_setting(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) # We can't use ``@pytest.mark.parametrize`` on a Django test case yaml_contents = [ {'docs_dir': ['docs']}, {'extra_css': 'a string here'}, {'extra_javascript': None}, ] for content in yaml_contents: yaml.safe_dump( content, open(yaml_file, 'w'), ) with self.assertRaises(MkDocsYAMLParseError): self.searchbuilder.append_conf() @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_dont_override_theme(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'theme': 'not-readthedocs', 'theme_dir': 'not-readthedocs', 'site_name': 'mkdocs', 'docs_dir': 'docs', }, open(yaml_file, 'w'), ) checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) config = yaml.safe_load(open(yaml_file)) self.assertEqual( config['theme_dir'], 'not-readthedocs', ) @patch('readthedocs.doc_builder.backends.mkdocs.BaseMkdocs.generate_rtd_data') @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_write_js_data_docs_dir(self, checkout_path, run, generate_rtd_data): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'site_name': 'mkdocs', 'docs_dir': 'docs', }, open(yaml_file, 'w'), ) checkout_path.return_value = tmpdir generate_rtd_data.return_value = '' python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) self.searchbuilder.append_conf() generate_rtd_data.assert_called_with( docs_dir='docs', mkdocs_config=mock.ANY, ) @patch('readthedocs.doc_builder.backends.mkdocs.BaseMkdocs.generate_rtd_data') @patch('readthedocs.projects.models.Project.checkout_path') def test_write_js_data_on_invalid_docs_dir(self, checkout_path, generate_rtd_data): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'site_name': 'mkdocs', 'google_analytics': ['UA-1234-5', 'mkdocs.org'], 'docs_dir': 'invalid_docs_dir', 'extra_css': [ 'http://readthedocs.org/static/css/badge_only.css' ], 'extra_javascript': ['readthedocs-data.js'], }, open(yaml_file, 'w'), ) checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) with self.assertRaises(MkDocsYAMLParseError): self.searchbuilder.append_conf() @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_append_conf_existing_yaml_with_extra(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'site_name': 'mkdocs', 'google_analytics': ['UA-1234-5', 'mkdocs.org'], 'docs_dir': 'docs', 'extra_css': [ 'http://readthedocs.org/static/css/badge_only.css' ], 'extra_javascript': ['readthedocs-data.js'], }, open(yaml_file, 'w'), ) checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) config = yaml.safe_load(open(yaml_file)) self.assertEqual( config['extra_css'], [ 'http://readthedocs.org/static/css/badge_only.css', 'http://readthedocs.org/static/css/readthedocs-doc-embed.css', ], ) self.assertEqual( config['extra_javascript'], [ 'readthedocs-data.js', 'http://readthedocs.org/static/core/js/readthedocs-doc-embed.js', 'http://readthedocs.org/static/javascript/readthedocs-analytics.js', ], )
class MkdocsBuilderTest(TestCase): def setUp(self): self.project = get(Project, documentation_type='mkdocs', name='mkdocs') self.version = get(Version, project=self.project) self.build_env = namedtuple('project', 'version') self.build_env.project = self.project self.build_env.version = self.version @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_append_conf_create_yaml(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) checkout_path.return_value = tmpdir self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=None ) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) # There is a mkdocs.yml file created generated_yaml = os.path.join(tmpdir, 'mkdocs.yml') self.assertTrue(os.path.exists(generated_yaml)) config = yaml.safe_load(open(generated_yaml)) self.assertEqual( config['docs_dir'], os.path.join(tmpdir, 'docs') ) self.assertEqual( config['extra_css'], [ 'http://readthedocs.org/media/css/badge_only.css', 'http://readthedocs.org/media/css/readthedocs-doc-embed.css' ] ) self.assertEqual( config['extra_javascript'], [ 'readthedocs-data.js', 'http://readthedocs.org/media/static/core/js/readthedocs-doc-embed.js', 'http://readthedocs.org/media/javascript/readthedocs-analytics.js', ] ) self.assertIsNone( config['google_analytics'], ) self.assertEqual( config['site_name'], 'mkdocs' ) @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_append_conf_existing_yaml_on_root(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'site_name': 'mkdocs', 'google_analytics': ['UA-1234-5', 'mkdocs.org'], 'docs_dir': 'docs', }, open(yaml_file, 'w') ) checkout_path.return_value = tmpdir self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=None ) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) config = yaml.safe_load(open(yaml_file)) self.assertEqual( config['docs_dir'], 'docs' ) self.assertEqual( config['extra_css'], [ 'http://readthedocs.org/media/css/badge_only.css', 'http://readthedocs.org/media/css/readthedocs-doc-embed.css' ] ) self.assertEqual( config['extra_javascript'], [ 'readthedocs-data.js', 'http://readthedocs.org/media/static/core/js/readthedocs-doc-embed.js', 'http://readthedocs.org/media/javascript/readthedocs-analytics.js', ] ) self.assertIsNone( config['google_analytics'], ) self.assertEqual( config['site_name'], 'mkdocs' ) @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_override_theme_new_style(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'theme': { 'name': 'readthedocs', }, 'site_name': 'mkdocs', 'docs_dir': 'docs', }, open(yaml_file, 'w') ) checkout_path.return_value = tmpdir self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=None ) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) config = yaml.safe_load(open(yaml_file)) self.assertEqual( config['theme'], { 'name': 'readthedocs', 'custom_dir': BaseMkdocs.READTHEDOCS_TEMPLATE_OVERRIDE_DIR } ) @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_override_theme_old_style(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'theme': 'readthedocs', 'site_name': 'mkdocs', 'docs_dir': 'docs', }, open(yaml_file, 'w') ) checkout_path.return_value = tmpdir self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=None ) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) config = yaml.safe_load(open(yaml_file)) self.assertEqual( config['theme_dir'], BaseMkdocs.READTHEDOCS_TEMPLATE_OVERRIDE_DIR ) @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_dont_override_theme(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'theme': 'not-readthedocs', 'theme_dir': 'not-readthedocs', 'site_name': 'mkdocs', 'docs_dir': 'docs', }, open(yaml_file, 'w') ) checkout_path.return_value = tmpdir self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=None ) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) config = yaml.safe_load(open(yaml_file)) self.assertEqual( config['theme_dir'], 'not-readthedocs' )
class MkdocsBuilderTest(TestCase): def setUp(self): self.project = get(Project, documentation_type='mkdocs', name='mkdocs') self.version = get(Version, project=self.project) self.build_env = namedtuple('project', 'version') self.build_env.project = self.project self.build_env.version = self.version @patch('readthedocs.projects.models.Project.checkout_path') def test_get_theme_name(self, checkout_path): tmpdir = tempfile.mkdtemp() checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) builder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) # The default theme is mkdocs but in mkdocs>=1.0, theme is required self.assertEqual(builder.get_theme_name({}), 'mkdocs') # mkdocs<0.17 syntax config = { 'theme': 'readthedocs', } self.assertEqual(builder.get_theme_name(config), 'readthedocs') # mkdocs>=0.17 syntax config = { 'theme': { 'name': 'test_theme', }, } self.assertEqual(builder.get_theme_name(config), 'test_theme') # No theme but just a directory config = { 'theme_dir': '/path/to/mydir', } self.assertEqual(builder.get_theme_name(config), 'mydir') config = { 'theme_dir': '/path/to/mydir/', } self.assertEqual(builder.get_theme_name(config), 'mydir') @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_get_theme_name_with_feature_flag(self, checkout_path, run): tmpdir = tempfile.mkdtemp() checkout_path.return_value = tmpdir feature = get( Feature, feature_id=Feature.MKDOCS_THEME_RTD, ) feature.projects.add(self.project) python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) builder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) self.assertEqual(builder.get_theme_name({}), 'readthedocs') with patch( 'readthedocs.doc_builder.backends.mkdocs.yaml') as mock_yaml: with patch( 'readthedocs.doc_builder.backends.mkdocs.MkdocsHTML.load_yaml_config' ) as mock_load_yaml_config: mock_load_yaml_config.return_value = { 'site_name': self.project.name } builder.append_conf() mock_yaml.safe_dump.assert_called_once_with( { 'site_name': mock.ANY, 'docs_dir': mock.ANY, 'extra_javascript': mock.ANY, 'extra_css': mock.ANY, 'google_analytics': mock.ANY, 'theme': 'readthedocs', }, mock.ANY, ) mock_yaml.reset_mock() config = { 'theme': 'customtheme', } self.assertEqual(builder.get_theme_name(config), 'customtheme') with patch( 'readthedocs.doc_builder.backends.mkdocs.MkdocsHTML.load_yaml_config' ) as mock_load_yaml_config: mock_load_yaml_config.return_value = { 'site_name': self.project.name, 'theme': 'customtheme', } builder.append_conf() mock_yaml.safe_dump.assert_called_once_with( { 'site_name': mock.ANY, 'docs_dir': mock.ANY, 'extra_javascript': mock.ANY, 'extra_css': mock.ANY, 'google_analytics': mock.ANY, 'theme': 'customtheme', }, mock.ANY, ) @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_append_conf_create_yaml(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) # There is a mkdocs.yml file created generated_yaml = os.path.join(tmpdir, 'mkdocs.yml') self.assertTrue(os.path.exists(generated_yaml)) config = yaml.safe_load(open(generated_yaml)) self.assertEqual( config['docs_dir'], os.path.join(tmpdir, 'docs'), ) self.assertEqual( config['extra_css'], [ 'http://readthedocs.org/static/css/badge_only.css', 'http://readthedocs.org/static/css/readthedocs-doc-embed.css', ], ) self.assertEqual( config['extra_javascript'], [ 'readthedocs-data.js', 'http://readthedocs.org/static/core/js/readthedocs-doc-embed.js', 'http://readthedocs.org/static/javascript/readthedocs-analytics.js', ], ) self.assertIsNone(config['google_analytics'], ) self.assertEqual( config['site_name'], 'mkdocs', ) @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_append_conf_existing_yaml_on_root(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'site_name': 'mkdocs', 'google_analytics': ['UA-1234-5', 'mkdocs.org'], 'docs_dir': 'docs', }, open(yaml_file, 'w'), ) checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) config = yaml.safe_load(open(yaml_file)) self.assertEqual( config['docs_dir'], 'docs', ) self.assertEqual( config['extra_css'], [ 'http://readthedocs.org/static/css/badge_only.css', 'http://readthedocs.org/static/css/readthedocs-doc-embed.css', ], ) self.assertEqual( config['extra_javascript'], [ 'readthedocs-data.js', 'http://readthedocs.org/static/core/js/readthedocs-doc-embed.js', 'http://readthedocs.org/static/javascript/readthedocs-analytics.js', ], ) self.assertIsNone(config['google_analytics'], ) self.assertEqual( config['site_name'], 'mkdocs', ) @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_append_conf_existing_yaml_on_root_with_invalid_setting( self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) # We can't use ``@pytest.mark.parametrize`` on a Django test case yaml_contents = [ { 'docs_dir': ['docs'] }, { 'extra_css': 'a string here' }, { 'extra_javascript': None }, ] for content in yaml_contents: yaml.safe_dump( content, open(yaml_file, 'w'), ) with self.assertRaises(MkDocsYAMLParseError): self.searchbuilder.append_conf() @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_dont_override_theme(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'theme': 'not-readthedocs', 'theme_dir': 'not-readthedocs', 'site_name': 'mkdocs', 'docs_dir': 'docs', }, open(yaml_file, 'w'), ) checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) config = yaml.safe_load(open(yaml_file)) self.assertEqual( config['theme_dir'], 'not-readthedocs', ) @patch( 'readthedocs.doc_builder.backends.mkdocs.BaseMkdocs.generate_rtd_data') @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_write_js_data_docs_dir(self, checkout_path, run, generate_rtd_data): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'site_name': 'mkdocs', 'docs_dir': 'docs', }, open(yaml_file, 'w'), ) checkout_path.return_value = tmpdir generate_rtd_data.return_value = '' python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) self.searchbuilder.append_conf() generate_rtd_data.assert_called_with( docs_dir='docs', mkdocs_config=mock.ANY, ) @patch( 'readthedocs.doc_builder.backends.mkdocs.BaseMkdocs.generate_rtd_data') @patch('readthedocs.projects.models.Project.checkout_path') def test_write_js_data_on_invalid_docs_dir(self, checkout_path, generate_rtd_data): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'site_name': 'mkdocs', 'google_analytics': ['UA-1234-5', 'mkdocs.org'], 'docs_dir': 'invalid_docs_dir', 'extra_css': ['http://readthedocs.org/static/css/badge_only.css'], 'extra_javascript': ['readthedocs-data.js'], }, open(yaml_file, 'w'), ) checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) with self.assertRaises(MkDocsYAMLParseError): self.searchbuilder.append_conf() @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_append_conf_existing_yaml_with_extra(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'site_name': 'mkdocs', 'google_analytics': ['UA-1234-5', 'mkdocs.org'], 'docs_dir': 'docs', 'extra_css': ['http://readthedocs.org/static/css/badge_only.css'], 'extra_javascript': ['readthedocs-data.js'], }, open(yaml_file, 'w'), ) checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) config = yaml.safe_load(open(yaml_file)) self.assertEqual( config['extra_css'], [ 'http://readthedocs.org/static/css/badge_only.css', 'http://readthedocs.org/static/css/readthedocs-doc-embed.css', ], ) self.assertEqual( config['extra_javascript'], [ 'readthedocs-data.js', 'http://readthedocs.org/static/core/js/readthedocs-doc-embed.js', 'http://readthedocs.org/static/javascript/readthedocs-analytics.js', ], ) @patch('readthedocs.projects.models.Project.checkout_path') def test_empty_yaml_config(self, checkout_path): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( '', open(yaml_file, 'w'), ) checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) with self.assertRaisesMessage(MkDocsYAMLParseError, MkDocsYAMLParseError.EMPTY_CONFIG): self.searchbuilder.append_conf() @patch('readthedocs.projects.models.Project.checkout_path') def test_yaml_config_not_returns_dict(self, checkout_path): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( 'test_string', open(yaml_file, 'w'), ) checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) with self.assertRaisesMessage(MkDocsYAMLParseError, MkDocsYAMLParseError.CONFIG_NOT_DICT): self.searchbuilder.append_conf()
class MkdocsBuilderTest(TestCase): def setUp(self): self.project = get(Project, documentation_type='mkdocs', name='mkdocs') self.version = get(Version, project=self.project) self.build_env = namedtuple('project', 'version') self.build_env.project = self.project self.build_env.version = self.version @patch('readthedocs.projects.models.Project.checkout_path') def test_get_theme_name(self, checkout_path): tmpdir = tempfile.mkdtemp() checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) builder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) # The default theme is mkdocs but in mkdocs>=1.0, theme is required self.assertEqual(builder.get_theme_name({}), 'mkdocs') # mkdocs<0.17 syntax config = { 'theme': 'readthedocs', } self.assertEqual(builder.get_theme_name(config), 'readthedocs') # mkdocs>=0.17 syntax config = { 'theme': { 'name': 'test_theme', }, } self.assertEqual(builder.get_theme_name(config), 'test_theme') # No theme but just a directory config = { 'theme_dir': '/path/to/mydir', } self.assertEqual(builder.get_theme_name(config), 'mydir') config = { 'theme_dir': '/path/to/mydir/', } self.assertEqual(builder.get_theme_name(config), 'mydir') @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_append_conf_create_yaml(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) # There is a mkdocs.yml file created generated_yaml = os.path.join(tmpdir, 'mkdocs.yml') self.assertTrue(os.path.exists(generated_yaml)) config = yaml.safe_load(open(generated_yaml)) self.assertEqual( config['docs_dir'], os.path.join(tmpdir, 'docs') ) self.assertEqual( config['extra_css'], [ 'http://readthedocs.org/static/css/badge_only.css', 'http://readthedocs.org/static/css/readthedocs-doc-embed.css' ] ) self.assertEqual( config['extra_javascript'], [ 'readthedocs-data.js', 'http://readthedocs.org/static/core/js/readthedocs-doc-embed.js', 'http://readthedocs.org/static/javascript/readthedocs-analytics.js', ] ) self.assertIsNone( config['google_analytics'], ) self.assertEqual( config['site_name'], 'mkdocs' ) @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_append_conf_existing_yaml_on_root(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'site_name': 'mkdocs', 'google_analytics': ['UA-1234-5', 'mkdocs.org'], 'docs_dir': 'docs', }, open(yaml_file, 'w') ) checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) config = yaml.safe_load(open(yaml_file)) self.assertEqual( config['docs_dir'], 'docs' ) self.assertEqual( config['extra_css'], [ 'http://readthedocs.org/static/css/badge_only.css', 'http://readthedocs.org/static/css/readthedocs-doc-embed.css' ] ) self.assertEqual( config['extra_javascript'], [ 'readthedocs-data.js', 'http://readthedocs.org/static/core/js/readthedocs-doc-embed.js', 'http://readthedocs.org/static/javascript/readthedocs-analytics.js', ] ) self.assertIsNone( config['google_analytics'], ) self.assertEqual( config['site_name'], 'mkdocs' ) @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_dont_override_theme(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'theme': 'not-readthedocs', 'theme_dir': 'not-readthedocs', 'site_name': 'mkdocs', 'docs_dir': 'docs', }, open(yaml_file, 'w') ) checkout_path.return_value = tmpdir python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) config = yaml.safe_load(open(yaml_file)) self.assertEqual( config['theme_dir'], 'not-readthedocs' ) @patch('readthedocs.doc_builder.backends.mkdocs.BaseMkdocs.generate_rtd_data') @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_write_js_data_docs_dir(self, checkout_path, run, generate_rtd_data): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'site_name': 'mkdocs', 'docs_dir': 'docs', }, open(yaml_file, 'w') ) checkout_path.return_value = tmpdir generate_rtd_data.return_value = '' python_env = Virtualenv( version=self.version, build_env=self.build_env, config=None, ) self.searchbuilder = MkdocsHTML( build_env=self.build_env, python_env=python_env, ) self.searchbuilder.append_conf() generate_rtd_data.assert_called_with( docs_dir='docs', mkdocs_config=mock.ANY )
class MkdocsBuilderTest(TestCase): def setUp(self): self.project = get(Project, documentation_type='mkdocs', name='mkdocs') self.version = get(Version, project=self.project) self.build_env = namedtuple('project', 'version') self.build_env.project = self.project self.build_env.version = self.version @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_append_conf_create_yaml(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) checkout_path.return_value = tmpdir self.searchbuilder = MkdocsHTML(build_env=self.build_env, python_env=None) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) # There is a mkdocs.yml file created generated_yaml = os.path.join(tmpdir, 'mkdocs.yml') self.assertTrue(os.path.exists(generated_yaml)) config = yaml.safe_load(open(generated_yaml)) self.assertEqual(config['docs_dir'], os.path.join(tmpdir, 'docs')) self.assertEqual(config['extra_css'], [ 'http://readthedocs.org/media/css/badge_only.css', 'http://readthedocs.org/media/css/readthedocs-doc-embed.css' ]) self.assertEqual(config['extra_javascript'], [ 'readthedocs-data.js', 'http://readthedocs.org/media/static/core/js/readthedocs-doc-embed.js', 'http://readthedocs.org/media/javascript/readthedocs-analytics.js', ]) self.assertIsNone(config['google_analytics'], ) self.assertEqual(config['site_name'], 'mkdocs') @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_append_conf_existing_yaml_on_root(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'site_name': 'mkdocs', 'google_analytics': ['UA-1234-5', 'mkdocs.org'], 'docs_dir': 'docs', }, open(yaml_file, 'w')) checkout_path.return_value = tmpdir self.searchbuilder = MkdocsHTML(build_env=self.build_env, python_env=None) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) config = yaml.safe_load(open(yaml_file)) self.assertEqual(config['docs_dir'], 'docs') self.assertEqual(config['extra_css'], [ 'http://readthedocs.org/media/css/badge_only.css', 'http://readthedocs.org/media/css/readthedocs-doc-embed.css' ]) self.assertEqual(config['extra_javascript'], [ 'readthedocs-data.js', 'http://readthedocs.org/media/static/core/js/readthedocs-doc-embed.js', 'http://readthedocs.org/media/javascript/readthedocs-analytics.js', ]) self.assertIsNone(config['google_analytics'], ) self.assertEqual(config['site_name'], 'mkdocs') @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_override_theme_new_style(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'theme': { 'name': 'readthedocs', }, 'site_name': 'mkdocs', 'docs_dir': 'docs', }, open(yaml_file, 'w')) checkout_path.return_value = tmpdir self.searchbuilder = MkdocsHTML(build_env=self.build_env, python_env=None) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) config = yaml.safe_load(open(yaml_file)) self.assertEqual( config['theme'], { 'name': 'readthedocs', 'custom_dir': BaseMkdocs.READTHEDOCS_TEMPLATE_OVERRIDE_DIR }) @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_override_theme_old_style(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'theme': 'readthedocs', 'site_name': 'mkdocs', 'docs_dir': 'docs', }, open(yaml_file, 'w')) checkout_path.return_value = tmpdir self.searchbuilder = MkdocsHTML(build_env=self.build_env, python_env=None) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) config = yaml.safe_load(open(yaml_file)) self.assertEqual(config['theme_dir'], BaseMkdocs.READTHEDOCS_TEMPLATE_OVERRIDE_DIR) @patch('readthedocs.doc_builder.base.BaseBuilder.run') @patch('readthedocs.projects.models.Project.checkout_path') def test_dont_override_theme(self, checkout_path, run): tmpdir = tempfile.mkdtemp() os.mkdir(os.path.join(tmpdir, 'docs')) yaml_file = os.path.join(tmpdir, 'mkdocs.yml') yaml.safe_dump( { 'theme': 'not-readthedocs', 'theme_dir': 'not-readthedocs', 'site_name': 'mkdocs', 'docs_dir': 'docs', }, open(yaml_file, 'w')) checkout_path.return_value = tmpdir self.searchbuilder = MkdocsHTML(build_env=self.build_env, python_env=None) self.searchbuilder.append_conf() run.assert_called_with('cat', 'mkdocs.yml', cwd=mock.ANY) config = yaml.safe_load(open(yaml_file)) self.assertEqual(config['theme_dir'], 'not-readthedocs')