impress/spec/models/item_spec.rb

160 lines
4.8 KiB
Ruby

require 'spec_helper'
describe Item do
context "an item" do
specify "should accept string or array for species_support_ids" do
items = [
Factory.build(:item, :species_support_ids => '1,2,3'),
Factory.build(:item, :species_support_ids => [1,2,3])
]
items.each { |i| i.species_support_ids.should == [1,2,3] }
end
end
context "class" do
specify "should search name for word" do
query_should 'blue',
:return => [
'A Hat That is Blue',
'Blue Hat',
'Blueish Hat',
'Very Blue Hat'
],
:not_return => [
'Green Hat',
'Red Hat'
]
end
specify "should search name for phrase" do
query_should '"one two"',
:return => [
'Zero one two three',
'Zero one two',
'One two three'
],
:not_return => [
'Zero one three',
'Zero two three',
'Zero one and two',
'Three two one'
]
end
specify "should search name for multiple words" do
query_should 'one two',
:return => [
'Zero one two three',
'Zero one two',
'One two three',
'Zero one and two',
'Three two one'
],
:not_return => [
'Zero one three',
'Zero two three'
]
end
specify "should search name for words and phrases" do
query_should 'zero "one two" three',
:return => [
'zero one two three',
'zero four one two three',
'one two zero three',
'three zero one two'
],
:not_return => [
'one two three',
'zero one two',
'three one zero two',
'two one three zero'
]
end
specify "should search name and description" do
query_should 'zero "one two"',
:return => [
'zero one two',
['zero one', 'one two three'],
['one two four', 'one three zero'],
['three', 'one two four zero']
],
:not_return => [
['zero one', 'two'],
['one two four', 'three'],
['five two', 'zero one three two']
]
end
specify "should search by species" do
[[2],[1,2,3],[2,3],[3],[1,3]].each do |ids|
Factory.create :item, :species_support_ids => ids
end
Item.search('species:acara').count.should == 2
Item.search('species:aisha').count.should == 3
Item.search('species:blumaroo').count.should == 4
end
specify "should search by species and words" do
Factory.create :item, :name => 'Blue Hat', :species_support_ids => [1]
Factory.create :item, :name => 'Very Blue Hat', :species_support_ids => [1,2]
Factory.create :item, :name => 'Red Hat', :species_support_ids => [2]
Item.search('blue species:acara').count.should == 2
Item.search('blue species:aisha').count.should == 1
Item.search('red species:acara').count.should == 0
Item.search('red species:aisha').count.should == 1
end
specify "should be able to negate word in search" do
query_should 'hat -blue',
:return => [
'Green Hat',
'Red Hat',
'Blu E Hat',
['Yellow Hat', 'This hat is not green!']
],
:not_return => [
'Blue Hat',
'Green Shirt',
'Blue Shirt',
['Orange Hat', 'This hat is not blue!'],
['Blue Pants', 'This is not a hat!']
]
end
specify "should be able to negate species in search" do
Factory.create :item, :name => 'Blue Hat', :species_support_ids => [1]
Factory.create :item, :name => 'Very Blue Hat', :species_support_ids => [1,2]
Factory.create :item, :name => 'Red Hat', :species_support_ids => [1,2]
Factory.create :item, :name => 'Green Hat', :species_support_ids => [3]
Factory.create :item, :name => 'Red Shirt', :species_support_ids => [3]
Item.search('hat -species:acara').count.should == 1
Item.search('hat -species:aisha').count.should == 2
Item.search('hat -species:acara -species:aisha').count.should == 1
end
specify "should be able to negate phrase in search" do
query_should 'zero -"one two"',
:return => [
'Zero two one',
['Two one', 'Zero'],
'One three two zero'
],
:not_return => [
'Zero one two',
['Zero', 'one two three'],
['One two four', 'Zero one']
]
end
specify "should return raise exception for a query with no conditions" do
Factory.create :item
[
lambda { Item.search('').all },
lambda { Item.search(nil).all },
lambda { Item.search(' ').all }
].each { |l| l.should raise_error(ArgumentError) }
end
end
end