fix: isolate GTIN tool and legal pages

This commit is contained in:
desfoto automation
2026-09-25 19:47:28 +02:00
parent 160d72f144
commit 89b8ca2283
15 changed files with 284 additions and 38 deletions

View File

@@ -91,10 +91,13 @@ fi
printf '\n== routes\n'
for route in / /fotografie/ /businessfotografie/ /portrait-und-model/ /familie/ \
/minishootings/ /video/ /musik-und-buehne/ /social-media/ /projekte/ /ueber/ /kontakt/ /impressum/ /datenschutz/ /gtin/; do
/minishootings/ /video/ /musik-und-buehne/ /social-media/ /projekte/ /ueber/ /kontakt/ /impressum/ /datenschutz/ \
/gtin/ /gtin/impressum/ /gtin/datenschutz/; do
check_status "$base$route" 200
done
check_redirect "$base/gtin" "$base/gtin/"
check_redirect "$base/gtin/impressum" "$base/gtin/impressum/"
check_redirect "$base/gtin/datenschutz" "$base/gtin/datenschutz/"
# The retired photo URL must keep working: it is the umbrella page now.
check_redirect "$base/shootings" "$base/fotografie/"
@@ -140,13 +143,19 @@ check_contains "$base/musik-und-buehne/" "Sagenbringer"
check_contains "$base/impressum/" "§ 5 DDG"
check_contains "$base/impressum/" "DE462149560"
check_contains "$base/datenschutz/" "keine Zugriffsprotokolle"
check_contains "$base/datenschutz/" "bis zu 20"
check_contains "$base/impressum/" "GTIN-Tool"
check_not_contains "$base/datenschutz/" "GTIN"
check_not_contains "$base/impressum/" "GTIN"
check_contains "$base/gtin/" 'name="robots" content="noindex, nofollow"'
check_not_contains "$base/" 'href="/gtin'
check_not_contains "$base/sitemap.xml" "/gtin/"
check_contains "$base/gtin/" 'href="/impressum/"'
check_contains "$base/gtin/" 'href="/datenschutz/"'
check_contains "$base/gtin/" 'href="/gtin/impressum/"'
check_contains "$base/gtin/" 'href="/gtin/datenschutz/"'
check_contains "$base/gtin/impressum/" "§ 5 DDG"
check_contains "$base/gtin/impressum/" "DE462149560"
check_contains "$base/gtin/datenschutz/" "Cache API"
check_contains "$base/gtin/datenschutz/" "nicht an einen Server übertragen"
check_contains "$base/gtin/datenschutz/" 'name="robots" content="noindex, nofollow"'
check_contains "$base/gtin/impressum/" 'name="robots" content="noindex, nofollow"'
for route in / /fotografie/ /businessfotografie/ /portrait-und-model/ /familie/ \
/minishootings/ /video/ /musik-und-buehne/ /social-media/ /projekte/ /ueber/ \
/kontakt/ /impressum/ /datenschutz/; do

View File

@@ -92,9 +92,10 @@ them is a defect, not a style question:
- no cookies, analytics or tracking. The standalone `/gtin/` tool is the only
`localStorage`/Cache API exception: it keeps its last 20 generated entries in
the browser and caches only its own offline app shell; it sends no tool data
to a server. The tool stays unlisted: no site navigation or page links, no
sitemap entry, and `noindex,nofollow`; only the tool itself links out to the
required legal pages;
to a server. Its `/gtin/impressum/` and `/gtin/datenschutz/` pages are
standalone, unlisted legal pages. The tool stays unlisted: no main-site
navigation or page links, no sitemap entry, and `noindex,nofollow`; only the
tool links to its own legal pages, which never link back to the main site;
- `access_log off` in `nginx.conf` — never enable request logging;
- `error_log /dev/null crit;` in `nginx.conf` — never write an error-log file either;
- fonts, scripts, styles and images are served from this origin only;

View File

