Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 87 additions & 0 deletions opac/tests/test_interface_home.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,90 @@ def test_collection_trans_home(self):
self.assertStatus(response, 200)
expected_anchor = "colección falsa"
self.assertIn(expected_anchor, response.data.decode("utf-8"))

def test_home_logo_shown_when_configured(self):
Copy link

Copilot AI Mar 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

O template escolhe o logo por idioma (pt/en/es), mas o teste só valida pt_BR e en. Para cobrir o comportamento introduzido (seleção por idioma), faltou validar também es. Além disso, os asserts atuais checam apenas a presença da URL no HTML; para reduzir falso-positivo, vale checar uma substring mais específica (ex.: <img src="...">) e, no cenário de fallback, afirmar que não existe <img quando não há logo configurado.

Copilot uses AI. Check for mistakes.
"""
Verificamos se a home exibe o logo da coleção quando está configurado.
"""

with current_app.app_context():
utils.makeOneCollection(
{
"name_pt": "coleção falsa",
"home_logo_pt": "http://example.com/logo_pt.png",
"home_logo_en": "http://example.com/logo_en.png",
"home_logo_es": "http://example.com/logo_es.png",
}
)

with self.client as c:
# idioma em 'pt_br'
response = c.get(
url_for("main.set_locale", lang_code="pt_BR"),
headers={"Referer": "/"},
follow_redirects=True,
)

self.assertStatus(response, 200)
self.assertIn(
"http://example.com/logo_pt.png",
response.data.decode("utf-8"),
)
self.assertNotIn(
'id="collectionNameHome"', response.data.decode("utf-8")
)

# idioma em 'en'
response = c.get(
url_for("main.set_locale", lang_code="en"),
headers={"Referer": "/"},
follow_redirects=True,
)

self.assertStatus(response, 200)
self.assertIn(
"http://example.com/logo_en.png",
response.data.decode("utf-8"),
)

Copy link

Copilot AI Mar 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

O template busca o logo por idioma (pt/en/es), mas o teste cobre apenas pt_BR e en. Como o comportamento adicionado explicitamente suporta es, vale incluir uma asserção adicional para lang_code=\"es\" verificando a presença de home_logo_es para evitar regressões específicas desse idioma.

Suggested change
# idioma em 'es'
response = c.get(
url_for("main.set_locale", lang_code="es"),
headers={"Referer": "/"},
follow_redirects=True,
)
self.assertStatus(response, 200)
self.assertIn(
"http://example.com/logo_es.png",
response.data.decode("utf-8"),
)

Copilot uses AI. Check for mistakes.
def test_home_logo_fallback_to_text_when_not_configured(self):
"""
Verificamos se a home exibe o nome da coleção em texto quando não há logo configurado.
"""

with current_app.app_context():
utils.makeOneCollection({"name_pt": "coleção falsa"})

with self.client as c:
response = c.get(
url_for("main.set_locale", lang_code="pt_BR"),
headers={"Referer": "/"},
follow_redirects=True,
)

self.assertStatus(response, 200)
self.assertIn(
'id="collectionNameHome"', response.data.decode("utf-8")
)
self.assertIn("coleção falsa", response.data.decode("utf-8"))

def test_home_aria_label_uses_collection_name(self):
"""
Verificamos se o aria-label usa o nome dinâmico da coleção.
"""

with current_app.app_context():
utils.makeOneCollection({"name_pt": "coleção falsa"})

with self.client as c:
response = c.get(
url_for("main.set_locale", lang_code="pt_BR"),
headers={"Referer": "/"},
follow_redirects=True,
)

self.assertStatus(response, 200)
self.assertIn(
'aria-label="Acessar site coleção coleção falsa"',
response.data.decode("utf-8"),
)
Comment on lines +141 to +144
Copy link

Copilot AI Mar 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Esse teste fica bem frágil por depender de uma string HTML completa e exata (incluindo aspas/ordem/possíveis mudanças de espaçamento/alterações de tradução). Sugestão: tornar a asserção mais resiliente checando separadamente que o HTML contém aria-label= e que o valor contém o nome dinâmico da coleção (ex.: procurar apenas pelo fragmento com coleção falsa, ou usar uma asserção menos estrita para o atributo).

Suggested change
self.assertIn(
'aria-label="Acessar site coleção coleção falsa"',
response.data.decode("utf-8"),
)
html = response.data.decode("utf-8")
# Garante que existe um atributo aria-label na página
self.assertIn("aria-label=", html)
# Garante que algum aria-label contém o nome dinâmico da coleção,
# sem depender da string completa exata.
self.assertRegex(html, r'aria-label="[^"]*coleção falsa[^"]*"')

Copilot uses AI. Check for mistakes.
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,12 @@ <h2 class="logo-svg">
<div class="scielo__mainMenu" id="mainMenu">
<div class="row">
<div class="col text-center">
<div class="scielo__logo-scielo--small"></div>
{%- set menu_logo_url = cimages.get_menu_logo(g.collection, session.lang)|default('')|trim -%}
{%- if menu_logo_url -%}
{{ cimages.render_logo(menu_logo_url, coll_macro.get_collection_name(), img_class='img-fluid') }}
Comment on lines +48 to +50
Copy link

