Skip to content

Cobertura de testes

Acreditamos que testes são essenciais para manter a qualidade do projeto. A cobertura atual já cobre boa parte do motor e do editor visual, e está sendo expandida a cada release.

Números gerais

MétricaValor
Testes unitários (sulfite_core)953
Testes unitários (sulfite_studio)896
Testes unitários (sulfite_chat)85
Testes unitários (sulfite_datasources)30
Testes integração/e2e (macOS)92
Total2056
Cobertura sulfite_core~84%
Cobertura sulfite_studio~73%

Por pacote

sulfite_core — 953 testes

ÁreaO que cobre
ExpressionEvaluatorAritmética +−×÷^, funções math (sqrt, abs, sin), 6 modos de arredondamento (half_up, half_even, up, down, truncate, half_down), divisão por zero, expressões inválidas
ValueFormattercurrency:BRL/USD, date:dd/MM/yyyy, datetime, number:N, integer, null/empty
ImageCacheCache hit/miss, LRU eviction, base64 decode
SulfiteEngineImplAPI pública render(), pipeline completo (parse → process → render)
PdfRendererTodos os tipos de elemento, multi-banda, Header/Detail/Summary/Footer
FontLoaderCarregamento de fontes customizadas, cache, fallback
DataProcessorSeparação de rows por band, múltiplos dataSources, __bandId
ParserParsing de ReportDefinition do JSON, campos opcionais
ChartRendererBar/Line/Pie em PDF, multi-series, ChartOptions, série vazia
ChartElement (model)Parse JSON bar/line/pie, serialização, ChartSeries, ChartOptions
HtmlRenderer (aggregates mode)HtmlAggregatesSectionMode (always, fallback, never) para evitar duplicação de seção de agregados no HTML
invoice_chart_reportDataProcessor + PdfRenderer com 4 dataSources e 3 gráficos
Multiformat ExportHTML, CSV (delimitador, header), Excel (.xlsx válido)
Models SerializationfromJson/toJson de todos os tipos de ReportElement, incluindo SpacerElement
IO (real / stub)dart:io — salvar/ler arquivo; stubs para web/mobile
rendering_integrationFieldElement binding, AggregateElement (SUM/COUNT/AVG/MIN/MAX), relatório completo
ScriptEnginefilter/sort/limit/distinct/addField, AND/OR/NOT, parâmetros injetados, printWhen
DataProcessorProcessamento via Stream, GroupBands; transforms replaced by scripts (RFC-016)
GroupBandsgroupHeader/groupFooter, agregação por grupo, renderização intercalada
ReportParameterSerialização JSON, campos opcionais (lookup, dependsOn, validation)
LookupConfigRound-trip JSON para variante http e db, discriminador "source", fallback backward-compat, LookupOption, ValidationRule, todos os ValidationRuleTypes, campos pageSize/searchOnOpen
HttpLookupResolverPlaceholders URL, cache, SSRF (reject + bypass), localhost, 127.0.0.1, https, non-2xx, paginação com fetchPage, leitura de meta.total/page/perPage, heurística items.length >= pageSize
RestDataSourceResolverHTTP GET/POST, expansão de {paramId}, modos strict/resilient
Rect/RoundedRect unificationborderRadius, migração automática de roundedRect
Print Filters (param injection)Injeção de parâmetros no ScriptEngine e URLs REST
Example Reports (e2e)3 exemplos reais (06-grouped-sales, 07-dashboard, 08-hr-report) — 67 testes profundos: parse, geração de arquivos físicos PDF/HTML/CSV/Excel em test_output/, validação de conteúdo (nomes, produtos, valores formatados), estrutura HTML (DOCTYPE, Chart.js, CSS classes), cross-format data consistency, backward compat com 01-invoice

Guardas de performance automatizadas

O teste test/stress/nfe_benchmark_test.dart agora inclui budgets de tempo para detectar regressões:

VolumeProcessHTMLPDF
5.000 itens<= 1200ms<= 3000ms<= 15000ms
10.000 itens<= 1800ms<= 5000ms<= 30000ms
20.000 itens<= 3000ms<= 9000ms<= 60000ms

Para execução diagnóstica (sem falhar por budget), use:

bash
SULFITE_SKIP_PERF_GUARD=1 flutter test test/stress/nfe_benchmark_test.dart

sulfite_datasources — 30 testes

ÁreaO que cobre
DbLookupResolverQuery parametrizada com placeholders {_search} / {_page} / {_page_size} / {_offset}, substituição de {_schema}, cache por chave composta, fetchPage com hasMore, UnresolvedConnectionException para connectionRef inválido
RestDataSourceResolverHTTP GET/POST, expansão de {paramId}, modos strict/resilient
PostgresDataSourceResolverConexão, query parametrizada, mapeamento de tipos, erro de conexão

sulfite_studio — 896 testes

