-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Improve testing for copyright year substitution (#12950)
- Loading branch information
Showing
7 changed files
with
228 additions
and
113 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +0,0 @@ | ||
======================== | ||
test-copyright-multiline | ||
======================== | ||
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
import time | ||
|
||
import pytest | ||
|
||
|
||
@pytest.fixture( | ||
params=[ | ||
1293840000, # 2011-01-01 00:00:00 | ||
1293839999, # 2010-12-31 23:59:59 | ||
] | ||
) | ||
def source_date_year(request, monkeypatch): | ||
source_date_epoch = request.param | ||
with monkeypatch.context() as m: | ||
m.setenv('SOURCE_DATE_EPOCH', str(source_date_epoch)) | ||
yield time.gmtime(source_date_epoch).tm_year | ||
|
||
|
||
@pytest.mark.sphinx('html', testroot='copyright-multiline') | ||
def test_html_multi_line_copyright(app): | ||
app.build(force_all=True) | ||
|
||
content = (app.outdir / 'index.html').read_text(encoding='utf-8') | ||
|
||
# check the copyright footer line by line (empty lines ignored) | ||
assert ' © Copyright 2006.<br/>\n' in content | ||
assert ' © Copyright 2006-2009, Alice.<br/>\n' in content | ||
assert ' © Copyright 2010-2013, Bob.<br/>\n' in content | ||
assert ' © Copyright 2014-2017, Charlie.<br/>\n' in content | ||
assert ' © Copyright 2018-2021, David.<br/>\n' in content | ||
assert ' © Copyright 2022-2025, Eve.' in content | ||
|
||
# check the raw copyright footer block (empty lines included) | ||
assert ( | ||
' © Copyright 2006.<br/>\n' | ||
' \n' | ||
' © Copyright 2006-2009, Alice.<br/>\n' | ||
' \n' | ||
' © Copyright 2010-2013, Bob.<br/>\n' | ||
' \n' | ||
' © Copyright 2014-2017, Charlie.<br/>\n' | ||
' \n' | ||
' © Copyright 2018-2021, David.<br/>\n' | ||
' \n' | ||
' © Copyright 2022-2025, Eve.' | ||
) in content | ||
|
||
|
||
@pytest.mark.sphinx('html', testroot='copyright-multiline') | ||
def test_html_multi_line_copyright_sde(source_date_year, app): | ||
app.build(force_all=True) | ||
|
||
content = (app.outdir / 'index.html').read_text(encoding='utf-8') | ||
|
||
# check the copyright footer line by line (empty lines ignored) | ||
assert f' © Copyright {source_date_year}.<br/>\n' in content | ||
assert f' © Copyright 2006-{source_date_year}, Alice.<br/>\n' in content | ||
assert f' © Copyright 2010-{source_date_year}, Bob.<br/>\n' in content | ||
assert f' © Copyright 2014-{source_date_year}, Charlie.<br/>\n' in content | ||
assert f' © Copyright 2018-{source_date_year}, David.<br/>\n' in content | ||
assert f' © Copyright 2022-{source_date_year}, Eve.' in content | ||
|
||
# check the raw copyright footer block (empty lines included) | ||
assert ( | ||
f' © Copyright {source_date_year}.<br/>\n' | ||
f' \n' | ||
f' © Copyright 2006-{source_date_year}, Alice.<br/>\n' | ||
f' \n' | ||
f' © Copyright 2010-{source_date_year}, Bob.<br/>\n' | ||
f' \n' | ||
f' © Copyright 2014-{source_date_year}, Charlie.<br/>\n' | ||
f' \n' | ||
f' © Copyright 2018-{source_date_year}, David.<br/>\n' | ||
f' \n' | ||
f' © Copyright 2022-{source_date_year}, Eve.' | ||
) in content |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,29 +1,172 @@ | ||
"""Test copyright year adjustment""" | ||
|
||
import time | ||
|
||
import pytest | ||
|
||
from sphinx.config import Config, correct_copyright_year | ||
|
||
LT = time.localtime() | ||
LT_NEW = (2009, *LT[1:], LT.tm_zone, LT.tm_gmtoff) | ||
LOCALTIME_2009 = type(LT)(LT_NEW) | ||
|
||
|
||
@pytest.fixture( | ||
params=[ | ||
# test with SOURCE_DATE_EPOCH unset: no modification | ||
(None, '2006-2009'), | ||
(None, ''), | ||
# test with SOURCE_DATE_EPOCH set: copyright year should be updated | ||
('1293840000', '2006-2011'), | ||
('1293839999', '2006-2010'), | ||
('1293840000', '2011'), | ||
('1293839999', '2010'), | ||
('1199145600', '2008'), | ||
('1199145599', '2007'), | ||
], | ||
) | ||
def expect_date(request, monkeypatch): | ||
sde, expect = request.param | ||
with monkeypatch.context() as m: | ||
m.setattr(time, 'localtime', lambda *a: LOCALTIME_2009) | ||
if sde: | ||
m.setenv('SOURCE_DATE_EPOCH', sde) | ||
else: | ||
m.delenv('SOURCE_DATE_EPOCH', raising=False) | ||
yield expect | ||
|
||
|
||
@pytest.mark.sphinx('html', testroot='correct-year') | ||
def test_correct_year(expect_date, app): | ||
app.build() | ||
content = (app.outdir / 'index.html').read_text(encoding='utf8') | ||
assert expect_date in content | ||
def test_correct_year(expect_date): | ||
# test that copyright is substituted | ||
copyright_date = '2006-2009, Alice' | ||
cfg = Config({'copyright': copyright_date}, {}) | ||
assert cfg.copyright == copyright_date | ||
correct_copyright_year(None, cfg) # type: ignore[arg-type] | ||
if expect_date: | ||
assert cfg.copyright == f'2006-{expect_date}, Alice' | ||
else: | ||
assert cfg.copyright == copyright_date | ||
|
||
|
||
def test_correct_year_space(expect_date): | ||
# test that copyright is substituted | ||
copyright_date = '2006-2009 Alice' | ||
cfg = Config({'copyright': copyright_date}, {}) | ||
assert cfg.copyright == copyright_date | ||
correct_copyright_year(None, cfg) # type: ignore[arg-type] | ||
if expect_date: | ||
assert cfg.copyright == f'2006-{expect_date} Alice' | ||
else: | ||
assert cfg.copyright == copyright_date | ||
|
||
|
||
def test_correct_year_no_author(expect_date): | ||
# test that copyright is substituted | ||
copyright_date = '2006-2009' | ||
cfg = Config({'copyright': copyright_date}, {}) | ||
assert cfg.copyright == copyright_date | ||
correct_copyright_year(None, cfg) # type: ignore[arg-type] | ||
if expect_date: | ||
assert cfg.copyright == f'2006-{expect_date}' | ||
else: | ||
assert cfg.copyright == copyright_date | ||
|
||
|
||
def test_correct_year_single(expect_date): | ||
# test that copyright is substituted | ||
copyright_date = '2009, Alice' | ||
cfg = Config({'copyright': copyright_date}, {}) | ||
assert cfg.copyright == copyright_date | ||
correct_copyright_year(None, cfg) # type: ignore[arg-type] | ||
if expect_date: | ||
assert cfg.copyright == f'{expect_date}, Alice' | ||
else: | ||
assert cfg.copyright == copyright_date | ||
|
||
|
||
def test_correct_year_single_space(expect_date): | ||
# test that copyright is substituted | ||
copyright_date = '2009 Alice' | ||
cfg = Config({'copyright': copyright_date}, {}) | ||
assert cfg.copyright == copyright_date | ||
correct_copyright_year(None, cfg) # type: ignore[arg-type] | ||
if expect_date: | ||
assert cfg.copyright == f'{expect_date} Alice' | ||
else: | ||
assert cfg.copyright == copyright_date | ||
|
||
|
||
def test_correct_year_single_no_author(expect_date): | ||
# test that copyright is substituted | ||
copyright_date = '2009' | ||
cfg = Config({'copyright': copyright_date}, {}) | ||
assert cfg.copyright == copyright_date | ||
correct_copyright_year(None, cfg) # type: ignore[arg-type] | ||
if expect_date: | ||
assert cfg.copyright == f'{expect_date}' | ||
else: | ||
assert cfg.copyright == copyright_date | ||
|
||
|
||
def test_correct_year_multi_line(expect_date): | ||
# test that copyright is substituted | ||
copyright_dates = ( | ||
'2006', | ||
'2006-2009, Alice', | ||
'2010-2013, Bob', | ||
'2014-2017, Charlie', | ||
'2018-2021, David', | ||
'2022-2025, Eve', | ||
) | ||
cfg = Config({'copyright': copyright_dates}, {}) | ||
assert cfg.copyright == copyright_dates | ||
correct_copyright_year(None, cfg) # type: ignore[arg-type] | ||
if expect_date: | ||
assert cfg.copyright == ( | ||
f'{expect_date}', | ||
f'2006-{expect_date}, Alice', | ||
f'2010-{expect_date}, Bob', | ||
f'2014-{expect_date}, Charlie', | ||
f'2018-{expect_date}, David', | ||
f'2022-{expect_date}, Eve', | ||
) | ||
else: | ||
assert cfg.copyright == copyright_dates | ||
|
||
|
||
def test_correct_year_multi_line_all_formats(expect_date): | ||
# test that copyright is substituted | ||
copyright_dates = ( | ||
'2009', | ||
'2009 Alice', | ||
'2009, Bob', | ||
'2006-2009', | ||
'2006-2009 Charlie', | ||
'2006-2009, David', | ||
) | ||
cfg = Config({'copyright': copyright_dates}, {}) | ||
assert cfg.copyright == copyright_dates | ||
correct_copyright_year(None, cfg) # type: ignore[arg-type] | ||
if expect_date: | ||
assert cfg.copyright == ( | ||
f'{expect_date}', | ||
f'{expect_date} Alice', | ||
f'{expect_date}, Bob', | ||
f'2006-{expect_date}', | ||
f'2006-{expect_date} Charlie', | ||
f'2006-{expect_date}, David', | ||
) | ||
else: | ||
assert cfg.copyright == copyright_dates | ||
|
||
|
||
def test_correct_year_app(expect_date, tmp_path, make_app): | ||
# integration test | ||
copyright_date = '2006-2009, Alice' | ||
(tmp_path / 'conf.py').touch() | ||
app = make_app( | ||
'dummy', | ||
srcdir=tmp_path, | ||
confoverrides={'copyright': copyright_date}, | ||
) | ||
if expect_date: | ||
assert app.config.copyright == f'2006-{expect_date}, Alice' | ||
else: | ||
assert app.config.copyright == copyright_date |