Copilot AI Mar 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

O PR altera comportamento visível também para logo no menu (hamburger/alternative header), headers internos (journal/article) e rodapé, mas os testes adicionados cobrem apenas a home. Como já existe suíte de testes de interface neste módulo, adicione casos que validem: (1) logo no menu quando configurado e fallback quando ausente; (2) logo no header interno (journal/article) e fallback para collectionNameInternal; e (3) logo no rodapé vs. fallback com aria-hidden=\"true\".

Copilot uses AI. Check for mistakes.
{%- else -%}
<a href="/" aria-label="{% trans %}Página inicial da coleção{% endtrans %} {{ coll_macro.get_collection_name() }}"><div class="scielo__logo-scielo--small" aria-hidden="true"></div></a>
{%- endif -%}
</div>
</div>
<nav>
Expand Down
9 changes: 7 additions & 2 deletions opac/webapp/templates/article/includes/header.html
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,16 @@
{% include "collection/includes/nav.html" %}
</div>
<div class="col col-md-3">
<a href="/" title="{% trans %}Ir para a homepage da coleção: {% endtrans %}{{ coll_macro.get_collection_name() }}">
{%- set header_logo_url = cimages.get_header_logo(g.collection, session.lang)|default('')|trim -%}
{%- if header_logo_url -%}
{{ cimages.render_logo(header_logo_url, coll_macro.get_collection_name(), img_class='img-fluid scielo__logo-img mt-1 ms-5') }}
{%- else -%}
<a href="/" title="{% trans %}Ir para a homepage da coleção: {% endtrans %}{{ coll_macro.get_collection_name() }}">
<div class="scielo__logo-scielo-collection mt-1 ms-5">
<small id="collectionNameInternal">{{ coll_macro.get_collection_name() }}</small>
</div>
</a>
</a>
{%- endif -%}
</div>
<div class="d-none d-md-block d-lg-none col col-md-5 d-print-none">
<div class="dropdown mt-3">
Expand Down
17 changes: 11 additions & 6 deletions opac/webapp/templates/collection/includes/header.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{% import 'macros/collection.html' as coll_macro %}
{% import 'macros/images.html' as img_macro %}

<link rel="stylesheet" href="../../../static/css/jquery.typeahead.css">
<style>
Expand Down Expand Up @@ -90,12 +91,16 @@
</div>
<div class="row">
<div class="col text-center">
<a href="/" alt="{{ coll_macro.get_collection_name() }}" aria-label="{% trans %}Acessar site coleção Brasil{% endtrans %}">
<span class="visually-hidden">Logo SciELO</span>
<h2 class="scielo__logo-scielo-caption mt-1">
<small id="collectionNameHome">{{ coll_macro.get_collection_name() }}</small>
</h2>
</a>
{%- set logo_url = img_macro.get_home_logo(g.collection, session.lang)|default('')|trim -%}
{%- if logo_url -%}
{{ img_macro.render_logo(logo_url, coll_macro.get_collection_name()) }}
{%- else -%}
<a href="/">
<h2 class="scielo__logo-scielo-caption mt-1">
<small id="collectionNameHome">{{ coll_macro.get_collection_name() }}</small>
</h2>
</a>
{%- endif -%}
</div>
</div>

Expand Down
8 changes: 7 additions & 1 deletion opac/webapp/templates/collection/includes/nav.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{% import 'macros/collection.html' as coll_macro %}
{% import 'macros/images.html' as img_macro %}

<details class="scielo__accessibleMenu">
<summary>
Expand All @@ -8,7 +9,12 @@
<nav style="max-height: 780px;">
<ul>
<li class="logo">
<div class="scielo__logo-scielo--small"></div>
{%- set menu_logo_url = img_macro.get_menu_logo(g.collection, session.lang)|default('')|trim -%}
{%- if menu_logo_url -%}
{{ img_macro.render_logo(menu_logo_url, coll_macro.get_collection_name(), img_class='img-fluid') }}
{%- else -%}
<a href="/" aria-label="{% trans %}Página inicial da coleção{% endtrans %} {{ coll_macro.get_collection_name() }}"><div class="scielo__logo-scielo--small" aria-hidden="true"></div></a>
{%- endif -%}
</li>
<li>
<a href="{{ url_for('.index') }}" alt="{% trans %}Acessar site coleção{% endtrans %} {{ coll_macro.get_collection_name() }}" aria-label="{% trans %}Acessar site coleção{% endtrans %} {{ coll_macro.get_collection_name() }}">
Copy link

Copilot AI Mar 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

