test/test_table_searcher.rb in clevic-0.12.0 vs test/test_table_searcher.rb in clevic-0.13.0.b1
- old
+ new
@@ -1,25 +1,12 @@
+require 'generator'
+require 'logger'
+
require File.dirname(__FILE__) + '/test_helper.rb'
require 'clevic/table_searcher.rb'
-class CreateFakePassengers < ActiveRecord::Migration
- MAX_PASSENGERS = 100
- NATIONALITIES = %w{Canada USA Britain UAE}
-
- def self.up
- 1.upto( MAX_PASSENGERS ) do |i|
- Passenger.create :name => Faker::Name.name, :flight => Flight.find(:all)[i%4], :nationality => NATIONALITIES[i%4], :row => i, :seat => %w{A B C D}[i % 4]
- end
- end
-
- def self.down
- Passenger.delete_all
- end
-end
-
class MockSearchCriteria
-
def initialize( &block )
@direction = :forwards
@from_start = false
@whole_words = false
self.instance_eval( &block ) if block_given?
@@ -31,98 +18,98 @@
def from_start?; @from_start; end
end
class TestTableSearcher < Test::Unit::TestCase
def self.startup
- CreateFakePassengers.up
+ #~ Passenger.db.loggers = [Logger.new($stdout)]
+ suite.db[:passengers].delete
+ CreateFakePassengers.new( suite.db ).up
+
+ # force Passenger to re-read db_schema
+ Passenger.dataset = Passenger.dataset
end
def self.shutdown
- CreateFakePassengers.down
+ CreateFakePassengers.new( suite.db ).down
end
def setup
@simple_search_criteria = MockSearchCriteria.new
- @id_order_attribute = OrderAttribute.new( Passenger, 'id' )
-
@name_field = Clevic::Field.new( :name, Passenger, {} )
@nationality_field = Clevic::Field.new( :nationality, Passenger, {} )
- @all_passengers = Passenger.find( :all, :conditions => [ 'flight_id = ?', Flight.find(:first).id ], :order => :id )
+ @all_passengers = Passenger.filter( :flight_id => Flight.first.id ).order( :id ).all
end
context 'on initialisation' do
should "have a matching field attribute on construction" do
- ts = Clevic::TableSearcher.new( Passenger, [@id_order_attribute], @simple_search_criteria, @name_field )
+ ts = Clevic::TableSearcher.new( Passenger.dataset, @simple_search_criteria, @name_field )
assert_equal @name_field.attribute, ts.field.attribute
end
- should "throw an exception when called with no order attributes" do
- assert_raise( RuntimeError ) do
- Clevic::TableSearcher.new( Passenger, nil, @simple_search_criteria, @name_field )
- end
- end
-
- should "throw an exception when called with an empty collection of order attributes" do
- assert_raise( RuntimeError ) do
- Clevic::TableSearcher.new( Passenger, [], @simple_search_criteria, @name_field )
- end
- end
-
should "throw an exception when called with no field" do
assert_raise( RuntimeError ) do
- Clevic::TableSearcher.new( Passenger, [@id_order_attribute], @simple_search_criteria, nil )
+ Clevic::TableSearcher.new( Passenger.dataset, @simple_search_criteria, nil )
end
end
should 'throw an exception for an unknown direction' do
@simple_search_criteria.direction = :other
assert_raise( RuntimeError ) do
- table_searcher = Clevic::TableSearcher.new( Passenger, [@id_order_attribute], @simple_search_criteria, @nationality_field )
+ table_searcher = Clevic::TableSearcher.new( Passenger.dataset, @simple_search_criteria, @nationality_field )
end
end
+
+ should "raise an expection for a naked dataset" do
+ assert_raise( RuntimeError ) do
+ Clevic::TableSearcher.new( Passenger.db[:passengers], @simple_search_criteria, @nationality_field )
+ end
+ end
end
context "searching" do
setup do
@simple_search_criteria.search_text = CreateFakePassengers::NATIONALITIES[0]
@passenger_generator = Generator.new( @all_passengers )
+ @simple_search_criteria.from_start = true
end
should "have #{CreateFakePassengers::MAX_PASSENGERS} passengers" do
assert_equal CreateFakePassengers::MAX_PASSENGERS, Passenger.count
end
+ should_eventually "work with several ordering fields"
+ # Sequel::SQL::OrderedExpression:0xb50a3b14 @expression=:date, @descending=false
+
should_eventually "do more granular testing"
should "find the first record" do
- @simple_search_criteria.from_start = true
- table_searcher = Clevic::TableSearcher.new( Passenger, [@id_order_attribute], @simple_search_criteria, @nationality_field )
+ table_searcher = Clevic::TableSearcher.new( Passenger.dataset, @simple_search_criteria, @nationality_field )
+ assert_equal '>', table_searcher.send( :comparator )
assert_equal @all_passengers.first, table_searcher.search
end
should "backwards-find the last record" do
- @simple_search_criteria.from_start = true
@simple_search_criteria.direction = :backwards
- table_searcher = Clevic::TableSearcher.new( Passenger, [@id_order_attribute], @simple_search_criteria, @nationality_field )
+ table_searcher = Clevic::TableSearcher.new( Passenger.dataset, @simple_search_criteria, @nationality_field )
+ assert_equal '<', table_searcher.send( :comparator )
assert_equal @all_passengers.last, table_searcher.search
end
should "backwards-find the next-to-last record" do
# find the last record
- @simple_search_criteria.from_start = true
@simple_search_criteria.direction = :backwards
- table_searcher = Clevic::TableSearcher.new( Passenger, [@id_order_attribute], @simple_search_criteria, @nationality_field )
+ table_searcher = Clevic::TableSearcher.new( Passenger.dataset, @simple_search_criteria, @nationality_field )
last = table_searcher.search
# now find the previous record
@simple_search_criteria.from_start = false
assert_equal @all_passengers[-2], table_searcher.search( last )
end
should "find next records" do
@simple_search_criteria.from_start = false
- table_searcher = Clevic::TableSearcher.new( Passenger, [@id_order_attribute], @simple_search_criteria, @nationality_field )
+ table_searcher = Clevic::TableSearcher.new( Passenger.dataset, @simple_search_criteria, @nationality_field )
# fetch records one by one, starting from the one after the first one, and compare them
while next_entity = table_searcher.search( @passenger_generator.next )
passenger = @passenger_generator.next
@@ -133,56 +120,75 @@
end
end
end
context 'search for related field value' do
- should 'raise an exception for no display value' do
+ setup do
@simple_search_criteria.from_start = true
- @simple_search_criteria.search_text = Flight.find(:first).number
- flight_field = Clevic::Field.new( :flight, Passenger, {} )
- assert_nil flight_field.display
+ # trim search slightly
+ @simple_search_criteria.search_text = Flight.first.number[1..-2]
+ @flight_field = Clevic::Field.new( :flight, Passenger, { :display => 'number' } )
+ end
+
+ should 'raise an exception for no display value' do
+ @flight_field = Clevic::Field.new( :flight, Passenger, {} )
+ assert_nil @flight_field.display
assert_raise RuntimeError do
- table_searcher = Clevic::TableSearcher.new( Passenger, [@id_order_attribute], @simple_search_criteria, flight_field )
+ table_searcher = Clevic::TableSearcher.new( Passenger.dataset, @simple_search_criteria, @flight_field )
table_searcher.search
end
end
-
- should 'find a record' do
- @simple_search_criteria.from_start = true
- @simple_search_criteria.search_text = Flight.find(:first).number
- flight_field = Clevic::Field.new( :flight, Passenger, { :display => 'number' } )
- table_searcher = Clevic::TableSearcher.new( Passenger, [@id_order_attribute], @simple_search_criteria, flight_field )
+
+ should "raise exception for related fields with display procs" do
+ assert_raise RuntimeError do
+ table_searcher = Clevic::TableSearcher.new(
+ Passenger.dataset,
+ @simple_search_criteria,
+ Clevic::Field.new( :flight, Passenger, { :display => lambda{|x| x.name} } )
+ )
+ table_searcher.search
+ end
+ end
+
+ should 'find a record with partial words' do
+ table_searcher = Clevic::TableSearcher.new( Passenger.dataset, @simple_search_criteria, @flight_field )
assert_equal @all_passengers.first, table_searcher.search
end
+
+ should 'find a record with whole words' do
+ @simple_search_criteria.whole_words = true
+ @simple_search_criteria.search_text = Flight.first.number
+
+ table_searcher = Clevic::TableSearcher.new( Passenger.dataset, @simple_search_criteria, @flight_field )
+ assert_equal @all_passengers.first, table_searcher.search
+ end
end
context 'whole words' do
setup do
@simple_search_criteria.from_start = true
@simple_search_criteria.search_text = CreateFakePassengers::NATIONALITIES[0][0..-3]
- @should_find = Passenger.find :all, :conditions => "nationality like '%#{@simple_search_criteria.search_text}%'", :order => :id
+ @should_find = Passenger.filter( "nationality like '%#{@simple_search_criteria.search_text}%'" ).order( :id )
end
should 'find a full value with a partial search string' do
@simple_search_criteria.whole_words = false
@simple_search_criteria.from_start = true
- table_searcher = Clevic::TableSearcher.new( Passenger, [@id_order_attribute], @simple_search_criteria, @nationality_field )
- g = Generator.new @should_find
+ table_searcher = Clevic::TableSearcher.new( Passenger.dataset, @simple_search_criteria, @nationality_field )
+ expecteds = Generator.new @should_find
last_entity = nil
while next_entity = table_searcher.search( last_entity )
- assert_equal next_entity, g.next
+ assert_equal next_entity, expecteds.next
last_entity = next_entity
@simple_search_criteria.from_start = false
end
end
should 'not find any values with a partial search string and whole_words enabled' do
@simple_search_criteria.whole_words = true
@simple_search_criteria.from_start = true
- table_searcher = Clevic::TableSearcher.new( Passenger, [@id_order_attribute], @simple_search_criteria, @nationality_field )
+ table_searcher = Clevic::TableSearcher.new( Passenger.dataset, @simple_search_criteria, @nationality_field )
assert_nil table_searcher.search
end
end
- should_eventually 'work for Array'
-
end