85 lines
2.7 KiB
Ruby
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
|