1"""
2    test_util_fileutil
3    ~~~~~~~~~~~~~~~~~~
4
5    Tests sphinx.util.fileutil functions.
6
7    :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
8    :license: BSD, see LICENSE for details.
9"""
10
11from unittest import mock
12
13from sphinx.jinja2glue import BuiltinTemplateLoader
14from sphinx.util.fileutil import copy_asset, copy_asset_file
15
16
17class DummyTemplateLoader(BuiltinTemplateLoader):
18    def __init__(self):
19        super().__init__()
20        builder = mock.Mock()
21        builder.config.templates_path = []
22        builder.app.translater = None
23        self.init(builder)
24
25
26def test_copy_asset_file(tempdir):
27    renderer = DummyTemplateLoader()
28
29    # copy normal file
30    src = (tempdir / 'asset.txt')
31    src.write_text('# test data')
32    dest = (tempdir / 'output.txt')
33
34    copy_asset_file(src, dest)
35    assert dest.exists()
36    assert src.read_text() == dest.read_text()
37
38    # copy template file
39    src = (tempdir / 'asset.txt_t')
40    src.write_text('# {{var1}} data')
41    dest = (tempdir / 'output.txt_t')
42
43    copy_asset_file(src, dest, {'var1': 'template'}, renderer)
44    assert not dest.exists()
45    assert (tempdir / 'output.txt').exists()
46    assert (tempdir / 'output.txt').read_text() == '# template data'
47
48    # copy template file to subdir
49    src = (tempdir / 'asset.txt_t')
50    src.write_text('# {{var1}} data')
51    subdir1 = (tempdir / 'subdir')
52    subdir1.makedirs()
53
54    copy_asset_file(src, subdir1, {'var1': 'template'}, renderer)
55    assert (subdir1 / 'asset.txt').exists()
56    assert (subdir1 / 'asset.txt').read_text() == '# template data'
57
58    # copy template file without context
59    src = (tempdir / 'asset.txt_t')
60    subdir2 = (tempdir / 'subdir2')
61    subdir2.makedirs()
62
63    copy_asset_file(src, subdir2)
64    assert not (subdir2 / 'asset.txt').exists()
65    assert (subdir2 / 'asset.txt_t').exists()
66    assert (subdir2 / 'asset.txt_t').read_text() == '# {{var1}} data'
67
68
69def test_copy_asset(tempdir):
70    renderer = DummyTemplateLoader()
71
72    # prepare source files
73    source = (tempdir / 'source')
74    source.makedirs()
75    (source / 'index.rst').write_text('index.rst')
76    (source / 'foo.rst_t').write_text('{{var1}}.rst')
77    (source / '_static').makedirs()
78    (source / '_static' / 'basic.css').write_text('basic.css')
79    (source / '_templates').makedirs()
80    (source / '_templates' / 'layout.html').write_text('layout.html')
81    (source / '_templates' / 'sidebar.html_t').write_text('sidebar: {{var2}}')
82
83    # copy a single file
84    assert not (tempdir / 'test1').exists()
85    copy_asset(source / 'index.rst', tempdir / 'test1')
86    assert (tempdir / 'test1').exists()
87    assert (tempdir / 'test1/index.rst').exists()
88
89    # copy directories
90    destdir = tempdir / 'test2'
91    copy_asset(source, destdir, context=dict(var1='bar', var2='baz'), renderer=renderer)
92    assert (destdir / 'index.rst').exists()
93    assert (destdir / 'foo.rst').exists()
94    assert (destdir / 'foo.rst').read_text() == 'bar.rst'
95    assert (destdir / '_static' / 'basic.css').exists()
96    assert (destdir / '_templates' / 'layout.html').exists()
97    assert (destdir / '_templates' / 'sidebar.html').exists()
98    assert (destdir / '_templates' / 'sidebar.html').read_text() == 'sidebar: baz'
99
100    # copy with exclusion
101    def excluded(path):
102        return ('sidebar.html' in path or 'basic.css' in path)
103
104    destdir = tempdir / 'test3'
105    copy_asset(source, destdir, excluded,
106               context=dict(var1='bar', var2='baz'), renderer=renderer)
107    assert (destdir / 'index.rst').exists()
108    assert (destdir / 'foo.rst').exists()
109    assert not (destdir / '_static' / 'basic.css').exists()
110    assert (destdir / '_templates' / 'layout.html').exists()
111    assert not (destdir / '_templates' / 'sidebar.html').exists()
112