O atributo alt não é válido em <a> (apenas em <img>/<area>/<input type=\"image\">). Aqui ele é redundante com o aria-label e gera HTML inválido; remova o alt e mantenha apenas aria-label (ou deixe o texto do link nomear o elemento quando aplicável).

Suggested change
<a href="{{ url_for('.index') }}" alt="{% trans %}Acessar site coleção{% endtrans %} {{ coll_macro.get_collection_name() }}" aria-label="{% trans %}Acessar site coleção{% endtrans %} {{ coll_macro.get_collection_name() }}">
<a href="{{ url_for('.index') }}" aria-label="{% trans %}Acessar site coleção{% endtrans %} {{ coll_macro.get_collection_name() }}">

Copilot uses AI. Check for mistakes.
Expand Down
13 changes: 10 additions & 3 deletions opac/webapp/templates/includes/footer.html
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
{% import 'macros/images.html' as img_macro %}
{% import 'macros/collection.html' as coll_macro %}
<style>
.scielo__logo-partner{
max-height: 50px;
Expand All @@ -19,10 +21,15 @@
<div class="container">
<div class="row">
<div class="col col-12 col-sm-2 text-center">
<div class="scielo__logo-scielo--small" alt="Logo SciELO"></div>
</div>
{%- set footer_logo_url = img_macro.get_footer_logo(g.collection)|default('')|trim -%}
{%- if footer_logo_url -%}
{{ img_macro.render_logo(footer_logo_url, coll_macro.get_collection_name()) }}
{%- else -%}
<a href="/" aria-label="{% trans %}Página inicial da coleção{% endtrans %} {{ coll_macro.get_collection_name() }}"><div class="scielo__logo-scielo--small" aria-hidden="true"></div></a>
{%- endif -%}
</div>
<div class="col col-12 col-sm-8 text-center text-sm-start">
<p><small><strong> SciELO - Scientific Electronic Library Online</strong></small></p>
<p><small><strong>{{ coll_macro.get_collection_name() }}</strong></small></p>
<p><small>{{ g.collection.address1 or '' }}<br/>
{{ g.collection.address2 or '' }}</small></p>
<div>
Expand Down
9 changes: 7 additions & 2 deletions opac/webapp/templates/journal/includes/header.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,16 @@
{% include "collection/includes/nav.html" %}
</div>
<div class="col col-md-3">
<a href="/" title="{% trans %}Ir para a homepage da coleção: {% endtrans %}{{ coll_macro.get_collection_name() }}">
{%- set header_logo_url = cimages.get_header_logo(g.collection, session.lang)|default('')|trim -%}
Copy link

Copilot AI Mar 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

default('') (sem o segundo parâmetro) só substitui valores undefined, não cobre None. Se get_header_logo(...) retornar None, o filtro trim tende a produzir a string 'None', tornando a condição verdadeira e podendo renderizar <img src=\"None\">. Use default('', true) antes do trim (ex.: |default('', true)|trim). O mesmo padrão aparece nos outros templates alterados neste PR (ex.: collection/includes/header.html, article/includes/header.html, collection/includes/nav.html, article/includes/alternative_header.html).

Suggested change
{%- set header_logo_url = cimages.get_header_logo(g.collection, session.lang)|default('')|trim -%}
{%- set header_logo_url = cimages.get_header_logo(g.collection, session.lang)|default('', true)|trim -%}

Copilot uses AI. Check for mistakes.
{%- if header_logo_url -%}
{{ cimages.render_logo(header_logo_url, coll_macro.get_collection_name(), img_class='img-fluid scielo__logo-img my-1 ms-5') }}
{%- else -%}
<a href="/" title="{% trans %}Ir para a homepage da coleção: {% endtrans %}{{ coll_macro.get_collection_name() }}">
<div class="scielo__logo-scielo-collection my-1 ms-5">
<small id="collectionNameInternal">{{ coll_macro.get_collection_name() }}</small>
</div>
</a>
</a>
{%- endif -%}
</div>
<div class="d-none d-md-block d-lg-none col col-md-5 d-print-none">
<div class="dropdown mt-3">
Expand Down
12 changes: 12 additions & 0 deletions opac/webapp/templates/macros/images.html
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,18 @@
{%- endif -%}
{%- endmacro %}


{% macro get_footer_logo(collection) -%}
{{ collection.logo_footer|default("", true) }}
{%- endmacro %}


{% macro render_logo(logo_url, collection_name, href='/', img_class='img-fluid scielo__logo-img') -%}
{%- if logo_url -%}
<a href="{{ href }}"><img src="{{ logo_url }}" alt="{% trans %}Página inicial da coleção{% endtrans %} {{ collection_name }}" class="{{ img_class }}"></a>
{%- endif -%}
{%- endmacro %}

{% macro proxy_ssm_resource_url(ssm_url) -%}
{%- if ssm_url.startswith('http') and config['SSM_MEDIA_PATH'] in ssm_url -%}
{{ config['SSM_MEDIA_PATH'] }}{{ ssm_url.split(config['SSM_MEDIA_PATH'])[1] }}
Expand Down
1 change: 1 addition & 0 deletions src/opac-schema
Submodule opac-schema added at 2bb30e
1 change: 1 addition & 0 deletions src/packtools
Submodule packtools added at e3d364
1 change: 1 addition & 0 deletions src/scieloh5m5
Submodule scieloh5m5 added at ad942d