Triagem por criticidade da duplicação de artigos após falha do Core + testes automatizados de conectividade#951
Draft
Copilot wants to merge 2 commits into
Draft
Conversation
Copilot
AI
changed the title
[WIP] Fix duplicated articles with different PIDs in migration process
Triagem por criticidade da duplicação de artigos após falha do Core
Apr 29, 2026
Member
|
@copilot crie 1 teste automatizado que trata o caso de migração que não consegue conexão com o core e outro teste automatizado que consegue a conexão com o core |
Agent-Logs-Url: https://github.com/scieloorg/scms-upload/sessions/afc9f1c2-c202-438b-bfc8-94da66182ca6 Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
Contributor
Author
Adicionei dois testes automatizados em
Quando os itens críticos #1/#2/#3 forem implementados, basta remover o |
Copilot
AI
changed the title
Triagem por criticidade da duplicação de artigos após falha do Core
Triagem por criticidade da duplicação de artigos após falha do Core + testes automatizados de conectividade
Apr 30, 2026
This file contains hidden or 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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
O que esse PR faz?
Conforme solicitado nos comentários da issue, este PR entrega:
pid_provider/test_requester.py) que cobrem os cenários de conectividade com o Core durante a migração, conforme solicitado no review.Resumo dos achados, ordenados por criticidade:
🔴 Crítico — causa raiz
pid_provider/requester.py:102-119— emrequest_pid_for_xml_with_pre, oerror_typeretornado porremote_registrationfica apenas emremote_responsee nunca é copiado pararegistered. A guardaif registered.get("error_type")não dispara, e o fluxo segue paralocal_registration, que gera um PID v3 local viaPidProviderXML.register. Esse PID nunca é conhecido pelo Core e dá origem a toda divergência futura.proc/models.py:2094-2146(ArticleProc.generate_sps_package) — no reprocessamento (statusREPROCporregistered_in_core=False), oxml_with_preé reconstruído a partir deprocessed_xmlsem injetarself.sps_pkg.pid_v3. O Core então emite novo PID v3 eSPSPkg._get_or_createcria um SPSPkg paralelo ao antigo.🟠 Alto — reconciliação sem reexecutar migração (atende explicitamente a instrução do agente)
journal_profile#3package/models.py:422-437, 549-597—SPSPkg._get_or_createcria novo registro quando o Core devolve PID v3 diferente do já vinculado ao mesmoArticleProc. Deveria atualizar o SPSPkg/Article existente para o novo PID v3 e remover o antigo na hora, em vez de depender da próxima execução detask_exclude_article_repetition_by_issue(hoje disparada apenas no início detask_migrate_and_publish_articles_by_issue,proc/tasks.py:1054).🟡 Médio — robustez
journal_profile#4 Migração não deveria publicar no OPAC quando Core falhou; oArticleProcdeveria ficar em estado bloqueado/aguardando Core. Hoje a publicação no QA ocorre silenciosamente (conforme relatado no issue).OfficialJournal#5update_sps_pkg_statusnão distingue "Core down" de outros motivos deregistered_in_core=False.🔵 Baixo — defesa em profundidade
journalspara ingresar títulos no oficiales de las revistas #6_get_or_createpoderia consultar a relação reversaarticle_proc.sps_pkgantes de criar duplicado.researcher#7 Constraint única empid_v3(migração0008) não pega esta duplicação porque os PIDs v3 são distintos; considerar restrição adicional porpid_v2 + issuepara artigos migrados.🟢 Muito baixo — observabilidade
Plano sugerido: implementar #1 + #2 + #3 resolve completamente o defeito do issue e o pedido do agente. Demais itens são melhorias incrementais.
Testes adicionados (
pid_provider/test_requester.py) — seguindo o padrão dearticle/test_models.py(unittest puro +MagicMock), isolam o orquestradorrequest_pid_for_xml_with_preao mockarget_registration_demand,remote_registrationelocal_registration:test_request_pid_when_core_is_unreachable— simularemote_registrationretornando{"error_type", "error_msg"}(Core indisponível). Verifica o comportamento correto: o erro deve ser propagado elocal_registrationnão deve ser chamado, evitando a criação de PID v3 local que causa a duplicação. Marcado com@unittest.expectedFailureenquanto o bug crítico Cria as apps upload, journals e migration #1 não é corrigido — atua como documentação executável do defeito. Quando Cria as apps upload, journals e migration #1 for corrigido, basta remover o decorator e o teste passa a servir como teste de regressão.test_request_pid_when_core_is_reachable— caminho feliz:remote_registrationdevolve PID v3 do Core e atualizaregisteredin-place;local_registrationé chamado em seguida com o mesmo PID v3; o resultado final temregistered_in_core=True,registered_in_upload=Trueesynchronized=True, semerror_type.Onde a revisão poderia começar?
pid_provider/test_requester.py— único arquivo novo desta PR; valida ambos os cenários de conectividade com o Core.pid_provider/requester.py—request_pid_for_xml_with_pre(ll. 77–126),remote_registration(ll. 176–213),local_registration(ll. 215–264).proc/models.py—ArticleProc.generate_sps_package(ll. 2094–2146),update_sps_pkg_status(ll. 2162–2170).package/models.py—SPSPkg._get_or_create(ll. 422–437) e_add_pid_v3_to_zip(ll. 549–597).proc/tasks.py:1054— invocação síncrona detask_exclude_article_repetition_by_issue.Como este poderia ser testado manualmente?
Execução dos testes automatizados (no ambiente Docker do projeto, conforme
.github/workflows/ci.yml):Esperado:
test_request_pid_when_core_is_reachable— PASStest_request_pid_when_core_is_unreachable— expected failure (XFAIL) enquanto o bug Cria as apps upload, journals e migration #1 não é corrigido. Após implementar a correção do item Cria as apps upload, journals e migration #1, deve passar normalmente; basta remover@unittest.expectedFailurepara ele se tornar teste de regressão.Reprodução manual do defeito original segue os passos do issue:
Articles > Articlese no TOC do OPAC_5.Algum cenário de contexto que queira dar?
Origem do bug: o pipeline de migração foi desenhado assumindo que o Core sempre estaria disponível como autoridade de PID v3. Quando o Core falha, o fluxo cai num caminho de fallback (
local_registration) que silenciosamente gera PID v3 local; quando o Core volta, não há mecanismo para "casar" o PID local com o que o Core emitiria, então ambos coexistem como artigos distintos. A reconciliação atual depende de uma nova execução completa da migração para que a task de limpeza rode.Os testes adicionados deixam ambos os comportamentos (esperado e bugado) versionados como especificação executável, facilitando o trabalho de quem implementar as correções dos itens #1, #2 e #3.
Screenshots
Não aplicável.
Quais são tickets relevantes?
Triagem referente ao issue de duplicação após falha do Core durante migração de fascículo (Upload v2.12.0rc4 / Core v3.12.5 / OPAC_5 v5.10.22-qa).
Referências
pid_provider/requester.py—PidRequester.request_pid_for_xml_with_pre,remote_registration,local_registrationarticle/test_models.py— padrão de testes unitários com mocks utilizado como referência parapid_provider/test_requester.pyproc/article_controller.py—ClassicWebsiteArticlePidTrackerarticle/models.py—Article.exclude_inconvenient_articles,get_repeated_itemsarticle/migrations/0008_add_unique_pid_v3.pydocs/processing/guide_task_track_classic_website_article_pids_pt.md