| Index: cms-dev/tests/test_cms_cmp.py | 
| =================================================================== | 
| new file mode 100644 | 
| --- /dev/null | 
| +++ b/cms-dev/tests/test_cms_cmp.py | 
| @@ -0,0 +1,127 @@ | 
| +# This file is part of Adblock Plus <https://adblockplus.org/>, | 
| +# Copyright (C) 2017-present eyeo GmbH | 
| +# | 
| +# Adblock Plus is free software: you can redistribute it and/or modify | 
| +# it under the terms of the GNU General Public License version 3 as | 
| +# published by the Free Software Foundation. | 
| +# | 
| +# Adblock Plus is distributed in the hope that it will be useful, | 
| +# but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
| +# GNU General Public License for more details. | 
| +# | 
| +# You should have received a copy of the GNU General Public License | 
| +# along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | 
| + | 
| +import glob | 
| +import os | 
| +import subprocess | 
| +import sys | 
| + | 
| +import pytest | 
| + | 
| +CMSCMP = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'cms_cmp.py') | 
| + | 
| + | 
| +def run_cms_cmp(*args, **kw): | 
| + return subprocess.check_call([sys.executable, CMSCMP] + list(args), **kw) | 
| + | 
| + | 
| +def hg(*args, **kw): | 
| 
 
tlucas
2017/11/24 10:57:46
This is a copy of cms_cmp.hg(), without the call o
 
Vasily Kuznetsov
2017/11/28 16:53:37
I had in mind three arguments for implementing a s
 
tlucas
2017/12/14 10:30:42
I agree, right now this is not a very urgent topic
 
 | 
| + cmd = ['hg'] | 
| + if 'repo' in kw: | 
| + cmd += ['-R', kw['repo']] | 
| + del kw['repo'] | 
| + # Disable default options from local user config. | 
| + cmd += ['--config', 'defaults.{}='.format(args[0])] | 
| + return subprocess.check_call(cmd + list(args), **kw) | 
| + | 
| + | 
| +@pytest.fixture(scope='session') | 
| +def website(tmpdir_factory): | 
| + root = tmpdir_factory.mktemp('website') | 
| + root.join('foo').write('foo') | 
| + hg('init', str(root)) | 
| + hg('commit', '-A', '-m', 'x', repo=str(root)) | 
| + return root | 
| + | 
| + | 
| +@pytest.fixture(scope='session') | 
| +def cms(tmpdir_factory): | 
| + root = tmpdir_factory.mktemp('cms') | 
| + generate = root.mkdir('cms').mkdir('bin').join('generate_static_pages.py') | 
| + generate.write('\n'.join([ | 
| + 'import sys, shutil', | 
| + 'shutil.copytree(sys.argv[1], sys.argv[2])' | 
| + ])) | 
| + hg('init', str(root)) | 
| + hg('commit', '-A', '-m', 'x', repo=str(root)) | 
| + root.join('foo').write('bar') | 
| + hg('commit', '-A', '-m', 'y', repo=str(root)) | 
| + generate.write( | 
| + generate.read() + | 
| + '\nshutil.copy(sys.argv[2] + "/foo", sys.argv[2] + "/bar")' | 
| + ) | 
| + hg('commit', '-m', 'z', repo=str(root)) | 
| + hg('bookmark', '-r', '0', 'master', repo=str(root)) | 
| + hg('bookmark', '-r', '1', 'yoda', repo=str(root)) | 
| + hg('bookmark', '-r', '2', 'other', repo=str(root)) | 
| + return root | 
| + | 
| + | 
| +def test_same_revision(website, cms, tmpdir): | 
| + run_cms_cmp('-d', str(tmpdir), '-c', str(cms), | 
| + '-b', 'master', '-t', 'yoda', | 
| + str(website)) | 
| + | 
| + | 
| +def test_different_revision(website, cms, tmpdir): | 
| + with pytest.raises(subprocess.CalledProcessError): | 
| + # Here the websites will be different, so the comparison will fail... | 
| + run_cms_cmp('-d', str(tmpdir), '-c', str(cms), | 
| + '-b', 'master', '-t', 'other', | 
| + str(website)) | 
| + # ...but it will succeed if we ignore 'bar'. | 
| + run_cms_cmp('-d', str(tmpdir), '-c', str(cms), | 
| + '-b', 'master', '-t', 'other', | 
| + '-i', 'bar', | 
| + str(website)) | 
| + | 
| + | 
| +def test_bad_python(website, cms, tmpdir): | 
| + with pytest.raises(subprocess.CalledProcessError): | 
| + # The run should fail with a broken python... | 
| + run_cms_cmp('-d', str(tmpdir), '-c', str(cms), | 
| + '-t', 'yoda', '-p', 'foobar', | 
| + str(website)) | 
| + # ...but succeed with a good one. | 
| + run_cms_cmp('-d', str(tmpdir), '-c', str(cms), | 
| + '-t', 'yoda', '-p', sys.executable, | 
| + str(website)) | 
| + | 
| + | 
| +def test_remove_old(website, cms, tmpdir): | 
| + run_cms_cmp('-d', str(tmpdir), '-c', str(cms), '-t', 'yoda', | 
| + str(website)) | 
| + # Let's add a file to one of the output directories: | 
| + d = glob.glob(os.path.join(str(tmpdir), 'website*'))[0] | 
| + with open(os.path.join(d, 'baz'), 'w') as f: | 
| + f.write('here') | 
| + # Now the comparison will fail... | 
| + with pytest.raises(subprocess.CalledProcessError): | 
| + run_cms_cmp('-d', str(tmpdir), '-c', str(cms), '-t', 'yoda', | 
| + str(website)) | 
| + # ...but it will succeed if we tell it to delete old outputs. | 
| + run_cms_cmp('-d', str(tmpdir), '-c', str(cms), '-t', 'yoda', '-r', | 
| + str(website)) | 
| + | 
| + | 
| +def test_working_copy(website, cms, tmpdir): | 
| + with pytest.raises(subprocess.CalledProcessError): | 
| + # This will fail because surrent version is 'other'. | 
| 
 
tlucas
2017/11/24 10:57:46
typo "current"
 
Vasily Kuznetsov
2017/11/28 16:53:37
Done.
 
 | 
| + run_cms_cmp('-d', str(tmpdir), '-c', str(cms), str(website)) | 
| + generate = cms.join('cms').join('bin').join('generate_static_pages.py') | 
| + # Remove last line that breaks stuff. | 
| + generate.write('\n'.join(generate.read().splitlines()[:-1])) | 
| + # Now it should be better. | 
| + run_cms_cmp('-d', str(tmpdir), '-c', str(cms), str(website)) |