Skip to content

Fix media/inline-media validation tests, add missing mime-subtypes, fix validation_type typo#1131

Draft
Copilot wants to merge 2 commits intomasterfrom
copilot/create-validations-media-elements
Draft

Fix media/inline-media validation tests, add missing mime-subtypes, fix validation_type typo#1131
Copilot wants to merge 2 commits intomasterfrom
copilot/create-validations-media-elements

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Mar 13, 2026

O que esse PR faz?

Corrige testes quebrados para validação de <media> e <inline-media>, adiciona mime-subtypes faltantes (docx, pptx) e corrige um typo no código de validação.

Bugs corrigidos nos testes:

  • MediaValidation(node, data, params)MediaValidation(data, params) — construtor aceita 2 args, não 3
  • xml_media.data()xml_media.datadata é @property, não método
  • validate_mime_type() / validate_mime_subtype()validate_mime_type_and_subtype() — métodos inexistentes substituídos pelo método real
  • Estrutura XML dos testes de modelo precisava de elementos body/sec para o XPath *[name()!='supplementary-material']/media funcionar

Correções no código de produção:

  • "value in lis""value in list" em media.py
  • Adicionados docx e pptx em valid_extension e mime_types_and_subtypes no visual_resource_base_rules.json (SPS 1.10)

Onde a revisão poderia começar?

tests/sps/validation/test_media.py — reescrito para usar a API correta do VisualResourceBaseValidation.

Como este poderia ser testado manualmente?

python -m pytest tests/sps/validation/test_media.py tests/sps/models/test_media.py tests/sps/validation/test_visual_resource_base.py -v

Todos os 23 testes devem passar.

Algum cenário de contexto que queira dar?

Os testes foram escritos contra uma API que não correspondia à implementação real. O VisualResourceBaseValidation.__init__ aceita (data, params), mas os testes passavam (node, data, params). Métodos como validate_mime_type() nunca existiram — o método real é validate_mime_type_and_subtype(). O modelo XmlVisualResource.data é uma @property geradora, não um método chamável.

Screenshots

N/A

Quais são tickets relevantes?

Referências

  • tests/sps/validation/test_visual_resource_base.py — padrão de teste de referência para validadores de recursos visuais
  • packtools/sps/validation/visual_resource_base.py — classe base que define a API real
Original prompt

This section details on the original issue you should resolve

<issue_title>Criar validações para os elementos e </issue_title>
<issue_description>## Objetivo

Implementar validações para os elementos <media> e <inline-media> conforme a especificação SPS 1.10, aumentando a conformidade de X% para 70% (7 de 10 regras).

Nota: Algumas validações para <media> e <inline-media> podem já estar parcialmente implementadas no repositório. Este Issue visa reavaliar, complementar e garantir cobertura completa das regras SPS 1.10.


Contexto

Os elementos <media> e <inline-media> referenciam arquivos externos de objetos multimídia (vídeos, áudios, documentos, planilhas, etc.), exceto figuras estáticas. Validações corretas garantem que atributos obrigatórios estejam presentes, que combinações de mime-type/mime-subtype sejam válidas, e que boas práticas de acessibilidade sejam seguidas.

Conformidade atual: X de 10 regras implementadas (X%)
Meta após implementação: 7 de 10 regras (70%)


Documentação SPS

Referência oficial: https://docs.google.com/document/d/1GTv4Inc2LS_AXY-ToHT3HmO66UT0VAHWJNOIqzBNSgA/edit?tab=t.0#heading=h.media

Regras principais conforme SPS 1.10:

  1. Atributos obrigatórios (ambos elementos):

    • @id (obrigatório)
    • @mime-type (obrigatório)
    • @mime-subtype (obrigatório)
    • @xlink:href (obrigatório)
  2. Valores comuns para @mime-type:

    • application - Planilhas Excel, documentos Word, apresentações PowerPoint, PDFs, arquivos compactados
    • video - Vídeos
    • audio - Áudios
  3. Extensões obrigatórias para @mime-subtype:

    • Vídeo: mp4
    • Áudio: mp3
    • Arquivos compactados: zip
    • Outros formatos: consultar IANA Media Types
  4. Formato do @xlink:href:

    • Nome completo do arquivo (nome + extensão)
    • Arquivo deve estar no pacote do documento
  5. Consistência mime-type e mime-subtype:

    • video + mp4
    • audio + mp3
    • application + zip, pdf, xlsx, docx, pptx, etc.
  6. Acessibilidade (recomendado):

    • Vídeos e áudios devem ter <alt-text> e/ou <long-desc>
    • Transcrição do conteúdo em <sec sec-type="transcript">
    • Referência cruzada para transcrição usando <xref ref-type="sec">
  7. Restrições de uso:

    • Não usar <media> ou <inline-media> para figuras e imagens estáticas (usar <graphic> e <inline-graphic>)

Regras a Implementar

P0 – Críticas (implementar obrigatoriamente)

# Regra Nível Descrição
1 Validar presença de @id CRITICAL O atributo @id é obrigatório em <media> e <inline-media>
2 Validar presença de @mime-type CRITICAL O atributo @mime-type é obrigatório em <media> e <inline-media>
3 Validar presença de @mime-subtype CRITICAL O atributo @mime-subtype é obrigatório em <media> e <inline-media>
4 Validar presença de @xlink:href CRITICAL O atributo @xlink:href é obrigatório em <media> e <inline-media>
5 Validar consistência mime-type e mime-subtype ERROR Combinação de @mime-type e @mime-subtype deve ser válida (ex: video/mp4, audio/mp3, application/pdf)
6 Validar extensões obrigatórias ERROR Para vídeo: mp4; para áudio: mp3; para compactado: zip

