Files
Reem-Notas/spec/support/tabela_operacao.rb

85 lines
2.7 KiB
Ruby

# Harness de uma tabela de operação (gade_entregas_*) para os specs.
#
# A tabela é EXTERNA: não tem migration (o cliente a carrega no banco) e não tem
# factory. Sem este harness, testar o enriquecimento do romaneio só daria para
# mockar o método sob teste — o que não pega regressão de SQL, que é onde moram os
# bugs de coluna ausente e de alias (`status` da gade x `status` do espelho).
#
# Guardas copiadas de spec/support/espelho_rastreio.rb, pelo mesmo motivo: se a
# tabela já existir COM DADOS, estamos apontados para dados de verdade e o spec tem
# que abortar em vez de destruí-los.
#
# Uso:
#
# RSpec.describe Romaneios::EnriquecimentoGade do
# include_context 'tabela de operação'
#
# it '...' do
# criar_operacao!('gade_entregas_teste_jan_2026', colunas: %i[nome_completo telefones status])
# semear_operacao!('gade_entregas_teste_jan_2026', [{ nota_fiscal: '1', status: 'NOVO' }])
# end
# end
module TabelaOperacao
COLUNAS_PADRAO = %i[nome_completo telefones status].freeze
class << self
def criar!(nome, colunas: COLUNAS_PADRAO)
raise "Tabela de operação de teste exige RAILS_ENV=test (está em #{Rails.env})" unless Rails.env.test?
if conexao.table_exists?(nome)
linhas = conexao.select_value("SELECT COUNT(*) FROM #{conexao.quote_table_name(nome)}").to_i
if linhas.positive?
raise "#{nome} já existe no banco de teste com #{linhas} linha(s) — o spec NÃO vai " \
'derrubá-la. Aponte RAILS_ENV=test para um banco descartável.'
end
conexao.drop_table(nome)
end
conexao.create_table(nome, id: false) do |t|
t.string :nota_fiscal
colunas.each { |c| t.string c }
end
criadas << nome
nome
end
def semear!(nome, linhas)
colunas = conexao.columns(nome).map(&:name)
linhas.each do |linha|
dados = linha.transform_keys(&:to_s).slice(*colunas)
conexao.execute(
"INSERT INTO #{conexao.quote_table_name(nome)} (#{dados.keys.join(', ')}) " \
"VALUES (#{dados.values.map { |v| conexao.quote(v) }.join(', ')})"
)
end
end
def derrubar_todas!
criadas.each { |nome| conexao.drop_table(nome, if_exists: true) }
criadas.clear
end
def criadas
@criadas ||= []
end
private
def conexao
ActiveRecord::Base.connection
end
end
end
RSpec.shared_context 'tabela de operação' do
after { TabelaOperacao.derrubar_todas! }
def criar_operacao!(nome, colunas: TabelaOperacao::COLUNAS_PADRAO)
TabelaOperacao.criar!(nome, colunas: colunas)
end
def semear_operacao!(nome, linhas)
TabelaOperacao.semear!(nome, linhas)
end
end