require 'test/unit' require File.expand_path(File.join(File.dirname(__FILE__), '../../../../config/environment.rb')) require File.dirname(__FILE__) + '/lone_master' require File.dirname(__FILE__) + '/paired_master' require File.dirname(__FILE__) + '/paired_master_history' require File.dirname(__FILE__) + '/ignorant_master' require File.dirname(__FILE__) + '/ignorant_master_history' LoneMaster.connection.instance_eval do SEQUENCE_COLUMNS = [ ActiveRecord::ConnectionAdapters::Column.new('value', nil, translate_field_type('INTEGER'), false) ] MASTER_COLUMNS = [ ActiveRecord::ConnectionAdapters::Column.new('id', nil, translate_field_type('INTEGER'), false), ActiveRecord::ConnectionAdapters::Column.new('created_at', nil, translate_field_type('TIMESTAMP'), false), ActiveRecord::ConnectionAdapters::Column.new('updated_at', nil, translate_field_type('TIMESTAMP'), false), ActiveRecord::ConnectionAdapters::Column.new('a', nil, translate_field_type('VARCHAR(1)'), false), ActiveRecord::ConnectionAdapters::Column.new('b', nil, translate_field_type('BOOLEAN'), false), ActiveRecord::ConnectionAdapters::Column.new('c', nil, translate_field_type('INTEGER'), false), ActiveRecord::ConnectionAdapters::Column.new('d', nil, translate_field_type('FLOAT'), false), ] HISTORY_COLUMNS = [ ActiveRecord::ConnectionAdapters::Column.new('id', nil, translate_field_type('INTEGER'), false), ActiveRecord::ConnectionAdapters::Column.new('paired_master_id', nil, translate_field_type('INTEGER'), false), ActiveRecord::ConnectionAdapters::Column.new('created_at', nil, translate_field_type('TIMESTAMP'), false), ActiveRecord::ConnectionAdapters::Column.new('valid_from', nil, translate_field_type('TIMESTAMP'), false), ActiveRecord::ConnectionAdapters::Column.new('a', nil, translate_field_type('VARCHAR(1)'), false), ActiveRecord::ConnectionAdapters::Column.new('b', nil, translate_field_type('BOOLEAN'), false), ActiveRecord::ConnectionAdapters::Column.new('c', nil, translate_field_type('INTEGER'), false), ActiveRecord::ConnectionAdapters::Column.new('d', nil, translate_field_type('FLOAT'), false), ] TABLES = { 'lone_masters' => {:columns => MASTER_COLUMNS}, 'paired_masters' => {:columns => MASTER_COLUMNS}, 'paired_master_histories' => {:columns => HISTORY_COLUMNS}, } def statements @statements end def inserts @statements.select {|s| s =~ /^INSERT INTO /} end def updates @statements.select {|s| s =~ /^UPDATE /} end def reset @statements = [] @stored_rows = {} end def execute(sql, name = nil) @statements << sql case sql when /BEGIN|COMMIT|ROLLBACK/ return when /^SELECT currval/ return MockResult.new(SEQUENCE_COLUMNS, [['1']]) when /^INSERT INTO (.*) \((.*)\) VALUES\s*\((.*)\)$/ table_name, fields, values = $1, $2, $3 fields = fields.gsub('"', '').split(', ') values = values.split(', ').map {|v| v == 'NULL' ? nil : v} @stored_rows[table_name] ||= [] id = @stored_rows[table_name].size + 1 @stored_rows[table_name][id] = {} fields.each_with_index do |field_name, i| @stored_rows[table_name][id][fields[i]] = values[i] end return when /^SELECT (.*) FROM (.*) WHERE \(.*\."id" = (\d*)\)/ fields, table_name, id = $1, $2, $3.to_i raise "Oooops" unless fields == '*' raise "Invalid ID" unless id >= 1 columns = (table_name =~ /_history/ ? HISTORY_COLUMNS : MASTER_COLUMNS) row = [id] + columns[1..-1].map {|c| @stored_rows[table_name][id][c.name] } return MockResult.new(columns, [row]) when /UPDATE (.*) SET (.*) WHERE "id" = (\d+)/ table_name, change_str, id = $1, $2, $3.to_i raise "Invalid ID" unless id >= 1 changes_array = change_str.split(', ') changes = {} changes_array.each {|c| c =~ /"(.*)" = (.*)/ ; changes[$1] = $2 } @stored_rows[table_name][id].update(changes) return MockResult.new([], [1]) end raise "Unknown SQL: '#{sql}'" end def columns(table_name, name = nil) raise "Unknown table '#{table_name}'" unless TABLES[table_name] TABLES[table_name][:columns] end end class MockResult attr_reader :fields def initialize(columns, rows) @fields = columns.map {|c| c.name} @types = columns.map {|c| c.type} @rows = rows end def type(i) @types[i] end def result @rows end def cmdtuples @rows.size end def clear @fields = nil @types = nil @rows = nil end end class Test::Unit::TestCase def statements connection.statements end def inserts connection.inserts end def updates connection.updates end def reset_connection connection.reset end private def connection ActiveRecord::Base.connection end end