P1 – Importantes (implementar se possível)

# Regra Nível Descrição
7 Validar presença de acessibilidade para vídeo/áudio WARNING Vídeos e áudios devem ter <alt-text> ou <long-desc> como elementos filhos
8 Recomendar transcrição para vídeo/áudio INFO Vídeos e áudios devem ter referência para <sec sec-type="transcript">

P2 – Futuras (fora do escopo deste Issue)

# Regra Motivo de exclusão
9 Validar que arquivo existe no pacote Alta complexidade - requer acesso ao sistema de arquivos
10 Validar contra lista completa IANA Media Types Média complexidade - requer manutenção de lista externa grande

Arquivos a Criar/Modificar

Avaliar existentes (podem ter validações parciais):

  • packtools/sps/models/media.py ou similar – Verificar se modelo existe
  • packtools/sps/validation/media.py – Verificar validações existentes
  • packtools/sps/validation/rules/media_rules.json ou similar – Verificar configuração

Criar (se não existirem):

  • packtools/sps/models/media.py – Modelo de extração de dados
  • packtools/sps/validation/media.py – Validações
  • packtools/sps/validation/rules/media_rules.json – Configuração de níveis de erro
  • tests/sps/validation/test_media.py – Testes unitários

Referenciar (implementações similares):

  • packtools/sps/validation/graphic.py – Validação de atributos obrigatórios similar
  • packtools/sps/validation/utils.py – Funções auxiliares (build_response)

Exemplos de XML

XML Válido (deve passa...


📱 Kick off Copilot coding agent tasks wherever you are with GitHub Mobile, available on iOS and Android.

…x validation_type typo

Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
Copilot AI changed the title [WIP] Implement validations for media and inline-media elements Fix media/inline-media validation tests, add missing mime-subtypes, fix validation_type typo Mar 13, 2026
Copilot AI requested a review from robertatakenaka March 13, 2026 14:30
Copy link
Copy Markdown
Collaborator

@Rossi-Luciano Rossi-Luciano left a comment

Choose a reason for hiding this comment

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

Bug: duplicação de validações de acessibilidade e @xlink:href ausente não detectado em <media>

Identificados via análise cruzada de media.py × XML artificial de testes × relatório CSV gerado pelo pipeline de validação do upload3/scms-upload.


Problema 1 — False negative: @xlink:href ausente não gera erro

Um elemento <media> com @mimetype, @mime-subtype e @id presentes, mas sem @xlink:href, não produz nenhuma entrada no relatório de erros para a validação de xlink_href. O erro é silenciosamente engolido.

Causa: VisualResourceBaseValidation.validate_xlink_href(), herdado por MediaValidation via super().validate(), chama os.path.splitext(xlink_href) sem verificar se xlink_href é None. Quando o atributo está ausente, xlink_href=None causa TypeError que interrompe o yield sem registrar o erro. Padrão idêntico ao bug já corrigido em graphic.py.

Correção: adicionar override de validate_xlink_href em MediaValidation com guarda explícita para None antes de qualquer operação que assuma string — seguindo o mesmo padrão aplicado em graphic.py. Alternativamente, corrigir diretamente em VisualResourceBaseValidation para beneficiar todos os módulos que herdam dela.

Exemplo mínimo que reproduz o bug:

<media id="m01" mimetype="video" mime-subtype="mp4"/>

Resultado esperado no relatório: entrada CRITICAL para @xlink:href ausente.
Resultado obtido: nenhuma entrada gerada para esse atributo.


Problema 2 — False positive: validações de acessibilidade duplicadas

Para cada <media> de vídeo ou áudio, as validações de alt-text, xref to transcript e transcript aparecem duas vezes no relatório de erros — uma com subject="accessibility" e outra com subject="media":

WARNING | accessibility | Missing <alt-text>...
WARNING | media         | Missing <alt-text>...                          ← duplicata
WARNING | accessibility | <media> with video is missing <xref>...
WARNING | media         | <media> with video is missing <xref>...        ← duplicata
WARNING | accessibility | The transcript is missing...
WARNING | media         | The transcript is missing...                   ← duplicata

Causa provável: o orquestrador (xml_validations.py) chama tanto o módulo de acessibilidade quanto MediaValidation.validate(), que por sua vez chama super().validate() — o qual já inclui as mesmas checagens de acessibilidade herdadas de VisualResourceBaseValidation. Padrão de duplicação idêntico ao identificado anteriormente em fn.py/basefn.py.

Correção: verificar em xml_validations.py se validate_media() e o módulo de acessibilidade estão sendo chamados separadamente para os mesmos elementos. Se sim, remover as checagens de acessibilidade do super().validate() em MediaValidation, ou suprimir a chamada duplicada no orquestrador.

Exemplo mínimo que reproduz a duplicação:

<media id="m01" mimetype="video" mime-subtype="mp4" xlink:href="video01.mp4"/>

Resultado esperado: uma entrada WARNING para alt-text, uma para xref to transcript, uma para transcript.
Resultado obtido: cada uma dessas entradas aparece duas vezes, com subject diferente.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Criar validações para os elementos <media> e <inline-media>

3 participants