ÁreaO que cobre
DesignerViewModeladdElement, removeElement, updateElement, seleção, multi-select, loadReport
UndoRedoManagerpush, undo, redo, pilha vazia, limite de histórico
JSON ↔ Canvas syncEditar JSON reflete no canvas; mover elemento atualiza o JSON editor
ChartEditorDialogTrocar ChartType, add/remove série, drag-reorder, preview em tempo real
ChartUI (ViewModel)Add/remove/reorder series via ViewModel, tipo muda opções disponíveis
PreferencesServiceget/set themeMode, primaryColor, locale, reset para defaults
PreferencesProviderNotificações Riverpod ao mudar prefs, propagação pelo widget tree
SulfiteThemebuildTheme com cor customizada, modo claro/escuro, 8 presets animados
ThemeEditorSegmented button idioma, color swatches, botão Personalizado → picker
SettingsScreen3 abas (Geral, Tema, Avançado), troca idioma, aplica tema
ReportValidatorIDs duplicados, bands sem elementos, dataSources sem referências
BandManagerDialogReorder bands, remover band, integração com undo
AddBandDialog / AddAggregateDialogFormulários de criação, validação de campos
ValidationDialogExibição de erros e warnings com severidade
CanvasInteractionClick para selecionar, drag para mover, Ctrl+Click multi-select, Escape deselect
CanvasRendererPaint, zoom, grid
Ruler / SnapLinesMarcações de régua, guias magnéticas
PropertyField / EditorsColorPickerField, FormatPickerField, RoundingConfigEditor
PageSettingsPanelFormato de página, margens
Toolbar / SpeedDialBotões, estado selecionado, ações
chart_integrationPipeline completo Studio: add element → edita → preview → serializa
TransformPipelineEditorAdicionar/remover/reordenar operações, preview com debounce, IDs únicos
PrintParamsDialogDelegação para SulfiteFilterScreen
SulfiteFilterScreentext/number/date/select, required validation, lookup loading/loaded, confirm/cancel, novos tipos currency/datetime, campo format
FilterFields (date/currency)Campos date com formatos dd/MM/yyyy, yyyy-MM-dd, MM/dd/yyyy; campo currency com máscaras BRL e US; rounding no blur; campo datetime
LookupListBodyEstado de loading, erro, lista vazia, hasMore (scroll infinito), awaitingInput, seleção de item
SingleSelectLookupDialogCarregamento inicial, busca com debounce, loading state, erro com retry, seleção confirma, cancelamento, cascata de parâmetros
MultiselectLookupDialogSeleção múltipla, paginação com fetchPage, busca incremental, hasMore, confirmação/cancelamento, estado de loading por página
DatasourceInspectorDialogRenderização dos campos, edição de nome/tipo/source, validação inline
BandManagerDialog (integração)Reorder completo, undo, groupHeader/groupFooter com groupBy
ParameterEditorAdicionar/remover parâmetros, edição inline
DartEvalScriptRunner (preview)runForPreview: captura de mutations via print(), múltiplas chamadas setDatasource, script Pokémon Duel completo (fighters/duel_stats/verdict_ds)
DesignerViewModel (preview mutations)Pipeline ponta a ponta: resolver → dart_eval fallback → apply mutations → processedData com rows preenchidos
SulfiteConsumerScreen (dart_eval)Contrato runForPreview → mutations → payload.addAll quando nenhum handler nativo está registrado
RFC-022/023 (ScriptTokenContext)ScriptTokenContext, ReportIdRegistry, DartScriptValidator, datasource inspector

sulfite_chat — 85 testes

ArquivoO que cobre
chat_config_test.dartConstrução/defaults, getter color, getter icon (8 iconNames + fallback), copyWith (7 casos), availableModels (5 providers)
schema_validator_test.dartJSON válido, JSON mal-formado, campos obrigatórios (reportId, reportName, pageSettings, bands), validação por tipo de elemento (text, field, image, aggregate, line, rect, circle, chart, richText), referências de dataSource, múltiplos erros
report_generator_test.dartExtração de JSON de bloco ```json , bloco genérico e JSON bruto; tag <explanation>; auto-correção em 2ª tentativa; falha após maxAttempts; detecção de erros de provedor (rate limit, quota, no authentication); GenerationResult` (success/failure/attempts)

Integração / E2E (macOS) — 52 testes

Executados via all_studio_tests.dart no app host (example/) com flutter test integration_test/ -d macos.

ArquivoTestesO que cobre
validation_flow_test.dart7Validação de relatório, erros/warnings, severidade
end_to_end_test.dart4Pipeline completo: criar → editar → serializar → renderizar
designer_workflow_test.dart8Fluxo do designer: add/move/resize elementos, undo/redo
multi_selection_test.dart9Ctrl+Click, seleção múltipla, operações em lote
rfc_features_test.dart13RFCs 011-015: filtros, lookups, cascata, params REST
filter_flow_test.dart6RFC-015: field types, lookup loading, cascade, validação, cross-field, integração Studio
json_editor_perf_test.dart5Performance do JSON editor: fold/unfold, highlight, edição grande
rfc_022_023_test.dart~40RFC-022/023: script console, datasource inspector, validação de código Dart

Executando os testes

bash
# sulfite_core
cd packages/sulfite_core
flutter test test/

# sulfite_studio
cd packages/sulfite_studio
flutter test test/

# sulfite_chat
cd packages/sulfite_chat
flutter test test/

# Integração / E2E (requer macOS)
cd example
flutter test integration_test/all_studio_tests.dart -d macos

# Todos os e2e do example (inclui testes avulsos)
cd example
flutter test integration_test/ -d macos

Sulfite do 🇧🇷 para o mundo © 2026 Rafael S. Pinheiro