@@ -47,7 +47,8 @@ Video · Social Media · Projekte · Über · Kontakt · Impressum · Datenschut
Der GTIN-Generator unter `/gtin/` ist ein separates, öffentlich direkt aufrufbares Werkzeug.
Er bleibt absichtlich unverlinkt, fehlt in der Sitemap und trägt `noindex,nofollow`; nur das
Werkzeug selbst verlinkt auf Impressum und Datenschutz.
Werkzeug selbst verlinkt auf seine eigenständigen Rechtstexte unter `/gtin/impressum/` und
`/gtin/datenschutz/`. Diese Seiten verwenden keine Navigation oder Rechtstexte des Hauptauftritts.
## Technische Entscheidungen
@@ -66,7 +67,8 @@ Werkzeug selbst verlinkt auf Impressum und Datenschutz.
- **GTIN-Generator.** Der Generator unter `/gtin/` rechnet vollständig im Browser,
ohne Konto, externe API oder Serverübertragung. Er speichert bis zu 20 zuletzt
erzeugte Einträge lokal im Browser; der Offline-Appcache enthält nur die
Anwendungsdateien. Beide Funktionen sind in der Datenschutzerklärung beschrieben.
Anwendungsdateien. Die eigenständige Datenschutzerklärung liegt unter
`/gtin/datenschutz/`; die Rechtstexte sind nicht mit denen des Hauptauftritts verknüpft.
## Herkunft der Inhalte

View File

@@ -65,6 +65,8 @@ server {
location = /datenschutz.html { return 301 /datenschutz/; }
location = /kontakt.html { return 301 /kontakt/; }
location = /gtin { return 301 /gtin/; }
location = /gtin/impressum { return 301 /gtin/impressum/; }
location = /gtin/datenschutz { return 301 /gtin/datenschutz/; }
location = /gtin/manifest.webmanifest {
default_type application/manifest+json;
try_files $uri =404;

View File

@@ -40,7 +40,11 @@ from theme import CSS, TOKENS # noqa: E402
WIDTHS = (480, 768, 1200, 1600)
WEBP_QUALITY = 84
UNLISTED_HTML = ["gtin/index.html"]
UNLISTED_HTML = [
"gtin/index.html",
"gtin/impressum/index.html",
"gtin/datenschutz/index.html",
]
INK = (23, 20, 15)
PAPER = (246, 242, 234)
@@ -281,7 +285,7 @@ def build_html(table: dict[str, dict]) -> list[tuple[str, str]]:
print(f" [html] {rel}")
shutil.rmtree(SITE / "gtin", ignore_errors=True)
shutil.copytree(SRC / "gtin", SITE / "gtin")
print(" [html] gtin/index.html (unlisted browser tool)")
print(" [html] gtin/ (unlisted browser tool and standalone legal pages)")
not_found = pages.not_found().replace("og-desfoto.jpg", "og-desfoto.jpg")
(SITE / "404.html").write_text(not_found, encoding="utf-8")
print(" [html] 404.html")
@@ -531,6 +535,7 @@ def link_check(routes: list[tuple[str, str]]) -> list[str]:
problems: list[str] = []
built = {f"/{rel}".replace("/index.html", "/") for _p, rel in routes}
built.update(f"/{rel}".replace("/index.html", "/") for rel in UNLISTED_HTML)
built.add("/404.html")
for rel in ["sitemap.xml", "robots.txt", "site.webmanifest", "favicon.svg", ".well-known/security.txt",
"assets/site.css", "assets/site.js", "assets/fonts.css"]:

View File

@@ -101,11 +101,8 @@
<h2>5. Cookies und lokale Speicherung</h2>
<p>Diese Website setzt <strong>keine Cookies</strong> und verwendet keine Analyse-, Marketing- oder
Tracking-Technologien. Das browserbasierte GTIN-Tool speichert die letzten bis zu 20
Artikelnummern und erzeugten GTINs im lokalen Speicher deines Browsers, damit du sie dort erneut
aufrufen oder den Verlauf löschen kannst. Die Einträge werden nicht an einen Server übertragen.
Für den Offlinebetrieb speichert dein Browser außerdem die Anwendungsdateien im Cache. Beides
kannst du über das Tool beziehungsweise die Browser-Einstellungen löschen.</p>
Tracking-Technologien. Auf den Seiten dieses Angebots werden keine Informationen dauerhaft im
Browser gespeichert.</p>
<h2>6. Schriftarten und Bilder</h2>
<p>Die verwendeten Schriftarten werden von diesem Server ausgeliefert und sind lokal eingebunden.

View File

@@ -0,0 +1,54 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Datenschutz</title>
<meta name="robots" content="noindex, nofollow" />
<link rel="canonical" href="https://desfoto.de/gtin/datenschutz/" />
<style>
:root { color-scheme: light; font: 16px/1.65 system-ui, sans-serif; color: #202124; background: #fff; }
body { box-sizing: border-box; max-width: 42rem; margin: 0 auto; padding: 2.5rem 1.25rem; }
h1 { margin: 0 0 1.5rem; font-size: clamp(2rem, 7vw, 3rem); line-height: 1.1; }
h2 { margin: 2rem 0 .5rem; font-size: 1.1rem; }
p { margin: .5rem 0 1rem; }
a { color: #174ea6; }
footer { margin-top: 3rem; padding-top: 1rem; border-top: 1px solid #ddd; }
footer a + a { margin-left: 1rem; }
</style>
</head>
<body>
<main>
<h1>Datenschutz</h1>
<p>Stand: September 2026</p>
<h2>Verantwortlicher</h2>
<p>Denny Schulz Fotografie, Inhaber Denny Schulz<br />
Flensburger Str. 16, 24537 Neumünster, Deutschland<br />
<a href="mailto:info@dennyschulz.de">info@dennyschulz.de</a></p>
<h2>Aufruf und Nutzung</h2>
<p>Beim Aufruf verarbeitet der selbst betriebene Server deine IP-Adresse kurzzeitig, um die
angeforderte Seite auszuliefern. Zugriffsprotokolle werden nicht gespeichert. Rechtsgrundlage
ist Art. 6 Abs. 1 lit. f DSGVO (sicherer und funktionsfähiger Betrieb).</p>
<p>Deine Eingaben und erzeugten GTINs werden ausschließlich in deinem Browser verarbeitet und
nicht an einen Server übertragen. Der Browser speichert bis zu 20 Verlaufseinträge im
lokalen Speicher und Anwendungsdateien für den Offlinebetrieb in der Cache API. Den Verlauf
kannst du im Werkzeug löschen; den Offline-Cache kannst du in den Browser-Einstellungen
entfernen. Es werden keine Cookies, Analyse- oder Trackingdienste eingesetzt und keine
externen Inhalte geladen.</p>
<h2>Deine Rechte</h2>
<p>Du hast im gesetzlichen Umfang das Recht auf Auskunft, Berichtigung, Löschung,
Einschränkung der Verarbeitung, Widerspruch und Datenübertragbarkeit. Außerdem kannst du
dich bei der zuständigen Datenschutzaufsicht beschweren: Unabhängiges Landeszentrum für
Datenschutz Schleswig-Holstein, Holstenstraße 98, 24103 Kiel. Für Fragen oder zur Ausübung
deiner Rechte erreichst du den Verantwortlichen unter
<a href="mailto:info@dennyschulz.de">info@dennyschulz.de</a>.</p>
</main>
<footer>
<a href="/gtin/">Zum GTIN-Werkzeug</a>
<a href="/gtin/impressum/">Impressum</a>
</footer>
</body>
</html>

View File

@@ -0,0 +1,43 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Impressum</title>
<meta name="robots" content="noindex, nofollow" />
<link rel="canonical" href="https://desfoto.de/gtin/impressum/" />
<style>
:root { color-scheme: light; font: 16px/1.65 system-ui, sans-serif; color: #202124; background: #fff; }
body { box-sizing: border-box; max-width: 42rem; margin: 0 auto; padding: 2.5rem 1.25rem; }
h1 { margin: 0 0 1.5rem; font-size: clamp(2rem, 7vw, 3rem); line-height: 1.1; }
h2 { margin: 2rem 0 .5rem; font-size: 1.1rem; }
p { margin: .5rem 0 1rem; }
a { color: #174ea6; }
footer { margin-top: 3rem; padding-top: 1rem; border-top: 1px solid #ddd; }
footer a + a { margin-left: 1rem; }
</style>
</head>
<body>
<main>
<h1>Impressum</h1>
<p>Angaben gemäß § 5 DDG für das GTIN-Werkzeug.</p>
<h2>Anbieter</h2>
<p><strong>Denny Schulz Fotografie</strong><br />
Inhaber: Denny Schulz<br />
Flensburger Str. 16<br />
24537 Neumünster<br />
Deutschland</p>
<h2>Kontakt</h2>
<p>E-Mail: <a href="mailto:info@dennyschulz.de">info@dennyschulz.de</a><br />
Telefon: <a href="tel:+491754083133">+49 175 4083133</a></p>
<p>Wirtschafts-Identifikationsnummer: DE462149560</p>
</main>
<footer>
<a href="/gtin/">Zum GTIN-Werkzeug</a>
<a href="/gtin/datenschutz/">Datenschutz</a>
</footer>
</body>
</html>

View File

@@ -85,11 +85,10 @@
</p>
<p class="fuss-datenschutz">
Eingaben und Verlauf bleiben in deinem Browser.
<a href="/datenschutz/">Datenschutz</a>
</p>
<nav class="fuss-rechtliches" aria-label="Rechtliche Informationen">
<a href="/impressum/">Impressum</a>
<a href="/datenschutz/">Datenschutz</a>
<a href="/gtin/impressum/">Impressum</a>
<a href="/gtin/datenschutz/">Datenschutz</a>
</nav>
</footer>
</main>

View File

@@ -85,8 +85,7 @@
<h2>Marke und Angebot</h2>
<p><strong>desfoto</strong> ist der Markenauftritt von Denny Schulz Fotografie. Alle über diese
Website erreichbaren Leistungen werden von Denny Schulz Fotografie erbracht. Das kostenlose
GTIN-Tool ist ein browserbasiertes Zusatzwerkzeug desselben Anbieters.</p>
Website erreichbaren Leistungen werden von Denny Schulz Fotografie erbracht.</p>
<h2>Urheberrecht und Bildrechte</h2>
<p>Alle auf dieser Website gezeigten Fotografien und Filme sind urheberrechtlich geschützt.

View File

@@ -0,0 +1,54 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Datenschutz</title>
<meta name="robots" content="noindex, nofollow" />
<link rel="canonical" href="https://desfoto.de/gtin/datenschutz/" />
<style>
:root { color-scheme: light; font: 16px/1.65 system-ui, sans-serif; color: #202124; background: #fff; }
body { box-sizing: border-box; max-width: 42rem; margin: 0 auto; padding: 2.5rem 1.25rem; }
h1 { margin: 0 0 1.5rem; font-size: clamp(2rem, 7vw, 3rem); line-height: 1.1; }
h2 { margin: 2rem 0 .5rem; font-size: 1.1rem; }
p { margin: .5rem 0 1rem; }
a { color: #174ea6; }
footer { margin-top: 3rem; padding-top: 1rem; border-top: 1px solid #ddd; }
footer a + a { margin-left: 1rem; }
</style>
</head>
<body>
<main>
<h1>Datenschutz</h1>
<p>Stand: September 2026</p>
<h2>Verantwortlicher</h2>
<p>Denny Schulz Fotografie, Inhaber Denny Schulz<br />
Flensburger Str. 16, 24537 Neumünster, Deutschland<br />
<a href="mailto:info@dennyschulz.de">info@dennyschulz.de</a></p>
<h2>Aufruf und Nutzung</h2>
<p>Beim Aufruf verarbeitet der selbst betriebene Server deine IP-Adresse kurzzeitig, um die
angeforderte Seite auszuliefern. Zugriffsprotokolle werden nicht gespeichert. Rechtsgrundlage
ist Art. 6 Abs. 1 lit. f DSGVO (sicherer und funktionsfähiger Betrieb).</p>
<p>Deine Eingaben und erzeugten GTINs werden ausschließlich in deinem Browser verarbeitet und
nicht an einen Server übertragen. Der Browser speichert bis zu 20 Verlaufseinträge im
lokalen Speicher und Anwendungsdateien für den Offlinebetrieb in der Cache API. Den Verlauf
kannst du im Werkzeug löschen; den Offline-Cache kannst du in den Browser-Einstellungen
entfernen. Es werden keine Cookies, Analyse- oder Trackingdienste eingesetzt und keine
externen Inhalte geladen.</p>
<h2>Deine Rechte</h2>
<p>Du hast im gesetzlichen Umfang das Recht auf Auskunft, Berichtigung, Löschung,
Einschränkung der Verarbeitung, Widerspruch und Datenübertragbarkeit. Außerdem kannst du
dich bei der zuständigen Datenschutzaufsicht beschweren: Unabhängiges Landeszentrum für
Datenschutz Schleswig-Holstein, Holstenstraße 98, 24103 Kiel. Für Fragen oder zur Ausübung
deiner Rechte erreichst du den Verantwortlichen unter
<a href="mailto:info@dennyschulz.de">info@dennyschulz.de</a>.</p>
</main>
<footer>
<a href="/gtin/">Zum GTIN-Werkzeug</a>
<a href="/gtin/impressum/">Impressum</a>
</footer>
</body>
</html>

View File

@@ -0,0 +1,43 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Impressum</title>
<meta name="robots" content="noindex, nofollow" />
<link rel="canonical" href="https://desfoto.de/gtin/impressum/" />
<style>
:root { color-scheme: light; font: 16px/1.65 system-ui, sans-serif; color: #202124; background: #fff; }
body { box-sizing: border-box; max-width: 42rem; margin: 0 auto; padding: 2.5rem 1.25rem; }
h1 { margin: 0 0 1.5rem; font-size: clamp(2rem, 7vw, 3rem); line-height: 1.1; }
h2 { margin: 2rem 0 .5rem; font-size: 1.1rem; }
p { margin: .5rem 0 1rem; }
a { color: #174ea6; }
footer { margin-top: 3rem; padding-top: 1rem; border-top: 1px solid #ddd; }
footer a + a { margin-left: 1rem; }
</style>
</head>
<body>
<main>
<h1>Impressum</h1>
<p>Angaben gemäß § 5 DDG für das GTIN-Werkzeug.</p>
<h2>Anbieter</h2>
<p><strong>Denny Schulz Fotografie</strong><br />
Inhaber: Denny Schulz<br />
Flensburger Str. 16<br />
24537 Neumünster<br />
Deutschland</p>
<h2>Kontakt</h2>
<p>E-Mail: <a href="mailto:info@dennyschulz.de">info@dennyschulz.de</a><br />
Telefon: <a href="tel:+491754083133">+49 175 4083133</a></p>
<p>Wirtschafts-Identifikationsnummer: DE462149560</p>
</main>
<footer>
<a href="/gtin/">Zum GTIN-Werkzeug</a>
<a href="/gtin/datenschutz/">Datenschutz</a>
</footer>
</body>
</html>

View File

@@ -85,11 +85,10 @@
</p>
<p class="fuss-datenschutz">
Eingaben und Verlauf bleiben in deinem Browser.
<a href="/datenschutz/">Datenschutz</a>
</p>
<nav class="fuss-rechtliches" aria-label="Rechtliche Informationen">
<a href="/impressum/">Impressum</a>
<a href="/datenschutz/">Datenschutz</a>
<a href="/gtin/impressum/">Impressum</a>
<a href="/gtin/datenschutz/">Datenschutz</a>
</nav>
</footer>
</main>

View File

@@ -1749,8 +1749,7 @@ def impressum() -> str:
<h2>Marke und Angebot</h2>
<p><strong>desfoto</strong> ist der Markenauftritt von {e(LEGAL['business'])}. Alle über diese
Website erreichbaren Leistungen werden von {e(LEGAL['business'])} erbracht. Das kostenlose
GTIN-Tool ist ein browserbasiertes Zusatzwerkzeug desselben Anbieters.</p>
Website erreichbaren Leistungen werden von {e(LEGAL['business'])} erbracht.</p>
<h2>Urheberrecht und Bildrechte</h2>
<p>Alle auf dieser Website gezeigten Fotografien und Filme sind urheberrechtlich geschützt.
@@ -1830,11 +1829,8 @@ def datenschutz() -> str:
<h2>5. Cookies und lokale Speicherung</h2>
<p>Diese Website setzt <strong>keine Cookies</strong> und verwendet keine Analyse-, Marketing- oder
Tracking-Technologien. Das browserbasierte GTIN-Tool speichert die letzten bis zu 20
Artikelnummern und erzeugten GTINs im lokalen Speicher deines Browsers, damit du sie dort erneut
aufrufen oder den Verlauf löschen kannst. Die Einträge werden nicht an einen Server übertragen.
Für den Offlinebetrieb speichert dein Browser außerdem die Anwendungsdateien im Cache. Beides
kannst du über das Tool beziehungsweise die Browser-Einstellungen löschen.</p>
Tracking-Technologien. Auf den Seiten dieses Angebots werden keine Informationen dauerhaft im
Browser gespeichert.</p>
<h2>6. Schriftarten und Bilder</h2>
<p>Die verwendeten Schriftarten werden von diesem Server ausgeliefert und sind lokal eingebunden.

View File

@@ -28,6 +28,8 @@ from content import CONTACT, LEGAL, SITE as META # noqa: E402
ROUTE_PATHS = [route[0] for route in pages.ROUTES]
HTML_FILES = [SITE / route[1] for route in pages.ROUTES] + [SITE / "404.html"]
GTIN_HTML = SITE / "gtin" / "index.html"
GTIN_IMPRESSUM = SITE / "gtin" / "impressum" / "index.html"
GTIN_DATENSCHUTZ = SITE / "gtin" / "datenschutz" / "index.html"
def read(path: Path) -> str:
@@ -49,7 +51,12 @@ class BuildLayout(unittest.TestCase):
self.assertTrue((SITE / rel).is_file(), f"missing {rel}")
def test_no_stray_html_files(self):
expected = {route[1] for route in pages.ROUTES} | {"404.html", "gtin/index.html"}
expected = {route[1] for route in pages.ROUTES} | {
"404.html",
"gtin/index.html",
"gtin/impressum/index.html",
"gtin/datenschutz/index.html",
}
actual = {str(f.relative_to(SITE)) for f in SITE.rglob("*.html")}
self.assertEqual(expected, actual)
@@ -215,9 +222,6 @@ class PrivacyAndLegal(unittest.TestCase):
for needle in (
"keine Zugriffsprotokolle",
"keine Cookies",
"GTIN-Tool",
"bis zu 20",
"nicht an einen Server übertragen",
"youtube-nocookie.com",
"Art. 6 Abs. 1 lit. f DSGVO",
LEGAL["authority"],
@@ -323,13 +327,52 @@ class Content(unittest.TestCase):
self.assertIn("GTIN Generator", text)
self.assertIn('<link rel="canonical" href="https://desfoto.de/gtin/" />', text)
self.assertIn('<meta name="robots" content="noindex, nofollow" />', text)
self.assertIn('href="/impressum/"', text)
self.assertIn('href="/datenschutz/"', text)
self.assertIn('href="/gtin/impressum/"', text)
self.assertIn('href="/gtin/datenschutz/"', text)
self.assertEqual(len(re.findall(r'<a href="/gtin/datenschutz/">', text)), 1)
self.assertNotIn('href="/impressum/"', text)
self.assertNotIn('href="/datenschutz/"', text)
self.assertNotIn('href="/"', text)
self.assertNotIn("/gtin/", read(SITE / "sitemap.xml"))
for file in HTML_FILES:
with self.subTest(file=str(file.relative_to(SITE))):
self.assertNotIn("/gtin", read(file))
self.assertNotIn("GTIN", read(file))
def test_gtin_legal_pages_are_standalone_and_unlisted(self):
impressum = read(GTIN_IMPRESSUM)
datenschutz = read(GTIN_DATENSCHUTZ)
for path, text in (
("/gtin/impressum/", impressum),
("/gtin/datenschutz/", datenschutz),
):
with self.subTest(path=path):
self.assertIn(f'<link rel="canonical" href="https://desfoto.de{path}" />', text)
self.assertIn('<meta name="robots" content="noindex, nofollow" />', text)
self.assertNotIn('href="/impressum/"', text)
self.assertNotIn('href="/datenschutz/"', text)
self.assertNotIn('href="/"', text)
self.assertNotIn("assets/", text)
for value in (
LEGAL["business"], LEGAL["owner"], LEGAL["street"], LEGAL["city"],
CONTACT["email"], CONTACT["phone"], "§ 5 DDG", LEGAL["w_id"],
):
with self.subTest(impressum=value):
self.assertIn(value, visible_text(impressum))
for value in (
LEGAL["owner"], CONTACT["email"], "bis zu 20", "Cache API",
"nicht an einen Server übertragen", "keine Cookies", "Art. 6 Abs. 1 lit. f DSGVO",
LEGAL["authority"],
):
with self.subTest(datenschutz=value):
self.assertIn(value, visible_text(datenschutz))
self.assertIn('href="/gtin/datenschutz/"', impressum)
self.assertIn('href="/gtin/impressum/"', datenschutz)
def test_main_legal_pages_do_not_name_the_gtin_tool(self):
for path in (SITE / "impressum" / "index.html", SITE / "datenschutz" / "index.html"):
with self.subTest(path=str(path.relative_to(SITE))):
self.assertNotIn("GTIN", visible_text(read(path)))
def test_gtin_assets_and_local_data_storage_are_scoped(self):
html_text = read(GTIN_HTML)